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

# build Apache Thrift on Travis CI - https://travis-ci.org/

sudo: required
dist: trusty

services:
  - docker

install:
  - (travis_wait ./build/docker/check_unmodified.sh $DISTRO && touch .unmodified) || true
  - if [ ! -f .unmodified ]; then travis_retry travis_wait docker build -q -t thrift-build:$DISTRO build/docker/$DISTRO; fi

script:
  - docker run --net=host -e BUILD_LIBS="$BUILD_LIBS" $BUILD_ENV -v $(pwd):/thrift/src -it thrift-build:$DISTRO build/docker/scripts/$SCRIPT $BUILD_ARG

env:
  global:
    - TEST_NAME=""
    - SCRIPT="cmake.sh"
    - BUILD_ARG=""
    - BUILD_ENV="-e CC=clang -e CXX=clang++"
    - DISTRO=ubuntu-xenial
    - BUILD_LIBS="CPP C_GLIB HASKELL JAVA PYTHON TESTING TUTORIALS"  # only meaningful for CMake builds

  matrix:
    - TEST_NAME="Cross Language Tests (Binary, Header, JSON Protocols)"
      SCRIPT="cross-test.sh"
      BUILD_ARG="-'(binary|header|json)'"
      BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    - TEST_NAME="Cross Language Tests (Compact and Multiplexed Protocols)"
      SCRIPT="cross-test.sh"
      BUILD_ARG="-'(compact|multiplexed)'"
      BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    # Autotools builds
    # TODO: Remove them once migrated to CMake
    - TEST_NAME="Autotools (CentOS 7.3)"
      DISTRO=centos-7.3
      SCRIPT="autotools.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"
      BUILD_ARG="--without-cpp --without-csharp --without-c_glib --without-d -without-dart --without-erlang --without-go --without-haskell --without-haxe"

    - TEST_NAME="Autotools (Ubuntu Xenial)"
      SCRIPT="autotools.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"
      BUILD_ARG="--enable-plugin --without-java --without-lua --without-nodejs --without-perl --without-php --without-php_extension --without-python --without-py3 --without-ruby --without-rust"

    # CMake builds
    - TEST_NAME="CMake (CentOS 7.3)"
      DISTRO=centos-7.3

    - TEST_NAME="CMake (Ubuntu Xenial)"

    # C++ specific options: compiler plug-in, threading model
    - TEST_NAME="C++ (Boost Thread)"
      BUILD_LIBS="CPP TESTING TUTORIALS"
      BUILD_ARG="-DWITH_BOOSTTHREADS=ON -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"

    - TEST_NAME="C++ Plugin (Std Thread)"
      BUILD_LIBS="CPP TESTING TUTORIALS"
      BUILD_ARG="-DWITH_PLUGIN=ON -DWITH_STDTHREADS=ON -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"

    # Distribution
    - TEST_NAME="make dist"
      SCRIPT="make-dist.sh"

    - TEST_NAME="Debian Packages"
      SCRIPT="dpkg.sh"

    # C and C++ undefined behavior. This wraps autotools.sh, but each binary crashes if
    # undefined behavior occurs. Skips the known flaky tests.
    - TEST_NAME="UBSan"
      SCRIPT="ubsan.sh"
      BUILD_ARG="--without-haskell --without-nodejs --without-perl --without-python"

matrix:
  include:
    # QA jobs for code analytics and metrics
    #
    # C/C++ static code analysis with cppcheck
    # add --error-exitcode=1 to --enable=all as soon as everything is fixed
    #
    # Python code style check with flake8
    #
    # search for TODO etc within source tree
    # some statistics about the code base
    # some info about the build machine
    - env: TEST_NAME="cppcheck, flake8, TODO FIXME HACK, LoC and system info"
      install:
        - travis_retry sudo apt-get update
        - travis_retry sudo apt-get install -ym cppcheck sloccount python-flake8
      script:
        # Compiler cppcheck (All)
        - cppcheck --force --quiet --inline-suppr --enable=all -j2 compiler/cpp/src
        # C++ cppcheck (All)
        - cppcheck --force --quiet --inline-suppr --enable=all -j2 lib/cpp/src lib/cpp/test test/cpp tutorial/cpp
        # C Glib cppcheck (All)
        - cppcheck --force --quiet --inline-suppr --enable=all -j2 lib/c_glib/src lib/c_glib/test test/c_glib/src tutorial/c_glib
        # Silent error checks
        - cppcheck --force --quiet --inline-suppr --error-exitcode=1 -j2 compiler/cpp/src
        - cppcheck --force --quiet --inline-suppr --error-exitcode=1 -j2 lib/cpp/src lib/cpp/test test/cpp tutorial/cpp
        - cppcheck --force --quiet --inline-suppr --error-exitcode=1 -j2 lib/c_glib/src lib/c_glib/test test/c_glib/src tutorial/c_glib
        # Python code style
        - flake8 --ignore=E501 lib/py
        - flake8 tutorial/py
        - flake8 --ignore=E501 test/py
        - flake8 test/py.twisted
        - flake8 test/py.tornado
        - flake8 --ignore=E501 test/test.py
        - flake8 --ignore=E501 test/crossrunner
        - flake8 test/features
        # TODO etc
        - grep -r TODO *
        - grep -r FIXME *
        - grep -r HACK *
        # LoC
        - sloccount .
        # System Info
        - dpkg -l
        - uname -a
