name: pre-review

on:
  pull_request:
    branches:
      - main
      - release-*

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

env:
  GRADLE_OPTS: "-Xmx6g -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true"

jobs:
  repolint:
    name: "Repository Linting"
    runs-on: ubuntu-22.04
    container: ghcr.io/todogroup/repolinter:v0.11.2
    steps:
    - name: Checkout Code
      uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
      with:
        ref: ${{ github.event.pull_request.head.sha || github.ref }}
    - name: Lint Repo
      run: bundle exec /app/bin/repolinter.js --rulesetUrl https://raw.githubusercontent.com/hyperledger-labs/hyperledger-community-management-tools/main/repo_structure/repolint.json --format markdown
  gradle-wrapper:
    name: "Gradle Wrapper Validation"
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
        with:
          ref: ${{ github.event.pull_request.head.sha || github.ref }}
      - uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4
  spotless:
    runs-on: ubuntu-22.04
    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: 17
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@9e899d11ad247ec76be7a60bc1cf9d3abbb9e7f1
        with:
          cache-disabled: true
      - name: run spotless
        run: ./gradlew spotlessCheck
  compile:
    runs-on: ubuntu-22.04
    timeout-minutes: 30
    needs: [spotless, gradle-wrapper, repolint]
    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: 17
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@9e899d11ad247ec76be7a60bc1cf9d3abbb9e7f1
        with:
          cache-disabled: true
      - name: Gradle Compile
        run: ./gradlew build -x test -x spotlessCheck
  unitTests:
    env:
        GRADLEW_UNIT_TEST_ARGS: ${{matrix.gradle_args}}
    runs-on: ubuntu-22.04
    needs: [ compile ]
    permissions:
      checks: write
      statuses: write
    strategy:
      fail-fast: true
      matrix:
        gradle_args:
          - "test -x besu:test -x consensus:test -x crypto:test -x ethereum:eth:test -x ethereum:api:test -x ethereum:core:test"
          - "besu:test consensus:test crypto:test"
          - "ethereum:api:testBonsai"
          - "ethereum:api:testForest"
          - "ethereum:api:testRemainder"
          - "ethereum:eth:test"
          - "ethereum:core:test"
        #includes will need exact strings from gradle args above
        include:
          - gradle_args: "test -x besu:test -x consensus:test -x crypto:test -x ethereum:eth:test -x ethereum:api:test -x ethereum:core:test"
            filename: "everythingElse"
          - gradle_args: "besu:test consensus:test crypto:test"
            filename: "consensusCrypto"
          - gradle_args: "ethereum:api:testBonsai"
            filename: "apiBonsai"
          - gradle_args: "ethereum:api:testRemainder"
            filename: "apiForest"
          - gradle_args: "ethereum:api:testRemainder"
            filename: "apiRemainder"
          - gradle_args: "ethereum:eth:test"
            filename: "eth"
          - gradle_args: "ethereum:core:test"
            filename: "core"
    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: 17
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@9e899d11ad247ec76be7a60bc1cf9d3abbb9e7f1
        with:
          cache-disabled: true
      - name: run unit tests
        id: unitTest
        run: ./gradlew $GRADLEW_UNIT_TEST_ARGS
      - name: Upload Unit Test Results
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3
        with:
          name: unit-${{matrix.filename}}-test-results
          path: '**/test-results/**/TEST-*.xml'
  unittests-passed:
    name: "unittests-passed"
    runs-on: ubuntu-22.04
    needs: [unitTests]
    permissions:
      checks: write
      statuses: write
    steps:
      - name: consolidation
        run: echo "consolidating statuses"
