public async Task InvokeGroupAsync_WritesTo_AllConnections_InGroups_Output()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager     = new OrleansHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <OrleansHubLifetimeManager <MyHub> >(), _fixture.ClientProvider);
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1);

                    await manager.OnConnectedAsync(connection2);

                    await manager.AddToGroupAsync(connection1.ConnectionId, "gunit");

                    await manager.AddToGroupAsync(connection2.ConnectionId, "tupac");

                    await manager.SendGroupsAsync(new string[] { "gunit", "tupac" }, "Hello", new object[] { "World" });

                    await AssertMessageAsync(client1);
                    await AssertMessageAsync(client2);
                }
        }
Example #2
0
        public async Task DisconnectConnectionRemovesConnectionFromGroup()
        {
            using (var client = new TestClient())
            {
                var manager = BackplaneHarness.HubLifetimeManager;

                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager.OnConnectedAsync(connection).OrTimeout();

                await manager.AddToGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await Task.Delay(2000);

                await manager.OnDisconnectedAsync(connection).OrTimeout();

                await Task.Delay(2000);

                await manager.SendGroupAsync("name", "Hello", new object[] { "World" }).OrTimeout();

                Assert.Null(client.TryRead());
            }
        }
        public async Task InvokeAllAsync_DoesNotWriteTo_DisconnectedConnections_Output()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager = new OrleansHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <OrleansHubLifetimeManager <MyHub> >(), _fixture.ClientProvider);

                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1);

                    await manager.OnConnectedAsync(connection2);

                    await manager.OnDisconnectedAsync(connection2);

                    await manager.SendAllAsync("Hello", new object[] { "World" });

                    await AssertMessageAsync(client1);

                    Assert.Null(client2.TryRead());
                }
        }
        public async Task InvokeUserSendsToAllConnectionsForUser()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                    using (var client3 = new TestClient())
                    {
                        var manager = BackplaneHarness.HubLifetimeManager;

                        var connection1 = HubConnectionContextUtils.Create(client1.Connection, userIdentifier: "userA");
                        var connection2 = HubConnectionContextUtils.Create(client2.Connection, userIdentifier: "userA");
                        var connection3 = HubConnectionContextUtils.Create(client3.Connection, userIdentifier: "userB");

                        await manager.OnConnectedAsync(connection1).OrTimeout();

                        await manager.OnConnectedAsync(connection2).OrTimeout();

                        await manager.OnConnectedAsync(connection3).OrTimeout();

                        await manager.SendUserAsync("userA", "Hello", new object[] { "World" }).OrTimeout();
                        await AssertMessageAsync(client1);
                        await AssertMessageAsync(client2);
                    }
        }
Example #5
0
        public async Task AddGroupAsyncForLocalConnectionAlreadyInGroupDoesNothing()
        {
            var server = new TestRedisServer();

            var manager = CreateLifetimeManager(server);

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager.OnConnectedAsync(connection).OrTimeout();

                await manager.AddToGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await manager.AddToGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await manager.SendGroupAsync("name", "Hello", new object[] { "World" }).OrTimeout();

                await AssertMessageAsync(client);

                Assert.Null(client.TryRead());
            }
        }
Example #6
0
        public async Task InvokeConnectionAsyncForLocalConnectionDoesNotPublishToRedis()
        {
            var server = new TestRedisServer();

            var manager1 = CreateLifetimeManager(server);
            var manager2 = CreateLifetimeManager(server);

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                // Add connection to both "servers" to see if connection receives message twice
                await manager1.OnConnectedAsync(connection).OrTimeout();

                await manager2.OnConnectedAsync(connection).OrTimeout();

                await manager1.SendConnectionAsync(connection.ConnectionId, "Hello", new object[] { "World" }).OrTimeout();

                await AssertMessageAsync(client);

                Assert.Null(client.TryRead());
            }
        }
