name: test
on:
  pull_request:
  push:
  workflow_dispatch:

env:
  MYSQL_TEST_USER: gotest
  MYSQL_TEST_PASS: secret
  MYSQL_TEST_ADDR: 127.0.0.1:3306
  MYSQL_TEST_CONCURRENT: 1

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dominikh/staticcheck-action@v1.3.1

  list:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - name: list
        id: set-matrix
        run: |
          import json
          import os
          go = [
              # Keep the most recent production release at the top
              '1.23',
              # Older production releases
              '1.22',
              '1.21',
          ]
          mysql = [
              '9.0',
              '8.4', # LTS
              '8.0',
              '5.7',
              'mariadb-11.4',   # LTS
              'mariadb-11.2',
              'mariadb-11.1',
              'mariadb-10.11',  # LTS
              'mariadb-10.6',   # LTS
              'mariadb-10.5',   # LTS
          ]

          includes = []
          # Go versions compatibility check
          for v in go[1:]:
              includes.append({'os': 'ubuntu-latest', 'go': v, 'mysql': mysql[0]})

          matrix = {
              # OS vs MySQL versions
              'os': [ 'ubuntu-latest', 'macos-latest', 'windows-latest' ],
              'go': [ go[0] ],
              'mysql': mysql,

              'include': includes
          }
          output = json.dumps(matrix, separators=(',', ':'))
          with open(os.environ["GITHUB_OUTPUT"], 'a', encoding="utf-8") as f:
              print(f"matrix={output}", file=f)
        shell: python
  test:
    needs: list
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix: ${{ fromJSON(needs.list.outputs.matrix) }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go }}
      - uses: shogo82148/actions-setup-mysql@v1
        with:
          mysql-version: ${{ matrix.mysql }}
          user: ${{ env.MYSQL_TEST_USER }}
          password: ${{ env.MYSQL_TEST_PASS }}
          my-cnf: |
            innodb_log_file_size=256MB
            innodb_buffer_pool_size=512MB
            max_allowed_packet=48MB
            ; TestConcurrent fails if max_connections is too large
            max_connections=50
            local_infile=1
            performance_schema=on
      - name: setup database
        run: |
          mysql --user 'root' --host '127.0.0.1' -e 'create database gotest;'

      - name: test
        run: |
          go test -v '-race' '-covermode=atomic' '-coverprofile=coverage.out' -parallel 10

      - name: benchmark
        run: |
          go test -run '^$' -bench .

      - name: Send coverage
        uses: shogo82148/actions-goveralls@v1
        with:
          path-to-profile: coverage.out
          flag-name: ${{ runner.os }}-Go-${{ matrix.go }}-DB-${{ matrix.mysql }}
          parallel: true

  # notifies that all test jobs are finished.
  finish:
    needs: test
    if: always()
    runs-on: ubuntu-latest
    steps:
      - uses: shogo82148/actions-goveralls@v1
        with:
          parallel-finished: true
