#
# 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 docker pull thrift/$DISTRO:latest || true
  - cp -r ./build/docker/scripts/*.sh ./build/docker/$DISTRO/scripts/
  - travis_retry travis_wait docker build -q -t thrift-build build/docker/$DISTRO

script:
  - docker run -e BUILD_LIBS="$BUILD_LIBS" $BUILD_ENV -v $(pwd):/thrift/src -it thrift-build $BUILD_CMD $BUILD_ARG

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

  matrix:
    # TODO: Break up by protocol types to avoid 50min limit
    - TEST_NAME="Cross Language Tests"
      BUILD_CMD="../cross-test.sh"
      BUILD_ARG="--enable-tutorial=no"
      BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"

    - TEST_NAME="Cross Language Tests (Debian)"
      BUILD_CMD="../cross-test.sh"
      BUILD_ARG="--enable-tutorial=no"
      BUILD_ENV="-e CC=clang -e CXX=clang++ -e THRIFT_CROSSTEST_CONCURRENCY=4"
      DISTRO=debian

    # TODO: Remove them once migrated to CMake
    # Autotools builds
    - TEST_NAME="C C++ C# D Erlang Haxe Go (automake)"
      BUILD_CMD="../autotools.sh"
      BUILD_ARG="--without-dart --without-haskell --without-java --without-lua --without-nodejs --without-perl --without-php --without-php_extension --without-python --without-ruby"

    - TEST_NAME="C C++ - GCC (automake)"
      BUILD_CMD="../autotools.sh"
      BUILD_ARG="--without-csharp --without-java --without-erlang --without-nodejs --without-lua --without-python --without-perl --without-php --without-php_extension --without-dart --without-ruby --without-haskell --without-go --without-haxe --without-d"
      BUILD_ENV="-e CC=gcc -e CXX=g++"

    - TEST_NAME="Java Lua Perl PHP Python Ruby Dart (automake)"
      BUILD_CMD="../autotools.sh"
      BUILD_ARG="--without-cpp --without-haskell --without-c_glib --without-csharp --without-d --without-erlang --without-go --without-haxe --without-nodejs"

    # These are flaky (due to cabal and npm network/server failures) and also have lengthy output
    - TEST_NAME="Haskell Node.js (automake)"
      BUILD_CMD="../autotools.sh"
      BUILD_ARG="--without-cpp --without-c_glib --without-csharp --without-d --without-dart --without-erlang --without-go --without-haxe --without-java --without-lua --without-perl --without-php --without-php_extension --without-python --without-ruby"

    # CMake build
    - TEST_NAME="All"
      BUILD_CMD="../cmake.sh"

    - TEST_NAME="All (Debian)"
      BUILD_CMD="../cmake.sh"
      DISTRO=debian

    - TEST_NAME="C C++ - GCC"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS="CPP C_GLIB TESTING TUTORIALS"
      BUILD_ARG="-DWITH_PYTHON=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
      BUILD_ENV="-e CC=gcc -e CXX=g++"

    - TEST_NAME="C++ (Boost Thread)"
      BUILD_CMD="../cmake.sh"
      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++ (Boost Thread - GCC)"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS="CPP TESTING TUTORIALS"
      BUILD_ARG="-DWITH_BOOSTTHREADS=ON -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
      BUILD_ENV="-e CC=gcc -e CXX=g++"

    - TEST_NAME="C++ (Std Thread)"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS="CPP TESTING TUTORIALS"
      BUILD_ARG="-DWITH_STDTHREADS=ON -DCMAKE_CXX_FLAGS='-std=c++11' -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"

    - TEST_NAME="C++ (Std Thread - GCC)"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS="CPP TESTING TUTORIALS"
      BUILD_ARG="-DWITH_STDTHREADS=ON -DCMAKE_CXX_FLAGS='-std=c++11' -DWITH_PYTHON=OFF -DWITH_C_GLIB=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
      BUILD_ENV="-e CC=gcc -e CXX=g++"

    - TEST_NAME="Compiler (mingw)"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS=""
      BUILD_ARG="-DCMAKE_TOOLCHAIN_FILE=../build/cmake/mingw32-toolchain.cmake -DBUILD_COMPILER=ON -DBUILD_LIBRARIES=OFF -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF"
      BUILD_ENV=""

    - TEST_NAME="All - GCC (CentOS)"
      BUILD_CMD="../cmake.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"
      DISTRO=centos

    - TEST_NAME="C C++ - Clang (CentOS)"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS="CPP C_GLIB TESTING TUTORIALS"
      BUILD_ARG="-DWITH_PYTHON=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
      DISTRO=centos

    - TEST_NAME="Python 2.6 (CentOS 6)"
      BUILD_CMD="../cmake.sh"
      BUILD_LIBS="PYTHON TESTING TUTORIALS"
      BUILD_ARG="-DWITH_PYTHON=ON -DWITH_CPP=OFF -DWITH_JAVA=OFF -DWITH_HASKELL=OFF"
      BUILD_ENV="-e CC=gcc -e CXX=g++"
      DISTRO=centos6

    # Distribution
    - TEST_NAME="make dist"
      BUILD_CMD="../make-dist.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"

    - TEST_NAME="Debian Packages"
      BUILD_CMD="../dpkg.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"

    - TEST_NAME="make dist (Debian)"
      BUILD_CMD="../make-dist.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"
      DISTRO=debian

    - TEST_NAME="Debian Packages (Debian)"
      BUILD_CMD="../dpkg.sh"
      BUILD_ENV="-e CC=gcc -e CXX=g++"
      DISTRO=debian

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
