Skip to content

Commit 8a39c92

Browse files
committed
test: Add e2e test to access instance using DNS SRV record. part of #842
1 parent 7296c90 commit 8a39c92

File tree

2 files changed

+102
-13
lines changed

2 files changed

+102
-13
lines changed

e2e_mysql_test.go

+43-13
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515
package cloudsqlconn_test
1616

1717
import (
18+
"context"
1819
"database/sql"
20+
"fmt"
1921
"os"
2022
"testing"
2123
"time"
2224

2325
"cloud.google.com/go/cloudsqlconn"
26+
"cloud.google.com/go/cloudsqlconn/instance"
2427
"cloud.google.com/go/cloudsqlconn/mysql/mysql"
2528
gomysql "github.com/go-sql-driver/mysql"
2629
)
@@ -54,25 +57,52 @@ func requireMySQLVars(t *testing.T) {
5457
}
5558
}
5659

60+
type mockResolver struct {
61+
}
62+
63+
func (r *mockResolver) Lookup(_ context.Context, name string) (instanceName instance.ConnName, err error) {
64+
if name == "mysql.example.com" {
65+
return instance.ParseConnNameWithDomainName(mysqlConnName, "mysql.example.com")
66+
}
67+
return instance.ConnName{}, fmt.Errorf("no resolution for %v", name)
68+
}
69+
5770
func TestMySQLDriver(t *testing.T) {
5871
if testing.Short() {
5972
t.Skip("skipping MySQL integration tests")
6073
}
6174

6275
tcs := []struct {
63-
desc string
64-
driverName string
65-
opts []cloudsqlconn.Option
76+
desc string
77+
driverName string
78+
instanceName string
79+
user string
80+
password string
81+
opts []cloudsqlconn.Option
6682
}{
6783
{
68-
desc: "default options",
69-
driverName: "cloudsql-mysql",
70-
opts: nil,
84+
desc: "default options",
85+
driverName: "cloudsql-mysql",
86+
opts: nil,
87+
instanceName: mysqlConnName,
88+
user: mysqlUser,
89+
password: mysqlPass,
90+
},
91+
{
92+
desc: "auto IAM authn",
93+
driverName: "cloudsql-mysql-iam",
94+
opts: []cloudsqlconn.Option{cloudsqlconn.WithIAMAuthN()},
95+
instanceName: mysqlIAMConnName,
96+
user: mysqlIAMUser,
97+
password: "password",
7198
},
7299
{
73-
desc: "auto IAM authn",
74-
driverName: "cloudsql-mysql-iam",
75-
opts: []cloudsqlconn.Option{cloudsqlconn.WithIAMAuthN()},
100+
desc: "with dns",
101+
driverName: "cloudsql-mysql-dns",
102+
opts: []cloudsqlconn.Option{cloudsqlconn.WithResolver(&mockResolver{})},
103+
instanceName: "mysql.example.com",
104+
user: mysqlUser,
105+
password: mysqlPass,
76106
},
77107
}
78108

@@ -85,18 +115,18 @@ func TestMySQLDriver(t *testing.T) {
85115
}
86116
t.Log(now)
87117
}
88-
cleanup, err := mysql.RegisterDriver(tc.driverName)
118+
cleanup, err := mysql.RegisterDriver(tc.driverName, tc.opts...)
89119
if err != nil {
90120
t.Fatalf("failed to register driver: %v", err)
91121
}
92122
defer cleanup()
93123
cfg := gomysql.NewConfig()
94124
cfg.CheckConnLiveness = true
95-
cfg.User = mysqlUser
96-
cfg.Passwd = mysqlPass
125+
cfg.User = tc.user
126+
cfg.Passwd = tc.password
97127
cfg.DBName = mysqlDB
98128
cfg.Net = tc.driverName
99-
cfg.Addr = mysqlConnName
129+
cfg.Addr = tc.instanceName
100130
cfg.Params = map[string]string{"parseTime": "true"}
101131

102132
db, err := sql.Open("mysql", cfg.FormatDSN())

e2e_postgres_test.go

+59
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"time"
2929

3030
"cloud.google.com/go/cloudsqlconn"
31+
"cloud.google.com/go/cloudsqlconn/instance"
3132
"github.com/jackc/pgx/v5/pgxpool"
3233
"golang.org/x/oauth2"
3334
"golang.org/x/oauth2/google"
@@ -107,6 +108,64 @@ func TestPostgresPgxPoolConnect(t *testing.T) {
107108
t.Log(now)
108109
}
109110

111+
type pgMockResolver struct {
112+
}
113+
114+
func (r *pgMockResolver) Lookup(_ context.Context, name string) (instanceName instance.ConnName, err error) {
115+
if name == "pg.example.com" {
116+
return instance.ParseConnNameWithDomainName(postgresConnName, "pg.example.com")
117+
}
118+
return instance.ConnName{}, fmt.Errorf("no resolution for %v", name)
119+
}
120+
121+
func TestPostgresPgxPoolConnectDomainName(t *testing.T) {
122+
if testing.Short() {
123+
t.Skip("skipping Postgres integration tests")
124+
}
125+
requirePostgresVars(t)
126+
127+
ctx := context.Background()
128+
129+
// Configure the driver to connect to the database
130+
dsn := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=disable", postgresUser, postgresPass, postgresDB)
131+
config, err := pgxpool.ParseConfig(dsn)
132+
if err != nil {
133+
t.Fatalf("failed to parse pgx config: %v", err)
134+
}
135+
136+
// Create a new dialer with any options
137+
d, err := cloudsqlconn.NewDialer(ctx, cloudsqlconn.WithResolver(&pgMockResolver{}))
138+
if err != nil {
139+
t.Fatalf("failed to init Dialer: %v", err)
140+
}
141+
142+
// call cleanup when you're done with the database connection to close dialer
143+
cleanup := func() error { return d.Close() }
144+
145+
// Tell the driver to use the Cloud SQL Go Connector to create connections
146+
// postgresConnName takes the form of 'project:region:instance'.
147+
config.ConnConfig.DialFunc = func(ctx context.Context, _ string, addr string) (net.Conn, error) {
148+
return d.Dial(ctx, "pg.example.com")
149+
}
150+
151+
// Interact with the driver directly as you normally would
152+
pool, err := pgxpool.NewWithConfig(ctx, config)
153+
if err != nil {
154+
t.Fatalf("failed to create pool: %s", err)
155+
}
156+
// ... etc
157+
158+
defer cleanup()
159+
defer pool.Close()
160+
161+
var now time.Time
162+
err = pool.QueryRow(context.Background(), "SELECT NOW()").Scan(&now)
163+
if err != nil {
164+
t.Fatalf("QueryRow failed: %s", err)
165+
}
166+
t.Log(now)
167+
}
168+
110169
func TestPostgresConnectWithIAMUser(t *testing.T) {
111170
if testing.Short() {
112171
t.Skip("skipping Postgres integration tests")

0 commit comments

Comments
 (0)