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:
  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.20',
              # Older production releases
              '1.19',
              '1.18',
              '1.17',
              '1.16',
              '1.15',
              '1.14',
              '1.13',
          ]
          mysql = [
              '8.0',
              '5.7',
              '5.6',
              'mariadb-10.11',
              'mariadb-10.6',
              'mariadb-10.5',
              'mariadb-10.4',
              'mariadb-10.3',
          ]

          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:
              f.write('matrix={0}\n'.format(output))
        shell: python
  test:
    needs: list
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix: ${{ fromJSON(needs.list.outputs.matrix) }}
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with:
          go-version: ${{ matrix.go }}
      - uses: shogo82148/actions-setup-mysql@v1.15.0
        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=16MB
            ; TestConcurrent fails if max_connections is too large
            max_connections=50
            local_infile=1
      - name: setup database
        run: |
          mysql --user 'root' --host '127.0.0.1' -e 'create database gotest;'

      - name: test
        run: |
          go test -v '-covermode=count' '-coverprofile=coverage.out'

      - 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
