name: "Benchmark testing"

on:
  workflow_dispatch:
  pull_request:

permissions:
  contents: read

jobs:

  Benchmark-Test:
    name: "Benchmark tests"
    runs-on: ubuntu-20.04
    # note: we want benchmarks to run on pull_request events in order to publish results to a sticky comment, and
    # we also want to run on push such that merges to main are recorded to the cache. For this reason we don't filter
    # the job by event.
    steps:
      - name: Checkout code
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Bootstrap environment
        uses: ./.github/actions/bootstrap

      - name: Restore base benchmark result
        uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2.0
        with:
          path: test/results/benchmark-main.txt
          # use base sha for PR or new commit hash for main push in benchmark result key
          key: ${{ runner.os }}-bench-${{ (github.event.pull_request.base.sha != github.event.after) && github.event.pull_request.base.sha || github.event.after }}

      - name: Run benchmark tests
        id: benchmark
        run: |
          REF_NAME=${GITHUB_REF##*/} make benchmark
          OUTPUT=$(make show-benchstat)
          OUTPUT="${OUTPUT//'%'/'%25'}"   # URL encode all '%' characters
          OUTPUT="${OUTPUT//$'\n'/'%0A'}" # URL encode all '\n' characters
          OUTPUT="${OUTPUT//$'\r'/'%0D'}" # URL encode all '\r' characters
          echo "result=$OUTPUT" >> $GITHUB_OUTPUT

      - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
        with:
          name: benchmark-test-results
          path: test/results/**/*

      - name: Update PR benchmark results comment
        uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 #v2.9.1
        continue-on-error: true
        with:
          header: benchmark
          message: |
            ### Benchmark Test Results

            <details>
              <summary>Benchmark results from the latest changes vs base branch</summary>

            ```
            ${{ steps.benchmark.outputs.result }}
            ```

            </details>
