@@ -9,10 +9,13 @@ package mongo
9
9
import (
10
10
"context"
11
11
"errors"
12
+ "math"
12
13
"testing"
13
14
"time"
14
15
15
16
"go.mongodb.org/mongo-driver/bson"
17
+ "go.mongodb.org/mongo-driver/event"
18
+ "go.mongodb.org/mongo-driver/internal/testutil"
16
19
"go.mongodb.org/mongo-driver/internal/testutil/assert"
17
20
"go.mongodb.org/mongo-driver/mongo/options"
18
21
"go.mongodb.org/mongo-driver/mongo/readconcern"
@@ -257,4 +260,87 @@ func TestClient(t *testing.T) {
257
260
assert .Equal (t , uri , got , "expected GetURI to return %v, got %v" , uri , got )
258
261
})
259
262
})
263
+ t .Run ("endSessions" , func (t * testing.T ) {
264
+ cs := testutil .ConnString (t )
265
+ originalBatchSize := endSessionsBatchSize
266
+ endSessionsBatchSize = 2
267
+ defer func () {
268
+ endSessionsBatchSize = originalBatchSize
269
+ }()
270
+
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 }},
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
+ }
309
+
310
+ coll := client .Database ("foo" ).Collection ("bar" )
311
+ defer func () {
312
+ _ = coll .Drop (bgCtx )
313
+ }()
314
+
315
+ // Do an application operation and create the number of sessions specified by the test.
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
+ })
344
+ }
345
+ })
260
346
}
0 commit comments