language: python

cache:
    directories:
        - $HOME/.cache/pip

before_script:
  - 'if [ $TRAVIS_OS_NAME = osx ] ; then ulimit -n 1024 ; fi'
  - export TOX_TESTENV_PASSENV=TRAVIS

# Only build pushes to the master branch, PRs, and branches beginning with
# `test-` or of the form `digit(s).digit(s).x`. This reduces the number of
# simultaneous Travis runs, which speeds turnaround time on review since there
# is a cap of on the number of simultaneous runs.
branches:
  only:
    - master
    - /^\d+\.\d+\.x$/
    - /^test-.*$/

# Jobs for the main test suite are always executed (including on PRs) except for pushes on master.
not-on-master: &not-on-master
  if: NOT (type = push AND branch = master)

# Jobs for the extended test suite are executed for cron jobs and pushes on non-master branches.
extended-test-suite: &extended-test-suite
  if: type = cron OR (type = push AND branch != master)

matrix:
  include:
    # Main test suite
    - python: "2.7"
      env: BOULDER_INTEGRATION=v1 INTEGRATION_TEST=all TOXENV=py27_install
      sudo: required
      services: docker
      <<: *not-on-master
    - python: "2.7"
      env: BOULDER_INTEGRATION=v2 INTEGRATION_TEST=all TOXENV=py27_install
      sudo: required
      services: docker
      <<: *not-on-master

    # This job is always executed, including on master
    - python: "2.7"
      env: TOXENV=py27-cover FYI="py27 tests + code coverage"

    - sudo: required
      env: TOXENV=nginx_compat
      services: docker
      before_install:
      addons:
      <<: *not-on-master
    - python: "2.7"
      env: TOXENV=lint
      <<: *not-on-master
    - python: "3.4"
      env: TOXENV=mypy
      <<: *not-on-master
    - python: "3.5"
      env: TOXENV=mypy
      <<: *not-on-master
    - python: "2.7"
      env: TOXENV='py27-{acme,apache,certbot,dns,nginx,postfix}-oldest'
      sudo: required
      services: docker
      <<: *not-on-master
    - python: "3.4"
      env: TOXENV=py34
      sudo: required
      services: docker
      <<: *not-on-master
    - python: "3.7"
      dist: xenial
      env: TOXENV=py37
      sudo: required
      services: docker
      <<: *not-on-master
    - sudo: required
      env: TOXENV=apache_compat
      services: docker
      before_install:
      addons:
      <<: *not-on-master
    - sudo: required
      env: TOXENV=le_auto_trusty
      services: docker
      before_install:
      addons:
      <<: *not-on-master
    - python: "2.7"
      env: TOXENV=apacheconftest-with-pebble
      sudo: required
      services: docker
      <<: *not-on-master
    - python: "2.7"
      env: TOXENV=nginxroundtrip
      <<: *not-on-master

    # Extended test suite on cron jobs and pushes to tested branches other than master
    - python: "3.7"
      dist: xenial
      env: TOXENV=py37 CERTBOT_NO_PIN=1
      <<: *extended-test-suite
    - python: "2.7"
      env: BOULDER_INTEGRATION=v1 INTEGRATION_TEST=certbot TOXENV=py27-certbot-oldest
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "2.7"
      env: BOULDER_INTEGRATION=v2 INTEGRATION_TEST=certbot TOXENV=py27-certbot-oldest
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "2.7"
      env: BOULDER_INTEGRATION=v1 INTEGRATION_TEST=nginx TOXENV=py27-nginx-oldest
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "2.7"
      env: BOULDER_INTEGRATION=v2 INTEGRATION_TEST=nginx TOXENV=py27-nginx-oldest
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.4"
      env: TOXENV=py34 BOULDER_INTEGRATION=v1
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.4"
      env: TOXENV=py34 BOULDER_INTEGRATION=v2
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.5"
      env: TOXENV=py35 BOULDER_INTEGRATION=v1
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.5"
      env: TOXENV=py35 BOULDER_INTEGRATION=v2
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.6"
      env: TOXENV=py36 BOULDER_INTEGRATION=v1
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.6"
      env: TOXENV=py36 BOULDER_INTEGRATION=v2
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.7"
      dist: xenial
      env: TOXENV=py37 BOULDER_INTEGRATION=v1
      sudo: required
      services: docker
      <<: *extended-test-suite
    - python: "3.7"
      dist: xenial
      env: TOXENV=py37 BOULDER_INTEGRATION=v2
      sudo: required
      services: docker
      <<: *extended-test-suite
    - sudo: required
      env: TOXENV=le_auto_xenial
      services: docker
      <<: *extended-test-suite
    - sudo: required
      env: TOXENV=le_auto_jessie
      services: docker
      <<: *extended-test-suite
    - sudo: required
      env: TOXENV=le_auto_centos6
      services: docker
      <<: *extended-test-suite
    - sudo: required
      env: TOXENV=docker_dev
      services: docker
      addons:
        apt:
          packages:  # don't install nginx and apache
            - libaugeas0
      <<: *extended-test-suite
    - language: generic
      env: TOXENV=py27
      os: osx
      addons:
        homebrew:
          packages:
            - augeas
            - python2
      <<: *extended-test-suite
    - language: generic
      env: TOXENV=py3
      os: osx
      addons:
        homebrew:
          packages:
            - augeas
            - python3
      <<: *extended-test-suite

# container-based infrastructure
sudo: false

addons:
  apt:
    packages:  # Keep in sync with letsencrypt-auto-source/pieces/bootstrappers/deb_common.sh and Boulder.
    - python-dev
    - python-virtualenv
    - gcc
    - libaugeas0
    - libssl-dev
    - libffi-dev
    - ca-certificates
    # For certbot-nginx integration testing
    - nginx-light
    - openssl

install: "$(command -v pip || command -v pip3) install codecov tox"
script:
    - tox
    - '[ -z "${BOULDER_INTEGRATION+x}" ] || (tests/boulder-fetch.sh && tests/tox-boulder-integration.sh)'

after_success: '[ "$TOXENV" == "py27-cover" ] && codecov'

notifications:
  email: false
  irc:
    channels:
      - secure: "SGWZl3ownKx9xKVV2VnGt7DqkTmutJ89oJV9tjKhSs84kLijU6EYdPnllqISpfHMTxXflNZuxtGo0wTDYHXBuZL47w1O32W6nzuXdra5zC+i4sYQwYULUsyfOv9gJX8zWAULiK0Z3r0oho45U+FR5ZN6TPCidi8/eGU+EEPwaAw="
    on_cancel: never
    on_success: never
    on_failure: always
    use_notice: true
