Skip to content

Commit c558997

Browse files
committed
test(endtoend): Use Docker to start database servers
Remove setup-mysql and setup-postgresql actions
1 parent a36654a commit c558997

File tree

5 files changed

+167
-19
lines changed

5 files changed

+167
-19
lines changed

.github/workflows/ci.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,24 @@ jobs:
5353
CGO_ENABLED: ${{ matrix.cgo }}
5454

5555
# Start a PostgreSQL server
56-
- uses: sqlc-dev/action-setup-postgres@master
57-
with:
58-
postgres-version: "16"
59-
id: postgres
56+
# - uses: sqlc-dev/action-setup-postgres@master
57+
# with:
58+
# postgres-version: "16"
59+
# id: postgres
6060

6161
# Start a MySQL server
62-
- uses: shogo82148/actions-setup-mysql@v1
63-
with:
64-
mysql-version: "9.0"
62+
# - uses: shogo82148/actions-setup-mysql@v1
63+
# with:
64+
# mysql-version: "9.0"
6565

6666
- name: test ./...
6767
run: gotestsum --junitfile junit.xml -- --tags=examples -timeout 20m ./...
6868
env:
6969
CI_SQLC_PROJECT_ID: ${{ secrets.CI_SQLC_PROJECT_ID }}
7070
CI_SQLC_AUTH_TOKEN: ${{ secrets.CI_SQLC_AUTH_TOKEN }}
7171
SQLC_AUTH_TOKEN: ${{ secrets.CI_SQLC_AUTH_TOKEN }}
72-
MYSQL_SERVER_URI: root:@tcp(localhost:3306)/mysql?multiStatements=true&parseTime=true
73-
POSTGRESQL_SERVER_URI: ${{ steps.postgres.outputs.connection-uri }}?sslmode=disable
72+
# MYSQL_SERVER_URI: root:@tcp(localhost:3306)/mysql?multiStatements=true&parseTime=true
73+
# POSTGRESQL_SERVER_URI: ${{ steps.postgres.outputs.connection-uri }}?sslmode=disable
7474
CGO_ENABLED: ${{ matrix.cgo }}
7575

7676
vuln_check:

internal/endtoend/endtoend_test.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
"github.com/sqlc-dev/sqlc/internal/cmd"
1818
"github.com/sqlc-dev/sqlc/internal/config"
1919
"github.com/sqlc-dev/sqlc/internal/opts"
20-
"github.com/sqlc-dev/sqlc/internal/sqltest/local"
20+
"github.com/sqlc-dev/sqlc/internal/sqltest/docker"
2121
)
2222

