#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

os: linux
dist: focal
language: java
jdk: openjdk11

services:
  - docker

env:
  global:
    - ANSIBLE_CMD="ansible-playbook -i environments/local -e docker_image_prefix=testing"
    - GRADLE_PROJS_SKIP=""

notifications:
  email: false
  slack:
    rooms:
      - secure: "Rrj5ya7JV7bfgW3GXZpuRsX2e9/qsTpLLVZAzgq2Z3xW/IVAqeAM8DDR0tjPbR7Nou0RpPtE/ynkps4Qd6CGTBiCULpcGi2cXJ+p35WvaweWlFIKU0Vam9iEWXQ+bG1LwB61LrSmD7DJvOxkZiwtagqUfYLhVeD1WfgcWc/lj0F0julCScujqqJbj/jUnlkSm6VJz9m11NQkvZZ+YFgNYCPAQRmSh59K0ELximJ54C4/af05YHq6QLWUh/2Eoa68p3XzQyONtteMRvbAJgmMGIijQsKa+ZELrZPjz/5EplMA+FEUjoW6tn3NQjQgZOdDHq3fEbnuit0OOBMRu5QhYT0MjV6QJANYmJU2QqVoDubgTtQSeHJNYoM1fI15yfuSCJg+H6FnI0ncXRB3zz7EZ3zksKKeWZ20NQVKBNCYRNIBC8Im3ff8TbZdulH/Qk/NEeOJwpgm8yfUqUqLu3dt13KT0JdxEcQeOX5lRmz+XBrN6C52/fX0NstO2OCxpKhKcq2+B/Y3mCn6ywqAiTtaLyhPrW08cCB3sBX8y5/Q3do8KPWO1MiBc/K+qtK481bnkh41DaLasqpltpEkFhCW/Udl8iuYEkMWZwNdhEUv6uuPiKF9da4FJkhIV3xVYOzrjF6xR2BtmHVGnCVMMoCUQo9tG8K9tOf+omH+KezZPuw="
      - secure: "WgdL9/Z/9+rl6edh+mqDiO0mx8JpxYwIrudYwuZUZ7d/9oUzS8Miid7au7Y1PP0CVPVDEvastw6+NnIVA/BIHTBNj488dTeNXumaaNQlaTTvaI9OLN1w3+GVVFuF64gmJ6I2T6x+qxqlYOwQhyZ8jZEJUXQ3VwE6DPz+KNqpBy+6GgWEvi+2lgGhc2Ko3SPAtcDWAdE6t8ELaO2uLh/JU60ndAi4yT297fOfwWi4I1aee5a+LajbJN6Mz89o5o0Y2GHV83a3D/ablt1CH3kRSErqLV3HDbt5eRR4yFhTPpbZG8yeWcZkP0oKyt3QqSen1paiEeqr7R9OspDf2OLSlWx7TGm/BnNW/3YRI3+gUPHqaJPCLldNRWnbYYd0RFGjVOfVOoYhAWAMdkWT48jX3YGE1LaZ0SwlxpMy5Fpj8Q22SVXY51o5Pw1UomUhGz2Hjfj8b0WbkWQ+q5qpgR8/z4Zfz5i3MY03mQNzeXs4Z9NoznIiz+9eQVpi4tkjUH3o2AFi6VXTdire61vfhFG3iYYqo2woKwNWOVaK/g0l13EVWiK62YxQEUZJbmhLb6VQrABrB2FCWl/+zZOOR3OUeie3AgAmxEwjxN9Y1IgMy0bJWEZ+ECf//39XMgj5Ys/gPsejDjPsWxhO6cuNtGq9K6RsPij1a0E+01JcyrNyNX0="
    on_pull_requests: false
    on_success: change
    on_failure: always
  webhooks:
    urls:
      # travis2slack webhook to enable DMs on openwhisk-team.slack.com to PR authors with TravisCI results
      secure: "qSkFNkMDYhp025vW+hBWO4wlMEeaz2S2c3tsZgIhcqji58AAxL2KKuNIWAuzftIxC5l5RwPt/OBXWFjgnAwCjj3hfczMfpuexGPruzmRe2GYbBwS0OhwDkWVosl9UqFELbZEdQ/tTJyW7p3Gd4FSjCJBCAdRL5yYcn3RiCj/UrJ6454IkKqeuTihWp2ZklqnZpMv9WzC4DK+cI/rJUP5megh/gilORfBD5/wnMMksC5NSlpc2WAtdeKusVZiZ6ieR6uLoR3rwzgUBC3PbyX8GO1OIh+LnvO7c0Hrhc2u685nxrCMseJIH9kZQboGA7RbiH64U5Zy7dK6fiFGfQJc3YyfsbKBKyd0QlvZp1vKw4iAvtsyentodjR1lN29fuTUW3hPMCo/YJSxZmHHMRSsoqs4zMp7lHo0aDfBOJRB+jjluA96Tn8SZjIATu76SwzJ0EolyVGw25HqKxSX0eM0ZLgrVrh89CwSlEYop07lQzaa1QTFu9DizONS8jlQYpXoAdgfeBXPDCyHVUzYjljzKyZG2Ph86eEo1mdHOlDyPI0hHuspBObP/mxSKXldxgBDRJ2jvF75t9DcxZdDzis5HBZeEktyIFaLS7spHlQLqGNEnpxNc+FxpT52Uw/sYJ6e1OG2Qx3Jhz4NNo4wJWUkdS1saaFCxIlyh7pqjpnsWqU="

