public void GetWriteChannelSourceAsync_should_use_a_writable_server_selector_to_select_the_server_from_the_cluster(
            [Values(false, true)]
            bool async)
        {
            var subject        = new WritableServerBinding(_mockCluster.Object, NoCoreSession.NewHandle());
            var selectedServer = new Mock <IServer>().Object;

            var clusterId = new ClusterId();
            var endPoint  = new DnsEndPoint("localhost", 27017);
            var initialClusterDescription = new ClusterDescription(
                clusterId,
                ClusterConnectionMode.Automatic,
                ClusterType.Unknown,
                new[] { new ServerDescription(new ServerId(clusterId, endPoint), endPoint) });
            var finalClusterDescription = initialClusterDescription.WithType(ClusterType.Standalone);

            _mockCluster.SetupSequence(c => c.Description).Returns(initialClusterDescription).Returns(finalClusterDescription);

            if (async)
            {
                _mockCluster.Setup(c => c.SelectServerAsync(It.IsAny <WritableServerSelector>(), CancellationToken.None)).Returns(Task.FromResult(selectedServer));

                subject.GetWriteChannelSourceAsync(CancellationToken.None).GetAwaiter().GetResult();

                _mockCluster.Verify(c => c.SelectServerAsync(It.IsAny <WritableServerSelector>(), CancellationToken.None), Times.Once);
            }
            else
            {
                _mockCluster.Setup(c => c.SelectServer(It.IsAny <WritableServerSelector>(), CancellationToken.None)).Returns(selectedServer);

                subject.GetWriteChannelSource(CancellationToken.None);

                _mockCluster.Verify(c => c.SelectServer(It.IsAny <WritableServerSelector>(), CancellationToken.None), Times.Once);
            }
        }
        public void GetReadChannelSource_should_fork_the_session(
            [Values(false, true)] bool async)
        {
            var mockSession       = new Mock <ICoreSessionHandle>();
            var subject           = new ReadPreferenceBinding(_mockCluster.Object, ReadPreference.Primary, mockSession.Object);
            var cancellationToken = new CancellationTokenSource().Token;

            var selectedServer = new Mock <IServer>().Object;

            _mockCluster.Setup(m => m.SelectServer(It.IsAny <IServerSelector>(), cancellationToken)).Returns(selectedServer);
            _mockCluster.Setup(m => m.SelectServerAsync(It.IsAny <IServerSelector>(), cancellationToken)).Returns(Task.FromResult(selectedServer));
            var forkedSession = new Mock <ICoreSessionHandle>().Object;

            mockSession.Setup(m => m.Fork()).Returns(forkedSession);

            var clusterId = new ClusterId();
            var endPoint  = new DnsEndPoint("localhost", 27017);
            var initialClusterDescription = new ClusterDescription(
                clusterId,
                ClusterConnectionMode.Automatic,
                ClusterType.Unknown,
                new[] { new ServerDescription(new ServerId(clusterId, endPoint), endPoint) });
            var finalClusterDescription = initialClusterDescription.WithType(ClusterType.Standalone);

            _mockCluster.SetupSequence(c => c.Description).Returns(initialClusterDescription).Returns(finalClusterDescription);

            IChannelSourceHandle result;

            if (async)
            {
                result = subject.GetReadChannelSourceAsync(cancellationToken).GetAwaiter().GetResult();
            }
            else
            {
                result = subject.GetReadChannelSource(cancellationToken);
            }

            var handle           = result.Should().BeOfType <ChannelSourceHandle>().Subject;
            var referenceCounted = handle._reference().Should().BeOfType <ReferenceCounted <IChannelSource> >().Subject;
            var source           = referenceCounted.Instance;

            source.Session.Should().BeSameAs(forkedSession);
        }
Exemple #3
0
        public void GetWriteChannelSource_with_mayUseSecondary_should_pass_mayUseSecondary_to_server_selector(
            [Values(false, true)]
            bool async)
        {
            var subject        = new WritableServerBinding(_mockCluster.Object, NoCoreSession.NewHandle());
            var selectedServer = new Mock <IServer>().Object;

            var clusterId = new ClusterId();
            var endPoint  = new DnsEndPoint("localhost", 27017);

#pragma warning disable CS0618 // Type or member is obsolete
            var initialClusterDescription = new ClusterDescription(
                clusterId,
                ClusterConnectionMode.Automatic,
                ClusterType.Unknown,
                new[] { new ServerDescription(new ServerId(clusterId, endPoint), endPoint) });
#pragma warning restore CS0618 // Type or member is obsolete
            var finalClusterDescription = initialClusterDescription.WithType(ClusterType.Standalone);
            _mockCluster.SetupSequence(c => c.Description).Returns(initialClusterDescription).Returns(finalClusterDescription);

            var mockMayUseSecondary = new Mock <IMayUseSecondaryCriteria>();
            mockMayUseSecondary.SetupGet(x => x.ReadPreference).Returns(ReadPreference.SecondaryPreferred);
            mockMayUseSecondary.Setup(x => x.CanUseSecondary(It.IsAny <ServerDescription>())).Returns(true);
            var mayUseSecondary = mockMayUseSecondary.Object;

            if (async)
            {
                _mockCluster.Setup(c => c.SelectServerAsync(It.IsAny <WritableServerSelector>(), CancellationToken.None)).Returns(Task.FromResult(selectedServer));

                subject.GetWriteChannelSourceAsync(mayUseSecondary, CancellationToken.None).GetAwaiter().GetResult();

                _mockCluster.Verify(c => c.SelectServerAsync(It.Is <WritableServerSelector>(s => s.MayUseSecondary == mayUseSecondary), CancellationToken.None), Times.Once);
            }
            else
            {
                _mockCluster.Setup(c => c.SelectServer(It.IsAny <WritableServerSelector>(), CancellationToken.None)).Returns(selectedServer);

                subject.GetWriteChannelSource(mayUseSecondary, CancellationToken.None);

                _mockCluster.Verify(c => c.SelectServer(It.Is <WritableServerSelector>(s => s.MayUseSecondary == mayUseSecondary), CancellationToken.None), Times.Once);
            }
        }