private static ConnectionManager CreateConnectionManager(
     ILoggerFactory loggerFactory,
     TestResolver resolver,
     TestSubchannelTransportFactory transportFactory)
 {
     return(new ConnectionManager(
                resolver,
                disableResolverServiceConfig: false,
                loggerFactory,
                new TestBackoffPolicyFactory(),
                transportFactory,
                Array.Empty <LoadBalancerFactory>()));
 }
        public async Task ChangeAddresses_HasReadySubchannel_OldSubchannelShutdown()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddNUnitLogger();

            var transportFactory = new TestSubchannelTransportFactory();

            services.AddSingleton <TestResolver>();
            services.AddSingleton <ResolverFactory, TestResolverFactory>();
            services.AddSingleton <ISubchannelTransportFactory>(transportFactory);
            var serviceProvider = services.BuildServiceProvider();

            var handler        = new TestHttpMessageHandler((r, ct) => default !);
Example #3
0
        public async Task ChangeAddresses_HasReadySubchannel_OldSubchannelShutdown()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddNUnitLogger();

            var resolver = new TestResolver();

            resolver.UpdateAddresses(new List <BalancerAddress>
            {
                new BalancerAddress("localhost", 80)
            });

            var transportFactory = new TestSubchannelTransportFactory();

            services.AddSingleton <ResolverFactory>(new TestResolverFactory(resolver));
            services.AddSingleton <ISubchannelTransportFactory>(transportFactory);

            var handler        = new TestHttpMessageHandler((r, ct) => default !);
        public async Task PickAsync_WaitForReadyWithDrop_ThrowsError()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddNUnitLogger();
            var serviceProvider = services.BuildServiceProvider();
            var loggerFactory   = serviceProvider.GetRequiredService <ILoggerFactory>();

            var resolver = new TestResolver(loggerFactory);

            resolver.UpdateAddresses(new List <BalancerAddress>
            {
                new BalancerAddress("localhost", 80)
            });

            var transportFactory = new TestSubchannelTransportFactory();
            var clientChannel    = new ConnectionManager(resolver, disableResolverServiceConfig: false, loggerFactory, transportFactory, Array.Empty <LoadBalancerFactory>());

            clientChannel.ConfigureBalancer(c => new DropLoadBalancer(c));

            // Act
            _ = clientChannel.ConnectAsync(waitForReady: true, CancellationToken.None).ConfigureAwait(false);

            var pickTask = clientChannel.PickAsync(
                new PickContext {
                Request = new HttpRequestMessage()
            },
                waitForReady: true,
                CancellationToken.None).AsTask();

            // Assert
            var ex = await ExceptionAssert.ThrowsAsync <RpcException>(() => pickTask).DefaultTimeout();

            Assert.AreEqual(StatusCode.DataLoss, ex.StatusCode);
        }
        public async Task PickAsync_ChannelStateChangesWithWaitForReady_WaitsForCorrectEndpoint()
        {
            // Arrange
            var services = new ServiceCollection();

            services.AddNUnitLogger();
            var serviceProvider = services.BuildServiceProvider();
            var loggerFactory   = serviceProvider.GetRequiredService <ILoggerFactory>();

            var resolver = new TestResolver(loggerFactory);

            resolver.UpdateAddresses(new List <BalancerAddress>
            {
                new BalancerAddress("localhost", 80)
            });

            var transportFactory = new TestSubchannelTransportFactory();
            var clientChannel    = new ConnectionManager(resolver, disableResolverServiceConfig: false, loggerFactory, transportFactory, Array.Empty <LoadBalancerFactory>());

            clientChannel.ConfigureBalancer(c => new RoundRobinBalancer(c, loggerFactory));

            // Act
            var pickTask1 = clientChannel.PickAsync(
                new PickContext {
                Request = new HttpRequestMessage()
            },
                waitForReady: true,
                CancellationToken.None).AsTask();

            await clientChannel.ConnectAsync(waitForReady : true, CancellationToken.None).DefaultTimeout();

            var result1 = await pickTask1.DefaultTimeout();

            // Assert
            Assert.AreEqual(new DnsEndPoint("localhost", 80), result1.Address !.EndPoint);

            resolver.UpdateAddresses(new List <BalancerAddress>
            {
                new BalancerAddress("localhost", 80),
                new BalancerAddress("localhost", 81)
            });

            for (var i = 0; i < transportFactory.Transports.Count; i++)
            {
                transportFactory.Transports[i].UpdateState(ConnectivityState.TransientFailure);
            }

            var pickTask2 = clientChannel.PickAsync(
                new PickContext {
                Request = new HttpRequestMessage()
            },
                waitForReady: true,
                CancellationToken.None).AsTask().DefaultTimeout();

            Assert.IsFalse(pickTask2.IsCompleted);

            resolver.UpdateAddresses(new List <BalancerAddress>
            {
                new BalancerAddress("localhost", 82)
            });

            var result2 = await pickTask2.DefaultTimeout();

            Assert.AreEqual(new DnsEndPoint("localhost", 82), result2.Address !.EndPoint);
        }