name: fuzzing
on:
  workflow_call:
permissions:
  contents: read

jobs:
  fuzzing:
    name: Run Go Fuzz Tests
    runs-on: ubuntu-latest
    strategy:
      matrix:
        fuzz_test: [FuzzParseMetricText, FuzzParseOpenMetric, FuzzParseMetricSelector, FuzzParseExpr]
    steps:
      - name: Checkout repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          persist-credentials: false
      - name: Install Go
        uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
        with:
          go-version: 1.26.x
      - name: Run Fuzzing
        run: go test -fuzz=${{ matrix.fuzz_test }}$ -fuzztime=5m ./util/fuzzing
        continue-on-error: true
        id: fuzz
      - name: Upload Crash Artifacts
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
        if: failure()
        with:
          name: fuzz-artifacts-${{ matrix.fuzz_test }}
          path: util/fuzzing/testdata/fuzz/${{ matrix.fuzz_test }}
  fuzzing_status:
    # This status check aggregates the individual matrix jobs of the fuzzing
    # step into a final status. Fails if a single matrix job fails, succeeds if
    # all matrix jobs succeed.
    name: Fuzzing
    runs-on: ubuntu-latest
    needs: [fuzzing]
    if: always()
    steps:
      - name: Successful fuzzing
        if: ${{ !(contains(needs.*.result, 'failure')) && !(contains(needs.*.result, 'cancelled')) }}
        run: exit 0
      - name: Failing or cancelled fuzzing
        if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }}
        run: exit 1