# specific cache configuration for gradle based builds
# see: https://docs.travis-ci.com/user/languages/java/#caching
before_cache:
  - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
  - rm -fr $HOME/.gradle/caches/*/plugin-resolution/

cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/

before_install:
  - sudo systemctl stop epmd.socket epmd.service
  - ./tools/travis/docker.sh
  - sudo apt-get install -y python3-pip
  - pip install --user --upgrade pip setuptools six
  - pip3 install --user --upgrade pip setuptools six

install:
  - ./tools/travis/setup.sh

jobs:
  include:
    - script:
        - TERM=dumb OW_SCALA_VERSION=2.13 ./gradlew :tests:compileTestScala
      name: "Scala 2.13 compilation"
    - script:
        - ./tools/travis/runUnitTests.sh
        - ./tools/travis/checkAndUploadLogs.sh unit db
      name: "Unit Tests"
    - script:
      - ./tools/travis/runSystemTests.sh
      - ./tools/travis/checkAndUploadLogs.sh system
      name: "System Tests"
    - script:
      - ./tools/travis/runMultiRuntimeTests.sh
      - ./tools/travis/checkAndUploadLogs.sh multi-runtime
      name: "Multi-Runtime Tests"
    - script:
        - ./tools/travis/runStandaloneTests.sh
        - ./tools/travis/checkAndUploadLogs.sh standalone
      name: "Standalone Tests"
    - script:
        - ./tests/performance/preparation/deploy.sh
        - TERM=dumb ./tests/performance/wrk_tests/latency.sh "https://172.17.0.1:10001" "$(cat ansible/files/auth.guest)" ./tests/performance/preparation/actions/noop.js 2m
        - TERM=dumb ./tests/performance/wrk_tests/latency.sh "https://172.17.0.1:10001" "$(cat ansible/files/auth.guest)" ./tests/performance/preparation/actions/async.js 2m
        - TERM=dumb ./tests/performance/wrk_tests/throughput.sh "https://172.17.0.1:10001" "$(cat ansible/files/auth.guest)" ./tests/performance/preparation/actions/noop.js 4 1 2 2m
        - TERM=dumb ./tests/performance/wrk_tests/throughput.sh "https://172.17.0.1:10001" "$(cat ansible/files/auth.guest)" ./tests/performance/preparation/actions/async.js 4 1 2 2m
        - TERM=dumb ./tests/performance/wrk_tests/throughput.sh "https://172.17.0.1:10001" "$(cat ansible/files/auth.guest)" ./tests/performance/preparation/actions/noop.js 100 110 2 2m
        - TERM=dumb ./tests/performance/wrk_tests/throughput.sh "https://172.17.0.1:10001" "$(cat ansible/files/auth.guest)" ./tests/performance/preparation/actions/async.js 100 110 2 2m
        - OPENWHISK_HOST="172.17.0.1" CONNECTIONS="100" REQUESTS_PER_SEC="1" ./gradlew gatlingRun-org.apache.openwhisk.ApiV1Simulation
        - OPENWHISK_HOST="172.17.0.1" MEAN_RESPONSE_TIME="1000" API_KEY="$(cat ansible/files/auth.guest)" EXCLUDED_KINDS="python:default,java:default,swift:default" PAUSE_BETWEEN_INVOKES="100" ./gradlew gatlingRun-org.apache.openwhisk.LatencySimulation
        - OPENWHISK_HOST="172.17.0.1" API_KEY="$(cat ansible/files/auth.guest)" CONNECTIONS="100" REQUESTS_PER_SEC="1" ./gradlew gatlingRun-org.apache.openwhisk.BlockingInvokeOneActionSimulation
        - OPENWHISK_HOST="172.17.0.1" API_KEY="$(cat ansible/files/auth.guest)" CONNECTIONS="100" REQUESTS_PER_SEC="1" ASYNC="true" ./gradlew gatlingRun-org.apache.openwhisk.BlockingInvokeOneActionSimulation
        # The following configuration does not make much sense. But we do not have enough users. But it's good to verify, that the test is still working.
        - OPENWHISK_HOST="172.17.0.1" USERS="1" REQUESTS_PER_SEC="1" ./gradlew gatlingRun-org.apache.openwhisk.ColdBlockingInvokeSimulation
        - ./tools/travis/checkAndUploadLogs.sh perf
      name: "Performance Tests"
    - script:
        - ./tools/travis/runSchedulerTests.sh
        - ./tools/travis/checkAndUploadLogs.sh scheduler
      name: "Scheduler Tests"
