@@ -28,6 +28,7 @@ import (
28
28
"time"
29
29
30
30
"cloud.google.com/go/cloudsqlconn"
31
+ "cloud.google.com/go/cloudsqlconn/instance"
31
32
"github.com/jackc/pgx/v5/pgxpool"
32
33
"golang.org/x/oauth2"
33
34
"golang.org/x/oauth2/google"
@@ -161,6 +162,62 @@ func TestPostgresCASConnect(t *testing.T) {
161
162
t .Log (now )
162
163
}
163
164
165
+ type pgMockResolver struct {
166
+ }
167
+
168
+ func (r * pgMockResolver ) Resolve (_ context.Context , name string ) (instanceName instance.ConnName , err error ) {
169
+ if name == "pg.example.com" {
170
+ return instance .ParseConnNameWithDomainName (postgresConnName , "pg.example.com" )
171
+ }
172
+ return instance.ConnName {}, fmt .Errorf ("no resolution for %v" , name )
173
+ }
174
+
175
+ func TestPostgresPgxPoolConnectDomainName (t * testing.T ) {
176
+ if testing .Short () {
177
+ t .Skip ("skipping Postgres integration tests" )
178
+ }
179
+ requirePostgresVars (t )
180
+ pgxv5 .RegisterDriver ("pgxpool-connect" )
181
+
182
+ ctx := context .Background ()
183
+
184
+ // Configure the driver to connect to the database
185
+ dsn := fmt .Sprintf ("user=%s password=%s dbname=%s sslmode=disable" , postgresUser , postgresPass , postgresDB )
186
+ config , err := pgxpool .ParseConfig (dsn )
187
+ if err != nil {
188
+ t .Fatalf ("failed to parse pgx config: %v" , err )
189
+ }
190
+
191
+ // Create a new dialer with any options
192
+ d , err := cloudsqlconn .NewDialer (ctx , cloudsqlconn .WithResolver (& pgMockResolver {}))
193
+ if err != nil {
194
+ t .Fatalf ("failed to init Dialer: %v" , err )
195
+ }
196
+
197
+ // call cleanup when you're done with the database connection to close dialer
198
+ cleanup := func () { d .Close () }
199
+ t .Cleanup (cleanup )
200
+
201
+ // Tell the driver to use the Cloud SQL Go Connector to create connections
202
+ // postgresConnName takes the form of 'project:region:instance'.
203
+ config .ConnConfig .DialFunc = func (ctx context.Context , _ string , _ string ) (net.Conn , error ) {
204
+ return d .Dial (ctx , "pg.example.com" ) //TODO: Replace this with a real DNS instance.
205
+ }
206
+
207
+ pool , err := pgxpool .NewWithConfig (ctx , config )
208
+ if err != nil {
209
+ t .Fatalf ("failed to create pool: %s" , err )
210
+ }
211
+ defer pool .Close ()
212
+
213
+ var now time.Time
214
+ err = pool .QueryRow (context .Background (), "SELECT NOW()" ).Scan (& now )
215
+ if err != nil {
216
+ t .Fatalf ("QueryRow failed: %s" , err )
217
+ }
218
+ t .Log (now )
219
+ }
220
+
164
221
func TestPostgresConnectWithIAMUser (t * testing.T ) {
165
222
if testing .Short () {
166
223
t .Skip ("skipping Postgres integration tests" )
@@ -264,6 +321,7 @@ func TestPostgresV5Hook(t *testing.T) {
264
321
driver string
265
322
source string
266
323
IAMAuthN bool
324
+ resolver bool
267
325
}{
268
326
{
269
327
driver : "cloudsql-postgres-v5" ,
@@ -277,6 +335,13 @@ func TestPostgresV5Hook(t *testing.T) {
277
335
postgresConnName , postgresUserIAM , postgresDB ),
278
336
IAMAuthN : true ,
279
337
},
338
+ {
339
+ driver : "cloudsql-postgres-v5-dns" ,
340
+ source : fmt .Sprintf ("host=%s user=%s password=%s dbname=%s sslmode=disable" ,
341
+ "pg.example.com" , postgresUser , postgresPass , postgresDB ),
342
+ IAMAuthN : false ,
343
+ resolver : true ,
344
+ },
280
345
}
281
346
282
347
if testing .Short () {
@@ -293,6 +358,8 @@ func TestPostgresV5Hook(t *testing.T) {
293
358
for _ , tc := range tests {
294
359
if tc .IAMAuthN {
295
360
pgxv5 .RegisterDriver (tc .driver , cloudsqlconn .WithIAMAuthN ())
361
+ } else if tc .resolver {
362
+ pgxv5 .RegisterDriver (tc .driver , cloudsqlconn .WithResolver (& pgMockResolver {}))
296
363
} else {
297
364
pgxv5 .RegisterDriver (tc .driver )
298
365
}
0 commit comments