language: c
os:
  - linux
dist: bionic
cache:
  directories:
    - /home/travis/perl5
    - /home/travis/root
# The non-x86_64 images currently lack cpanminus, when that is fixed
# the cpanminus & universe sourceline can be removed.
addons:
  apt:
    update: false
    sources:
      - sourceline: 'deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe'
    packages:
      - cpanminus
      - libtool-bin
      - libapr1-dev
      - libaprutil1-dev
      - perl-doc
      - liblua5.3-dev
      - libbrotli-dev
      - libcurl4-openssl-dev
      - libsystemd-dev
      - libnghttp2-dev
      - libjansson-dev
      - libpcre2-dev
      - libldap2-dev
      - ldap-utils
      - gdb
env:
  global:
    - MFLAGS=-j2

# This defines two condition anchors which can be used in job
# definitions to either:
#  condition_24x_only => run the job only for 2.4.x
#  condition_not_24x  => run the job everywhere EXCEPT 2.4.x
_cond1: &condition_24x_only (branch is present AND (branch = 2.4.x OR branch ~= /^candidate-2.4/)) OR (tag is present AND tag ~= /^2.4/)
_cond2: &condition_not_24x (branch is not present OR (branch != 2.4.x AND branch !~ /^candidate-2.4/)) AND (tag is not present OR tag !~ /^2.4/)

