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

language: c
cache: ccache
jobs:
  fast_finish: true
  allow_failures:
    - os: osx
  include:
  - name: "apache-rat:check"
    os: linux
    env: []
    language: java
    addons:
      apt:
        packages: []
    install: []
    before_script: []
    script:
    - mvn apache-rat:check
    before_cache:
    - rm -rf $HOME/.m2/repository/org/apache/qpid/*
    cache:
      directories:
      - $HOME/.m2/repository
    after_script:
    - cat target/rat.txt || true
  # prepending /usr/bin to PATH to avoid mismatched python interpreters in /opt
  - name: "qdrouterd:Debug"
    os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=master BUILD_TYPE=Debug
    - DISPATCH_CMAKE_ARGS='-DRUNTIME_CHECK=asan'
  - name: "qdrouterd:Coverage"
    os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=0.33.0 BUILD_TYPE=Coverage
  - name: "qdrouterd:RelWithDebInfo+MemoryDebug (gcc on xenial)"
    os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=0.33.0 BUILD_TYPE=RelWithDebInfo
    - DISPATCH_CMAKE_ARGS='-DRUNTIME_CHECK=asan -DCMAKE_C_FLAGS=-DQD_MEMORY_DEBUG'
  - name: "qdrouterd:RelWithDebInfo+MemoryDebug (clang on focal)"
    os: linux
    dist: focal
    compiler: clang
    before_install:
    - sudo apt-get install clang-10 llvm-10-dev
    # https://github.com/pypa/virtualenv/issues/1740
    # https://github.com/pypa/virtualenv/issues/1873
    - python -m pip install --user --upgrade pip
    - python -m pip install --user --upgrade tox virtualenv==20.0.23
    env:
    - CC=clang-10
    - CXX=clang++-10
    - PATH="/usr/bin:$PATH" PROTON_VERSION=master BUILD_TYPE=RelWithDebInfo
    - DISPATCH_CMAKE_ARGS='-DRUNTIME_CHECK=asan -DCMAKE_C_FLAGS=-DQD_MEMORY_DEBUG'
  - name: "qdrouterd:Default Build"
    os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=0.33.0
  - os: osx
    osx_image: xcode11
    env:
    - PATH="/opt/local/bin:/opt/local/sbin:/usr/local/bin:$PATH" PROTON_VERSION=master
    before_install:
    - bash ./macports.sh
    - export COLUMNS=80
    - yes | sudo port install cmake swig swig-python libuv jsoncpp libwebsockets cyrus-sasl2 pkgconfig python37 py37-pip
    # set aliases for CMake's PythonInterp and PythonLibs to find MacPort's `python` on the path first
    - sudo port select --set python python37
    - sudo port select --set python3 python37
    - python -m venv p3venv
    - source p3venv/bin/activate

addons:
  apt:
    packages:
    # Proton requirements
    - cmake
    - libsasl2-dev
    - libssl-dev
    - python2.7
    - python2.7-dev
    - sasl2-bin
    - swig
    # documentation
    - asciidoc
    - asciidoctor
    - dblatex
    # unit test requirement
    - python-unittest2
    - tox
    # code coverage
    - lcov

install:
- NPROC=2
- PREFIX=$PWD/install
- git clone --depth=10 --branch=$PROTON_VERSION https://github.com/apache/qpid-proton.git
- cmake -version

# Build and install proton from source.
- mkdir qpid-proton/build
- pushd qpid-proton/build
- cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DBUILD_PYTHON=YES -DBUILD_JAVASCRIPT=NO -DBUILD_CPP=NO -DBUILD_GO=NO -DBUILD_RUBY=NO -DBUILD_PHP=NO -DBUILD_PERL=NO
- cmake --build . --target install -- -j $NPROC
- popd

before_script:
- source qpid-proton/build/config.sh
- mkdir build
- pushd build
- cmake .. -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${DISPATCH_CMAKE_ARGS}
- . config.sh
- make -j $NPROC

script:
- pushd ../qpid-proton
- echo $(echo "Current proton commit:") $(git rev-parse HEAD) "(${PROTON_VERSION})"
- popd
# Workaround on macOS for PROTON-808 Binaries have their library locations stripped
- if [[ "${OSTYPE}" == "darwin"* ]]; then install_name_tool -add_rpath $PREFIX/lib/. $PREFIX/lib/proton/bindings/python/_cproton.so; fi
- ctest -V && if [ "$BUILD_TYPE" = "Coverage" ]; then cmake --build . --target coverage; fi

after_success:
- cd ${TRAVIS_BUILD_DIR}/build
- if [ "$BUILD_TYPE" = "Coverage" ]; then bash <(curl -s https://codecov.io/bash); fi
