@@ -9,6 +9,7 @@ package mongo
9
9
import (
10
10
"context"
11
11
"errors"
12
+ "math"
12
13
"testing"
13
14
"time"
14
15
@@ -261,70 +262,85 @@ func TestClient(t *testing.T) {
261
262
})
262
263
t .Run ("endSessions" , func (t * testing.T ) {
263
264
cs := testutil .ConnString (t )
264
-
265
- var started []* event.CommandStartedEvent
266
- var failureReasons []string
267
- cmdMonitor := & event.CommandMonitor {
268
- Started : func (_ context.Context , evt * event.CommandStartedEvent ) {
269
- if evt .CommandName == "endSessions" {
270
- started = append (started , evt )
271
- }
272
- },
273
- Failed : func (_ context.Context , evt * event.CommandFailedEvent ) {
274
- if evt .CommandName == "endSessions" {
275
- failureReasons = append (failureReasons , evt .Failure )
276
- }
277
- },
278
- }
279
- clientOpts := options .Client ().ApplyURI (cs .Original ).SetReadPreference (readpref .Primary ()).
280
- SetWriteConcern (writeconcern .New (writeconcern .WMajority ())).SetMonitor (cmdMonitor )
281
- client , err := Connect (bgCtx , clientOpts )
282
- assert .Nil (t , err , "Connect error: %v" , err )
283
- defer func () {
284
- _ = client .Disconnect (bgCtx )
285
- }()
286
-
287
- serverVersion , err := getServerVersion (client .Database ("admin" ))
288
- assert .Nil (t , err , "getServerVersion error: %v" , err )
289
- if compareVersions (t , serverVersion , "3.6.0" ) < 1 {
290
- t .Skip ("skipping server version < 3.6" )
291
- }
292
-
293
- coll := client .Database ("foo" ).Collection ("bar" )
294
- // Lower the batch size to force multiple batches.
295
265
originalBatchSize := endSessionsBatchSize
296
266
endSessionsBatchSize = 2
297
267
defer func () {
298
268
endSessionsBatchSize = originalBatchSize
299
- _ = coll .Drop (bgCtx )
300
269
}()
301
270
302
- // Do an application operation and create four sessions so endSessions will execute in two batches.
303
- _ , err = coll .CountDocuments (bgCtx , bson.D {})
304
- assert .Nil (t , err , "CountDocuments error: %v" , err )
305
- numSessions := 4
306
- var sessions []Session
307
- for i := 0 ; i < numSessions ; i ++ {
308
- sess , err := client .StartSession ()
309
- assert .Nil (t , err , "StartSession error at index %d: %v" , i , err )
310
- sessions = append (sessions , sess )
311
- }
312
- for _ , sess := range sessions {
313
- sess .EndSession (bgCtx )
271
+ testCases := []struct {
272
+ name string
273
+ numSessions int
274
+ eventBatchSizes []int
275
+ }{
276
+ {"number of sessions divides evenly" , endSessionsBatchSize * 2 , []int {endSessionsBatchSize , endSessionsBatchSize }},
277
+ {"number of sessions does not divide evenly" , endSessionsBatchSize + 1 , []int {endSessionsBatchSize , 1 }},
314
278
}
279
+ for _ , tc := range testCases {
280
+ t .Run (tc .name , func (t * testing.T ) {
281
+ // Setup a client and skip the test based on server version.
282
+ var started []* event.CommandStartedEvent
283
+ var failureReasons []string
284
+ cmdMonitor := & event.CommandMonitor {
285
+ Started : func (_ context.Context , evt * event.CommandStartedEvent ) {
286
+ if evt .CommandName == "endSessions" {
287
+ started = append (started , evt )
288
+ }
289
+ },
290
+ Failed : func (_ context.Context , evt * event.CommandFailedEvent ) {
291
+ if evt .CommandName == "endSessions" {
292
+ failureReasons = append (failureReasons , evt .Failure )
293
+ }
294
+ },
295
+ }
296
+ clientOpts := options .Client ().ApplyURI (cs .Original ).SetReadPreference (readpref .Primary ()).
297
+ SetWriteConcern (writeconcern .New (writeconcern .WMajority ())).SetMonitor (cmdMonitor )
298
+ client , err := Connect (bgCtx , clientOpts )
299
+ assert .Nil (t , err , "Connect error: %v" , err )
300
+ defer func () {
301
+ _ = client .Disconnect (bgCtx )
302
+ }()
303
+
304
+ serverVersion , err := getServerVersion (client .Database ("admin" ))
305
+ assert .Nil (t , err , "getServerVersion error: %v" , err )
306
+ if compareVersions (t , serverVersion , "3.6.0" ) < 1 {
307
+ t .Skip ("skipping server version < 3.6" )
308
+ }
315
309
316
- client .endSessions (bgCtx )
317
- numEventsExpected := numSessions / endSessionsBatchSize
318
- assert .Equal (t , len (started ), numEventsExpected , "expected %d started events, got %d" , numEventsExpected ,
319
- len (started ))
320
- assert .Equal (t , len (failureReasons ), 0 , "endSessions errors: %v" , failureReasons )
310
+ coll := client .Database ("foo" ).Collection ("bar" )
311
+ defer func () {
312
+ _ = coll .Drop (bgCtx )
313
+ }()
321
314
322
- for i := 0 ; i < numEventsExpected ; i ++ {
323
- sentArray := started [i ].Command .Lookup ("endSessions" ).Array ()
324
- values , _ := sentArray .Values ()
325
- assert .Equal (t , len (values ), endSessionsBatchSize ,
326
- "batch size mismatch at index %d; expected %d sessions in batch, got %d" , i , endSessionsBatchSize ,
327
- len (values ))
315
+ // Do an application operation and create four sessions so endSessions will execute in two batches.
316
+ _ , err = coll .CountDocuments (bgCtx , bson.D {})
317
+ assert .Nil (t , err , "CountDocuments error: %v" , err )
318
+ var sessions []Session
319
+ for i := 0 ; i < tc .numSessions ; i ++ {
320
+ sess , err := client .StartSession ()
321
+ assert .Nil (t , err , "StartSession error at index %d: %v" , i , err )
322
+ sessions = append (sessions , sess )
323
+ }
324
+ for _ , sess := range sessions {
325
+ sess .EndSession (bgCtx )
326
+ }
327
+
328
+ client .endSessions (bgCtx )
329
+ divisionResult := float64 (tc .numSessions ) / float64 (endSessionsBatchSize )
330
+ numEventsExpected := int (math .Ceil (divisionResult ))
331
+ assert .Equal (t , len (started ), numEventsExpected , "expected %d started events, got %d" , numEventsExpected ,
332
+ len (started ))
333
+ assert .Equal (t , len (failureReasons ), 0 , "endSessions errors: %v" , failureReasons )
334
+
335
+ for i := 0 ; i < numEventsExpected ; i ++ {
336
+ sentArray := started [i ].Command .Lookup ("endSessions" ).Array ()
337
+ values , _ := sentArray .Values ()
338
+ expectedNumValues := tc .eventBatchSizes [i ]
339
+ assert .Equal (t , len (values ), expectedNumValues ,
340
+ "batch size mismatch at index %d; expected %d sessions in batch, got %d" , i , expectedNumValues ,
341
+ len (values ))
342
+ }
343
+ })
328
344
}
329
345
})
330
346
}
0 commit comments