jobs:
  include:
    - name: Linux Ubuntu, Default module set
    # -------------------------------------------------------------------------
    - name: Empty APLOGNO() test
      env: SKIP_TESTING=1 TEST_LOGNO=1
    # -------------------------------------------------------------------------
    - name: Linux s390x Ubuntu, all-modules
      arch: s390x
      env: CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - name: Linux ppc64le Ubuntu, all-modules
      arch: ppc64le
      env: CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - name: Linux arm64 Ubuntu, all-modules
      arch: arm64
      env: CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - if: *condition_not_24x
      name: Linux i386 Ubuntu, Shared MPMs, most modules, maintainer-mode w/-Werror
      env: CONFIG="--enable-mods-shared=reallyall --disable-xml2enc --disable-proxy-html --enable-mpms-shared=all --enable-maintainer-mode"
           PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig"
           NOTEST_CFLAGS="-Werror"
           CC="gcc -m32"
           APR_VERSION=1.7.0
           APU_VERSION=1.6.1 APU_CONFIG="--with-crypto --with-ldap"
      addons:
        apt:
          sources:
            - sourceline: 'deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe'
          packages:
            - cpanminus
            - libc6-dev-i386
            - gcc-multilib
            - libexpat1-dev:i386
            - libssl-dev:i386
            - lib32z1-dev
            - libbrotli-dev:i386
            - libpcre2-dev:i386
            - libldap2-dev:i386
            - libtool-bin
            - perl-doc
            - libapr1-dev
            - libbrotli-dev:i386
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Default, all-modules + install
      env: CONFIG="--enable-mods-shared=reallyall"
           TEST_INSTALL=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Default, all-static modules
      env: CONFIG="--enable-mods-static=reallyall"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Default, all-modules, random test order
      env: CONFIG="--enable-mods-shared=reallyall"
           TEST_ARGS="-order=random"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Prefork MPM, all-modules
      env: CONFIG="--enable-mods-shared=reallyall --with-mpm=prefork"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Worker MPM, all-modules
      env: CONFIG="--enable-mods-shared=reallyall --with-mpm=worker"
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Shared MPMs, all-modules
      env: CONFIG="--enable-mods-shared=reallyall --enable-mpms-shared=all"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, GCC 7 maintainer-mode w/-Werror, install + VPATH
      os: linux
      env: CONFIG="--enable-mods-shared=reallyall --enable-maintainer-mode"
           NOTEST_CFLAGS='-Werror -O2' CC=gcc-7
           TEST_VPATH=1 TEST_INSTALL=1 SKIP_TESTING=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Event MPM, all-modules, mod_cgid only
      env: CONFIG="--enable-mods-shared=reallyall --with-mpm=event --disable-cgi"
    # -------------------------------------------------------------------------
    - if: *condition_not_24x
      name: Linux Ubuntu, Event MPM, all-modules, mod_cgid fdpassing
      env: CONFIG="--enable-mods-shared=reallyall --with-mpm=event --disable-cgi --enable-cgid-fdpassing"
    # -------------------------------------------------------------------------
    - if: *condition_not_24x
      name: Linux Ubuntu, PCRE 1, GCC 7 maintainer-mode w/-Werror
      os: linux
      env: CONFIG="--enable-mods-shared=reallyall --with-pcre=/usr/bin/pcre-config --enable-maintainer-mode NOTEST_CFLAGS=-Werror CC=gcc-7"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, GCC 8 maintainer-mode w/-Werror
      env: CONFIG="--enable-mods-shared=reallyall --enable-maintainer-mode" NOTEST_CFLAGS='-Werror -O2' CC=gcc-8
           SKIP_TESTING=1
      addons:
        apt:
          packages:
            - gcc-8
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - libldap2-dev
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, GCC 9 maintainer-mode w/-Werror
      env: CONFIG="--enable-mods-shared=reallyall --enable-maintainer-mode" NOTEST_CFLAGS='-Werror -O2' CC=gcc-9
           SKIP_TESTING=1
      addons:
        apt:
          sources:
            - sourceline: 'ppa:ubuntu-toolchain-r/test'
          packages:
            - gcc-9
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - libldap2-dev
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, GCC 10 maintainer-mode w/-Werror
      env: CONFIG="--enable-mods-shared=reallyall --enable-maintainer-mode" NOTEST_CFLAGS='-Werror -O2' CC=gcc-10
           SKIP_TESTING=1
      addons:
        apt:
          sources:
            - sourceline: 'ppa:ubuntu-toolchain-r/test'
          packages:
            - gcc-10
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - libldap2-dev
    # -------------------------------------------------------------------------
    # MFLAGS= works around https://bz.apache.org/bugzilla/show_bug.cgi?id=63942
    - if: *condition_not_24x
      name: Linux Ubuntu, Regenerate ap_expr
      os: linux
      env: CONFIG="--enable-mods-shared=reallyall --enable-maintainer-mode NOTEST_CFLAGS=-Werror"
           BUILDCONFIG="--with-regen-expr"
           MFLAGS=
    # -------------------------------------------------------------------------
    - if: *condition_not_24x
      name: Linux Ubuntu, APR trunk
      env: APR_VERSION=trunk APR_CONFIG="--with-crypto"
           CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - if: *condition_24x_only
      name: Linux Ubuntu Xenial, all-modules, system APR/APR-util
      os: linux
      dist: xenial
      env: CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu Xenial, all-modules, APR 1.7.0, APR-util 1.6.1
      dist: xenial
      env: APR_VERSION=1.7.0 APU_VERSION=1.6.1
           CONFIG="--enable-mods-shared=reallyall"
           APU_CONFIG="--with-crypto --with-ldap"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu Focal, all-modules, system APR/APR-util
      os: linux
      dist: focal
      env: CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu Focal, all-modules, APR 1.7.0, APR-util 1.6.1
      dist: focal
      env: APR_VERSION=1.7.0 APU_VERSION=1.6.1
           CONFIG="--enable-mods-shared=reallyall"
           APU_CONFIG="--with-crypto --with-ldap"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, APR 1.7.0, APR-util 1.6.1
      env: APR_VERSION=1.7.0 APU_VERSION=1.6.1
           CONFIG="--enable-mods-shared=reallyall"
           APU_CONFIG="--with-crypto --with-ldap"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, APR 1.7.x, APR-util 1.7.x
      env: APR_VERSION=1.7.x APU_VERSION=1.7.x
           CONFIG="--enable-mods-shared=reallyall"
           APU_CONFIG="--with-crypto --with-ldap"
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, pool-debug
      env: APR_VERSION=1.7.x APR_CONFIG="--enable-pool-debug"
           APU_VERSION=1.7.x APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall"
           TEST_MALLOC=1
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Shared MPMs (event), pool-debug, SSL/TLS variants
      env: APR_VERSION=1.7.x APR_CONFIG="--enable-pool-debug"
           APU_VERSION=1.7.x APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=event"
           TEST_MALLOC=1 TEST_SSL=1
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Shared MPMs (worker), pool-debug, SSL/TLS variants
      env: APR_VERSION=1.7.x APR_CONFIG="--enable-pool-debug"
           APU_VERSION=1.7.x APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=worker"
           TEST_MALLOC=1 TEST_SSL=1
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, Shared MPMs (prefork), pool-debug, SSL/TLS variants
      env: APR_VERSION=1.7.x APR_CONFIG="--enable-pool-debug"
           APU_VERSION=1.7.x APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall --enable-mpms-shared=all --with-mpm=prefork"
           TEST_MALLOC=1 TEST_SSL=1
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, APR trunk, minimal module set, OpenSSL 3.x
      if: *condition_not_24x
      env: APR_VERSION=trunk APR_CONFIG="--without-pgsql --without-mysql --without-odbc --with-crypto"
           CONFIG="--enable-mods-shared=ssl --with-mpm=event"
           TEST_SSL=1 TEST_OPENSSL3=3.0.1
    # -------------------------------------------------------------------------
    - if: *condition_24x_only
      name: Linux Ubuntu, APR 1.7, minimal module set, OpenSSL 3.x
      env: APR_VERSION=1.7.0
           APU_VERSION=1.6.1 APU_CONFIG="--without-pgsql --without-mysql --without-odbc --with-crypto"
           CONFIG="--enable-mods-shared=ssl --with-mpm=event"
           TEST_SSL=1 TEST_OPENSSL3=3.0.1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, MPMs [event, worker], core + HTTP/2 test suite
      dist: focal
      env: APR_VERSION=1.7.0
           APU_VERSION=1.6.1 APU_CONFIG="--with-crypto"
           CONFIG="--enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=all"
           NO_TEST_FRAMEWORK=1 TEST_INSTALL=1 TEST_H2=1 TEST_CORE=1
      addons:
        apt:
          sources:
            - sourceline: 'deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe'
          packages:
            - cpanminus
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - libldap2-dev
            - ldap-utils
            - gdb
            - curl
            - python3-pytest
            - nghttp2-client
            - python3-cryptography
            - python3-requests
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, event MPM, ACME test suite
      dist: focal
      env: APR_VERSION=1.7.0
           APU_VERSION=1.6.1 APU_CONFIG="--with-crypto"
           CONFIG="--enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=event"
           NO_TEST_FRAMEWORK=1 TEST_INSTALL=1 TEST_MD=1
      addons:
        apt:
          sources:
            - sourceline: 'deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe'
          packages:
            - cpanminus
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - libldap2-dev
            - ldap-utils
            - gdb
            - curl
            - python3-pytest
            - nghttp2-client
            - python3-cryptography
            - python3-requests
            - golang-1.14
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, event MPM, MOD_TLS test suite
      dist: focal
      env: APR_VERSION=1.7.0
           APU_VERSION=1.6.1 APU_CONFIG="--with-crypto"
           CONFIG="--enable-mods-shared=reallyall --with-mpm=event --enable-mpms-shared=event"
           NO_TEST_FRAMEWORK=1 TEST_INSTALL=1 TEST_MOD_TLS=1
      addons:
        apt:
          sources:
            - sourceline: 'deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe'
          packages:
            - cpanminus
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - libldap2-dev
            - ldap-utils
            - gdb
            - curl
            - python3-pytest
            - nghttp2-client
            - python3-cryptography
            - python3-requests
            - cargo
            - cbindgen
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, APR 1.7.0, APR-util 1.6.1, LDAP
      env: APR_VERSION=1.7.0
           APU_VERSION=1.6.1 APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall"
           TEST_MALLOC=1 TEST_LDAP=1 TEST_ARGS="-defines LDAP"
           TESTS="t/modules/"
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu, litmus WebDAV tests
      env: CONFIG="--enable-dav --enable-dav-fs"
           LITMUS=1 TESTS="t/modules/dav.t"
      addons:
        apt:
          update: false
          sources:
            - sourceline: 'deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe'
          packages:
            - cpanminus
            - libtool-bin
            - libapr1-dev
            - libaprutil1-dev
            - perl-doc
            - liblua5.3-dev
            - libbrotli-dev
            - libcurl4-openssl-dev
            - libsystemd-dev
            - libnghttp2-dev
            - libjansson-dev
            - libpcre2-dev
            - litmus
    # -------------------------------------------------------------------------
    - if: *condition_24x_only
      name: Linux Ubuntu, APR 1.5.1, APR-util 1.5.4
      env: APR_VERSION=1.5.1 APU_VERSION=1.5.4
           CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - if: *condition_24x_only
      name: Linux Ubuntu, APR 1.4.8, APR-util 1.4.2
      env: APR_VERSION=1.4.8 APU_VERSION=1.4.2
           CONFIG="--enable-mods-shared=reallyall"
    # -------------------------------------------------------------------------
    - if: *condition_not_24x
      name: Linux Ubuntu Focal, UBSan
      dist: focal
      env: NOTEST_CFLAGS="-fsanitize=undefined -fno-sanitize-recover=undefined" NOTEST_LIBS=-lubsan
           CONFIG="--enable-mods-shared=reallyall --disable-http2"
           TEST_UBSAN=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu Focal, ASan
      dist: focal
      env: NOTEST_CFLAGS="-ggdb -fsanitize=address -fno-sanitize-recover=address -fno-omit-frame-pointer"
           APR_VERSION=1.7.x
           APU_VERSION=1.7.x APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall"
           TEST_ASAN=1
           CLEAR_CACHE=1
    # -------------------------------------------------------------------------
    - name: Linux Ubuntu Focal, ASan, pool-debug
      dist: focal
      env: NOTEST_CFLAGS="-ggdb -fsanitize=address -fno-sanitize-recover=address -fno-omit-frame-pointer"
           APR_VERSION=1.7.x APR_CONFIG="--enable-pool-debug"
           APU_VERSION=1.7.x APU_CONFIG="--with-crypto --with-ldap"
           CONFIG="--enable-mods-shared=reallyall"
           TEST_ASAN=1
           CLEAR_CACHE=1
  allow_failures:
    # Intermittent failures:
    - env: CONFIG="--enable-mods-shared=reallyall --with-mpm=worker"
    # Currently broken:
    - env: CONFIG="--enable-mods-shared=reallyall --with-mpm=event --disable-cgi --enable-cgid-fdpassing"
    # Non-x86 are sometimes flaky:
    - arch: s390x
      env: CONFIG="--enable-mods-shared=reallyall"
    - arch: arm64
      env: CONFIG="--enable-mods-shared=reallyall"
    - arch: ppc64le
      env: CONFIG="--enable-mods-shared=reallyall"

# CPAN modules are to be used with the system Perl and always with
# CC=gcc, e.g. for the CC="gcc -m32" case the builds are not correct
# otherwise.
before_install:
  - if [ "$TRAVIS_OS_NAME" = "linux" -a ! -v SKIP_TESTING ]; then
        if [ -v CLEAR_CACHE ]; then rm -rf ~/perl5; fi;
        cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib);
        CC=gcc cpanm --notest Net::SSL LWP::Protocol::https ExtUtils::Embed Test::More AnyEvent DateTime HTTP::DAV Protocol::HTTP2::Client FCGI AnyEvent::WebSocket::Client Apache::Test;
    fi

before_script:
  - ./test/travis_before_${TRAVIS_OS_NAME}.sh

script:
  - ./test/travis_run_${TRAVIS_OS_NAME}.sh

# Send notifications by default to IRC and dev@, for everything but
# forks, otherwise any build from a fork will spam the list with CI
# results.
notifications:
  irc:
    if: fork = false
    channels:
      - "irc.libera.chat#httpd-dev"
  email:
    if: fork = false
    recipients:
      - dev@httpd.apache.org
