# 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/**', 'buildSrc/**']


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
        with:
          persist-credentials: false
          submodules: recursive
      # :sdks:java:core:test
      - name: Run :sdks:java:core:test
        uses: ./.github/actions/gradle-command-action
        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: ./.github/actions/gradle-command-action
        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: ./.github/actions/gradle-command-action
        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
        with:
          persist-credentials: false
          submodules: recursive
      - name: Run WordCount Unix
        uses: ./.github/actions/gradle-command-action
        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
        with:
          persist-credentials: false
          submodules: recursive
      - name: Authenticate on GCP
        uses: google-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: ./.github/actions/gradle-command-action
        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