Example #7
0
        public async Task AddGroupAsyncForConnectionOnDifferentServerAlreadyInGroupDoesNothing()
        {
            var backplane = CreateBackplane();
            var manager1  = CreateNewHubLifetimeManager(backplane);
            var manager2  = CreateNewHubLifetimeManager(backplane);

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager1.OnConnectedAsync(connection).OrTimeout();

                await manager1.AddToGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await manager2.AddToGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await manager2.SendGroupAsync("name", "Hello", new object[] { "World" }).OrTimeout();

                await AssertMessageAsync(client);

                Assert.Null(client.TryRead());
            }
        }
Example #8
0
        public async Task InvokeAllAsyncWithMultipleServersWritesToAllConnectionsOutput()
        {
            var server = new TestRedisServer();

            var manager1 = CreateLifetimeManager(server);
            var manager2 = CreateLifetimeManager(server);

            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager1.OnConnectedAsync(connection1).OrTimeout();

                    await manager2.OnConnectedAsync(connection2).OrTimeout();

                    await manager1.SendAllAsync("Hello", new object[] { "World" }).OrTimeout();

                    await AssertMessageAsync(client1);
                    await AssertMessageAsync(client2);
                }
        }
        public async Task InvokeAllAsyncWithMultipleServersDoesNotWriteToDisconnectedConnectionsOutput()
        {
            using (var manager1 = CreateNewHubLifetimeManager <MyHub>())
                using (var manager2 = CreateNewHubLifetimeManager <MyHub>())
                    using (var client1 = new TestClient())
                        using (var client2 = new TestClient())
                        {
                            var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                            var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                            await manager1.OnConnectedAsync(connection1).OrTimeout();

                            await manager2.OnConnectedAsync(connection2).OrTimeout();

                            await manager2.OnDisconnectedAsync(connection2).OrTimeout();

                            await manager2.SendAllAsync("Hello", new object[] { "World" }).OrTimeout();

                            await AssertMessageAsync(client1);

                            Assert.Null(client2.TryRead());
                        }
        }
        public async Task RemoveGroupAsyncForConnectionOnDifferentServerWorks()
        {
            using (var manager1 = CreateNewHubLifetimeManager <MyHub>())
                using (var manager2 = CreateNewHubLifetimeManager <MyHub>())
                    using (var client = new TestClient())
                    {
                        var connection = HubConnectionContextUtils.Create(client.Connection);

                        await manager1.OnConnectedAsync(connection).OrTimeout();

                        await manager1.AddToGroupAsync(connection.ConnectionId, "group").OrTimeout();

                        await manager2.SendGroupAsync("group", "Hello", new object[] { "World" }).OrTimeout();

                        await AssertMessageAsync(client);

                        await manager2.RemoveFromGroupAsync(connection.ConnectionId, "group").OrTimeout();

                        await manager2.SendGroupAsync("group", "Hello", new object[] { "World" }).OrTimeout();

                        Assert.Null(client.TryRead());
                    }
        }
Example #11
0
        public async Task DisconnectConnectionRemovesConnectionFromGroup()
        {
            var manager = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(),
                                                              Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager.OnConnectedAsync(connection).OrTimeout();

                await manager.AddGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await manager.OnDisconnectedAsync(connection).OrTimeout();

                await manager.SendGroupAsync("name", "Hello", new object[] { "World" }).OrTimeout();

                Assert.Null(client.TryRead());
            }
        }
Example #12
0
        public async Task InvokeAllAsyncWritesToAllConnectionsOutput()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(),
                                                                      Options.Create(new RedisOptions()
                    {
                        Factory = t => new TestConnectionMultiplexer()
                    }));
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1).OrTimeout();

                    await manager.OnConnectedAsync(connection2).OrTimeout();

                    await manager.SendAllAsync("Hello", new object[] { "World" }).OrTimeout();

                    await AssertMessageAsync(client1);
                    await AssertMessageAsync(client2);
                }
        }
