dist: trusty
sudo: false
language: c

addons:
  apt:
    # Define the required packages without libjansson so we can do a
    # build without libjansson.
    packages-without-jansson: &packages-without-jansson
      - libpcre3
      - libpcre3-dbg
      - libpcre3-dev
      - build-essential
      - autoconf
      - automake
      - libtool
      - libpcap-dev
      - libnet1-dev
      - libyaml-0-2
      - libyaml-dev
      - zlib1g
      - zlib1g-dev
      - libcap-ng-dev
      - libcap-ng0
      - make
      - libmagic-dev
      - libnetfilter-queue-dev
      - libnetfilter-queue1
      - libnfnetlink-dev
      - libnfnetlink0
      - libhiredis-dev
      - libjansson-dev
      - libevent-dev
      - libevent-pthreads-2.0-5
    # Now define the default set of packages which is those above, and
    # libjansson.
    packages: &packages
      - *packages-without-jansson
      - libjansson-dev

# Define the default CFLAGS used by all builds as a YAML anchor.
default-cflags: &default-cflags
  CFLAGS="-Wall -Wextra -Werror -Wno-unused-parameter -Wno-unused-function"

matrix:
  allow_failures:
    # Allow the rust-stable build to fail. These entries must match
    # the env entry in the build matrix exactly.
    - env:
        - NAME="linux,gcc,rust-stable"
        - *default-cflags
        - ENABLE_RUST="yes"
        - RUST_VERSION="stable"
        - ARGS="--enable-rust --enable-rust-strict"
        - DO_CHECK_SETUP_SCRIPTS="yes"
        - DO_DISTCHECK="yes"
  include:
    # Linux, gcc, coccinelle.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,cocci"
        - *default-cflags
      addons:
        apt:
          sources:
            - sourceline: ppa:npalix/coccinelle
          packages:
            - *packages
            - coccinelle
    # Linux, gcc, Rust (latest stable).
    # This is allowed to fail, update allow_failures if the env changes.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,rust-stable"
        - *default-cflags
        - ENABLE_RUST="yes"
        - RUST_VERSION="stable"
        - ARGS="--enable-rust --enable-rust-strict"
        - DO_CHECK_SETUP_SCRIPTS="yes"
        - DO_DISTCHECK="yes"
    # Linux, gcc, Rust.
    # - Rust 1.23.0, the latest known working version.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,rust-1.23.0"
        - *default-cflags
        - ENABLE_RUST="yes"
        - RUST_VERSION="1.23.0"
        - ARGS="--enable-rust --enable-rust-strict"
        - DO_DISTCHECK="yes"
    # Linux, gcc, Rust (1.21.0 - oldest supported).
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,rust-1.21.0"
        - *default-cflags
        - ENABLE_RUST="yes"
        - RUST_VERSION="1.21.0"
        - ARGS="--enable-rust --enable-rust-strict"
        - DO_DISTCHECK="yes"
    # Linux, gcc, -DNDEBUG.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,ndebug"
        - *default-cflags
        - EXTRA_CFLAGS="-DNDEBUG"
    # Linux, clang. For this build we'll also enable -Wshadow.
    - os: linux
      compiler: clang
      env:
        - NAME="linux,clang"
        - *default-cflags
        - EXTRA_CFLAGS="-Wshadow"
    # Linux, gcc, profiling.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,profiling"
        - *default-cflags
        - ARGS="--enable-profiling"
    # Linux, gcc, debug.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,debug"
        - *default-cflags
        - ARGS="--enable-debug"
        - ENABLE_DEBUG="yes"
    # Linux, gcc, no jansson.
    - os: linux
      compiler: gcc
      env:
        - NAME="linux,gcc,no-json"
        - *default-cflags
      addons:
        apt:
          packages:
            - *packages-without-jansson
    # OSX 10.12, XCode 8.1
    - os: osx
      compiler: gcc
      osx_image: xcode8.1
      sudo: true
      env:
        - NAME="osx,gcc"
        - *default-cflags

script:
  - sh ./autogen.sh
  - |
    if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
        export CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
        ./configure --enable-nfqueue --enable-unittests --enable-hiredis ${ARGS}
    fi
  - |
    if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
        export CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
        ./configure --enable-unittests --enable-hiredis --enable-ipfw \
            --enable-lua --with-libpcre-includes=/usr/local/include \
            --with-libpcre-includes=/usr/local/include \
            --with-libpcre-libraries=/usr/local/lib \
            --with-libnss-includes=/usr/local/opt/nss/include/nss \
            --with-libnss-libraries=/usr/local/opt/nss/lib \
            --with-libnspr-includes=/usr/local/opt/nspr/include/nspr \
            --with-libnspr-libraries=/usr/local/opt/nspr/lib
    fi
  - |
    # Linux container builds have 2 cores, make use of them.
    if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
        j="-j 2"
    fi
    make ${j}
  - |
    # Like "make check", but fail on first error. We redirect the output
    # so Travis doesn't fail the build with a too much output error.
    mkdir -p ./qa/log
    ./src/suricata -u -l ./qa/log --fatal-unittests > unittests.log 2>&1
    if [[ $? -ne 0 ]]; then
        echo "Unit tests failed, last 500 lines of output are:"
        tail -n 500 unittests.log
        exit 1
    fi
  - |
    if [[ "$DO_DISTCHECK" == "yes" ]]; then
        make distcheck DISTCHECK_CONFIGURE_FLAGS="${ARGS}"
    fi
  - |
    if [[ "$DO_CHECK_SETUP_SCRIPTS" == "yes" ]]; then
        (cd scripts && ./check-setup.sh)
    fi

before_install:
  - export PATH=$HOME/.cargo/bin:$PATH
  - |
    if [[ "$ENABLE_RUST" == "yes" ]]; then
        curl https://sh.rustup.rs -sSf | sh -s -- -y
        if [[ "$RUST_VERSION" != "" ]]; then
            rustup override set $RUST_VERSION
        fi
        rustc --version
    fi
  - |
    if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
        brew update

        # Unlink and install each dependency to avoid errors where a
        # formula might already be installed but is not the current
        # version.
        packages=""
        packages="$packages pkg-config"
        packages="$packages libmagic"
        packages="$packages libyaml"
        packages="$packages nss"
        packages="$packages nspr"
        packages="$packages jansson"
        packages="$packages libnet"
        packages="$packages lua"
        packages="$packages pcre"
        packages="$packages hiredis"
        for package in $packages; do
            if brew ls $package --versions > /dev/null; then
                brew unlink $package
            fi
        done

        # Now install.
        brew install $packages

        # Now relink, becuase if a newer version of a package wasn't
        # installed above, it will remain unlinked.
        brew link $packages
    fi
  - ./qa/travis-libhtp.sh
