# 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"
  - 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.11.1* ]; then \
        sudo dpkg -i $HOME/protobuf/protobuf_3.11.1*; \
      else \
        wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.1/protobuf-java-3.11.1.zip && \
        unzip protobuf-java-3.11.1.zip && pushd protobuf-3.11.1 && \
        ./configure && sudo make && sudo checkinstall -y && \
        if [ ! -d $HOME/protobuf ]; then \
          mkdir -p $HOME/protobuf; \
        fi && \
        mv protobuf_3.11.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 \
        -DexcludedGroups="org.apache.drill.categories.SlowTest,org.apache.drill.categories.UnlikelyTest,org.apache.drill.categories.SecurityTest" \
        -DmemoryMb=1300 -DdirectMemoryMb=3000; \
    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