Example #13
0
        public async Task SendGroupExceptAsyncDoesNotWriteToExcludedConnections(bool fromManager)
        {
            var hubProxy = new HubProxy <MyHub>(_fixture.TestCluster.Client);

            using (var manager = CreateNewHubLifetimeManager <MyHub>())
                using (var client1 = new TestClient())
                    using (var client2 = new TestClient())
                    {
                        var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                        var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                        await manager.OnConnectedAsync(connection1).OrTimeout();

                        await manager.OnConnectedAsync(connection2).OrTimeout();

                        if (fromManager)
                        {
                            await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();

                            await manager.AddToGroupAsync(connection2.ConnectionId, "group").OrTimeout();

                            await manager.SendGroupExceptAsync("group", "Hello", new object[] { "World" }, new[] { connection2.ConnectionId }).OrTimeout();
                        }
                        else
                        {
                            await hubProxy.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();

                            await hubProxy.AddToGroupAsync(connection2.ConnectionId, "group").OrTimeout();

                            await hubProxy.SendGroupExceptAsync("group", "Hello", new[] { connection2.ConnectionId }, "World").OrTimeout();
                        }

                        await AssertMessageAsync(client1);

                        Assert.Null(client2.TryRead());
                    }
        }
    public async Task SendGroupAsyncWillCancelWithToken()
    {
        using (var client1 = new TestClient(pauseWriterThreshold: 2))
        {
            var manager     = CreateNewHubLifetimeManager();
            var connection1 = HubConnectionContextUtils.Create(client1.Connection);
            await manager.OnConnectedAsync(connection1).DefaultTimeout();

            await manager.AddToGroupAsync(connection1.ConnectionId, "group").DefaultTimeout();

            var cts      = new CancellationTokenSource();
            var sendTask = manager.SendGroupAsync("group", "Hello", new object[] { "World" }, cts.Token).DefaultTimeout();
            Assert.False(sendTask.IsCompleted);
            cts.Cancel();
            await sendTask.DefaultTimeout();

            var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
            connection1.ConnectionAborted.Register(t =>
            {
                ((TaskCompletionSource)t).SetResult();
            }, tcs);
            await tcs.Task.DefaultTimeout();
        }
    }
        public async Task RemoveGroupAsync_ForConnection_OnDifferentServer_Works()
        {
            var manager1 = new OrleansHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <OrleansHubLifetimeManager <MyHub> >(), this._fixture.ClientProvider);
            var manager2 = new OrleansHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <OrleansHubLifetimeManager <MyHub> >(), this._fixture.ClientProvider);

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager1.OnConnectedAsync(connection);

                await manager1.AddToGroupAsync(connection.ConnectionId, "snoop");

                await manager2.SendGroupAsync("snoop", "Hello", new object[] { "World" });

                await AssertMessageAsync(client);

                await manager2.RemoveFromGroupAsync(connection.ConnectionId, "snoop");

                await manager2.SendGroupAsync("snoop", "Hello", new object[] { "World" });

                Assert.Null(client.TryRead());
            }
        }
        public async Task InvokeAsync_WhenNotConnectedAfterFailedAttemptsExceeds_ShouldForceDisconnect()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager     = new OrleansHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <OrleansHubLifetimeManager <MyHub> >(), _fixture.ClientProvider);
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1);

                    var groupName = "flex";
                    await manager.AddToGroupAsync(connection1.ConnectionId, groupName);

                    await manager.AddToGroupAsync(connection2.ConnectionId, groupName);

                    await manager.SendGroupAsync(groupName, "Hello", new object[] { "World" });

                    var grain            = _fixture.ClientProvider.GetClient().GetGroupGrain("MyHub", groupName);
                    var connectionsCount = await grain.Count();

                    await AssertMessageAsync(client1);

                    Assert.Equal(2, connectionsCount);

                    await manager.SendGroupAsync(groupName, "Hello", new object[] { "World" });

                    await manager.SendGroupAsync(groupName, "Hello", new object[] { "World" });

                    await Task.Delay(1);

                    connectionsCount = await grain.Count();

                    Assert.Equal(1, connectionsCount);
                }
        }
    public async Task InvocationsFromDifferentServersUseUniqueIDs()
    {
        var backplane = CreateBackplane();
        var manager1  = CreateNewHubLifetimeManager(backplane);
        var manager2  = CreateNewHubLifetimeManager(backplane);

        using (var client1 = new TestClient())
            using (var client2 = new TestClient())
            {
                var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                await manager1.OnConnectedAsync(connection1).DefaultTimeout();

                await manager2.OnConnectedAsync(connection2).DefaultTimeout();

                var invoke1     = manager1.InvokeConnectionAsync <int>(connection2.ConnectionId, "Result", new object[] { "test" });
                var invocation2 = Assert.IsType <InvocationMessage>(await client2.ReadAsync().DefaultTimeout());

                var invoke2     = manager2.InvokeConnectionAsync <int>(connection1.ConnectionId, "Result", new object[] { "test" });
                var invocation1 = Assert.IsType <InvocationMessage>(await client1.ReadAsync().DefaultTimeout());

                Assert.NotEqual(invocation1.InvocationId, invocation2.InvocationId);

                await manager1.SetConnectionResultAsync(connection2.ConnectionId, CompletionMessage.WithResult(invocation2.InvocationId, 2)).DefaultTimeout();

                await manager2.SetConnectionResultAsync(connection1.ConnectionId, CompletionMessage.WithResult(invocation1.InvocationId, 5)).DefaultTimeout();

                var res = await invoke1.DefaultTimeout();

                Assert.Equal(2, res);
                res = await invoke2.DefaultTimeout();

                Assert.Equal(5, res);
            }
    }
