public async Task TestContainerWithTwoOfflineEndpointWriteAckableMessageSucceedsWithWarning() { using (StartVerifiableLog(out var loggerFactory, LogLevel.Warning, logChecker: logs => { var warns = logs.Where(s => s.Write.LogLevel == LogLevel.Warning).ToList(); Assert.Equal(2, warns.Count); Assert.Contains(warns, s => s.Write.Message.Contains("Message JoinGroupWithAckMessage is not sent to endpoint (Primary)http://url1 because all connections to this endpoint are offline.")); return(true); })) { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(); var container = new MultiEndpointServiceConnectionContainer("hub", e => { return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected), }, e)); }, sem, router, loggerFactory); _ = container.StartAsync(); await container.ConnectionInitializedTask; await container.WriteAckableMessageAsync(DefaultGroupMessage); } }
public async Task TestContainerWithTwoEndpointWithAllConnectedSucceedsWithGoodRouter() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(); var writeTcs = new TaskCompletionSource <object>(); var containers = new Dictionary <ServiceEndpoint, TestBaseServiceConnectionContainer>(); var container = new MultiEndpointServiceConnectionContainer("hub", e => containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e), sem, router, null); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; var task = container.WriteAckableMessageAsync(DefaultGroupMessage); await writeTcs.Task.OrTimeout(); containers.First().Value.HandleAck(new AckMessage(1, (int)AckStatus.Ok)); await task.OrTimeout(); }
public async Task TestContainerWithOneEndpointWithAllConnectedSucceeeds() { var sem = new TestServiceEndpointManager(new ServiceEndpoint(ConnectionString1)); var throws = new ServiceConnectionNotActiveException(); var router = new TestEndpointRouter(throws); var writeTcs = new TaskCompletionSource <object>(); TestBaseServiceConnectionContainer innerContainer = null; var container = new MultiEndpointServiceConnectionContainer("hub", e => innerContainer = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e), sem, router, null); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; var task = container.WriteAckableMessageAsync(DefaultGroupMessage); await writeTcs.Task.OrTimeout(); innerContainer.HandleAck(new AckMessage(1, (int)AckStatus.Ok)); await task.OrTimeout(); }
public async Task TestTwoEndpointsWithAllNotFoundAck() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, name: "online")); var router = new TestEndpointRouter(); var writeTcs = new TaskCompletionSource <object>(); TestBaseServiceConnectionContainer innerContainer = null; var containers = new Dictionary <ServiceEndpoint, TestBaseServiceConnectionContainer>(); var container = new MultiEndpointServiceConnectionContainer("hub", e => { if (string.IsNullOrEmpty(e.Name)) { return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e)); } return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e)); }, sem, router, null); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; var task = container.WriteAckableMessageAsync(DefaultGroupMessage); await writeTcs.Task.OrTimeout(); foreach (var c in containers) { c.Value.HandleAck(new AckMessage(1, (int)AckStatus.NotFound)); } var result = await task.OrTimeout(); Assert.False(result); }
public async Task TestContainerWithTwoEndpointWithPrimaryOfflineAndConnectionStartedSucceeds() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, EndpointType.Secondary, "online")); var router = new TestEndpointRouter(); var writeTcs = new TaskCompletionSource <object>(); var containers = new Dictionary <ServiceEndpoint, TestBaseServiceConnectionContainer>(); var container = new MultiEndpointServiceConnectionContainer("hub", e => { if (string.IsNullOrEmpty(e.Name)) { return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), }, e)); } return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e)); }, sem, router, null); _ = container.StartAsync(); var task = container.WriteAckableMessageAsync(DefaultGroupMessage); await writeTcs.Task.OrTimeout(); containers.First(p => !string.IsNullOrEmpty(p.Key.Name)).Value.HandleAck(new AckMessage(1, (int)AckStatus.Ok)); await task.OrTimeout(); var endpoints = container.GetOnlineEndpoints().ToArray(); Assert.Single(endpoints); Assert.Equal("online", endpoints.First().Name); }
public async Task TestTwoEndpointsWithCancellationToken() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, name: "online")); var router = new TestEndpointRouter(); var writeTcs = new TaskCompletionSource <object>(); TestBaseServiceConnectionContainer innerContainer = null; var containers = new Dictionary <ServiceEndpoint, TestBaseServiceConnectionContainer>(); var container = new MultiEndpointServiceConnectionContainer("hub", e => { if (string.IsNullOrEmpty(e.Name)) { return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e, new AckHandler(100, 200))); } return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e, new AckHandler(100, 200))); }, sem, router, null); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; var task = container.WriteAckableMessageAsync(DefaultGroupMessage, new CancellationToken(true)); await writeTcs.Task.OrTimeout(); foreach (var c in containers) { c.Value.HandleAck(new AckMessage(1, (int)AckStatus.Timeout)); } await Assert.ThrowsAnyAsync <OperationCanceledException>(async() => await task).OrTimeout(); }
public async Task TestTwoEndpointsWithOneSucceededAndOtherNotAcked() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, name: "online")); var router = new TestEndpointRouter(); var writeTcs = new TaskCompletionSource <object>(); var containers = new Dictionary <ServiceEndpoint, TestBaseServiceConnectionContainer>(); var container = new MultiEndpointServiceConnectionContainer("hub", e => { if (string.IsNullOrEmpty(e.Name)) { return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e, new AckHandler(100, 500))); } return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e, new AckHandler(100, 500))); }, sem, router, null); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; var task = container.WriteAckableMessageAsync(DefaultGroupMessage); await writeTcs.Task.OrTimeout(); containers.First().Value.HandleAck(new AckMessage(1, (int)AckStatus.Ok)); var result = await task.OrTimeout(); Assert.True(result); }
public async Task TestContainerWithTwoEndpointWithOneOfflineSucceeds() { using (StartVerifiableLog(out var loggerFactory, LogLevel.Warning)) { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, name: "online")); var router = new TestEndpointRouter(); var writeTcs = new TaskCompletionSource <object>(); var containers = new Dictionary <ServiceEndpoint, TestBaseServiceConnectionContainer>(); var container = new MultiEndpointServiceConnectionContainer("hub", e => { if (string.IsNullOrEmpty(e.Name)) { return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(ServiceConnectionStatus.Disconnected, writeAsyncTcs: writeTcs), }, e)); } return(containers[e] = new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), new TestSimpleServiceConnection(writeAsyncTcs: writeTcs), }, e)); }, sem, router, loggerFactory); _ = container.StartAsync(); var task = container.WriteAckableMessageAsync(DefaultGroupMessage); await writeTcs.Task.OrTimeout(); containers.First(p => !string.IsNullOrEmpty(p.Key.Name)).Value.HandleAck(new AckMessage(1, (int)AckStatus.Ok)); await task.OrTimeout(); } }