@@ -9,7 +9,6 @@ package mongo
9
9
import (
10
10
"context"
11
11
"os"
12
- "reflect"
13
12
"testing"
14
13
15
14
"github.com/mongodb/mongo-go-driver/bson"
@@ -82,11 +81,11 @@ func createReadFuncMap(t *testing.T, dbName string, collName string) (*Client, *
82
81
coll .writeConcern = writeconcern .New (writeconcern .WMajority ())
83
82
84
83
functions := []CollFunction {
85
- {"Aggregate" , reflect . ValueOf ( coll . Aggregate ), [] interface {}{ ctx , emptyDoc }},
86
- {"Count" , reflect . ValueOf ( coll . Count ), [] interface {}{ ctx , emptyDoc }},
87
- {"Distinct" , reflect . ValueOf ( coll . Distinct ), [] interface {}{ ctx , "field" , emptyDoc }},
88
- {"Find" , reflect . ValueOf ( coll . Find ), [] interface {}{ ctx , emptyDoc }},
89
- {"FindOne" , reflect . ValueOf ( coll .FindOne ), [] interface {}{ ctx , emptyDoc }},
84
+ {"Aggregate" , coll , nil , func ( mctx SessionContext ) error { _ , err := coll . Aggregate ( mctx , emptyDoc ); return err }},
85
+ {"Count" , coll , nil , func ( mctx SessionContext ) error { _ , err := coll . Count ( mctx , emptyDoc ); return err }},
86
+ {"Distinct" , coll , nil , func ( mctx SessionContext ) error { _ , err := coll . Distinct ( mctx , "field" , emptyDoc ); return err }},
87
+ {"Find" , coll , nil , func ( mctx SessionContext ) error { _ , err := coll . Find ( mctx , emptyDoc ); return err }},
88
+ {"FindOne" , coll , nil , func ( mctx SessionContext ) error { res := coll .FindOne ( mctx , emptyDoc ); return res . err }},
90
89
}
91
90
92
91
_ , err = coll .InsertOne (ctx , startingDoc )
@@ -137,25 +136,31 @@ func createWriteFuncMap(t *testing.T, dbName string, collName string) (*Client,
137
136
manyIndexes := []IndexModel {barIndex , bazIndex }
138
137
139
138
functions := []CollFunction {
140
- {"InsertOne" , reflect .ValueOf (coll .InsertOne ), []interface {}{ctx , doc }},
141
- {"InsertMany" , reflect .ValueOf (coll .InsertMany ), []interface {}{ctx , []interface {}{doc2 }}},
142
- {"DeleteOne" , reflect .ValueOf (coll .DeleteOne ), []interface {}{ctx , emptyDoc }},
143
- {"DeleteMany" , reflect .ValueOf (coll .DeleteMany ), []interface {}{ctx , emptyDoc }},
144
- {"UpdateOne" , reflect .ValueOf (coll .UpdateOne ), []interface {}{ctx , emptyDoc , updateDoc }},
145
- {"UpdateMany" , reflect .ValueOf (coll .UpdateMany ), []interface {}{ctx , emptyDoc , updateDoc }},
146
- {"ReplaceOne" , reflect .ValueOf (coll .ReplaceOne ), []interface {}{ctx , emptyDoc , emptyDoc }},
147
- {"FindOneAndDelete" , reflect .ValueOf (coll .FindOneAndDelete ), []interface {}{ctx , emptyDoc }},
148
- {"FindOneAndReplace" , reflect .ValueOf (coll .FindOneAndReplace ), []interface {}{ctx , emptyDoc , emptyDoc }},
149
- {"FindOneAndUpdate" , reflect .ValueOf (coll .FindOneAndUpdate ), []interface {}{ctx , emptyDoc , updateDoc }},
150
- {"DropCollection" , reflect .ValueOf (coll .Drop ), []interface {}{ctx }},
151
- {"DropDatabase" , reflect .ValueOf (db .Drop ), []interface {}{ctx }},
152
- {"ListCollections" , reflect .ValueOf (db .ListCollections ), []interface {}{ctx , emptyDoc }},
153
- {"ListDatabases" , reflect .ValueOf (client .ListDatabases ), []interface {}{ctx , emptyDoc }},
154
- {"CreateOneIndex" , reflect .ValueOf (iv .CreateOne ), []interface {}{ctx , fooIndex }},
155
- {"CreateManyIndexes" , reflect .ValueOf (iv .CreateMany ), []interface {}{ctx , manyIndexes }},
156
- {"DropOneIndex" , reflect .ValueOf (iv .DropOne ), []interface {}{ctx , "barIndex" }},
157
- {"DropAllIndexes" , reflect .ValueOf (iv .DropAll ), []interface {}{ctx }},
158
- {"ListIndexes" , reflect .ValueOf (iv .List ), []interface {}{ctx }},
139
+ {"InsertOne" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .InsertOne (mctx , doc ); return err }},
140
+ {"InsertMany" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .InsertMany (mctx , []interface {}{doc2 }); return err }},
141
+ {"DeleteOne" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .DeleteOne (mctx , emptyDoc ); return err }},
142
+ {"DeleteMany" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .DeleteMany (mctx , emptyDoc ); return err }},
143
+ {"UpdateOne" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .UpdateOne (mctx , emptyDoc , updateDoc ); return err }},
144
+ {"UpdateMany" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .UpdateMany (mctx , emptyDoc , updateDoc ); return err }},
145
+ {"ReplaceOne" , coll , nil , func (mctx SessionContext ) error { _ , err := coll .ReplaceOne (mctx , emptyDoc , emptyDoc ); return err }},
146
+ {"FindOneAndDelete" , coll , nil , func (mctx SessionContext ) error { res := coll .FindOneAndDelete (mctx , emptyDoc ); return res .err }},
147
+ {"FindOneAndReplace" , coll , nil , func (mctx SessionContext ) error {
148
+ res := coll .FindOneAndReplace (mctx , emptyDoc , emptyDoc )
149
+ return res .err
150
+ }},
151
+ {"FindOneAndUpdate" , coll , nil , func (mctx SessionContext ) error {
152
+ res := coll .FindOneAndUpdate (mctx , emptyDoc , updateDoc )
153
+ return res .err
154
+ }},
155
+ {"DropCollection" , coll , nil , func (mctx SessionContext ) error { err := coll .Drop (mctx ); return err }},
156
+ {"DropDatabase" , coll , nil , func (mctx SessionContext ) error { err := db .Drop (mctx ); return err }},
157
+ {"ListCollections" , coll , nil , func (mctx SessionContext ) error { _ , err := db .ListCollections (mctx , emptyDoc ); return err }},
158
+ {"ListDatabases" , coll , nil , func (mctx SessionContext ) error { _ , err := client .ListDatabases (mctx , emptyDoc ); return err }},
159
+ {"CreateOneIndex" , coll , nil , func (mctx SessionContext ) error { _ , err := iv .CreateOne (mctx , fooIndex ); return err }},
160
+ {"CreateManyIndexes" , coll , nil , func (mctx SessionContext ) error { _ , err := iv .CreateMany (mctx , manyIndexes ); return err }},
161
+ {"DropOneIndex" , coll , nil , func (mctx SessionContext ) error { _ , err := iv .DropOne (mctx , "barIndex" ); return err }},
162
+ {"DropAllIndexes" , coll , nil , func (mctx SessionContext ) error { _ , err := iv .DropAll (mctx ); return err }},
163
+ {"ListIndexes" , coll , nil , func (mctx SessionContext ) error { _ , err := iv .List (mctx ); return err }},
159
164
}
160
165
161
166
return client , db , coll , functions
@@ -183,7 +188,7 @@ func TestCausalConsistency(t *testing.T) {
183
188
testhelpers .RequireNil (t , err , "error creating session: %s" , err )
184
189
defer sess .EndSession (ctx )
185
190
186
- if sess .OperationTime != nil {
191
+ if sess .OperationTime () != nil {
187
192
t .Fatal ("operation time is not nil" )
188
193
}
189
194
})
@@ -192,16 +197,17 @@ func TestCausalConsistency(t *testing.T) {
192
197
// First read in causally consistent session must not send afterClusterTime to the server
193
198
194
199
client := createSessionsMonitoredClient (t , ccMonitor )
195
- sess , err := client .StartSession (sessionopt .CausalConsistency (true ))
196
- testhelpers .RequireNil (t , err , "error creating session: %s" , err )
197
- defer sess .EndSession (ctx )
198
200
199
201
db := client .Database ("FirstCommandDB" )
200
- err = db .Drop (ctx )
202
+ err : = db .Drop (ctx )
201
203
testhelpers .RequireNil (t , err , "error dropping db: %s" , err )
202
204
203
205
coll := db .Collection ("FirstCommandColl" )
204
- _ , err = coll .Find (ctx , emptyDoc , sess )
206
+ err = client .UseSessionWithOptions (ctx , []sessionopt.Session {sessionopt .CausalConsistency (true )},
207
+ func (mctx SessionContext ) error {
208
+ _ , err := coll .Find (mctx , emptyDoc )
209
+ return err
210
+ })
205
211
testhelpers .RequireNil (t , err , "error running find: %s" , err )
206
212
207
213
testhelpers .RequireNotNil (t , ccStarted , "no started command found" )
@@ -228,13 +234,16 @@ func TestCausalConsistency(t *testing.T) {
228
234
testhelpers .RequireNil (t , err , "error dropping db: %s" , err )
229
235
230
236
coll := db .Collection ("OptimeUpdateColl" )
231
- _ , _ = coll .Find (ctx , emptyDoc , sess )
237
+ _ = WithSession (ctx , sess , func (mctx SessionContext ) error {
238
+ _ , _ = coll .Find (mctx , emptyDoc )
239
+ return nil
240
+ })
232
241
233
242
testhelpers .RequireNotNil (t , ccSucceeded , "no succeeded command" )
234
243
serverT , serverI := ccSucceeded .Reply .Lookup ("operationTime" ).Timestamp ()
235
244
236
- testhelpers .RequireNotNil (t , sess .OperationTime , "operation time nil after first command" )
237
- compareOperationTimes (t , & bson.Timestamp {serverT , serverI }, sess .OperationTime )
245
+ testhelpers .RequireNotNil (t , sess .OperationTime () , "operation time nil after first command" )
246
+ compareOperationTimes (t , & bson.Timestamp {serverT , serverI }, sess .OperationTime () )
238
247
})
239
248
240
249
t .Run ("TestOperationTimeSent" , func (t * testing.T ) {
@@ -252,14 +261,15 @@ func TestCausalConsistency(t *testing.T) {
252
261
testhelpers .RequireNil (t , err , "error creating session for %s: %s" , tc .name , err )
253
262
defer sess .EndSession (ctx )
254
263
255
- opts := append (tc .opts , sess )
256
- docRes := coll .FindOne (ctx , emptyDoc , sess )
257
- testhelpers .RequireNil (t , docRes .err , "find one error for %s: %s" , tc .name , docRes .err )
264
+ err = WithSession (ctx , sess , func (mctx SessionContext ) error {
265
+ docRes := coll .FindOne (mctx , emptyDoc )
266
+ return docRes .err
267
+ })
268
+ testhelpers .RequireNil (t , err , "find one error for %s: %s" , tc .name , err )
258
269
259
- currOptime := sess .OperationTime
270
+ currOptime := sess .OperationTime ()
260
271
261
- returnVals := tc .f .Call (getOptValues (opts ))
262
- err = getReturnError (returnVals )
272
+ err = WithSession (ctx , sess , tc .f )
263
273
testhelpers .RequireNil (t , err , "error running %s: %s" , tc .name , err )
264
274
265
275
testhelpers .RequireNotNil (t , ccStarted , "no started command" )
@@ -285,13 +295,15 @@ func TestCausalConsistency(t *testing.T) {
285
295
testhelpers .RequireNil (t , err , "error starting session: %s" , err )
286
296
defer sess .EndSession (ctx )
287
297
288
- opts := append (tc .opts , sess )
289
- returnVals := tc .f .Call (getOptValues (opts ))
290
- err = getReturnError (returnVals )
298
+ err = WithSession (ctx , sess , tc .f )
291
299
testhelpers .RequireNil (t , err , "error running %s: %s" , tc .name , err )
292
300
293
- currentOptime := sess .OperationTime
294
- _ = coll .FindOne (ctx , emptyDoc , sess )
301
+ currentOptime := sess .OperationTime ()
302
+
303
+ _ = WithSession (ctx , sess , func (mctx SessionContext ) error {
304
+ _ = coll .FindOne (mctx , emptyDoc )
305
+ return nil
306
+ })
295
307
296
308
testhelpers .RequireNotNil (t , ccStarted , "no started command" )
297
309
sentOptime := getOperationTime (t , ccStarted .Command )
@@ -308,16 +320,17 @@ func TestCausalConsistency(t *testing.T) {
308
320
skipIfBelow36 (t )
309
321
310
322
client := createSessionsMonitoredClient (t , ccMonitor )
311
- sess , err := client .StartSession (sessionopt .CausalConsistency (false ))
312
- testhelpers .RequireNil (t , err , "error creating session: %s" , err )
313
- defer sess .EndSession (ctx )
314
323
315
324
db := client .Database ("NonConsistentReadDB" )
316
- err = db .Drop (ctx )
325
+ err : = db .Drop (ctx )
317
326
testhelpers .RequireNil (t , err , "error dropping db: %s" , err )
318
327
319
328
coll := db .Collection ("NonConsistentReadColl" )
320
- _ , _ = coll .Find (ctx , emptyDoc , sess )
329
+ _ = client .UseSessionWithOptions (ctx , []sessionopt.Session {sessionopt .CausalConsistency (false )},
330
+ func (mctx SessionContext ) error {
331
+ _ , _ = coll .Find (mctx , emptyDoc )
332
+ return nil
333
+ })
321
334
322
335
testhelpers .RequireNotNil (t , ccStarted , "no started command" )
323
336
if ccStarted .CommandName != "find" {
@@ -338,12 +351,12 @@ func TestCausalConsistency(t *testing.T) {
338
351
339
352
skipIfSessionsSupported (t , db )
340
353
341
- sess , err := client .StartSession (sessionopt .CausalConsistency (true ))
342
- testhelpers .RequireNil (t , err , "error starting session: %s" , err )
343
- defer sess .EndSession (ctx )
344
-
345
354
coll := db .Collection ("InvalidTopologyColl" )
346
- _ , _ = coll .Find (ctx , emptyDoc , sess )
355
+ _ = client .UseSessionWithOptions (ctx , []sessionopt.Session {sessionopt .CausalConsistency (true )},
356
+ func (mctx SessionContext ) error {
357
+ _ , _ = coll .Find (mctx , emptyDoc )
358
+ return nil
359
+ })
347
360
348
361
testhelpers .RequireNotNil (t , ccStarted , "no started command found" )
349
362
if ccStarted .CommandName != "find" {
@@ -370,10 +383,16 @@ func TestCausalConsistency(t *testing.T) {
370
383
371
384
coll := db .Collection ("DefaultReadConcernColl" )
372
385
coll .readConcern = readconcern .New ()
373
- _ = coll .FindOne (ctx , emptyDoc , sess )
386
+ _ = WithSession (ctx , sess , func (mctx SessionContext ) error {
387
+ _ = coll .FindOne (mctx , emptyDoc )
388
+ return nil
389
+ })
374
390
375
- currOptime := sess .OperationTime
376
- _ = coll .FindOne (ctx , emptyDoc , sess )
391
+ currOptime := sess .OperationTime ()
392
+ _ = WithSession (ctx , sess , func (mctx SessionContext ) error {
393
+ _ = coll .FindOne (mctx , emptyDoc )
394
+ return nil
395
+ })
377
396
378
397
testhelpers .RequireNotNil (t , ccStarted , "no started command found" )
379
398
if ccStarted .CommandName != "find" {
@@ -402,10 +421,17 @@ func TestCausalConsistency(t *testing.T) {
402
421
coll := db .Collection ("CustomReadConcernColl" )
403
422
coll .readConcern = readconcern .Majority ()
404
423
405
- _ = coll .FindOne (ctx , emptyDoc , sess )
406
- currOptime := sess .OperationTime
424
+ _ = WithSession (ctx , sess , func (mctx SessionContext ) error {
425
+ _ = coll .FindOne (mctx , emptyDoc )
426
+ return nil
427
+ })
428
+
429
+ currOptime := sess .OperationTime ()
407
430
408
- _ = coll .FindOne (ctx , emptyDoc , sess )
431
+ _ = WithSession (ctx , sess , func (mctx SessionContext ) error {
432
+ _ = coll .FindOne (mctx , emptyDoc )
433
+ return nil
434
+ })
409
435
410
436
testhelpers .RequireNotNil (t , ccStarted , "no started command found" )
411
437
if ccStarted .CommandName != "find" {
@@ -431,7 +457,7 @@ func TestCausalConsistency(t *testing.T) {
431
457
coll .writeConcern = writeconcern .New (writeconcern .W (0 ))
432
458
_ , _ = coll .InsertOne (ctx , doc )
433
459
434
- if sess .OperationTime != nil {
460
+ if sess .OperationTime () != nil {
435
461
t .Fatal ("operation time updated for unacknowledged write" )
436
462
}
437
463
})
0 commit comments