Skip to content

Commit 89150a5

Browse files
committed
Use docker compose for tests, run macOS in GitHub actions
This makes it easier to run the tests locally. - Always run the SSL tests, since the container is already set up correctly. Currently still needs the /etc/hosts entry for postgres though, which is not great but not a huge deal either. - Skip the hstore tests when using PQTEST_BINARY_PARAMETERS=1. Previously this wasn't applied.
1 parent 8c874a4 commit 89150a5

38 files changed

Lines changed: 401 additions & 527 deletions

.github/workflows/codeql-analysis.yml

Lines changed: 0 additions & 24 deletions
This file was deleted.

.github/workflows/test.yml

Lines changed: 84 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -1,194 +1,96 @@
1-
name: Test
2-
3-
on: [push, pull_request]
1+
name: 'test'
2+
on:
3+
pull_request:
4+
push:
5+
#on:
6+
# pull_request:
7+
# paths: ['**.go', 'go.mod', '.github/workflows/*']
8+
# push:
9+
# branches: ['main']
410

511
jobs:
6-
staticcheck:
7-
name: 'staticcheck'
8-
runs-on: 'ubuntu-latest'
9-
steps:
10-
- uses: 'actions/checkout@v6'
11-
- uses: 'dominikh/staticcheck-action@v1.3.1'
12-
with: {version: '2025.1.1'}
12+
#staticcheck:
13+
# name: 'staticcheck'
14+
# runs-on: 'ubuntu-latest'
15+
# steps:
16+
# - uses: 'actions/checkout@v6'
17+
# - uses: 'dominikh/staticcheck-action@v1.3.1'
18+
# with: {version: '2025.1.1'}
19+
20+
#test:
21+
# runs-on: 'ubuntu-latest'
22+
# strategy:
23+
# fail-fast: false
24+
# matrix:
25+
# #pg: ['14', '15', '16', '17']
26+
# #go: ['1.18', '1.25']
27+
# pg: ['17']
28+
# go: ['1.25']
29+
# steps:
30+
# - uses: 'actions/checkout@v6'
31+
# - uses: 'actions/setup-go@v6'
32+
# with:
33+
# go-version: ${{ matrix.go }}
34+
# - name: 'Run tests'
35+
# run: |
36+
# docker compose up pg${{ matrix.pg }} -d --wait || exit 1
37+
# echo '127.0.0.1 postgres' | sudo tee -a /etc/hosts
38+
#
39+
# echo 'PQTEST_BINARY_PARAMETERS=no go test -race ./...'
40+
# PQTEST_BINARY_PARAMETERS=no go test -race ./...
41+
#
42+
# echo 'PQTEST_BINARY_PARAMETERS=yes go test -race ./...'
43+
# PQTEST_BINARY_PARAMETERS=yes go test -race ./...
1344

