9
9
"time"
10
10
11
11
"github.com/cenkalti/backoff/v5"
12
+ "github.com/n-r-w/ctxlog"
12
13
)
13
14
14
15
// Informer interface for database information.
@@ -38,7 +39,7 @@ type PrepareCleanUp func(db *sql.DB, databaseName string) error
38
39
type testDB struct {
39
40
t testing.TB
40
41
41
- logger Logger // unified way to logging
42
+ logger ctxlog. ILogger // unified way to logging
42
43
43
44
databaseName string // name of the test database
44
45
url * dbURL // parsed database connection string
@@ -70,13 +71,13 @@ var (
70
71
)
71
72
72
73
// newTDB creates a new test database and applies migrations.
73
- func newTDB (tb testing.TB , driver , dsn string , opt []Option ) * testDB {
74
+ func newTDB (ctx context. Context , tb testing.TB , driver , dsn string , opt []Option ) * testDB {
74
75
tb .Helper ()
75
76
76
77
var (
77
78
db = & testDB {
78
79
t : tb ,
79
- logger : NewDefaultLogger ( tb ),
80
+ logger : ctxlog . Must ( ctxlog . WithTesting ( tb ) ),
80
81
driver : driver ,
81
82
dsn : dsn ,
82
83
mode : RunModeAuto ,
@@ -88,7 +89,7 @@ func newTDB(tb testing.TB, driver, dsn string, opt []Option) *testDB {
88
89
89
90
defer func () {
90
91
if errResult != nil {
91
- db . logger . Fatalf ("%v" , errResult )
92
+ tb . Fatalf ("cannot create test database: %v" , errResult )
92
93
}
93
94
}()
94
95
@@ -108,46 +109,47 @@ func newTDB(tb testing.TB, driver, dsn string, opt []Option) *testDB {
108
109
defer mu .Unlock ()
109
110
110
111
if db .mode == RunModeDocker {
111
- db .logger .Logf ( "[%s] using docker test database" , db .dsnNoPass )
112
- if errResult = db .createDockerResources (); errResult != nil {
112
+ db .logger .Info ( ctx , " using docker test database" , "dsn " , db .dsnNoPass )
113
+ if errResult = db .createDockerResources (ctx ); errResult != nil {
113
114
return nil
114
115
}
115
116
} else {
116
- db .logger .Logf ( "[%s] using real test database" , db .dsnNoPass )
117
+ db .logger .Info ( ctx , " using real test database" , "dsn " , db .dsnNoPass )
117
118
}
118
119
119
- if errResult = db .createTestDatabase (); errResult != nil {
120
- if err := db .close (); err != nil {
121
- db .logger .Logf ( "[%s] failed to close test database: %v" , db .dsnNoPass , err )
120
+ if errResult = db .createTestDatabase (ctx ); errResult != nil {
121
+ if err := db .close (ctx ); err != nil {
122
+ db .logger .Info ( ctx , " failed to close test database" , "dsn" , db .dsnNoPass , "error" , err )
122
123
}
123
124
return nil
124
125
}
125
126
126
127
if db .migrationsDir != "" {
127
- if errResult = db .migrationsUp (); errResult != nil {
128
+ if errResult = db .migrationsUp (ctx ); errResult != nil {
128
129
return nil
129
130
}
130
131
}
131
132
132
133
tb .Cleanup (func () {
133
- if err := db .close (); err != nil {
134
- db .logger .Logf ("[%s] failed to close test database: %v" , db .dsnNoPass , err )
134
+ ctx := context .Background ()
135
+ if err := db .close (ctx ); err != nil {
136
+ db .logger .Info (ctx , "failed to close test database" , "dsn" , db .dsnNoPass , "error" , err )
135
137
} else {
136
- db .logger .Logf ( "[%s] test database closed" , db .dsnNoPass )
138
+ db .logger .Info ( ctx , " test database closed" , "dsn " , db .dsnNoPass )
137
139
}
138
140
})
139
141
140
142
return db
141
143
}
142
144
143
145
// migrationsUp applies migrations to the database.
144
- func (d * testDB ) migrationsUp () error {
145
- d .logger .Logf ( "[%s] migrations up start" , d .dsnNoPass )
146
- defer d .logger .Logf ( "[%s] migrations up end" , d .dsnNoPass )
146
+ func (d * testDB ) migrationsUp (ctx context. Context ) error {
147
+ d .logger .Info ( ctx , " migrations up start" , "dsn " , d .dsnNoPass )
148
+ defer d .logger .Info ( ctx , " migrations up end" , "dsn " , d .dsnNoPass )
147
149
148
150
dsn := d .url .replaceDatabase (d .databaseName ).string (false )
149
151
150
- migrator , err := d .MigrateFactory (dsn , d .migrationsDir , d .logger )
152
+ migrator , err := d .MigrateFactory (d . t , dsn , d .migrationsDir , d .logger )
151
153
if err != nil {
152
154
return fmt .Errorf ("new migrator: %w" , err )
153
155
}
@@ -160,10 +162,10 @@ func (d *testDB) migrationsUp() error {
160
162
}
161
163
162
164
// close closes the test database.
163
- func (d * testDB ) close () error {
165
+ func (d * testDB ) close (ctx context. Context ) error {
164
166
if d .mode != RunModeDocker {
165
167
// remove the database created before applying the migrations
166
- d .logger .Logf ( "[%s] deleting test database %s" , d .dsnNoPass , d .databaseName )
168
+ d .logger .Info ( ctx , " deleting test database" , "dsn" , d .dsnNoPass , "database" , d .databaseName )
167
169
168
170
dsn := d .url .string (false )
169
171
db , err := sql .Open (d .driver , dsn )
@@ -176,35 +178,35 @@ func (d *testDB) close() error {
176
178
177
179
for _ , prepareCleanUp := range d .prepareCleanUp {
178
180
if err := prepareCleanUp (db , d .databaseName ); err != nil {
179
- d .logger .Logf ( "[%s] failed to prepare clean up: %v" , d .dsnNoPass , err )
181
+ d .logger .Info ( ctx , " failed to prepare clean up" , "dsn" , d .dsnNoPass , "error" , err )
180
182
}
181
183
}
182
184
183
185
if _ , err = db .Exec (fmt .Sprintf ("DROP DATABASE %s" , d .databaseName )); err != nil {
184
186
return fmt .Errorf ("drop db: %w" , err )
185
187
}
186
188
187
- d .logger .Logf ( "[%s] test db %s deleted" , d .dsnNoPass , d .databaseName )
189
+ d .logger .Info ( ctx , " test database deleted" , "dsn" , d .dsnNoPass , "database" , d .databaseName )
188
190
}
189
191
190
192
return nil
191
193
}
192
194
193
195
// initDatabase creates a test database or connects to an existing one.
194
- func (d * testDB ) createTestDatabase () error {
196
+ func (d * testDB ) createTestDatabase (ctx context. Context ) error {
195
197
if d .driver == mongoDriverName {
196
198
return nil
197
199
}
198
200
199
- return d .createSQLDatabase ()
201
+ return d .createSQLDatabase (ctx )
200
202
}
201
203
202
204
// retryConnect connects to the database with retries.
203
- func (d * testDB ) retryConnect (info string , op func () error ) error {
205
+ func (d * testDB ) retryConnect (ctx context. Context , info string , op func () error ) error {
204
206
var attempt int
205
207
operation := func () (struct {}, error ) {
206
208
if err := op (); err != nil {
207
- d .logger .Logf ( "[%s] retrying attempt %d: %v" , info , attempt , err )
209
+ d .logger .Info ( ctx , " retrying operation" , "info" , info , " attempt" , attempt , "error" , err )
208
210
attempt ++
209
211
return struct {}{}, err
210
212
}
0 commit comments