@@ -2,10 +2,12 @@ package txdb
2
2
3
3
import (
4
4
"database/sql"
5
+ "errors"
5
6
"fmt"
6
7
"strings"
7
8
"sync"
8
9
"testing"
10
+ "time"
9
11
)
10
12
11
13
func drivers () []string {
@@ -381,3 +383,55 @@ func TestShouldReopenAfterClose(t *testing.T) {
381
383
}
382
384
}
383
385
}
386
+
387
+ type canceledContext struct {}
388
+
389
+ func (canceledContext ) Deadline () (deadline time.Time , ok bool ) { return time.Time {}, true }
390
+ func (canceledContext ) Done () <- chan struct {} {
391
+ done := make (chan struct {}, 0 )
392
+ close (done )
393
+ return done
394
+ }
395
+ func (canceledContext ) Err () error { return errors .New ("canceled" ) }
396
+ func (canceledContext ) Value (key interface {}) interface {} { return nil }
397
+
398
+ func TestShouldDiscardConnectionWhenClosedBecauseOfError (t * testing.T ) {
399
+ for _ , driver := range drivers () {
400
+ t .Run (fmt .Sprintf ("using driver %s" , driver ), func (t * testing.T ) {
401
+ {
402
+ db , err := sql .Open (driver , "first" )
403
+ if err != nil {
404
+ t .Fatalf (driver + ": failed to open a connection, have you run 'make test'? err: %s" , err )
405
+ }
406
+ defer db .Close ()
407
+
408
+ tx , err := db .Begin ()
409
+ defer tx .Rollback ()
410
+ if err != nil {
411
+ t .Fatalf (driver + ": failed to begin transaction err: %s" , err )
412
+ }
413
+
414
+ // TODO: we somehow need to poison the DB connection here so that Rollback fails
415
+
416
+ _ , err = tx .PrepareContext (canceledContext {}, "SELECT * FROM users" )
417
+ if err == nil {
418
+ t .Fatalf (driver + ": should have returned error for prepare" )
419
+ }
420
+ }
421
+
422
+ fmt .Println ("Opening db..." )
423
+
424
+ {
425
+ db , err := sql .Open (driver , "second" )
426
+ if err != nil {
427
+ t .Fatalf (driver + ": failed to open a connection, have you run 'make test'? err: %s" , err )
428
+ }
429
+ defer db .Close ()
430
+
431
+ if err := db .Ping (); err != nil {
432
+ t .Fatalf (driver + ": failed to ping, have you run 'make test'? err: %s" , err )
433
+ }
434
+ }
435
+ })
436
+ }
437
+ }
0 commit comments