14-
test:
15-
runs-on: ubuntu-latest
45+
#macos:
46+
# runs-on: 'macos-15-intel'
47+
# strategy:
48+
# fail-fast: false
49+
# matrix:
50+
# #pg: ['14', '15', '16', '17']
51+
# #go: ['1.18', '1.25']
52+
# pg: ['17']
53+
# go: ['1.25']
54+
# steps:
55+
# - uses: 'actions/checkout@v6'
56+
# - uses: 'douglascamata/setup-docker-macos-action@v1'
57+
# - uses: 'actions/setup-go@v6'
58+
# with:
59+
# go-version: ${{ matrix.go }}
60+
# - name: 'Run tests'
61+
# run: |
62+
# docker compose up pg${{ matrix.pg }} -d --wait || exit 1
63+
# echo '127.0.0.1 postgres' | sudo tee -a /etc/hosts
64+
#
65+
# echo 'PQTEST_BINARY_PARAMETERS=no go test -race ./...'
66+
# PQTEST_BINARY_PARAMETERS=no go test -race ./...
67+
#
68+
# echo 'PQTEST_BINARY_PARAMETERS=yes go test -race ./...'
69+
# PQTEST_BINARY_PARAMETERS=yes go test -race ./...
70+
71+
windows:
72+
runs-on: 'windows-latest'
1673
strategy:
1774
fail-fast: false
1875
matrix:
19-
postgres: ['17', '16', '15', '14']
20-
go: ['1.25', '1.18']
76+
#pg: ['14', '15', '16', '17']
77+
#go: ['1.18', '1.25']
78+
pg: ['17']
79+
go: ['1.25']
2180
steps:
22-
- name: setup postgres pre-reqs
23-
run: |
24-
mkdir init
25-
cat <<CONF > init/root.crt
26-
-----BEGIN CERTIFICATE-----
27-
MIIEBjCCAu6gAwIBAgIJAPizR+OD14YnMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV
28-
BAYTAlVTMQ8wDQYDVQQIDAZOZXZhZGExEjAQBgNVBAcMCUxhcyBWZWdhczEaMBgG
29-
A1UECgwRZ2l0aHViLmNvbS9saWIvcHExDjAMBgNVBAMMBXBxIENBMB4XDTIxMDkw
30-
MjAxNTUwMloXDTMxMDkwMzAxNTUwMlowXjELMAkGA1UEBhMCVVMxDzANBgNVBAgM
31-
Bk5ldmFkYTESMBAGA1UEBwwJTGFzIFZlZ2FzMRowGAYDVQQKDBFnaXRodWIuY29t
32-
L2xpYi9wcTEOMAwGA1UEAwwFcHEgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
33-
ggEKAoIBAQDb9d6sjdU6GdibGrXRMOHREH3MRUS8T4TFqGgPEGVDP/V5bAZlBSGP
34-
AN0o9DTyVLcbQpBt8zMTw9KeIzIIe5NIVkSmA16lw/YckGhOM+kZIkiDuE6qt5Ia
35-
OQCRMdXkZ8ejG/JUu+rHU8FJZL8DE+jyYherzdjkeVAQ7JfzxAwW2Dl7T/47g337
36-
Pwmf17AEb8ibSqmXyUN7R5NhJQs+hvaYdNagzdx91E1H+qlyBvmiNeasUQljLvZ+
37-
Y8wAuU79neA+d09O4PBiYwV17rSP6SZCeGE3oLZviL/0KM9Xig88oB+2FmvQ6Zxa
38-
L7SoBlqS+5pBZwpH7eee/wCIKAnJtMAJAgMBAAGjgcYwgcMwDwYDVR0TAQH/BAUw
39-
AwEB/zAdBgNVHQ4EFgQUfIXEczahbcM2cFrwclJF7GbdajkwgZAGA1UdIwSBiDCB
40-
hYAUfIXEczahbcM2cFrwclJF7GbdajmhYqRgMF4xCzAJBgNVBAYTAlVTMQ8wDQYD
41-
VQQIDAZOZXZhZGExEjAQBgNVBAcMCUxhcyBWZWdhczEaMBgGA1UECgwRZ2l0aHVi
42-
LmNvbS9saWIvcHExDjAMBgNVBAMMBXBxIENBggkA+LNH44PXhicwDQYJKoZIhvcN
43-
AQELBQADggEBABFyGgSz2mHVJqYgX1Y+7P+MfKt83cV2uYDGYvXrLG2OGiCilVul
44-
oTBG+8omIMSHOsQZvWMpA5H0tnnlQHrKpKpUyKkSL+Wv5GL0UtBmHX7mVRiaK2l4
45-
q2BjRaQUitp/FH4NSdXtVrMME5T1JBBZHsQkNL3cNRzRKwY/Vj5UGEDxDS7lILUC
46-
e01L4oaK0iKQn4beALU+TvKoAHdPvoxpPpnhkF5ss9HmdcvRktJrKZemDJZswZ7/
47-
+omx8ZPIYYUH5VJJYYE88S7guAt+ZaKIUlel/t6xPbo2ZySFSg9u1uB99n+jTo3L
48-
1rAxFnN3FCX2jBqgP29xMVmisaN5k04UmyI=
49-
-----END CERTIFICATE-----
50-
CONF
51-
cat <<CONF > init/server.crt
52-
-----BEGIN CERTIFICATE-----
53-
MIIDqzCCApOgAwIBAgIJAPiewLrOyYipMA0GCSqGSIb3DQEBCwUAMF4xCzAJBgNV
54-
BAYTAlVTMQ8wDQYDVQQIDAZOZXZhZGExEjAQBgNVBAcMCUxhcyBWZWdhczEaMBgG
55-
A1UECgwRZ2l0aHViLmNvbS9saWIvcHExDjAMBgNVBAMMBXBxIENBMB4XDTIxMDkw
56-
MjAxNTUwMloXDTMxMDkwMzAxNTUwMlowTjELMAkGA1UEBhMCVVMxDzANBgNVBAgM
57-
Bk5ldmFkYTESMBAGA1UEBwwJTGFzIFZlZ2FzMRowGAYDVQQKDBFnaXRodWIuY29t
58-
L2xpYi9wcTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKf6H4UzmANN
59-
QiQJe92Mf3ETMYmpZKNNO9DPEHyNLIkag+XwMrBTdcCK0mLvsNCYpXuBN6703KCd
60-
WAFOeMmj7gOsWtvjt5Xm6bRHLgegekXzcG/jDwq/wyzeDzr/YkITuIlG44Lf9lhY
61-
FLwiHlHOWHnwrZaEh6aU//02aQkzyX5INeXl/3TZm2G2eIH6AOxOKOU27MUsyVSQ
62-
5DE+SDKGcRP4bElueeQWvxAXNMZYb7sVSDdfHI3zr32K4k/tC8x0fZJ5XN/dvl4t
63-
4N4MrYlmDO5XOrb/gQH1H4iu6+5EMDfZYab4fkThnNFdfFqu4/8Scv7KZ8mWqpKM
64-
fGAjEPctQi0CAwEAAaN8MHowHQYDVR0OBBYEFENExPbmDyFB2AJUdbMvVyhlNPD5
65-
MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgWgMBMGA1UdEQQMMAqCCHBvc3RncmVzMCwG
66-
CWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTANBgkq
67-
hkiG9w0BAQsFAAOCAQEAMRVbV8RiEsmp9HAtnVCZmRXMIbgPGrqjeSwk586s4K8v
68-
BSqNCqxv6s5GfCRmDYiqSqeuCVDtUJS1HsTmbxVV7Ke71WMo+xHR1ICGKOa8WGCb
69-
TGsuicG5QZXWaxeMOg4s0qpKmKko0d1aErdVsanU5dkrVS7D6729Ffnzu4lwApk6
70-
invAB67p8u7sojwqRq5ce0vRaG+YFylTrWomF9kauEb8gKbQ9Xc7QfX+h+UH/mq9
71-
Nvdj8LOHp6/82bZdnsYUOtV4lS1IA/qzeXpqBphxqfWabD1yLtkyJyImZKq8uIPp
72-
0CG4jhObPdWcCkXD6bg3QK3mhwlC79OtFgxWmldCRQ==
73-
-----END CERTIFICATE-----
74-
CONF
75-
cat <<CONF > init/server.key
76-
-----BEGIN PRIVATE KEY-----
77-
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCn+h+FM5gDTUIk
78-
CXvdjH9xEzGJqWSjTTvQzxB8jSyJGoPl8DKwU3XAitJi77DQmKV7gTeu9NygnVgB
79-
TnjJo+4DrFrb47eV5um0Ry4HoHpF83Bv4w8Kv8Ms3g86/2JCE7iJRuOC3/ZYWBS8
80-
Ih5Rzlh58K2WhIemlP/9NmkJM8l+SDXl5f902ZthtniB+gDsTijlNuzFLMlUkOQx
81-
PkgyhnET+GxJbnnkFr8QFzTGWG+7FUg3XxyN8699iuJP7QvMdH2SeVzf3b5eLeDe
82-
DK2JZgzuVzq2/4EB9R+IruvuRDA32WGm+H5E4ZzRXXxaruP/EnL+ymfJlqqSjHxg
83-
IxD3LUItAgMBAAECggEAOE2naQ9tIZYw2EFxikZApVcooJrtx6ropMnzHbx4NBB2
84-
K4mChAXFj184u77ZxmGT/jzGvFcI6LE0wWNbK0NOUV7hKZk/fPhkV3AQZrAMrAu4
85-
IVi7PwAd3JkmA8F8XuebUDA5rDGDsgL8GD9baFJA58abeLs9eMGyuF4XgOUh4bip
86-
hgHa76O2rcDWNY5HZqqRslw75FzlYkB0PCts/UJxSswj70kTTihyOhDlrm2TnyxI
87-
ne54UbGRrpfs9wiheSGLjDG81qZToBHQDwoAnjjZhu1VCaBISuGbgZrxyyRyqdnn
88-
xPW+KczMv04XyvF7v6Pz+bUEppalLXGiXnH5UtWvZQKBgQDTPCdMpNE/hwlq4nAw
89-
Kf42zIBWfbnMLVWYoeDiAOhtl9XAUAXn76xe6Rvo0qeAo67yejdbJfRq3HvGyw+q
90-
4PS8r9gXYmLYIPQxSoLL5+rFoBCN3qFippfjLB1j32mp7+15KjRj8FF2r6xIN8fu
91-
XatSRsaqmvCWYLDRv/rbHnxwkwKBgQDLkyfFLF7BtwtPWKdqrwOM7ip1UKh+oDBS
92-
vkCQ08aEFRBU7T3jChsx5GbaW6zmsSBwBwcrHclpSkz7n3aq19DDWObJR2p80Fma
93-
rsXeIcvtEpkvT3pVX268P5d+XGs1kxgFunqTysG9yChW+xzcs5MdKBzuMPPn7rL8
94-
MKAzdar6PwKBgEypkzW8x3h/4Moa3k6MnwdyVs2NGaZheaRIc95yJ+jGZzxBjrMr
95-
h+p2PbvU4BfO0AqOkpKRBtDVrlJqlggVVp04UHvEKE16QEW3Xhr0037f5cInX3j3
96-
Lz6yXwRFLAsR2aTUzWjL6jTh8uvO2s/GzQuyRh3a16Ar/WBShY+K0+zjAoGATnLT
97-
xZjWnyHRmu8X/PWakamJ9RFzDPDgDlLAgM8LVgTj+UY/LgnL9wsEU6s2UuP5ExKy
98-
QXxGDGwUhHar/SQTj+Pnc7Mwpw6HKSOmnnY5po8fNusSwml3O9XppEkrC0c236Y/
99-
7EobJO5IFVTJh4cv7vFxTJzSsRL8KFD4uzvh+nMCgYEAqY8NBYtIgNJA2B6C6hHF
100-
+bG7v46434ZHFfGTmMQwzE4taVg7YRnzYESAlvK4bAP5ZXR90n7GRGFhrXzoMZ38
101-
r0bw/q9rV+ReGda7/Bjf7ciCKiq0RODcHtf4IaskjPXCoQRGJtgCPLhWPfld6g9v
102-
/HTvO96xv9e3eG/PKSPog94=
103-
-----END PRIVATE KEY-----
104-
CONF
105-
cat <<CONF > init/hba.sh
106-
cat <<EOF > /var/lib/postgresql/data/pg_hba.conf
107-
local all all trust
108-
host all postgres all trust
109-
hostnossl all pqgossltest all reject
110-
hostnossl all pqgosslcert all reject
111-
hostssl all pqgossltest all trust
112-
hostssl all pqgosslcert all cert
113-
host all all all trust
114-
EOF
115-
CONF
116-
sudo chown 999:999 ./init/*
117-
sudo chmod 600 ./init/*
118-
119-
- name: start postgres
120-
run: |
121-
docker run -d \
122-
--name pg \
123-
-p 5432:5432 \
124-
-v $(pwd)/init:/init \
125-
-e POSTGRES_PASSWORD=unused \
126-
-e POSTGRES_USER=postgres \
127-
postgres:${{ matrix.postgres }} \
128-
-c ssl=on \
129-
-c ssl_ca_file=/init/root.crt \
130-
-c ssl_cert_file=/init/server.crt \
131-
-c ssl_key_file=/init/server.key
132-
133-
- name: configure postgres
134-
run: |
135-
n=0
136-
until [ "$n" -ge 10 ]
137-
do
138-
docker exec pg pg_isready -h localhost && break
139-
n=$((n+1))
140-
echo waiting for postgres to be ready...
141-
sleep 1
142-
done
143-
docker exec pg bash /init/hba.sh
144-
n=0
145-
until [ "$n" -ge 10 ]
146-
do
147-
docker exec pg su postgres -c '/usr/lib/postgresql/${{ matrix.postgres }}/bin/pg_ctl reload' && break
148-
n=$((n+1))
149-
echo waiting for postgres to reload...
150-
sleep 1
151-
done
152-
153-
- name: setup hosts
154-
run: echo '127.0.0.1 postgres' | sudo tee -a /etc/hosts
155-
156-
- name: create db/roles
157-
run: |
158-
n=0
159-
until [ "$n" -ge 10 ]
160-
do
161-
docker exec pg pg_isready -h localhost && break
162-
n=$((n+1))
163-
echo waiting for postgres to be ready...
164-
sleep 1
165-
done
166-
docker exec pg createdb -h localhost -U postgres pqgotest
167-
docker exec pg createuser -h localhost -U postgres -DRS pqgossltest
168-
docker exec pg createuser -h localhost -U postgres -DRS pqgosslcert
169-
170-
- name: check out code into the Go module directory
171-
uses: actions/checkout@v6
172-
173-
- name: set up go
174-
uses: actions/setup-go@v6
81+
- uses: 'actions/checkout@v6'
82+
#- uses: 'douglascamata/setup-docker-macos-action@v1'
83+
- uses: 'actions/setup-go@v6'
17584
with:
17685
go-version: ${{ matrix.go }}
177-
id: go
86+
- name: 'Run tests'
87+
shell: 'bash'
88+
run: |
89+
docker compose up pg${{ matrix.pg }} -d --wait || exit 1
90+
echo '127.0.0.1 postgres' | sudo tee -a /etc/hosts
17891
179-
- name: set key perms
180-
run: sudo chmod 600 testdata/certs/postgresql.key
92+
echo 'PQTEST_BINARY_PARAMETERS=no go test -race ./...'
93+
PQTEST_BINARY_PARAMETERS=no go test -race ./...
18194
182-
- name: run tests
183-
env:
184-
PGUSER: postgres
185-
PGHOST: localhost
186-
PGPORT: 5432
187-
PQGOSSLTESTS: 1
188-
PQSSLCERTTEST_PATH: testdata/certs
189-
run: |
190-
PQTEST_BINARY_PARAMETERS=no go test -race ./...
95+
echo 'PQTEST_BINARY_PARAMETERS=yes go test -race ./...'
19196
PQTEST_BINARY_PARAMETERS=yes go test -race ./...
192-
193-
- name: build
194-
run: go build -v .

README.md

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
1-
# pq - A pure Go postgres driver for Go's database/sql package
1+
pq is a Go PostgreSQL driver for database/sql.
2+
3+
All [maintained versions of PostgreSQL] are supported. Older versions may work,
4+
but this is not tested.
25

36
API docs: https://pkg.go.dev/github.com/lib/pq
47

58
Install with:
69

710
go get github.com/lib/pq@latest
811

9-
## Features
12+
[maintained versions of PostgreSQL]: https://www.postgresql.org/support/versioning
1013

14+
Features
15+
--------
1116
* SSL
1217
* Handles bad connections for `database/sql`
1318
* Scan `time.Time` correctly (i.e. `timestamp[tz]`, `time[tz]`, `date`)
@@ -21,6 +26,28 @@ Install with:
2126
* pgpass support
2227
* GSS (Kerberos) auth
2328

24-
## Tests
29+
Running Tests
30+
-------------
31+
Tests need to be run against a PostgreSQL database; you can use Docker compose
32+
to start one:
33+
34+
docker compose up -d pg17
35+
36+
Or you can use any other PostgreSQL instance; see `testdata/init/` for the
37+
required setup. You can use the standard `PG*` environment variables to control
38+
the connection details; it uses the following defaults:
39+
40+
PGHOST=localhost
41+
PGDATABASE=pqgo
42+
PGUSER=pqgo
43+
PGSSLMODE=disable
44+
PGCONNECT_TIMEOUT=20
45+
46+
In addition, your `/etc/hosts` currently needs an entry:
47+
48+
127.0.0.1 postgres
49+
50+
`PQTEST_BINARY_PARAMETERS` can be used to add `binary_parameters=yes` to all
51+
connection strings:
2552

26-
`go test` is used for testing. See [TESTS.md](TESTS.md) for more details.
53+
PQTEST_BINARY_PARAMETERS=1 go test

TESTS.md

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)