name: acceptance-tests
on:
  workflow_dispatch:
  pull_request:
    branches:
      - main
      - release-*
      - verkle

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

env:
  GRADLE_OPTS: "-Xmx7g"
  total-runners: 14

jobs:
  acceptanceTestEthereum:
    runs-on: ubuntu-22.04
    name: "Acceptance Runner"
    permissions:
      statuses: write
      checks: write
    strategy:
      fail-fast: true
      matrix:
        runner_index: [0,1,2,3,4,5,6,7,8,9,10,11,12,13]
    steps:
      - name: Checkout Repo
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
        with:
          ref: ${{ github.event.pull_request.head.sha || github.ref }}
      - name: Set up Java
        uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
        with:
          distribution: temurin
          java-version: 21
      - name: Install required packages
        run:  sudo apt-get install -y xmlstarlet
      - name: setup gradle
        uses: gradle/actions/setup-gradle@9e899d11ad247ec76be7a60bc1cf9d3abbb9e7f1
        with:
          cache-disabled: true
      - name: List unit tests
        run: ./gradlew acceptanceTestNotPrivacy --test-dry-run -Dorg.gradle.parallel=true -Dorg.gradle.caching=true
      - name: Extract current test list
        run: mkdir tmp; find . -type f -name TEST-*.xml | xargs -I{} bash -c "xmlstarlet sel -t -v '/testsuite/@name' '{}'; echo ' acceptanceTestNotPrivacy'" | tee tmp/currentTests.list
      - name: Get acceptance test reports
        uses: dawidd6/action-download-artifact@e7466d1a7587ed14867642c2ca74b5bcc1e19a2d
        continue-on-error: true
        with:
          branch: main
          workflow: update-test-reports.yml
          name: acceptance-test-results
          path: tmp/junit-xml-reports-downloaded
          if_no_artifact_found: ignore
      - name: Split tests
        run: .github/workflows/splitTestsByTime.sh tmp/junit-xml-reports-downloaded "tmp/junit-xml-reports-downloaded/acceptance-node-.*-test-results" "TEST-" ${{env.total-runners}} ${{ matrix.runner_index }} > testList.txt
      - name: format gradle args
        # we do not need the module task here
        run:  cat testList.txt | cut -f 2- -d ' ' | tee gradleArgs.txt
      - name: Upload Timing
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
        if: matrix.runner_index == 0
        with:
          name: acceptance-tests-timing
          path: 'tmp/timing.tsv'
      - name: Upload Lists
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
        if: matrix.runner_index == 0
        with:
          name: acceptance-tests-lists
          path: 'tmp/*.list'
      - name: Upload gradle test tasks
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
        with:
          name: test-args-${{ matrix.runner_index }}.txt
          path: '*.txt'
      - name: run acceptance tests
        run: ./gradlew acceptanceTestNotPrivacy `cat gradleArgs.txt` -Dorg.gradle.parallel=true -Dorg.gradle.caching=true
      - name: Remove downloaded test results
        run: rm -rf tmp/junit-xml-reports-downloaded
      - name: Upload Acceptance Test Results
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
        with:
          name: acceptance-node-${{matrix.runner_index}}-test-results
          path: 'acceptance-tests/tests/build/test-results/**/TEST-*.xml'
      - name: Upload Acceptance Test HTML Reports
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
        if: success() || failure()
        with:
          name: acceptance-node-${{matrix.runner_index}}-test-html-reports
          path: 'acceptance-tests/tests/build/reports/tests/**'
  accepttests-passed:
    name: "accepttests-passed"
    runs-on: ubuntu-22.04
    needs: [ acceptanceTestEthereum ]
    permissions:
      checks: write
      statuses: write
    if: always()
    steps:
      # Fail if any `needs` job was not a success.
      # Along with `if: always()`, this allows this job to act as a single required status check for the entire workflow.
      - name: Fail on workflow error
        run: exit 1
        if: >-
          ${{
            contains(needs.*.result, 'failure')
            || contains(needs.*.result, 'cancelled')
            || contains(needs.*.result, 'skipped')
          }}