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();
        }
示例#4
0
        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();
        }
示例#5
0
        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();
        }
示例#6
0
        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();
        }
示例#9
0
        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();
        }
示例#10
0
        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();
        }
示例#11
0
        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();
        }