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

jobs:
  include:
  - os: linux
    dist: xenial
    language: cpp
    compiler: gcc
    env:
    - OPENSSL_ia32cap='0x00000000'
  - os: linux
    dist: xenial
    language: cpp
    compiler: clang
    env:
    - OPENSSL_ia32cap='0x00000000'
    # c-threaderciser test hangs on older clang
    - QPID_PROTON_CMAKE_ARGS='-DENABLE_LINKTIME_OPTIMIZATION=OFF'
    - QPID_PROTON_CTEST_ARGS='--exclude-regex c-threaderciser'
  - name: static libs
    os: linux
    dist: focal
    language: cpp
    compiler: gcc
    env:
    - PYTHON=python3
    - QPID_PROTON_CMAKE_ARGS='-DBUILD_STATIC_LIBS=ON'
  - name: benchmarks
    os: linux
    dist: focal
    language: cpp
    compiler: gcc
    env:
    - PYTHON=python3
    - QPID_PROTON_CMAKE_ARGS='-DENABLE_BENCHMARKS=ON -DRUNTIME_CHECK=OFF'
    before_install:
    - sudo apt-get install -y libbenchmark-dev
  - name: gcc asan
    os: linux
    dist: focal
    before_install:
    - sudo apt-get install -y gcc-10 g++-10
    env:
    - CC=gcc-10
    - CXX=g++-10
    - PYTHON=python3
    # python-tox-test fails and ruby tests segfault
    - QPID_PROTON_CMAKE_ARGS='-DRUNTIME_CHECK=asan -DENABLE_TOX_TEST=OFF'
    - QPID_PROTON_CTEST_ARGS='-E ^ruby.*'
  - name: clang asan
    os: linux
    dist: focal
    before_install:
    - sudo apt-get install -y clang-10 llvm-10-dev
    env:
    - CC=clang-10
    - CXX=clang++-10
    - PYTHON=python3
    - QPID_PROTON_CMAKE_ARGS='-DRUNTIME_CHECK=asan -DENABLE_TOX_TEST=OFF'
    # otherwise, on Travis ldd gives `libclang_rt.asan-x86_64.so => not found` and binaries don't work
    - LD_LIBRARY_PATH=/usr/lib/llvm-10/lib/clang/10.0.0/lib/linux/
  - name: gcc tsan
    os: linux
    dist: focal
    before_install:
    - sudo apt-get install -y gcc-10 g++-10
    env:
    - CC=gcc-10
    - CXX=g++-10
    - PYTHON=python3
    # python-test, python-integration-test, and python-tox-test segfault
    - QPID_PROTON_CMAKE_ARGS='-DRUNTIME_CHECK=tsan -DENABLE_TOX_TEST=OFF'
    - QPID_PROTON_CTEST_ARGS="-E 'python-test|python-integration-test'"
  - name: coverage
    os: linux
    dist: bionic
    language: cpp
    compiler: gcc
    env:
    - QPID_PROTON_CMAKE_ARGS='-DCMAKE_BUILD_TYPE=Coverage'
    after_success:
    - bash <(curl -s https://codecov.io/bash)

  - os: osx
    osx_image: xcode9.4
    language: cpp
    compiler: clang
    env:
    - PATH="/usr/local/opt/python/libexec/bin:/usr/local/bin:$PATH"
    - PKG_CONFIG_PATH='/usr/local/opt/openssl@1.1/lib/pkgconfig'
    - QPID_PROTON_CMAKE_ARGS='-DCMAKE_OSX_DEPLOYMENT_TARGET=10.13'
    # c-threaderciser test hangs on older clang
    # python-tox-test segfaults and ruby tests do not start due to dynamic library issues
    - QPID_PROTON_CTEST_ARGS="--exclude-regex 'c-threaderciser|python-tox-test|ruby.*'"

  - os: osx
    osx_image: xcode11.3
    language: cpp
    compiler: clang
    env:
    - PATH="/usr/local/opt/python/libexec/bin:/usr/local/bin:$PATH"
    - PKG_CONFIG_PATH='/usr/local/opt/openssl@1.1/lib/pkgconfig'
    - QPID_PROTON_CMAKE_ARGS='-DCMAKE_OSX_DEPLOYMENT_TARGET=10.14'
    # TODO PROTON-2225: c-threaderciser sometimes fails with assertion error
    # python-tox-test segfaults and ruby tests do not start due to dynamic library issues
    - QPID_PROTON_CTEST_ARGS="--exclude-regex 'c-threaderciser|python-tox-test|ruby.*'"

addons:
  # Ubuntu APT dependencies, https://packages.ubuntu.com/
  apt:
    packages:
    - cmake
    - libssl-dev
    - libsasl2-dev
    - sasl2-bin
    - swig
    - python-dev
    - valgrind
    - ruby
    - ruby-dev
    - python3-dev
    - golang
    - lcov
    - libjsoncpp-dev
  # macOS Homebrew dependencies, https://formulae.brew.sh/
  homebrew:
    packages:
      - jsoncpp
      - libuv
      - swig
# update:true workaround as of Feb. 22/20 as per
# https://travis-ci.community/t/macos-build-fails-because-of-homebrew-bundle-unknown-command/7296/10
    update: true

install:
- echo "Using PYTHON=${PYTHON:=python}"
# use older version of virtualenv to workaround https://github.com/pypa/virtualenv/issues/1873
- ${PYTHON} -m pip install --user --upgrade pip
- ${PYTHON} -m pip install --user coverage setuptools wheel tox virtualenv==20.0.23
# PROTON-2125 suppress annoying deprecation warning from Minitest in Ruby tests
- gem install minitest:4.3.2 simplecov codecov

before_script:
- mkdir build
- cd build
- cmake .. -DCMAKE_INSTALL_PREFIX=$PWD/install -DPYTHON_EXECUTABLE="$(which ${PYTHON})" ${QPID_PROTON_CMAKE_ARGS}

script:
- cmake --build . --target install -- -j$(nproc) && eval ctest -V ${QPID_PROTON_CTEST_ARGS}
