public void Should_SendRequest_When_AConnectionIsObtained(bool currentHostRetry)
        {
            var mockSession          = Mock.Of <IInternalSession>();
            var mockRequest          = Mock.Of <IRequest>();
            var mockRequestExecution = Mock.Of <IRequestHandler>();
            var connection           = Mock.Of <IConnection>();
            var host = new Host(
                new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9047),
                new ConstantReconnectionPolicy(1));
            var validHost = ValidHost.New(
                host,
                HostDistance.Local);

            Mock.Get(mockRequestExecution)
            .Setup(m => m.GetConnectionToValidHostAsync(validHost, It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .ReturnsAsync(connection);
            Mock.Get(mockRequestExecution)
            .Setup(m => m.GetNextValidHost(It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .Returns(validHost);
            var sut = new ProxyRequestExecution(mockRequestExecution, mockSession, mockRequest);

            sut.Start(currentHostRetry);
            TestHelper.RetryAssert(
                () =>
            {
                Mock.Get(connection)
                .Verify(
                    c => c.Send(mockRequest, It.IsAny <Action <Exception, Response> >(), It.IsAny <int>()),
                    Times.Once);
            });
        }
Exemplo n.º 2
0
        public void Should_SendRequest_When_AConnectionIsObtained(bool currentHostRetry)
        {
            var mockSession           = Mock.Of <IInternalSession>();
            var requestHandlerFactory = Mock.Of <IRequestHandlerFactory>();

            Mock.Get(requestHandlerFactory)
            .Setup(r => r.Create(
                       It.IsAny <IInternalSession>(),
                       It.IsAny <ISerializer>(),
                       It.IsAny <IRequest>(),
                       It.IsAny <IStatement>(),
                       It.IsAny <IRequestOptions>()))
            .Returns(Mock.Of <IRequestHandler>());
            var config = new TestConfigurationBuilder
            {
                RequestHandlerFactory = requestHandlerFactory
            }.Build();

            Mock.Get(mockSession).SetupGet(m => m.Cluster.Configuration).Returns(config);
            var mockRequest = Mock.Of <IRequest>();
            var mockParent  = Mock.Of <IRequestHandler>();
            var connection  = Mock.Of <IConnection>();
            var host        = new Host(
                new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9047),
                new ConstantReconnectionPolicy(1));
            var validHost = ValidHost.New(
                host,
                HostDistance.Local);

            Mock.Get(mockParent)
            .Setup(m => m.GetConnectionToValidHostAsync(validHost, It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .ReturnsAsync(connection);
            Mock.Get(mockParent)
            .Setup(m => m.GetNextValidHost(It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .Returns(validHost);
            Mock.Get(mockParent)
            .Setup(m => m.RequestOptions)
            .Returns(config.DefaultRequestOptions);
            var sut = new RequestExecution(mockParent, mockSession, mockRequest, NullRequestObserver.Instance);

            sut.Start(currentHostRetry);
            TestHelper.RetryAssert(
                () =>
            {
                Mock.Get(connection)
                .Verify(
                    c => c.Send(mockRequest, It.IsAny <Action <IRequestError, Response> >(), It.IsAny <int>()),
                    Times.Once);
            });
        }
        public async Task Pool_Increasing_Size_And_Closing_Should_Not_Leave_Connections_Open([Range(0, 29)] int delay)
        {
            _mock = GetPoolMock(null, GetConfig(50, 50));
            _mock.Setup(p => p.DoCreateAndOpen(It.IsAny <bool>())).Returns(async() =>
            {
                await Task.Yield();
                var spinWait = new SpinWait();
                spinWait.SpinOnce();
                return(await Task.Run(() => CreateConnection()).ConfigureAwait(false));
            });
            var pool = _mock.Object;

            Assert.AreEqual(0, pool.OpenConnections);
            pool.SetDistance(HostDistance.Local);
            await pool.EnsureCreate().ConfigureAwait(false);

            Assert.Greater(pool.OpenConnections, 0);
            // Wait for the pool to be gaining size
            TestHelper.RetryAssert(() =>
            {
                Assert.Greater(pool.OpenConnections, 1);
            },
                                   20,
                                   100);
            await Task.Run(() =>
            {
                pool.Dispose();
            }).ConfigureAwait(false);

            TestHelper.RetryAssert(() =>
            {
                Assert.AreEqual(0, pool.OpenConnections);
            },
                                   20,
                                   100);
        }
        public void Should_RetryRequestToSameHost_When_ConnectionFailsAndRetryDecisionIsRetrySameHost()
        {
            var mockSession = Mock.Of <IInternalSession>();
            var config      = new Configuration();

            Mock.Get(mockSession).SetupGet(m => m.Cluster.Configuration).Returns(config);
            var mockRequest = Mock.Of <IRequest>();
            var mockParent  = Mock.Of <IRequestHandler>();
            var connection  = Mock.Of <IConnection>();

            // Setup hosts
            var host = new Host(
                new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9047),
                new ConstantReconnectionPolicy(1));
            var validHost = ValidHost.New(
                host,
                HostDistance.Local);
            var secondHost = new Host(
                new IPEndPoint(IPAddress.Parse("127.0.0.2"), 9047),
                new ConstantReconnectionPolicy(1)); // second host should never be used if test passes
            var secondValidHost = ValidHost.New(
                secondHost,
                HostDistance.Local);

            // Setup query plan
            Mock.Get(mockParent)
            .SetupSequence(m => m.GetNextValidHost(It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .Returns(validHost)
            .Returns(secondValidHost);

            // Setup retry policy
            var exception = new OverloadedException(string.Empty);

            Mock.Get(mockParent)
            .SetupGet(m => m.RetryPolicy)
            .Returns(() =>
                     Mock.Of <IExtendedRetryPolicy>(a =>
                                                    a.OnRequestError(
                                                        It.IsAny <IStatement>(), config, exception, 0)
                                                    == RetryDecision.Retry(null, true)));

            // Setup connection failure
            Mock.Get(mockParent)
            .Setup(m => m.GetConnectionToValidHostAsync(validHost, It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .ThrowsAsync(exception);

            // Setup successful second connection on the same host retry (different method call - ValidateHostAndGetConnectionAsync)
            Mock.Get(mockParent)
            .Setup(m => m.ValidateHostAndGetConnectionAsync(validHost.Host, It.IsAny <Dictionary <IPEndPoint, Exception> >()))
            .ReturnsAsync(connection);

            var sut = new ProxyRequestExecution(mockParent, mockSession, mockRequest);

            sut.Start(false);

            // Validate request is sent
            TestHelper.RetryAssert(
                () =>
            {
                Mock.Get(connection).Verify(
                    c => c.Send(mockRequest, It.IsAny <Action <Exception, Response> >(), It.IsAny <int>()),
                    Times.Once);
            });

            // Validate that there were 2 connection attempts (1 with each method)
            Mock.Get(mockParent).Verify(
                m => m.GetConnectionToValidHostAsync(validHost, It.IsAny <Dictionary <IPEndPoint, Exception> >()),
                Times.Once);
            Mock.Get(mockParent).Verify(
                m => m.ValidateHostAndGetConnectionAsync(validHost.Host, It.IsAny <Dictionary <IPEndPoint, Exception> >()),
                Times.Once);
        }