Example #18
0
        public async Task WritingToGroupWithOneConnectionFailingSecondConnectionStillReceivesMessage()
        {
            var manager = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(), Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));

            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    // Force an exception when writing to connection
                    var writer = new Mock <ChannelWriter <HubMessage> >();
                    writer.Setup(o => o.WaitToWriteAsync(It.IsAny <CancellationToken>())).Throws(new Exception());

                    var connection1 = HubConnectionContextUtils.Create(client1.Connection, new MockChannel(writer.Object));
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1).OrTimeout();

                    await manager.AddGroupAsync(connection1.ConnectionId, "group");

                    await manager.OnConnectedAsync(connection2).OrTimeout();

                    await manager.AddGroupAsync(connection2.ConnectionId, "group");

                    await manager.InvokeGroupAsync("group", "Hello", new object[] { "World" }).OrTimeout();

                    // connection1 will throw when receiving a group message, we are making sure other connections
                    // are not affected by another connection throwing
                    await AssertMessageAsync(client2);

                    // Repeat to check that group can still be sent to
                    await manager.InvokeGroupAsync("group", "Hello", new object[] { "World" }).OrTimeout();
                    await AssertMessageAsync(client2);
                }
        }
    public async Task ClientDisconnectsWithoutCompletingClientResultOnSecondServer()
    {
        var backplane = CreateBackplane();
        var manager1  = CreateNewHubLifetimeManager(backplane);
        var manager2  = CreateNewHubLifetimeManager(backplane);

        using (var client1 = new TestClient())
        {
            var connection1 = HubConnectionContextUtils.Create(client1.Connection);

            await manager2.OnConnectedAsync(connection1).DefaultTimeout();

            var invoke1    = manager1.InvokeConnectionAsync <int>(connection1.ConnectionId, "Result", new object[] { "test" });
            var invocation = Assert.IsType <InvocationMessage>(await client1.ReadAsync().DefaultTimeout());

            connection1.Abort();
            await manager2.OnDisconnectedAsync(connection1).DefaultTimeout();

            // Server should propogate connection closure so task isn't blocked
            var ex = await Assert.ThrowsAsync <Exception>(() => invoke1).DefaultTimeout();

            Assert.Equal("Connection disconnected.", ex.Message);
        }
    }
