Skip to content

Commit d95fd1b

Browse files
author
Divjot Arora
committed
add tests for odd number of sessions
1 parent bc23820 commit d95fd1b

File tree

1 file changed

+71
-55
lines changed

1 file changed

+71
-55
lines changed

mongo/client_test.go

Lines changed: 71 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ package mongo
99
import (
1010
"context"
1111
"errors"
12+
"math"
1213
"testing"
1314
"time"
1415

@@ -261,70 +262,85 @@ func TestClient(t *testing.T) {
261262
})
262263
t.Run("endSessions", func(t *testing.T) {
263264
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.
295265
originalBatchSize := endSessionsBatchSize
296266
endSessionsBatchSize = 2
297267
defer func() {
298268
endSessionsBatchSize = originalBatchSize
299-
_ = coll.Drop(bgCtx)
300269
}()
301270

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}},
314278
}
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+
}
315309

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+
}()
321314

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+
})
328344
}
329345
})
330346
}

0 commit comments

Comments
 (0)