Skip to content

Commit 1d0c791

Browse files
authored
CSHARP-5204: Test Heartbeats don't gossip cluster time (#1665)
1 parent 3e65585 commit 1d0c791

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

tests/MongoDB.Driver.Tests/Specifications/sessions/SessionsProseTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
using MongoDB.Bson;
2222
using MongoDB.Bson.TestHelpers;
2323
using MongoDB.Driver.Core;
24+
using MongoDB.Driver.Core.Clusters;
2425
using MongoDB.Driver.Core.Events;
2526
using MongoDB.Driver.Core.Misc;
2627
using MongoDB.Driver.Core.TestHelpers.Logging;
@@ -302,6 +303,55 @@ public async Task Ensure_server_session_are_allocated_only_on_connection_checkou
302303
await eventsTask.WithTimeout(1000);
303304
}
304305

306+
// https://specifications.readthedocs.io/en/latest/sessions/tests/#20-drivers-do-not-gossip-clustertime-on-sdam-commands
307+
[Fact]
308+
public void Ensure_cluster_times_are_not_gossiped_on_SDAM_commands()
309+
{
310+
RequireServer.Check().ClusterTypes(ClusterType.ReplicaSet, ClusterType.Sharded);
311+
312+
var eventCapturer = new EventCapturer()
313+
.Capture<ServerHeartbeatStartedEvent>()
314+
.Capture<ServerHeartbeatSucceededEvent>()
315+
.Capture<CommandStartedEvent>();
316+
317+
using var c1 = DriverTestConfiguration.CreateMongoClient(
318+
settings =>
319+
{
320+
settings.ClusterConfigurator = c => c.Subscribe(eventCapturer);
321+
settings.DirectConnection = true;
322+
settings.HeartbeatInterval = TimeSpan.FromMilliseconds(10);
323+
if (settings.Servers.Count() > 1)
324+
{
325+
settings.Servers = settings.Servers.Take(1);
326+
}
327+
});
328+
329+
var pingCommand = new BsonDocument("ping", 1);
330+
var pingResult = c1.GetDatabase("admin").RunCommand<BsonDocument>(pingCommand);
331+
332+
var clusterTime = pingResult["$clusterTime"];
333+
334+
var c2 = DriverTestConfiguration.Client;
335+
c2.GetDatabase("test").GetCollection<BsonDocument>("test").InsertOne(new BsonDocument("advance", "$clusterTime"));
336+
337+
eventCapturer.Clear();
338+
339+
eventCapturer.WaitForOrThrowIfTimeout(
340+
capturedEvents =>
341+
{
342+
return capturedEvents
343+
.SkipWhile(e => e is not ServerHeartbeatStartedEvent)
344+
.Any(e => e is ServerHeartbeatSucceededEvent);
345+
}, TimeSpan.FromSeconds(1), "Didn't get any server heartbeat pairs");
346+
347+
c1.GetDatabase("admin").RunCommand<BsonDocument>(pingCommand);
348+
349+
var commandStartedEvents = eventCapturer.Events.OfType<CommandStartedEvent>().ToArray();
350+
commandStartedEvents.Length.Should().Be(1);
351+
commandStartedEvents[0].CommandName.Should().Be("ping");
352+
commandStartedEvents[0].Command["$clusterTime"].Should().Be(clusterTime);
353+
}
354+
305355
private sealed class MongocryptdContext : IDisposable
306356
{
307357
public IMongoClient MongoClient { get; }

0 commit comments

Comments
 (0)