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

sudo: true
language: c
cache: ccache
matrix:
  fast_finish: true
  allow_failures:
    - os: osx
  include:
  - name: "apache-rat:check"
    os: linux
    sudo: false
    env: []
    language: java
    addons:
      apt:
        packages: []
    cache:
      directories:
        - $HOME/.m2/repository
      before_cache:
        - rm -rf $HOME/.m2/repository/org/apache/qpid/*
    install: []
    before_script: []
    script:
    - mvn apache-rat:check
  # prepending /usr/bin to PATH to avoid mismatched python interpreters in /opt
  - os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=master BUILD_TYPE=Debug
  - os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=0.29.0 BUILD_TYPE=Coverage
  - os: linux
    env:
    - PATH="/usr/bin:$PATH" PROTON_VERSION=0.29.0 BUILD_TYPE=RelWithDebInfo
    - DISPATCH_CMAKE_ARGS='-DRUNTIME_CHECK=asan'
  - os: osx
    osx_image: xcode10.1
    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
    - pip install unittest2

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
    # code coverage
    - lcov

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

# 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} -DDISPATCH_TEST_TIMEOUT=600 ${DISPATCH_CMAKE_ARGS}
- cmake --build . --target install -- -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
