diff --git a/mongo/integration/unified/testrunner_operation.go b/mongo/integration/unified/testrunner_operation.go index b1af95b5ba..6f31a199cc 100644 --- a/mongo/integration/unified/testrunner_operation.go +++ b/mongo/integration/unified/testrunner_operation.go @@ -222,6 +222,41 @@ func executeTestRunnerOperation(ctx context.Context, op *operation, loopDone <-c defer cancel() return waitForEvent(wfeCtx, wfeArgs) + case "wait": + timeMs := lookupInteger(args, "ms") + + dur := time.Duration(timeMs) * time.Millisecond + time.Sleep(dur) + + return nil + case "assertEventCount": + // args: client, event, count + var wfeArgs waitForEventArguments + if err := bson.Unmarshal(op.Arguments, &wfeArgs); err != nil { + return fmt.Errorf("error unmarshalling event to waitForEventArguments: %v", err) + } + + client, err := entities(ctx).client(wfeArgs.ClientID) + if err != nil { + return err + } + + for rawEventType, eventDoc := range wfeArgs.Event { + eventType, _ := monitoringEventTypeFromString(rawEventType) + + switch eventType { + case serverDescriptionChangedEvent: + if got := getServerDescriptionChangedEventCount(client, eventDoc); got != wfeArgs.Count { + return fmt.Errorf("failed to assert count. want: %v, got: %v", wfeArgs.Count, got) + } + default: + if got := client.getEventCount(eventType); got != wfeArgs.Count { + return fmt.Errorf("failed to assert count. want: %v, got: %v", wfeArgs.Count, got) + } + } + } + + return nil default: return fmt.Errorf("unrecognized testRunner operation %q", op.Name) } diff --git a/testdata/server-discovery-and-monitoring/unified/serverMonitoringMode.json b/testdata/server-discovery-and-monitoring/unified/serverMonitoringMode.json index 7d681b4f9e..5b490f0f50 100644 --- a/testdata/server-discovery-and-monitoring/unified/serverMonitoringMode.json +++ b/testdata/server-discovery-and-monitoring/unified/serverMonitoringMode.json @@ -444,6 +444,70 @@ ] } ] + }, + { + "description": "poll waits after successful heartbeat", + "operations": [ + { + "name": "createEntities", + "object": "testRunner", + "arguments": { + "entities": [ + { + "client": { + "id": "client", + "uriOptions": { + "serverMonitoringMode": "poll", + "heartbeatFrequencyMS": 1000000 + }, + "useMultipleMongoses": false, + "observeEvents": [ + "serverHeartbeatStartedEvent", + "serverHeartbeatSucceededEvent", + "serverHeartbeatFailedEvent" + ] + } + }, + { + "database": { + "id": "db", + "client": "client", + "databaseName": "sdam-tests" + } + } + ] + } + }, + { + "name": "waitForEvent", + "object": "testRunner", + "arguments": { + "client": "client", + "event": { + "serverHeartbeatSucceededEvent": {} + }, + "count": 1 + } + }, + { + "name": "wait", + "object": "testRunner", + "arguments": { + "ms": 500 + } + }, + { + "name": "assertEventCount", + "object": "testRunner", + "arguments": { + "client": "client", + "event": { + "serverHeartbeatStartedEvent": {} + }, + "count": 1 + } + } + ] } ] }