2323
func lineEndings() cmp.Option {
@@ -112,6 +112,24 @@ func TestReplay(t *testing.T) {
112112
// t.Parallel()
113113
ctx := context.Background()
114114

115+
var mysqlURI, postgresURI string
116+
if err := docker.Installed(); err == nil {
117+
{
118+
host, err := docker.StartPostgreSQLServer(ctx)
119+
if err != nil {
120+
t.Fatalf("starting postgresql failed: %s", err)
121+
}
122+
postgresURI = host
123+
}
124+
{
125+
host, err := docker.StartMySQLServer(ctx)
126+
if err != nil {
127+
t.Fatalf("starting mysql failed: %s", err)
128+
}
129+
mysqlURI = host
130+
}
131+
}
132+
115133
contexts := map[string]textContext{
116134
"base": {
117135
Mutate: func(t *testing.T, path string) func(*config.Config) { return func(c *config.Config) {} },
@@ -124,13 +142,13 @@ func TestReplay(t *testing.T) {
124142
{
125143
Name: "postgres",
126144
Engine: config.EnginePostgreSQL,
127-
URI: local.PostgreSQLServer(),
145+
URI: postgresURI,
128146
},
129147

130148
{
131149
Name: "mysql",
132150
Engine: config.EngineMySQL,
133-
URI: local.MySQLServer(),
151+
URI: mysqlURI,
134152
},
135153
}
136154
for i := range c.SQL {
@@ -150,13 +168,8 @@ func TestReplay(t *testing.T) {
150168
}
151169
},
152170
Enabled: func() bool {
153-
if len(os.Getenv("POSTGRESQL_SERVER_URI")) == 0 {
154-
return false
155-
}
156-
if len(os.Getenv("MYSQL_SERVER_URI")) == 0 {
157-
return false
158-
}
159-
return true
171+
err := docker.Installed()
172+
return err == nil
160173
},
161174
},
162175
}

internal/sqltest/docker/enabled.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package docker
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
)
7+
8+
func Installed() error {
9+
if _, err := exec.LookPath("docker"); err != nil {
10+
return fmt.Errorf("docker not found: %w", err)
11+
}
12+
return nil
13+
}

internal/sqltest/docker/mysql.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package docker
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"fmt"
7+
"os/exec"
8+
"time"
9+
10+
_ "github.com/go-sql-driver/mysql"
11+
)
12+
13+
func StartMySQLServer(c context.Context) (string, error) {
14+
if err := Installed(); err != nil {
15+
return "", err
16+
}
17+
18+
ctx, cancel := context.WithTimeout(c, 10*time.Second)
19+
defer cancel()
20+
21+
cmd := exec.Command("docker", "run",
22+
"--name", "sqlc_sqltest_docker_mysql",
23+
"-e", "MYSQL_ROOT_PASSWORD=mysecretpassword",
24+
"-e", "MYSQL_DATABASE=dinotest",
25+
"-p", "3306:3306",
26+
"-d",
27+
"mysql:8",
28+
)
29+
30+
output, err := cmd.CombinedOutput()
31+
fmt.Println(string(output))
32+
if err != nil {
33+
return "", err
34+
}
35+
36+
// Create a ticker that fires every 10ms
37+
ticker := time.NewTicker(10 * time.Millisecond)
38+
defer ticker.Stop()
39+
40+
uri := "root:mysecretpassword@/dinotest"
41+
42+
db, err := sql.Open("mysql", uri)
43+
if err != nil {
44+
return "", fmt.Errorf("sql.Open: %w", err)
45+
}
46+
47+
for {
48+
select {
49+
case <-ctx.Done():
50+
return "", fmt.Errorf("timeout reached: %w", ctx.Err())
51+
52+
case <-ticker.C:
53+
// Run your function here
54+
if err := db.PingContext(ctx); err != nil {
55+
continue
56+
}
57+
return uri, nil
58+
}
59+
}
60+
}

internal/sqltest/docker/postgres.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package docker
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log/slog"
7+
"os/exec"
8+
"time"
9+
10+
"github.com/jackc/pgx/v5"
11+
)
12+
13+
func StartPostgreSQLServer(c context.Context) (string, error) {
14+
if err := Installed(); err != nil {
15+
return "", err
16+
}
17+
18+
ctx, cancel := context.WithTimeout(c, 5*time.Second)
19+
defer cancel()
20+
21+
cmd := exec.Command("docker", "run",
22+
"--name", "sqlc_sqltest_docker_postgres",
23+
"-e", "POSTGRES_PASSWORD=mysecretpassword",
24+
"-e", "POSTGRES_USER=postgres",
25+
"-p", "5432:5432",
26+
"-d",
27+
"postgres:16",
28+
"-c", "max_connections=200",
29+
)
30+
31+
output, err := cmd.CombinedOutput()
32+
fmt.Println(string(output))
33+
if err != nil {
34+
return "", err
35+
}
36+
37+
// Create a ticker that fires every 10ms
38+
ticker := time.NewTicker(10 * time.Millisecond)
39+
defer ticker.Stop()
40+
41+
uri := "postgres://postgres:mysecretpassword@localhost:5432/postgres?sslmode=disable"
42+
43+
for {
44+
select {
45+
case <-ctx.Done():
46+
return "", fmt.Errorf("timeout reached: %w", ctx.Err())
47+
48+
case <-ticker.C:
49+
// Run your function here
50+
conn, err := pgx.Connect(ctx, uri)
51+
if err != nil {
52+
slog.Debug("sqltest", "connect", err)
53+
continue
54+
}
55+
if err := conn.Ping(ctx); err != nil {
56+
slog.Error("sqltest", "ping", err)
57+
continue
58+
}
59+
return uri, nil
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)