name: Test Benchmarks

on:
    schedule:
        - cron: "0 3 * * 1" # Weekly Monday 3am UTC
    workflow_dispatch:

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

permissions:
    contents: read
    pull-requests: write

env:
    CARGO_TERM_COLOR: always

jobs:
    benchmarks:
        name: Criterion Benchmarks
        runs-on: blacksmith-2vcpu-ubuntu-2404
        timeout-minutes: 30
        steps:
            - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
            - uses: dtolnay/rust-toolchain@631a55b12751854ce901bb631d5902ceb48146f7 # stable
              with:
                  toolchain: 1.92.0
            - uses: useblacksmith/rust-cache@f53e7f127245d2a269b3d90879ccf259876842d5 # v3

            - name: Run benchmarks
              run: cargo bench --locked 2>&1 | tee benchmark_output.txt

            - name: Upload benchmark results
              if: always()
              uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
              with:
                  name: benchmark-results
                  path: |
                      target/criterion/
                      benchmark_output.txt
                  retention-days: 7

            - name: Post benchmark summary on PR
              if: github.event_name == 'pull_request'
              uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
              with:
                  script: |
                    const script = require('./.github/workflows/scripts/test_benchmarks_pr_comment.js');
                    await script({ github, context, core });
