# 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.

# To learn more about GitHub Actions in Apache Beam check the CI.md

name: Java Tests

on:
  workflow_dispatch:
    inputs:
      runDataflow:
        description: 'Type "true" if you want to run Dataflow tests (GCP variables must be configured, check CI.md)'
        default: false
  schedule:
    - cron: '10 2 * * *'
  push:
    branches: ['master', 'release-*']
    tags: 'v*'
  pull_request:
    branches: ['master', 'release-*']
    tags: 'v*'
    paths: ['sdks/java/**', 'model/**', 'runners/**', 'examples/java/**', 'examples/kotlin/**', 'release/**']


jobs:

  check_gcp_variables:
    timeout-minutes: 5
    name: "Check GCP variables set"
    runs-on: ubuntu-latest
    outputs:
      gcp-variables-set: ${{ steps.check_gcp_variables.outputs.gcp-variables-set }}
    steps:
      - uses: actions/checkout@v2
      - name: "Check are GCP variables set"
        run: "./scripts/ci/ci_check_are_gcp_variables_set.sh"
        id: check_gcp_variables
        env:
          GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
          GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }}
          GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
          GCP_TESTING_BUCKET: ${{ secrets.GCP_TESTING_BUCKET }}
          GCP_REGION: "not-needed-here"
          GCP_PYTHON_WHEELS_BUCKET: "not-needed-here"

  java_unit_tests:
    name: 'Java Unit Tests'
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      # :sdks:java:core:test
      - name: Run :sdks:java:core:test
        uses: eskatos/gradle-command-action@v1
        with:
          arguments: :sdks:java:core:test
      - name: Upload test logs for :sdks:java:core:test
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: java_unit_tests-sdks-java-core-test-${{ matrix.os }}
          path: sdks/java/core/build/reports/tests/test
      # :sdks:java:harness:test
      - name: Run :sdks:java:harness:test
        uses: eskatos/gradle-command-action@v1
        with:
          arguments: :sdks:java:harness:test
        if: always()
      - name: Upload test logs for :sdks:java:harness:test
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: java_unit_tests-sdks-java-harness-test-${{ matrix.os }}
          path: sdks/java/harness/build/reports/tests/test
      # :runners:core-java:test
      - name: Run :runners:core-java:test
        uses: eskatos/gradle-command-action@v1
        with:
          arguments: :runners:core-java:test
        if: always()
      - name: Upload test logs for :runners:core-java:test
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: java_unit_tests-runners-core-java-test-${{ matrix.os }}
          path: runners/core-java/build/reports/tests/test

  java_wordcount_direct_runner:
    name: 'Java Wordcount Direct Runner'
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Run WordCount Unix
        uses: eskatos/gradle-command-action@v1
        with:
          arguments: -p examples/ integrationTest --tests org.apache.beam.examples.WordCountIT
            -DintegrationTestRunner=direct
            -DintegrationTestPipelineOptions=["--runner=DirectRunner","--tempRoot=./tmp"]
      - name: Upload test logs
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: java_wordcount_direct_runner-${{matrix.os}}
          path: examples/java/build/reports/tests/integrationTest

  java_wordcount_dataflow:
    name: 'Java Wordcount Dataflow'
    needs:
      - check_gcp_variables
    runs-on: ${{ matrix.os }}
    if: |
      needs.check_gcp_variables.outputs.gcp-variables-set == 'true' && (
        (github.event_name == 'push' || github.event_name == 'schedule') ||
        (github.event_name == 'workflow_dispatch' && github.event.inputs.runDataflow == 'true')
      )
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Authenticate on GCP
        uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
        with:
          service_account_email: ${{ secrets.GCP_SA_EMAIL }}
          service_account_key: ${{ secrets.GCP_SA_KEY }}
          project_id: ${{ secrets.GCP_PROJECT_ID }}
          export_default_credentials: true
      - name: Run WordCount
        uses: eskatos/gradle-command-action@v1
        with:
          arguments: -p examples/ integrationTest --tests org.apache.beam.examples.WordCountIT
            -DintegrationTestPipelineOptions=["--runner=DataflowRunner","--project=${{ secrets.GCP_PROJECT_ID }}","--tempRoot=gs://${{ secrets.GCP_TESTING_BUCKET }}/tmp/"]
            -DintegrationTestRunner=dataflow
      - name: Upload test logs
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: java_wordcount_dataflow-${{matrix.os}}
          path: examples/java/build/reports/tests/integrationTest
