name: CI

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

jobs:
  test:
    name: Test
    runs-on: ubuntu-22.04

    strategy:
      matrix:
        go-version: ["1.25", "1.26"]
        pg-version: [14, 15, 16, 17, 18, cockroachdb]
        include:
          - pg-version: 14
            pgx-test-database: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-unix-socket-conn-string: "host=/var/run/postgresql dbname=pgx_test"
            pgx-test-tcp-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-scram-password-conn-string: "host=127.0.0.1 user=pgx_scram password=secret dbname=pgx_test channel_binding=disable"
            pgx-test-scram-plus-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=require"
            pgx-test-md5-password-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-plain-password-conn-string: "host=127.0.0.1 user=pgx_pw password=secret dbname=pgx_test"
            pgx-test-tls-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=disable"
            pgx-ssl-password: certpw
            pgx-test-tls-client-conn-string: "host=localhost user=pgx_sslcert sslmode=verify-full sslrootcert=/tmp/ca.pem sslcert=/tmp/pgx_sslcert.crt sslkey=/tmp/pgx_sslcert.key dbname=pgx_test"
          - pg-version: 15
            pgx-test-database: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-unix-socket-conn-string: "host=/var/run/postgresql dbname=pgx_test"
            pgx-test-tcp-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-scram-password-conn-string: "host=127.0.0.1 user=pgx_scram password=secret dbname=pgx_test channel_binding=disable"
            pgx-test-scram-plus-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=require"
            pgx-test-md5-password-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-plain-password-conn-string: "host=127.0.0.1 user=pgx_pw password=secret dbname=pgx_test"
            pgx-test-tls-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=disable"
            pgx-ssl-password: certpw
            pgx-test-tls-client-conn-string: "host=localhost user=pgx_sslcert sslmode=verify-full sslrootcert=/tmp/ca.pem sslcert=/tmp/pgx_sslcert.crt sslkey=/tmp/pgx_sslcert.key dbname=pgx_test"
          - pg-version: 16
            pgx-test-database: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-unix-socket-conn-string: "host=/var/run/postgresql dbname=pgx_test"
            pgx-test-tcp-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-scram-password-conn-string: "host=127.0.0.1 user=pgx_scram password=secret dbname=pgx_test channel_binding=disable"
            pgx-test-scram-plus-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=require"
            pgx-test-md5-password-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-plain-password-conn-string: "host=127.0.0.1 user=pgx_pw password=secret dbname=pgx_test"
            pgx-test-tls-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=disable"
            pgx-ssl-password: certpw
            pgx-test-tls-client-conn-string: "host=localhost user=pgx_sslcert sslmode=verify-full sslrootcert=/tmp/ca.pem sslcert=/tmp/pgx_sslcert.crt sslkey=/tmp/pgx_sslcert.key dbname=pgx_test"
          - pg-version: 17
            pgx-test-database: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-unix-socket-conn-string: "host=/var/run/postgresql dbname=pgx_test"
            pgx-test-tcp-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-scram-password-conn-string: "host=127.0.0.1 user=pgx_scram password=secret dbname=pgx_test channel_binding=disable"
            pgx-test-scram-plus-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=require"
            pgx-test-md5-password-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-plain-password-conn-string: "host=127.0.0.1 user=pgx_pw password=secret dbname=pgx_test"
            pgx-test-tls-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=disable"
            pgx-ssl-password: certpw
            pgx-test-tls-client-conn-string: "host=localhost user=pgx_sslcert sslmode=verify-full sslrootcert=/tmp/ca.pem sslcert=/tmp/pgx_sslcert.crt sslkey=/tmp/pgx_sslcert.key dbname=pgx_test"
          - pg-version: 18
            pgx-test-database: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-unix-socket-conn-string: "host=/var/run/postgresql dbname=pgx_test"
            pgx-test-tcp-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-scram-password-conn-string: "host=127.0.0.1 user=pgx_scram password=secret dbname=pgx_test channel_binding=disable"
            pgx-test-scram-plus-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=require"
            pgx-test-md5-password-conn-string: "host=127.0.0.1 user=pgx_md5 password=secret dbname=pgx_test"
            pgx-test-plain-password-conn-string: "host=127.0.0.1 user=pgx_pw password=secret dbname=pgx_test"
            pgx-test-tls-conn-string: "host=localhost user=pgx_ssl password=secret sslmode=verify-full sslrootcert=/tmp/ca.pem dbname=pgx_test channel_binding=disable"
            pgx-test-oauth: "true"
            pgx-ssl-password: certpw
            pgx-test-tls-client-conn-string: "host=localhost user=pgx_sslcert sslmode=verify-full sslrootcert=/tmp/ca.pem sslcert=/tmp/pgx_sslcert.crt sslkey=/tmp/pgx_sslcert.key dbname=pgx_test"
          - pg-version: cockroachdb
            pgx-test-database: "postgresql://root@127.0.0.1:26257/pgx_test?sslmode=disable&experimental_enable_temp_tables=on"

    steps:
      - name: Check out code into the Go module directory
        uses: actions/checkout@v5

      - name: Set up Go ${{ matrix.go-version }}
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go-version }}

      - name: Setup database server for testing
        run: ci/setup_test.bash
        env:
          PGVERSION: ${{ matrix.pg-version }}

      # - name: Setup upterm session
      #   uses: lhotari/action-upterm@v1
      #   with:
      #     ## limits ssh access and adds the ssh public key for the user which triggered the workflow
      #     limit-access-to-actor: true
      #   env:
      #     PGX_TEST_DATABASE: ${{ matrix.pgx-test-database }}
      #     PGX_TEST_UNIX_SOCKET_CONN_STRING: ${{ matrix.pgx-test-unix-socket-conn-string }}
      #     PGX_TEST_TCP_CONN_STRING: ${{ matrix.pgx-test-tcp-conn-string }}
      #     PGX_TEST_SCRAM_PASSWORD_CONN_STRING: ${{ matrix.pgx-test-scram-password-conn-string }}
      #     PGX_TEST_MD5_PASSWORD_CONN_STRING: ${{ matrix.pgx-test-md5-password-conn-string }}
      #     PGX_TEST_PLAIN_PASSWORD_CONN_STRING: ${{ matrix.pgx-test-plain-password-conn-string }}
      #     PGX_TEST_TLS_CONN_STRING: ${{ matrix.pgx-test-tls-conn-string }}
      #     PGX_SSL_PASSWORD: ${{ matrix.pgx-ssl-password }}
      #     PGX_TEST_TLS_CLIENT_CONN_STRING: ${{ matrix.pgx-test-tls-client-conn-string }}

      - name: Check formatting
        run: |
          gofmt -l -s -w .
          git status
          git diff --exit-code

      - name: Test
        # parallel testing is disabled because somehow parallel testing causes Github Actions to kill the runner.
        run: go test -parallel=1 -race ./...
        env:
          PGX_TEST_DATABASE: ${{ matrix.pgx-test-database }}
          PGX_TEST_UNIX_SOCKET_CONN_STRING: ${{ matrix.pgx-test-unix-socket-conn-string }}
          PGX_TEST_TCP_CONN_STRING: ${{ matrix.pgx-test-tcp-conn-string }}
          PGX_TEST_SCRAM_PASSWORD_CONN_STRING: ${{ matrix.pgx-test-scram-password-conn-string }}
          PGX_TEST_MD5_PASSWORD_CONN_STRING: ${{ matrix.pgx-test-md5-password-conn-string }}
          PGX_TEST_PLAIN_PASSWORD_CONN_STRING: ${{ matrix.pgx-test-plain-password-conn-string }}
          PGX_TEST_OAUTH: ${{ matrix.pgx-test-oauth }}
          # TestConnectTLS fails. However, it succeeds if I connect to the CI server with upterm and run it. Give up on that test for now.
          # PGX_TEST_TLS_CONN_STRING: ${{ matrix.pgx-test-tls-conn-string }}
          # PGX_TEST_SCRAM_PLUS_CONN_STRING: ${{ matrix.pgx-test-scram-plus-conn-string }}
          PGX_SSL_PASSWORD: ${{ matrix.pgx-ssl-password }}
          PGX_TEST_TLS_CLIENT_CONN_STRING: ${{ matrix.pgx-test-tls-client-conn-string }}

  test-windows:
    name: Test Windows
    runs-on: windows-latest
    strategy:
      matrix:
        go-version: ["1.25", "1.26"]

    steps:
      - name: Setup PostgreSQL
        id: postgres
        uses: ikalnytskyi/action-setup-postgres@v4
        with:
          database: pgx_test

      - name: Check out code into the Go module directory
        uses: actions/checkout@v5

      - name: Set up Go ${{ matrix.go-version }}
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go-version }}

      - name: Initialize test database
        run: |
          psql -f testsetup/postgresql_setup.sql pgx_test
        env:
          PGSERVICE: ${{ steps.postgres.outputs.service-name }}
        shell: bash

      - name: Test
        # Parallel testing is disabled because somehow parallel testing causes Github Actions to kill the runner.
        # Disabling CGO because that is not working on the Windows runner. Apparently, we could install MingW and set up
        # CGO to work, but disabling CGO takes less CI time. Without CGO, we also must not use the race detector.
        run: go test -parallel=1 ./...
        env:
          CGO_ENABLED: 0
          PGX_TEST_DATABASE: ${{ steps.postgres.outputs.connection-uri }}
