# Copyright (C) 2017 The Android Open Source Project
#
# Licensed 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.

notifications:
  email: false

language: cpp

# The |CFG| variable name is hooked up by the perfetto-ci.appspot.com frontend.
# Please keep infra/perfetto-ci.appspot.com/ updated when adding/removing
# entries below.
matrix:
  include:
    - os: osx
      osx_image: xcode8.3
      compiler: clang
      env: CFG=mac-clang-x86_64-release GN_ARGS="is_debug=false"
    - os: osx
      osx_image: xcode8.3
      compiler: clang
      env: CFG=mac-clang-x86_64-debug GN_ARGS="is_debug=true"
    - os: osx
      osx_image: xcode8.3
      compiler: clang
      env: CFG=mac-clang-x86_64-asan GN_ARGS="is_debug=false is_asan=true"
    - os: osx
      osx_image: xcode8.3
      compiler: clang
      env: CFG=mac-clang-x86_64-tsan GN_ARGS="is_debug=false is_tsan=true"
    - os: osx
      osx_image: xcode8.3
      compiler: clang
      env: CFG=mac-clang-x86_64-ubsan GN_ARGS="is_debug=false is_ubsan=true"
    - os: linux
      dist: trusty
      sudo: false
      # When setting compiler: clang Travis pull a newer version of clang than
      # the version that is shipped with Trusty. This is good for all the other
      # configs, but we want to keep at least one target in the matrix to match
      # the default version of clang that we have on our workstations.
      addons:
        apt:
          packages:
            - clang
      env: CFG=linux_trusty-clang-x86_64-debug GN_ARGS="is_debug=true"
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=linux_trusty-clang-x86_64-asan GN_ARGS="is_debug=false is_asan=true"
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=linux_trusty-clang-x86_64-tsan GN_ARGS="is_debug=false is_tsan=true"
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=linux_trusty-clang-x86_64-msan GN_ARGS="is_debug=false is_msan=true"
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=linux_trusty-clang-x86_64-lsan GN_ARGS="is_debug=false is_lsan=true"
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=linux_trusty-clang-x86_64-ubsan GN_ARGS="is_debug=false is_ubsan=true"
    - os: linux
      dist: trusty
      sudo: false
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-7
      env: CFG=linux_trusty-gcc7-x86_64-release GN_ARGS="is_debug=false is_clang=false use_custom_libcxx=false cc=\"gcc-7\" cxx=\"g++-7\""
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=android-clang-arm-release GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm\""
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=android-clang-arm64-release GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm64\""
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=android-clang-arm-asan GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm\" is_asan=true"
    - os: linux
      dist: trusty
      sudo: false
      compiler: clang
      env: CFG=android-clang-arm64-asan GN_ARGS="is_debug=false target_os=\"android\" target_cpu=\"arm64\" is_asan=true"

# Cache the deps that get git-pulled to avoid hitting quota limits (b/68252114).
# Do not cache NDK/SDK and things that come from .zip files rather than git.
# Doing that is discouraged (https://docs.travis-ci.com/user/caching/).
cache:
  timeout: 1800  # 30 mins
  directories:
    - buildtools/benchmark
    - buildtools/googletest
    - buildtools/libcxx
    - buildtools/libcxxabi
    - buildtools/libunwind

before_install:
  - set -e
  - echo "$CFG" && echo "$GN_ARGS"
  - ASAN_SYMBOLIZER_PATH="$(which llvm-symbolizer || echo /usr/bin/llvm-symbolizer-*)"

install:
  - |
    if [[ "$CFG" != android-* ]]; then
      tools/install-build-deps --no-android
    else
      ARCH=$(echo "$CFG" | cut -d- -f3)
      tools/install-build-deps --emulator="$ARCH"
    fi

script:
  - tools/gn gen out/dist --args="${GN_ARGS}" --check
  - tools/ninja -C out/dist -j8 all
  - |
    TEST_TARGETS="
    perfetto_tests
    perfetto_benchmarks
    "
    if [[ "$CFG" != android-* ]]; then
      for TEST_TARGET in $TEST_TARGETS; do
        "out/dist/$TEST_TARGET"
      done
    else
      TARGET_ARCH=$(echo $CFG | cut -d- -f3)
      tools/run_android_emulator $TARGET_ARCH --pid /tmp/emulator.pid -v &
      for TEST_TARGET in $TEST_TARGETS; do
        tools/run_android_test out/dist "$TEST_TARGET"
      done
    fi

after_script:
  - test -f /tmp/emulator.pid && kill -9 $(cat /tmp/emulator.pid); true
