public async Task TestContainerWithTwoEndpointWithAllConnectedFailsWithBadRouter() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(true); var container = new MultiEndpointServiceConnectionContainer( e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e), sem, router, null); await Assert.ThrowsAsync <InvalidOperationException>( () => container.WriteAsync(DefaultGroupMessage) ); await Assert.ThrowsAsync <InvalidOperationException>( () => container.WriteAsync("1", DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithAllOfflineAndConnectionStartedThrows() { using (StartVerifiableLog(out var loggerFactory, LogLevel.Warning)) { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(); var container = new MultiEndpointServiceConnectionContainer( e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e), sem, router, loggerFactory); _ = container.StartAsync(); // Instead of throws, it logs a warning instead, because the endpoint router can indeed filter out all the available endpoints // So this message not sent can be expected. Users can throw inside the router if they want await container.WriteAsync(DefaultGroupMessage); await container.WriteAsync("1", DefaultGroupMessage); } }
public async Task TestContainerWithTwoEndpointWithAllOfflineThrows() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(false); var container = new MultiEndpointServiceConnectionContainer( e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e), sem, router, null); await Assert.ThrowsAsync <ServiceConnectionNotActiveException>( () => container.WriteAsync(DefaultGroupMessage) ); await Assert.ThrowsAsync <ServiceConnectionNotActiveException>( () => container.WriteAsync("1", DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithAllOfflineAndConnectionStartedThrows() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(false); var container = new MultiEndpointServiceConnectionContainer( e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e), sem, router, null); _ = container.StartAsync(); // Instead of throw, just log warning, because endpoint router can indeed returns no endpoint // If user wants to throw, user can had the check and throw from the router await container.WriteAsync(DefaultGroupMessage); await container.WriteAsync("1", DefaultGroupMessage); }
public async Task TestContainerWithTwoEndpointWithAllConnectedFailsWithBadRouter() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(true); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e), sem, router, NullLoggerFactory.Instance); _ = container.StartAsync(); await container.ConnectionInitializedTask.OrTimeout(); await Assert.ThrowsAsync <InvalidOperationException>( () => container.WriteAsync(DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithAllOfflineSucceedsWithWarning() { 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(false); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e), sem, router, loggerFactory); _ = container.StartAsync(); await container.ConnectionInitializedTask.OrTimeout(); await container.WriteAsync(DefaultGroupMessage); } }
public async Task TestContainerWithTwoConnectedEndpointAndBadRouterThrows() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(new ServiceConnectionNotActiveException()); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestSimpleServiceConnection(), new TestSimpleServiceConnection(), new TestSimpleServiceConnection(), new TestSimpleServiceConnection(), new TestSimpleServiceConnection(), new TestSimpleServiceConnection(), new TestSimpleServiceConnection(), }, e), sem, router, null); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; await Assert.ThrowsAsync <ServiceConnectionNotActiveException>( () => container.WriteAsync(DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithPrimaryOfflineAndConnectionStartedSucceeds() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, EndpointType.Secondary, "online")); var router = new TestEndpointRouter(false); var container = new MultiEndpointServiceConnectionContainer(e => { if (string.IsNullOrEmpty(e.Name)) { return(new TestServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e)); } return(new TestServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e)); }, sem, router, null); _ = container.StartAsync(); await container.WriteAsync(DefaultGroupMessage); await container.WriteAsync("1", DefaultGroupMessage); var endpoints = sem.GetAvailableEndpoints(); Assert.Single(endpoints); endpoints = sem.GetPrimaryEndpoints(); Assert.Single(endpoints); Assert.Equal("online", endpoints.First().Name); }
public async Task TestContainerWithOneEndpointWithAllConnectedSucceeeds() { var sem = new TestServiceEndpointManager(new ServiceEndpoint(ConnectionString1)); var router = new TestEndpointRouter(true); var container = new MultiEndpointServiceConnectionContainer( e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e), sem, router, null); await container.WriteAsync(DefaultGroupMessage); await container.WriteAsync("1", DefaultGroupMessage); }
public async Task TestMultiEndpointConnectionWithNotExistEndpointRouter() { using (StartVerifiableLog(out var loggerFactory, LogLevel.Warning)) { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, EndpointType.Secondary, "online")); var router = new NotExistEndpointRouter(); var container = new MultiEndpointServiceConnectionContainer(e => { if (string.IsNullOrEmpty(e.Name)) { return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e)); } return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e)); }, sem, router, loggerFactory); _ = container.StartAsync(); await container.WriteAsync(DefaultGroupMessage); await container.WriteAsync("1", DefaultGroupMessage); } }
public async Task TestContainerWithTwoEndpointWithOneOfflineThrows() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, name: "online")); var router = new TestEndpointRouter(false); var container = new MultiEndpointServiceConnectionContainer(e => { if (string.IsNullOrEmpty(e.Name)) { return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e)); } return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e)); }, sem, router, null); await Assert.ThrowsAsync <ServiceConnectionNotActiveException>( () => container.WriteAsync(DefaultGroupMessage) ); await Assert.ThrowsAsync <ServiceConnectionNotActiveException>( () => container.WriteAsync("1", DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithOneOfflineAndConnectionStartedSucceeds() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, name: "online")); var router = new TestEndpointRouter(); var container = new MultiEndpointServiceConnectionContainer(e => { if (string.IsNullOrEmpty(e.Name)) { return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e)); } return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e)); }, sem, router, null); _ = container.StartAsync(); await container.WriteAsync(DefaultGroupMessage); await container.WriteAsync("1", DefaultGroupMessage); }
public async Task TestContainerWithOneEndpointWithAllDisconnectedAndConnectionStartedThrows() { var sem = new TestServiceEndpointManager(new ServiceEndpoint(ConnectionString1)); var throws = new ServiceConnectionNotActiveException(); var router = new TestEndpointRouter(throws); var container = new MultiEndpointServiceConnectionContainer( e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e), sem, router, null); await Assert.ThrowsAsync(throws.GetType(), () => container.WriteAsync(DefaultGroupMessage) ); await Assert.ThrowsAsync(throws.GetType(), () => container.WriteAsync("1", DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithPrimaryOfflineAndConnectionStartedSucceeds() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2, EndpointType.Secondary, "online")); var router = new TestEndpointRouter(false); var container = new MultiEndpointServiceConnectionContainer("hub", e => { if (string.IsNullOrEmpty(e.Name)) { return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e)); } return(new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e)); }, sem, router, NullLoggerFactory.Instance); _ = container.StartAsync(); await container.ConnectionInitializedTask; await container.WriteAsync(DefaultGroupMessage); var endpoints = container.GetOnlineEndpoints().ToArray(); Assert.Single(endpoints); Assert.Equal("online", endpoints.First().Name); }
public async Task TestContainerWithOneEndpointWithAllConnectedSucceeeds() { var sem = new TestServiceEndpointManager(new ServiceEndpoint(ConnectionString1)); var router = new TestEndpointRouter(true); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e), sem, router, NullLoggerFactory.Instance); _ = container.StartAsync(); await container.ConnectionInitializedTask.OrTimeout(); await container.WriteAsync(DefaultGroupMessage); }
public async Task TestContainerWithOneEndpointWithAllDisconnectedAndConnectionStartedThrows() { var sem = new TestServiceEndpointManager(new ServiceEndpoint(ConnectionString1)); var router = new TestEndpointRouter(true); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), new TestServiceConnection(ServiceConnectionStatus.Disconnected), }, e), sem, router, null); _ = container.StartAsync(); await container.ConnectionInitializedTask.OrTimeout(); await Assert.ThrowsAsync <ServiceConnectionNotActiveException>( () => container.WriteAsync(DefaultGroupMessage) ); }
public async Task TestContainerWithTwoEndpointWithAllConnectedSucceedsWithGoodRouter() { var sem = new TestServiceEndpointManager( new ServiceEndpoint(ConnectionString1), new ServiceEndpoint(ConnectionString2)); var router = new TestEndpointRouter(false); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestBaseServiceConnectionContainer(new List <IServiceConnection> { new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), new TestServiceConnection(), }, e), sem, router, null); _ = container.StartAsync(); await container.ConnectionInitializedTask.OrTimeout(); await container.WriteAsync(DefaultGroupMessage); }
public async Task TestContainerWithBadRouterThrows() { var sem = new TestServiceEndpointManager(new ServiceEndpoint(ConnectionString1)); var throws = new ServiceConnectionNotActiveException(); var router = new TestEndpointRouter(throws); var container = new MultiEndpointServiceConnectionContainer("hub", e => new TestServiceConnectionContainer(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, NullLoggerFactory.Instance); // All the connections started _ = container.StartAsync(); await container.ConnectionInitializedTask; await Assert.ThrowsAsync(throws.GetType(), () => container.WriteAsync(DefaultGroupMessage) ); }