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 !);
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); }