public void SelectServerAsync_should_throw_if_any_servers_are_incompatible() { var subject = CreateSubject(); subject.Initialize(); var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId, wireVersionRange: new Range <int>(10, 12)); subject.SetServerDescriptions(connected); var selector = new DelegateServerSelector((c, s) => s); Action act = () => subject.SelectServerAsync(selector, CancellationToken.None).Wait(); act.ShouldThrow <MongoException>(); }
public void SelectServerAsync_should_throw_if_no_servers_match() { var subject = CreateSubject(); subject.Initialize(); var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connected); var selector = new DelegateServerSelector((c, s) => Enumerable.Empty <ServerDescription>()); Action act = () => subject.SelectServerAsync(selector, CancellationToken.None).Wait(); act.ShouldThrow <TimeoutException>(); }
public void SelectServerAsync_should_return_a_server_if_one_matches() { var subject = CreateSubject(); subject.Initialize(); var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connected); var selector = new DelegateServerSelector((c, s) => s); var result = subject.SelectServerAsync(selector, CancellationToken.None).Result; result.Should().NotBeNull(); }
public void SelectServer_should_apply_both_pre_and_post_server_selectors( [Values(false, true)] bool async) { _mockServerFactory.Setup(f => f.CreateServer(It.IsAny <ClusterId>(), It.IsAny <IClusterClock>(), It.IsAny <EndPoint>())) .Returns((ClusterId _, IClusterClock clusterClock, EndPoint endPoint) => { var mockServer = new Mock <IClusterableServer>(); mockServer.SetupGet(s => s.EndPoint).Returns(endPoint); return(mockServer.Object); }); var preSelector = new DelegateServerSelector((cd, sds) => sds.Where(x => ((DnsEndPoint)x.EndPoint).Port != 27017)); var middleSelector = new DelegateServerSelector((cd, sds) => sds.Where(x => ((DnsEndPoint)x.EndPoint).Port != 27018)); var postSelector = new DelegateServerSelector((cd, sds) => sds.Where(x => ((DnsEndPoint)x.EndPoint).Port != 27019)); var settings = new ClusterSettings( preServerSelector: preSelector, postServerSelector: postSelector); var subject = new StubCluster(settings, _mockServerFactory.Object, _capturedEvents); subject.Initialize(); subject.SetServerDescriptions( ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27017)), ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27018)), ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27019)), ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27020))); _capturedEvents.Clear(); IServer result; if (async) { result = subject.SelectServerAsync(middleSelector, CancellationToken.None).GetAwaiter().GetResult(); } else { result = subject.SelectServer(middleSelector, CancellationToken.None); } ((DnsEndPoint)result.EndPoint).Port.Should().Be(27020); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectedServerEvent>(); _capturedEvents.Any().Should().BeFalse(); }
public void SelectServer_should_keep_trying_to_match_by_waiting_on_cluster_description_changes( [Values(false, true)] bool async) { var subject = CreateSubject(); subject.Initialize(); var connecting = ServerDescriptionHelper.Disconnected(subject.Description.ClusterId); var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connecting); _capturedEvents.Clear(); Task.Run(() => { var descriptions = new Queue <ServerDescription>(new[] { connecting, connecting, connecting, connected }); while (descriptions.Count > 0) { Thread.Sleep(TimeSpan.FromMilliseconds(20)); var next = descriptions.Dequeue(); subject.SetServerDescriptions(next); } }); var selector = new DelegateServerSelector((c, s) => s); IServer result; if (async) { result = subject.SelectServerAsync(selector, CancellationToken.None).GetAwaiter().GetResult(); } else { result = subject.SelectServer(selector, CancellationToken.None); } result.Should().NotBeNull(); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterDescriptionChangedEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterDescriptionChangedEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterDescriptionChangedEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterDescriptionChangedEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectedServerEvent>(); _capturedEvents.Any().Should().BeFalse(); }
public void SelectServer_should_apply_both_pre_and_post_server_selectors( [Values(false, true)] bool async) { _serverFactory.CreateServer(null, null).ReturnsForAnyArgs(ci => { var endPoint = ci.Arg <EndPoint>(); var server = Substitute.For <IClusterableServer>(); server.EndPoint.Returns(endPoint); return(server); }); var preSelector = new DelegateServerSelector((cd, sds) => sds.Where(x => ((DnsEndPoint)x.EndPoint).Port != 27017)); var middleSelector = new DelegateServerSelector((cd, sds) => sds.Where(x => ((DnsEndPoint)x.EndPoint).Port != 27018)); var postSelector = new DelegateServerSelector((cd, sds) => sds.Where(x => ((DnsEndPoint)x.EndPoint).Port != 27019)); var settings = new ClusterSettings( preServerSelector: preSelector, postServerSelector: postSelector); var subject = new StubCluster(settings, _serverFactory, _capturedEvents); subject.Initialize(); subject.SetServerDescriptions( ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27017)), ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27018)), ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27019)), ServerDescriptionHelper.Connected(subject.Description.ClusterId, new DnsEndPoint("localhost", 27020))); _capturedEvents.Clear(); IServer result; if (async) { result = subject.SelectServerAsync(middleSelector, CancellationToken.None).GetAwaiter().GetResult(); } else { result = subject.SelectServer(middleSelector, CancellationToken.None); } ((DnsEndPoint)result.EndPoint).Port.Should().Be(27020); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectedServerEvent>(); _capturedEvents.Any().Should().BeFalse(); }
public void SelectServerAsync_should_throw_if_the_matched_server_cannot_be_found_and_no_others_matched() { var subject = CreateSubject(); subject.Initialize(); _serverFactory.CreateServer(null, null).ReturnsForAnyArgs((IClusterableServer)null); var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connected); var selector = new DelegateServerSelector((c, s) => s); Action act = () => subject.SelectServerAsync(selector, TimeSpan.FromMilliseconds(50), CancellationToken.None).Wait(); act.ShouldThrow <TimeoutException>(); }
public void SelectServerAsync_should_return_second_server_if_first_cannot_be_found() { var subject = CreateSubject(); subject.Initialize(); _serverFactory.CreateServer(null, null).ReturnsForAnyArgs((IClusterableServer)null, Substitute.For <IClusterableServer>()); var connected1 = ServerDescriptionHelper.Connected(subject.Description.ClusterId); var connected2 = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connected1, connected2); var selector = new DelegateServerSelector((c, s) => s); var result = subject.SelectServerAsync(selector, TimeSpan.FromMilliseconds(50), CancellationToken.None).Result; result.Should().NotBeNull(); }
public void SelectServerAsync_should_throw_if_the_matched_server_cannot_be_found_and_no_others_matched() { var subject = CreateSubject(); subject.Initialize(); _serverFactory.CreateServer(null, null).ReturnsForAnyArgs((IClusterableServer)null); var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connected); _capturedEvents.Clear(); var selector = new DelegateServerSelector((c, s) => s); Action act = () => subject.SelectServerAsync(selector, CancellationToken.None).Wait(); act.ShouldThrow <TimeoutException>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerFailedEvent>(); _capturedEvents.Any().Should().BeFalse(); }
public void SelectServerAsync_should_return_second_server_if_first_cannot_be_found() { var subject = CreateSubject(); subject.Initialize(); _serverFactory.CreateServer(null, null).ReturnsForAnyArgs((IClusterableServer)null, Substitute.For <IClusterableServer>()); var connected1 = ServerDescriptionHelper.Connected(subject.Description.ClusterId); var connected2 = ServerDescriptionHelper.Connected(subject.Description.ClusterId); subject.SetServerDescriptions(connected1, connected2); _capturedEvents.Clear(); var selector = new DelegateServerSelector((c, s) => s); var result = subject.SelectServerAsync(selector, CancellationToken.None).Result; result.Should().NotBeNull(); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectedServerEvent>(); _capturedEvents.Any().Should().BeFalse(); }
public void SelectServer_should_return_second_server_if_first_cannot_be_found( [Values(false, true)] bool async) { var subject = CreateSubject(); subject.Initialize(); var endPoint1 = new DnsEndPoint("localhost", 27017); var endPoint2 = new DnsEndPoint("localhost", 27018); var connected1 = ServerDescriptionHelper.Connected(subject.Description.ClusterId, endPoint1); var connected2 = ServerDescriptionHelper.Connected(subject.Description.ClusterId, endPoint2); subject.SetServerDescriptions(connected1, connected2); subject.RemoveServer(endPoint1); _capturedEvents.Clear(); var selector = new DelegateServerSelector((c, s) => s); IServer result; if (async) { result = subject.SelectServerAsync(selector, CancellationToken.None).GetAwaiter().GetResult(); } else { result = subject.SelectServer(selector, CancellationToken.None); } result.Should().NotBeNull(); result.EndPoint.Should().Be(endPoint2); _capturedEvents.Next().Should().BeOfType <ClusterSelectingServerEvent>(); _capturedEvents.Next().Should().BeOfType <ClusterSelectedServerEvent>(); _capturedEvents.Any().Should().BeFalse(); }