Example #20
0
        public async Task InvokeAllAsyncWithMultipleServersDoesNotWriteToDisconnectedConnectionsOutput()
        {
            var manager1 = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(),
                                                               Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));
            var manager2 = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(),
                                                               Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));

            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager1.OnConnectedAsync(connection1).OrTimeout();

                    await manager2.OnConnectedAsync(connection2).OrTimeout();

                    await manager2.OnDisconnectedAsync(connection2).OrTimeout();

                    await manager2.InvokeAllAsync("Hello", new object[] { "World" }).OrTimeout();

                    await AssertMessageAsync(client1);

                    await connection1.DisposeAsync().OrTimeout();

                    await connection2.DisposeAsync().OrTimeout();

                    Assert.Null(client2.TryRead());
                }
        }
Example #21
0
        public async Task InvokeConnectionAsyncOnServerWithoutConnectionWritesOutputToConnection()
        {
            var manager1 = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(),
                                                               Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));
            var manager2 = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(),
                                                               Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager1.OnConnectedAsync(connection).OrTimeout();

                await manager2.InvokeConnectionAsync(connection.ConnectionId, "Hello", new object[] { "World" }).OrTimeout();

                await AssertMessageAsync(client);
            }
        }
        public async Task InvokeConnectionAsyncForLocalConnectionDoesNotPublishToBackplane()
        {
            using (var client = new TestClient())
            {
                var manager1 = Backplane1Harness.HubLifetimeManager;
                var manager2 = Backplane2Harness.HubLifetimeManager;

                var connection = HubConnectionContextUtils.Create(client.Connection);

                // Add connection to both "servers" to see if connection receives message twice
                await manager1.OnConnectedAsync(connection).OrTimeout(Harness.TestTimeout);

                await manager2.OnConnectedAsync(connection).OrTimeout(Harness.TestTimeout);

                await manager1.SendConnectionAsync(connection.ConnectionId, "Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);

                Assert.IsFalse(Backplane1Harness.Connection.Consumed.Select <Connection <MyHub> >().Any());
                Assert.IsFalse(Backplane2Harness.Connection.Consumed.Select <Connection <MyHub> >().Any());

                await AssertMessageAsync(client);

                Assert.Null(client.TryRead());
            }
        }
        public async Task AddGroupAsyncForConnectionOnDifferentServerWorks()
        {
            var manager1 = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(), Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));
            var manager2 = new RedisHubLifetimeManager <MyHub>(new LoggerFactory().CreateLogger <RedisHubLifetimeManager <MyHub> >(), Options.Create(new RedisOptions()
            {
                Factory = t => new TestConnectionMultiplexer()
            }));

            using (var client = new TestClient())
            {
                var connection = HubConnectionContextUtils.Create(client.Connection);

                await manager1.OnConnectedAsync(connection).OrTimeout();

                await manager2.AddGroupAsync(connection.ConnectionId, "name").OrTimeout();

                await manager2.SendGroupAsync("name", "Hello", new object[] { "World" }).OrTimeout();

                await AssertMessageAsync(client);
            }
        }
        public async Task InvokeAllAsyncWithMultipleServersWritesToAllConnectionsOutput()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager1 = Backplane1Harness.HubLifetimeManager;
                    var manager2 = Backplane2Harness.HubLifetimeManager;

                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager1.OnConnectedAsync(connection1).OrTimeout(Harness.TestTimeout);

                    await manager2.OnConnectedAsync(connection2).OrTimeout(Harness.TestTimeout);

                    await manager1.SendAllAsync("Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);

                    Assert.IsTrue(Backplane1Harness.All.Consumed.Select <All <MyHub> >().Any());
                    Assert.IsTrue(Backplane2Harness.All.Consumed.Select <All <MyHub> >().Any());

                    await AssertMessageAsync(client1);
                    await AssertMessageAsync(client2);
                }
        }
        public async Task InvokeAllAsyncDoesNotWriteToDisconnectedConnectionsOutput()
        {
            var server = new TestRedisServer();

            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager     = CreateLifetimeManager(server);
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1).OrTimeout();

                    await manager.OnConnectedAsync(connection2).OrTimeout();

                    await manager.OnDisconnectedAsync(connection2).OrTimeout();

                    await manager.SendAllAsync("Hello", new object[] { "World" }).OrTimeout();

                    await AssertMessageAsync(client1);

                    Assert.Null(client2.TryRead());
                }
        }
        public async Task InvokeGroupAsyncWritesToAllConnectionsInGroupOutput()
        {
            var server = new TestRedisServer();

            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    var manager     = CreateLifetimeManager(server);
                    var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                    var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                    await manager.OnConnectedAsync(connection1).OrTimeout();

                    await manager.OnConnectedAsync(connection2).OrTimeout();

                    await manager.AddGroupAsync(connection1.ConnectionId, "gunit").OrTimeout();

                    await manager.SendGroupAsync("gunit", "Hello", new object[] { "World" }).OrTimeout();

                    await AssertMessageAsync(client1);

                    Assert.Null(client2.TryRead());
                }
        }
