@@ -13,6 +13,8 @@ import (
13
13
"time"
14
14
15
15
"go.mongodb.org/mongo-driver/bson"
16
+ "go.mongodb.org/mongo-driver/event"
17
+ "go.mongodb.org/mongo-driver/internal/testutil"
16
18
"go.mongodb.org/mongo-driver/internal/testutil/assert"
17
19
"go.mongodb.org/mongo-driver/mongo/options"
18
20
"go.mongodb.org/mongo-driver/mongo/readconcern"
@@ -257,4 +259,64 @@ func TestClient(t *testing.T) {
257
259
assert .Equal (t , uri , got , "expected GetURI to return %v, got %v" , uri , got )
258
260
})
259
261
})
262
+ t .Run ("endSessions" , func (t * testing.T ) {
263
+ 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
+ coll := client .Database ("foo" ).Collection ("bar" )
284
+
285
+ // Lower the batch size to force multiple batches.
286
+ originalBatchSize := endSessionsBatchSize
287
+ endSessionsBatchSize = 2
288
+ defer func () {
289
+ endSessionsBatchSize = originalBatchSize
290
+ _ = coll .Drop (bgCtx )
291
+ _ = client .Disconnect (bgCtx )
292
+ }()
293
+
294
+ // Do an application operation and create four sessions so endSessions will execute in two batches.
295
+ _ , err = coll .CountDocuments (bgCtx , bson.D {})
296
+ assert .Nil (t , err , "CountDocuments error: %v" , err )
297
+ numSessions := 4
298
+ var sessions []Session
299
+ for i := 0 ; i < numSessions ; i ++ {
300
+ sess , err := client .StartSession ()
301
+ assert .Nil (t , err , "StartSession error at index %d: %v" , i , err )
302
+ sessions = append (sessions , sess )
303
+ }
304
+ for _ , sess := range sessions {
305
+ sess .EndSession (bgCtx )
306
+ }
307
+
308
+ client .endSessions (bgCtx )
309
+ numEventsExpected := numSessions / endSessionsBatchSize
310
+ assert .Equal (t , len (started ), numEventsExpected , "expected %d started events, got %d" , numEventsExpected ,
311
+ len (started ))
312
+ assert .Equal (t , len (failureReasons ), 0 , "endSessions errors: %v" , failureReasons )
313
+
314
+ for i := 0 ; i < numEventsExpected ; i ++ {
315
+ sentArray := started [i ].Command .Lookup ("endSessions" ).Array ()
316
+ values , _ := sentArray .Values ()
317
+ assert .Equal (t , len (values ), endSessionsBatchSize ,
318
+ "batch size mismatch at index %d; expected %d sessions in batch, got %d" , i , endSessionsBatchSize ,
319
+ len (values ))
320
+ }
321
+ })
260
322
}
0 commit comments