language: generic

services:
  - docker

addons:
  apt:
    packages:
      - docker-ce

cache:
  apt: true
  directories:
    - $HOME/.npm
    - vendor

env:
  global:
    - LOCAL_DIR: build
    - COMPOSER_INSTALL: false
    - NPM_INSTALL: true
    - WP_INSTALL: true
    - PHP_FPM_UID: "`id -u`"
    - PHP_FPM_GID: "`id -g`"
    - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true

matrix:
  include:
  - env: WP_TRAVISCI=test:e2e PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
    name: E2E Tests
  - env: WP_TRAVISCI=lint:php COMPOSER_INSTALL=true NPM_INSTALL=false WP_INSTALL=false
    name: PHP Linting
  - env: WP_TRAVISCI=travis:js WP_INSTALL=false
    name: JS Tests
  - env: WP_TRAVISCI=test:compat COMPOSER_INSTALL=true NPM_INSTALL=false WP_INSTALL=false
    name: "PHP Compatibility Check"
  - env: LOCAL_PHP=7.4-fpm WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 7.4"
  - env: LOCAL_PHP=7.3-fpm WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 7.3"
  - env: LOCAL_PHP=7.3-fpm LOCAL_PHP_MEMCACHED=true WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 7.3 with Memcached"
  - env: LOCAL_PHP=7.2-fpm WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 7.2"
  - env: LOCAL_PHP=7.1-fpm WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 7.1"
  - env: LOCAL_PHP=7.0-fpm WP_TEST_REPORTER=true WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 7.0"
  - env: LOCAL_PHP=5.6-fpm WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 5.6"
  - env: LOCAL_PHP=8.0-fpm WP_TRAVISCI=test:php
    name: "PHPUnit Tests: PHP 8.0"
  allow_failures:
  - env: WP_TRAVISCI=test:compat COMPOSER_INSTALL=true NPM_INSTALL=false WP_INSTALL=false
  - env: LOCAL_PHP=8.0-fpm WP_TRAVISCI=test:php
  fast_finish: true

before_install:
- |
  if [[ "$WP_TRAVISCI" == "test:php" ]]; then
      travis_retry svn checkout -r 2170172 https://plugins.svn.wordpress.org/wordpress-importer/trunk/ tests/phpunit/data/plugins/wordpress-importer
  fi
- |
  sudo rm /usr/local/bin/docker-compose
  curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > docker-compose
  chmod +x docker-compose
  sudo mv docker-compose /usr/local/bin

before_script:
- |
  if [[ "$COMPOSER_INSTALL" == "true" ]]; then
    docker-compose run --rm php composer --version
    docker-compose run --rm php composer install
  fi
- npm --version
- node --version
- nvm install 10.13.0
- |
  if [[ "$NPM_INSTALL" == "true" ]]; then
    npm ci
  fi
- |
  if [[ "$WP_TRAVISCI" == "test:e2e" ]] || [[ "$WP_TRAVISCI" == "test:php" ]]; then
    npm run env:start
    npm run build
    docker-compose run --rm mysql mysql --version
    docker-compose run --rm php php --version
    docker-compose run --rm php php -m
    docker-compose run --rm phpunit phpunit --version
  fi
- |
  if [[ "$LOCAL_PHP_MEMCACHED" == "true" ]]; then
    cp tests/phpunit/includes/object-cache.php build/wp-content/object-cache.php
    # The memcached server needs to start after `npm run env:start`, which sets up the Docker network.
    docker run --name memcached --net $(basename "$PWD")_wpdevnet -d memcached
  fi
- |
  if [[ "$WP_INSTALL" == "true" ]]; then
    # Run the install process after memcached has started.
    npm run env:install
  fi
- npm --version
- node --version
- curl --version
- git --version
- svn --version
- php --version
- php -i
- locale -a

script:
  - |
    if [[ "$WP_TRAVISCI" == "test:e2e" ]]; then
      npm run test:e2e
    elif [[ "$WP_TRAVISCI" == "test:php" ]]; then
      npm run test:php -- --verbose -c phpunit.xml.dist &&
      npm run test:php -- --verbose -c phpunit.xml.dist --group ajax &&
      npm run test:php -- --verbose -c tests/phpunit/multisite.xml &&
      npm run test:php -- --verbose -c tests/phpunit/multisite.xml --group ms-files &&
      npm run test:php -- --verbose -c phpunit.xml.dist --group external-http &&
      npm run test:php -- --verbose -c phpunit.xml.dist --group restapi-jsclient &&
      # __fakegroup__ is excluded to force PHPUnit to ignore the <exclude> settings in phpunit.xml.dist.
      LOCAL_PHP_XDEBUG=true npm run test:php -- -v --group xdebug --exclude-group __fakegroup__
    elif [[ "$WP_TRAVISCI" == "lint:php" ]]; then
      docker-compose run --rm php composer format &&
      docker-compose run --rm php composer lint:errors &&
      docker-compose run --rm php composer lint tests
    elif [[ "$WP_TRAVISCI" == "test:compat" ]]; then
      docker-compose run --rm php composer compat
    else
      npm run grunt $WP_TRAVISCI
    fi

after_script:
- |
  if [[ "$WP_TEST_REPORTER" == "true" ]]; then
    git clone https://github.com/WordPress/phpunit-test-runner.git test-runner
    docker-compose run --rm -e WPT_REPORT_API_KEY -e WPT_PREPARE_DIR=/var/www -e WPT_TEST_DIR=/var/www php php test-runner/report.php
  fi

notifications:
  slack:
    rooms:
      secure: PO3x/bhYXNFqAMtzDzpOAnHcg2KzG2gGbBDft1HlqN4O8hRJqrRs7hqsEe9wKZUs6qf9Jv0ZleJ5AmcSd0DbDAFsfqeWtnWpsj8NqOIWgLX0C2idvfNRzCX1mUd6E1hlAjjTGnKn4MV3m1dRurwcDqacSBVtbXKQ+yPSgM3eXYkDz8EFbTsMcda8pFskcXr98E7/YomU0QtgOcjXndxGZ53zUQ1rfaDwUJzGY3bn5nLoweVZsSIeEFSiNcip7Kt22zVlU0SAb6QlBf3F0h9IWoRD59BQ7pkl53FWzpXoHzUYOFmn0jB5y1vHMlHvTDVEmDuumpCEqnxVvLh33AwGtqYRWH36PEfTn/u1YTFr7FS7KbwrKw9Nn+jUZe3KFrVzgQNUt0El33mO0FbSoNEWJhxRarp0D1z3/HVsbon3Fwzt/3jBHGf9nI+tHH4u7KQ70+M7pzBsV7F7Lc60YnuKrcy/hkwObGB0Za9tMHPUw3c7b4ep6nSa4ts9S++IijLWDaNAq7K/j7fAfI1JrkPIw4T6PcGpNAADkmlCrvToKE4axExaJke/lkUb+3Pwdj0h7ePzPSrHT8aASlKFM1PuI1KRMn/J4wRLtGeLlfYXvVlaQYmJobJtYgoiNWJWMIybLGVBSVPohdGO3qIJbl8WNPN1cW2ZZTcEBprLe8y7MSo=
    on_start: never
    on_failure: always
    on_success: change
    on_pull_requests: false