public void Should_select_no_servers_when_none_exist()
        {
            var subject = new DelegateServerSelector((c, s) => s.Where(p => ((DnsEndPoint)p.EndPoint).Port == 0));

            var result = subject.SelectServers(_description, Enumerable.Empty<ServerDescription>()).ToList();

            result.Should().BeEmpty();
        }
        public void Should_select_the_servers_matching_the_delegate()
        {
            var subject = new DelegateServerSelector((c, s) => s.Where(p => ((DnsEndPoint)p.EndPoint).Port >= 27018));

            var result = subject.SelectServers(_description, _description.Servers).ToList();

            result.Count.Should().Be(2);
            result.Should().BeEquivalentTo(new[] { _description.Servers[1], _description.Servers[2] });
        }
        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);
            _capturedEvents.Clear();

            var selector = new DelegateServerSelector((c, s) => s);
            Action act = () => subject.SelectServerAsync(selector, CancellationToken.None).Wait();

            act.ShouldThrow<MongoException>();

            _capturedEvents.Next().Should().BeOfType<ClusterSelectingServerEvent>();
            _capturedEvents.Next().Should().BeOfType<ClusterSelectingServerFailedEvent>();
            _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);
            _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_throw_if_no_servers_match()
        {
            var subject = CreateSubject();
            subject.Initialize();

            var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId);
            subject.SetServerDescriptions(connected);
            _capturedEvents.Clear();

            var selector = new DelegateServerSelector((c, s) => Enumerable.Empty<ServerDescription>());
            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 SelectServerAsync_should_return_a_server_if_one_matches()
        {
            var subject = CreateSubject();
            subject.Initialize();

            var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId);
            subject.SetServerDescriptions(connected);
            _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 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();
        }
Example #9
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<EndPoint>()))
                .Returns((ClusterId _, 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();
        }
Example #10
0
        public void SelectServer_should_throw_if_the_matched_server_cannot_be_found_and_no_others_matched(
            [Values(false, true)]
            bool async)
        {
            var subject = CreateSubject(serverSelectionTimeout: TimeSpan.FromMilliseconds(10));
            subject.Initialize();

            var connected = ServerDescriptionHelper.Connected(subject.Description.ClusterId);
            subject.SetServerDescriptions(connected);
            subject.RemoveServer(connected.EndPoint);
            _capturedEvents.Clear();

            var selector = new DelegateServerSelector((c, s) => s);

            Action act;
            if (async)
            {
                act = () => subject.SelectServerAsync(selector, CancellationToken.None).GetAwaiter().GetResult();
            }
            else
            {
                act = () => subject.SelectServer(selector, CancellationToken.None);
            }

            act.ShouldThrow<TimeoutException>();

            _capturedEvents.Next().Should().BeOfType<ClusterSelectingServerEvent>();
            _capturedEvents.Next().Should().BeOfType<ClusterSelectingServerFailedEvent>();
            _capturedEvents.Any().Should().BeFalse();
        }
Example #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();
        }
Example #12
0
        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, TimeSpan.FromMilliseconds(50), CancellationToken.None).Wait();

            act.ShouldThrow<MongoException>();
        }
Example #13
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);

            var selector = new DelegateServerSelector((c, s) => s);

            Action act = () => subject.SelectServerAsync(selector, TimeSpan.FromMilliseconds(50), CancellationToken.None).Wait();

            act.ShouldThrow<TimeoutException>();
        }
Example #14
0
        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, TimeSpan.FromMilliseconds(50), CancellationToken.None).Wait();

            act.ShouldThrow<TimeoutException>();
        }
        public void SelectServerAsync_should_keep_trying_to_match_by_waiting_on_cluster_description_changes()
        {
            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);

            var result = subject.SelectServerAsync(selector, CancellationToken.None).Result;

            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 async Task SelectServerAsync_should_apply_both_pre_and_post_server_selectors()
        {
            _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();

            var selected = await subject.SelectServerAsync(middleSelector, CancellationToken.None);
            ((DnsEndPoint)selected.EndPoint).Port.Should().Be(27020);
            _capturedEvents.Next().Should().BeOfType<ClusterSelectingServerEvent>();
            _capturedEvents.Next().Should().BeOfType<ClusterSelectedServerEvent>();
            _capturedEvents.Any().Should().BeFalse();
        }
Example #17
0
        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, Timeout.InfiniteTimeSpan, CancellationToken.None).Result;

            result.Should().NotBeNull();
        }