Example #27
0
        public async Task SendGroupAsyncWritesToAllConnectionsInGroupsOutput(bool fromManager)
        {
            var hubProxy = new HubProxy <MyHub>(_fixture.TestCluster.Client);

            using (var manager = CreateNewHubLifetimeManager <MyHub>())
                using (var client1 = new TestClient())
                    using (var client2 = new TestClient())
                    {
                        var connection1 = HubConnectionContextUtils.Create(client1.Connection);
                        var connection2 = HubConnectionContextUtils.Create(client2.Connection);

                        await manager.OnConnectedAsync(connection1).OrTimeout();

                        await manager.OnConnectedAsync(connection2).OrTimeout();

                        if (fromManager)
                        {
                            await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();

                            await manager.AddToGroupAsync(connection2.ConnectionId, "group2").OrTimeout();

                            await manager.SendGroupsAsync(new[] { "group", "group2" }, "Hello", new object[] { "World" }).OrTimeout();
                        }
                        else
                        {
                            await hubProxy.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout();

                            await hubProxy.AddToGroupAsync(connection2.ConnectionId, "group2").OrTimeout();

                            await hubProxy.SendGroupsAsync(new[] { "group", "group2" }, "Hello", "World").OrTimeout();
                        }

                        await AssertMessageAsync(client1);
                        await AssertMessageAsync(client2);
                    }
        }
