# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Note: TravisCI is used only for testing on Linux ARM64
# The testing on x86_64 is done on Github Actions

dist: focal
language: generic
sudo: required
arch: arm64-graviton2
virt: vm
group: edge

# install JDK and Maven from Ubuntu repos because TravisCI has no JDK 1.8 for ARM64 images
addons:
  apt:
    update: true
    packages:
      - openjdk-8-jdk
      - maven
      - unzip

matrix:
  fast_finish: true
  include:
    - env: PHASE=tests
    - env: PHASE=build_checkstyle_protobuf

cache:
  directories:
    - "$HOME/.m2"
    - "$HOME/protobuf"
before_install:
  - export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-arm64"
  - export PATH="$JAVA_HOME/bin:$PATH"
  - export MEMORYMB=2048
  - export DIRECTMEMORYMB=5120
  - free -m
  - java -version
  - mvn -version
  - git fetch --unshallow
  # Install libraries required for protobuf generation
  - |
    if [ $PHASE = "build_checkstyle_protobuf" ]; then \
      sudo apt-get install -y libboost-all-dev libzookeeper-mt-dev libsasl2-dev cmake libcppunit-dev checkinstall && \
      pushd .. && \
      if [ -f $HOME/protobuf/protobuf_3.16.1* ]; then \
        sudo dpkg -i $HOME/protobuf/protobuf_3.16.1*; \
      else \
        wget https://github.com/protocolbuffers/protobuf/releases/download/v3.16.1/protobuf-java-3.16.1.zip && \
        unzip protobuf-java-3.16.1.zip && pushd protobuf-3.16.1 && \
        ./configure && sudo make && sudo checkinstall -y && \
        if [ ! -d $HOME/protobuf ]; then \
          mkdir -p $HOME/protobuf; \
        fi && \
        mv protobuf_3.16.1* $HOME/protobuf/ && popd; \
      fi && \
      sudo ldconfig && popd; \
    fi
install:
  # For tests phase runs unit tests
  # For protobuf phase: builds Drill project, performs license checkstyle goal and regenerates Java and C++ Protobuf files
  - |
    if [ $PHASE = "tests" ]; then \
      mvn install --batch-mode --no-transfer-progress -DforkCount=1 -DmemoryMb=$MEMORYMB -DdirectMemoryMb=$DIRECTMEMORYMB \
        -DexcludedGroups="org.apache.drill.categories.SlowTest,org.apache.drill.categories.UnlikelyTest,org.apache.drill.categories.SecurityTest"; \
    elif [ $PHASE = "build_checkstyle_protobuf" ]; then \
      MAVEN_OPTS="-Xms1G -Xmx1G" mvn install --no-transfer-progress -Drat.skip=false -Dlicense.skip=false --batch-mode -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DskipTests=true -Dmaven.javadoc.skip=true -Dmaven.source.skip=true && \
      pushd protocol && mvn process-sources -P proto-compile && popd && \
      mkdir contrib/native/client/build && pushd contrib/native/client/build && /usr/bin/cmake -G "Unix Makefiles" .. && make cpProtobufs && popd; \
    fi
script:
  # Checks whether project files weren't changed after regenerating protobufs
  - |
    if [ "$(git status -s | grep -c "")" -gt 0 ]; then \
      echo "The following changes are found in files after regenerating protobufs (output may be used as a patch to apply):" >&2 &&
      echo "$(git diff --color)" && \
      exit 1; \
    else
      echo "All checks are passed!";
    fi
