# 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:
  
  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/**']
# This allows a subsequently queued workflow run to interrupt previous runs
concurrency:
  group: '${{ github.workflow }} @ ${{ github.event.issue.number || github.event.pull_request.head.label || github.sha || github.head_ref || github.ref }}-${{ github.event.schedule || github.event.comment.id || github.event.sender.login}}'
  cancel-in-progress: true
env:
  DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
  GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GE_CACHE_USERNAME }}
  GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GE_CACHE_PASSWORD }}
jobs:
  java_unit_tests:
    name: 'Java Unit Tests'
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [[self-hosted, ubuntu-20.04, main], macos-latest, windows-latest]
    steps:
      - name: Check out code
        uses: actions/checkout@v4
        with:
          persist-credentials: false
          submodules: recursive
      - name: Setup environment
        uses: ./.github/actions/setup-environment-action
        with:
          java-version: 11
          go-version: default
        # :sdks:java:core:test
      - name: Run :sdks:java:core:test
        uses: ./.github/actions/gradle-command-self-hosted-action
        with:
          gradle-command: test
          arguments: -p sdks/java/core/
      - name: Upload test logs for :sdks:java:core:test
        uses: actions/upload-artifact@v4
        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-self-hosted-action
        with:
          gradle-command: test
          arguments: -p sdks/java/harness/
        if: always()
      - name: Upload test logs for :sdks:java:harness:test
        uses: actions/upload-artifact@v4
        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-self-hosted-action
        with:
          gradle-command: test
          arguments: -p runners/core-java/
        if: always()
      - name: Upload test logs for :runners:core-java:test
        uses: actions/upload-artifact@v4
        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: [[self-hosted, ubuntu-20.04, main], macos-latest, windows-latest]
    steps:
      - name: Check out code
        uses: actions/checkout@v4
        with:
          persist-credentials: false
          submodules: recursive
      - name: Setup environment
        uses: ./.github/actions/setup-environment-action
        with:
          java-version: 11
          go-version: default
      - name: Run WordCount Unix
        uses: ./.github/actions/gradle-command-self-hosted-action
        with:
          gradle-command: integrationTest
          arguments: -p examples/ --tests org.apache.beam.examples.WordCountIT
            -DintegrationTestRunner=direct
            -DintegrationTestPipelineOptions=[\"--runner=DirectRunner\",\"--tempRoot=./tmp\"]
      - name: Upload test logs
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: java_wordcount_direct_runner-${{matrix.os}}
          path: examples/java/build/reports/tests/integrationTest