Example #28
0
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            stoppingToken.Register(async() =>
            {
                foreach (var item in clientDisposables.Values)
                {
                    item.Dispose();
                }
                foreach (var item in testClients.Values)
                {
                    item.Abort();
                }
                foreach (var item in managers.Values)
                {
                    item.Dispose();
                }
                await _testCluster.Client.Close();

                _logger.LogInformation(2, "stopped.");
            });



            Observable.FromAsync(() => Console.In.ReadLineAsync())
            .Repeat()
            .Where(value => !string.IsNullOrEmpty(value))
            .Select(value => value.Split(' '))
            .SubscribeOn(TaskPoolScheduler.Default)
            .Subscribe(async(string[] value) =>
            {
                await Task.CompletedTask;

                try
                {
                    switch (value[0])
                    {
                    case "m":
                        {
                            var managerId = value[1];

                            var groupPartitioner = new DefaultClientSetPartitioner <IGroupPartitionGrain>();
                            var userPartitioner  = new DefaultClientSetPartitioner <IUserPartitionGrain>();
                            managers[managerId]  = new OrleansHubLifetimeManager <SampleHub>(Options.Create(new OrleansOptions <SampleHub> {
                                ClusterClient = _testCluster.Client
                            }),
                                                                                             groupPartitioner,
                                                                                             userPartitioner,
                                                                                             new DefaultUserIdProvider(),
                                                                                             _loggerFactory.CreateLogger <OrleansHubLifetimeManager <SampleHub> >());

                            groupPartitioners[managerId] = groupPartitioner;
                            userPartitioners[managerId]  = userPartitioner;
                        }
                        break;

                    case "dm":
                        {
                            var managerId = value[1];

                            managers[managerId].Dispose();
                        }
                        break;

                    case "sa":
                        {
                            var managerId = value[1];

                            await managers[managerId].SendAllAsync("Hello", new object[] { "World" });
                        }
                        break;

                    case "sg":
                        {
                            var managerId = value[1];
                            var groupName = value[2];

                            await managers[managerId].SendGroupAsync(groupName, "Hello", new object[] { "World" });
                        }
                        break;

                    case "atg":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];
                            var groupName    = value[3];

                            await managers[managerId].AddToGroupAsync(testClients[connectionId].ConnectionId, groupName);
                        }
                        break;

                    case "rfg":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];
                            var groupName    = value[3];

                            await managers[managerId].RemoveFromGroupAsync(testClients[connectionId].ConnectionId, groupName);
                        }
                        break;

                    case "c":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];
                            var userId       = value[3];

                            var client = new TestClient(userIdentifier: userId);

                            var connection            = HubConnectionContextUtils.Create(client.Connection);
                            testClients[connectionId] = connection;

                            await managers[managerId].OnConnectedAsync(connection);

                            var disposable = Observable.Repeat(Observable.FromAsync(() => client.ReadAsync()))
                                             .ObserveOn(TaskPoolScheduler.Default)
                                             .Subscribe(message =>
                            {
                                var _message = message as InvocationMessage;
                                _logger.LogInformation($"Method {_message.Target}, Args {JsonConvert.SerializeObject(_message.Arguments)}");
                            });
                            clientDisposables[connectionId] = disposable;
                        }
                        break;

                    case "ga":
                        {
                            var managerId = value[1];

                            var result2 = await groupPartitioners[managerId].GetAllClientSetIdsAsync(_testCluster.Client, typeof(SampleHub).GUID);
                            var result3 = await userPartitioners[managerId].GetAllClientSetIdsAsync(_testCluster.Client, typeof(SampleHub).GUID);
                            _logger.LogInformation($"GroupNames: {JsonConvert.SerializeObject(result2)}, " +
                                                   $"UserIds: {JsonConvert.SerializeObject(result3)}");
                        }
                        break;

                    case "dc":
                        {
                            var managerId    = value[1];
                            var connectionId = value[2];

                            await managers[managerId].OnDisconnectedAsync(testClients[connectionId]);
                        }
                        break;


                    //case "sr":
                    //    {
                    //        var range = RangeFactory.CreateRange(uint.Parse(value[1]), uint.Parse(value[2]));
                    //        var subRanges = RangeFactory.GetSubRanges(range);
                    //        _logger.LogInformation($"subRanges: {JsonConvert.SerializeObject(subRanges)}");



                    //        //var id = Utils.CalculateIdHash(value[1]);
                    //        //_logger.LogInformation($"id: {id}");
                    //    }
                    //    break;
                    //case "ifr":
                    //    {
                    //        var fullRange = RangeFactory.CreateFullRange();
                    //        _logger.LogInformation($"{value[1]} in full range: {fullRange.InRange(uint.Parse(value[1]))}");
                    //    }
                    //    break;
                    //case "ir":
                    //    {
                    //        var range = RangeFactory.CreateRange(uint.Parse(value[1]), uint.Parse(value[2]));
                    //        _logger.LogInformation($"{value[3]} in range: {range.InRange(uint.Parse(value[3]))}");
                    //    }
                    //    break;
                    default:
                        break;
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Exception onNext.");
                }
            },
                       error => _logger.LogError(error, "OnError."),
                       () => _logger.LogInformation("OnCompleted."));

            return(Task.CompletedTask);
        }
 public static HubConnectionContext CreateConnection(this TestClient testClient, IHubProtocol protocol = null, string userIdentifier = null)
 {
     return(HubConnectionContextUtils.Create(testClient.Connection, protocol, userIdentifier));
 }