# 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 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 -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
