language: node_js

node_js:
  - "lts/*"

services:
  - docker

cache: false

env:
  global:
    - secure: "WMGxFkOeTTlhWB+ChMucRtIqVmMbwzYdNHuHQjKCcj8HBEPdZLfCuK/kf4rG\nVLcLQiIsyllqzNhBGVHG1nyqWr0/LTm8JRqSCDDVIhpyzp9KpCJQQJG2Uwjk\n6/HIJJh/wbxsEdLNV2crYU/EiVO3A4Bq0YTHUlbhUqG3mSCr5Ec="
    - secure: "gejXUAHYscbR6Bodw35XexpToqWkv2ifeECsbeEmjaLkYzXmUUNWJGknKSu7\nEUsSfQV8w+hxApr1Z+jNqk9aX3K1I4btL3cwk2trnNI8XRAvu1c1Iv60eerI\nkE82Rsd5lwUaMEh+/HoL8ztFCZamVndoNgX7HWp5J/NRZZMmh4g="

_set_loglevel_warn: &set_loglevel_warn |
  sed -e 's/"loglevel":[^,]*/"loglevel": "WARN"/' \
      settings.json.template >settings.json.template.new &&
  mv settings.json.template.new settings.json.template

_enable_admin_tests: &enable_admin_tests |
sed -e 's/"enableAdminUITests": false/"enableAdminUITests": true,\n"users":{"admin":{"password":"changeme","is_admin":true}}/' \
      settings.json.template >settings.json.template.new &&
  mv settings.json.template.new settings.json.template

_install_libreoffice: &install_libreoffice >-
  sudo add-apt-repository -y ppa:libreoffice/ppa &&
  sudo apt-get update &&
  sudo apt-get -y install libreoffice libreoffice-pdfimport

# The --legacy-peer-deps flag is required to work around a bug in npm v7:
# https://github.com/npm/cli/issues/2199
_install_plugins: &install_plugins >-
  npm install --no-save --legacy-peer-deps
  ep_align
  ep_author_hover
  ep_cursortrace
  ep_font_size
  ep_hash_auth
  ep_headings2
  ep_markdown
  ep_readonly_guest
  ep_spellcheck
  ep_subscript_and_superscript
  ep_table_of_contents
  ep_set_title_on_pad

jobs:
  include:
    # we can only frontend tests from the ether/ organization and not from forks.
    # To request tests to be run ask a maintainer to fork your repo to ether/
    - if: fork = false
      name: "Test the Frontend without Plugins"
      install:
        - *set_loglevel_warn
        - *enable_admin_tests
        - "src/tests/frontend/travis/sauce_tunnel.sh"
        - "bin/installDeps.sh"
        - "export GIT_HASH=$(git rev-parse --verify --short HEAD)"
      script:
        - "./src/tests/frontend/travis/runner.sh"
    - name: "Run the Backend tests without Plugins"
      install:
        - *install_libreoffice
        - *set_loglevel_warn
        - "bin/installDeps.sh"
        - "cd src && pnpm install && cd -"
      script:
        - "cd src && pnpm test"
    - name: "Test the Dockerfile"
      install:
        - "cd src && pnpm install && cd -"
      script:
        - "docker build -t etherpad:test ."
        - "docker run -d -p 9001:9001 etherpad:test && sleep 3"
        - "cd src && pnpm run test-container"
    - name: "Load test Etherpad without Plugins"
      install:
        - *set_loglevel_warn
        - "bin/installDeps.sh"
        - "cd src && pnpm install && cd -"
        - "npm install -g etherpad-load-test"
      script:
        - "src/tests/frontend/travis/runnerLoadTest.sh"
    # we can only frontend tests from the ether/ organization and not from forks.
    # To request tests to be run ask a maintainer to fork your repo to ether/
    - if: fork = false
      name: "Test the Frontend Plugins only"
      install:
        - *set_loglevel_warn
        - *enable_admin_tests
        - "src/tests/frontend/travis/sauce_tunnel.sh"
        - "bin/installDeps.sh"
        - "rm src/tests/frontend/specs/*"
        - *install_plugins
        - "export GIT_HASH=$(git rev-parse --verify --short HEAD)"
      script:
        - "./src/tests/frontend/travis/runner.sh"
    - name: "Lint test package-lock.json"
      install:
        - "npm install lockfile-lint"
      script:
        - npx lockfile-lint --path src/package-lock.json --validate-https --allowed-hosts npm
    - name: "Run the Backend tests with Plugins"
      install:
        - *install_libreoffice
        - *set_loglevel_warn
        - "bin/installDeps.sh"
        - *install_plugins
        - "cd src && pnpm install && cd -"
      script:
        - "cd src && pnpm test"
    - name: "Test the Dockerfile"
      install:
        - "cd src && pnpm install && cd -"
      script:
        - "docker build -t etherpad:test ."
        - "docker run -d -p 9001:9001 etherpad:test && sleep 3"
        - "cd src && pnpm run test-container"
    - name: "Load test Etherpad with Plugins"
      install:
        - *set_loglevel_warn
        - "bin/installDeps.sh"
        - *install_plugins
        - "cd src && npm install && cd -"
        - "npm install -g etherpad-load-test"
      script:
        - "src/tests/frontend/travis/runnerLoadTest.sh"
    - name: "Test rate limit"
      install:
        - "docker network create --subnet=172.23.42.0/16 ep_net"
        - "docker build -f Dockerfile -t epl-debian-slim ."
        - "docker build -f src/tests/ratelimit/Dockerfile.nginx -t nginx-latest ."
        - "docker build -f src/tests/ratelimit/Dockerfile.anotherip -t anotherip ."
        - "docker run -p 8081:80 --rm --network ep_net --ip 172.23.42.1 -d nginx-latest"
        - "docker run --name etherpad-docker -p 9000:9001 --rm --network ep_net --ip 172.23.42.2 -e 'TRUST_PROXY=true' epl-debian-slim &"
        - "docker run --rm --network ep_net --ip 172.23.42.3 --name anotherip -dt anotherip"
        - "./bin/installDeps.sh"
      script:
        - "cd src/tests/ratelimit && bash testlimits.sh"

notifications:
  irc:
    channels:
      - "irc.freenode.org#etherpad-lite-dev"
