Skip to content

Commit ae4c630

Browse files
committed
CSHARP-2109: Fix race condition in BinaryConnectionTests.
1 parent 9f558df commit ae4c630

File tree

1 file changed

+69
-18
lines changed

1 file changed

+69
-18
lines changed

tests/MongoDB.Driver.Core.Tests/Core/Connections/BinaryConnectionTests.cs

Lines changed: 69 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@
1414
*/
1515

1616
using System;
17+
using System.Collections.Generic;
1718
using System.IO;
19+
using System.Linq;
1820
using System.Net;
1921
using System.Net.Sockets;
2022
using System.Threading;
2123
using System.Threading.Tasks;
2224
using FluentAssertions;
2325
using MongoDB.Bson;
24-
using MongoDB.Bson.Serialization;
2526
using MongoDB.Bson.Serialization.Serializers;
2627
using MongoDB.Bson.TestHelpers.XunitExtensions;
2728
using MongoDB.Driver.Core.Clusters;
@@ -715,26 +716,76 @@ public void SendMessageshould_throw_MongoConnectionClosedException_for_waiting_t
715716
Func<Task> act2 = () => task2;
716717
act2.ShouldThrow<MongoConnectionClosedException>();
717718

718-
_capturedEvents.Next().Should().BeOfType<ConnectionSendingMessagesEvent>();
719-
_capturedEvents.Next().Should().BeOfType<CommandStartedEvent>();
720-
_capturedEvents.Next().Should().BeOfType<ConnectionSendingMessagesEvent>();
721-
_capturedEvents.Next().Should().BeOfType<CommandStartedEvent>();
722-
_capturedEvents.Next().Should().BeOfType<ConnectionFailedEvent>();
723-
_capturedEvents.Next().Should().BeOfType<CommandFailedEvent>();
724-
var events7And8Types = new Type[]
719+
SpinWait.SpinUntil(() => _capturedEvents.Count >= 9, TimeSpan.FromSeconds(5));
720+
_capturedEvents.Count.Should().Be(9);
721+
722+
var allEvents = new List<object>();
723+
while (_capturedEvents.Any())
725724
{
726-
_capturedEvents.Next().GetType(),
727-
_capturedEvents.Next().GetType()
728-
};
729-
var expectedEventTypes = new Type[]
725+
allEvents.Add(_capturedEvents.Next());
726+
}
727+
728+
var request1Events = GetEventsForRequest(allEvents, message1.RequestId);
729+
request1Events.Should().HaveCount(4);
730+
request1Events[0].Should().BeOfType<ConnectionSendingMessagesEvent>();
731+
request1Events[1].Should().BeOfType<CommandStartedEvent>();
732+
request1Events[2].Should().BeOfType<CommandFailedEvent>();
733+
request1Events[3].Should().BeOfType<ConnectionSendingMessagesFailedEvent>();
734+
735+
var request2Events = GetEventsForRequest(allEvents, message2.RequestId);
736+
request2Events.Should().HaveCount(4);
737+
request2Events[0].Should().BeOfType<ConnectionSendingMessagesEvent>();
738+
request2Events[1].Should().BeOfType<CommandStartedEvent>();
739+
request2Events[2].Should().BeOfType<CommandFailedEvent>();
740+
request2Events[3].Should().BeOfType<ConnectionSendingMessagesFailedEvent>();
741+
742+
var connectionFailedEvents = allEvents.OfType<ConnectionFailedEvent>().ToList();
743+
connectionFailedEvents.Should().HaveCount(1);
744+
}
745+
}
746+
747+
// private methods
748+
private List<object> GetEventsForRequest(List<object> events, int requestId)
749+
{
750+
var eventsForRequest = new List<object>();
751+
752+
foreach (var @event in events)
753+
{
754+
if (@event is ConnectionSendingMessagesEvent)
730755
{
731-
typeof(CommandFailedEvent),
732-
typeof(ConnectionSendingMessagesFailedEvent)
733-
};
734-
events7And8Types.Should().BeEquivalentTo(expectedEventTypes);
735-
_capturedEvents.Next().Should().BeOfType<ConnectionSendingMessagesFailedEvent>();
736-
_capturedEvents.Any().Should().BeFalse();
756+
var e = (ConnectionSendingMessagesEvent)@event;
757+
if (e.RequestIds.Single() == requestId)
758+
{
759+
eventsForRequest.Add(@event);
760+
}
761+
}
762+
else if (@event is CommandStartedEvent)
763+
{
764+
var e = (CommandStartedEvent)@event;
765+
if (e.RequestId == requestId)
766+
{
767+
eventsForRequest.Add(@event);
768+
}
769+
}
770+
else if (@event is CommandFailedEvent)
771+
{
772+
var e = (CommandFailedEvent)@event;
773+
if (e.RequestId == requestId)
774+
{
775+
eventsForRequest.Add(@event);
776+
}
777+
}
778+
else if (@event is ConnectionSendingMessagesFailedEvent)
779+
{
780+
var e = (ConnectionSendingMessagesFailedEvent)@event;
781+
if (e.RequestIds.Single() == requestId)
782+
{
783+
eventsForRequest.Add(@event);
784+
}
785+
}
737786
}
787+
788+
return eventsForRequest;
738789
}
739790
}
740791
}

0 commit comments

Comments
 (0)