name: Test
on:
  push:
    branches:
      - master
      - release/**
  pull_request:
permissions:
  contents: read
defaults:
  run:
    shell: bash
concurrency:
  group: test-${{ github.ref }}
  cancel-in-progress: true
jobs:
  test:
    name: Module Mode
    runs-on: ${{ matrix.os }}-latest
    env:
      GO111MODULE: "on"
      GOFLAGS: "-mod=readonly"
    steps:
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go }}
      - uses: actions/checkout@v4
      - uses: actions/cache@v4
        with:
          # In order:
          # * Module download cache
          # * Build cache (Linux)
          # * Build cache (Mac)
          # * Build cache (Windows)
          path: |
            ~/go/pkg/mod
            ~/.cache/go-build
            ~/Library/Caches/go-build
            %LocalAppData%\go-build
          key: ${{ runner.os }}-go-${{ matrix.go }}-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-${{ matrix.go }}-
      - name: Build
        run: make build
      - name: Vet
        run: make vet
      - name: Check go.mod Tidiness
        run: make mod-tidy
        if: ${{ matrix.go == '1.21' }}
      - name: Test
        run: make test-coverage
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # pin@v5.4.2
        with:
          directory: .coverage
          token: ${{ secrets.CODECOV_TOKEN }}
      - name: Test (with race detection)
        run: make test-race
        # The race detector adds considerable runtime overhead. To save time on
        # pull requests, only run this step for a single job in the matrix. For
        # all other workflow triggers (e.g., pushes to a release branch) run
        # this step for the whole matrix.
        if: ${{ github.event_name != 'pull_request' || (matrix.go == '1.23' && matrix.os == 'ubuntu') }}
    timeout-minutes: 15
    strategy:
      matrix:
        go: ["1.24", "1.23", "1.22"]
        os: [ubuntu, windows, macos]
      fail-fast: false
