public async Task SendGroupAsyncWritesToAllConnectionsInGroupOutput()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    MassTransitHubLifetimeManager <MyHub> manager = BackplaneHarness.HubLifetimeManager;

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

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

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

                    await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout(Harness.TestTimeout);

                    // Because connection is local, should not have any GroupManagement
                    //Assert.IsFalse(backplaneConsumers.GroupManagementConsumer.Consumed.Select<GroupManagement<MyHub>>().Any());

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

                    Assert.IsTrue(BackplaneHarness.Group.Consumed.Select <Group <MyHub> >().Any());

                    var message = client1.TryRead() as InvocationMessage;
                    Assert.NotNull(message);
                    Assert.AreEqual("Hello", message.Target);
                    Assert.AreEqual(1, message.Arguments.Length);
                    Assert.AreEqual("World", (string)message.Arguments[0]);

                    Assert.Null(client2.TryRead());
                }
        }
        public async Task AddGroupAsyncForConnectionOnDifferentServerAlreadyInGroupDoesNothing()
        {
            using (var client = new TestClient())
            {
                Task <ConsumeContext <Ack <MyHub> > > ackHandler =
                    Harness.SubscribeHandler <Ack <MyHub> >(); // Lets us verify that the ack was sent back to our bus endpoint
                MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                MassTransitHubLifetimeManager <MyHub> manager2 = Backplane2Harness.HubLifetimeManager;

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

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

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

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

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

                ConsumeContext <Ack <MyHub> > responseContext = await ackHandler;

                Assert.AreEqual(manager1.ServerName, responseContext.Message.ServerName);

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

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

                await AssertMessageAsync(client);

                Assert.Null(client.TryRead());
            }
        }
        public async Task StillSubscribedToUserAfterOneOfMultipleConnectionsAssociatedWithUserDisconnects()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                    using (var client3 = new TestClient())
                    {
                        MassTransitHubLifetimeManager <MyHub> 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(Harness.TestTimeout);

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

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

                        await manager.SendUserAsync("userA", "Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);
                        await AssertMessageAsync(client1);
                        await AssertMessageAsync(client2);

                        // Disconnect one connection for the user
                        await manager.OnDisconnectedAsync(connection1).OrTimeout(Harness.TestTimeout);

                        await manager.SendUserAsync("userA", "Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);
                        await AssertMessageAsync(client2);
                    }
        }
        public async Task SendAllAsyncDoesNotWriteToDisconnectedConnectionsOutput()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    MassTransitHubLifetimeManager <MyHub> manager = BackplaneHarness.HubLifetimeManager;

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

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

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

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

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

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

                    var message = client1.TryRead() as InvocationMessage;
                    Assert.NotNull(message);
                    Assert.AreEqual("Hello", message.Target);
                    Assert.AreEqual(1, message.Arguments.Length);
                    Assert.AreEqual("World", (string)message.Arguments[0]);

                    Assert.Null(client2.TryRead());
                }
        }
        public async Task WritingToGroupWithOneConnectionFailingSecondConnectionStillReceivesMessage()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    MassTransitHubLifetimeManager <MyHub> manager = BackplaneHarness.HubLifetimeManager;

                    // Force an exception when writing to connection
                    var connectionMock = HubConnectionContextUtils.CreateMock(client1.Connection);

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

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

                    await manager.AddToGroupAsync(connection1.ConnectionId, "group").OrTimeout(Harness.TestTimeout);

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

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

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

                    // 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.SendGroupAsync("group", "Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);
                    await AssertMessageAsync(client2);
                }
        }
        public async Task DisconnectConnectionRemovesConnectionFromGroup()
        {
            using (var client = new TestClient())
            {
                MassTransitHubLifetimeManager <MyHub> manager = BackplaneHarness.HubLifetimeManager;

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

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

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

                await Task.Delay(2000);

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

                await Task.Delay(2000);

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

                await Task.Delay(2000);

                Assert.Null(client.TryRead());
            }
        }
Exemplo n.º 7
0
        public void SetHubLifetimeManager(MassTransitHubLifetimeManager <THub> hubLifetimeManager)
        {
            foreach (var factory in _hubManagerConsumerFactories)
            {
                factory.HubLifetimeManager = hubLifetimeManager;
            }

            HubLifetimeManager = hubLifetimeManager;
        }
Exemplo n.º 8
0
        public async Task CamelCasedJsonIsPreservedAcrossMassTransitBoundary()
        {
            Harness = new InMemoryTestHarness();

            var messagePackOptions = new MessagePackHubProtocolOptions();

            var jsonOptions = new JsonHubProtocolOptions();

            jsonOptions.PayloadSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            SignalRBackplaneConsumersTestHarness <MyHub> backplane1Harness = RegisterBusEndpoint("receiveEndpoint1");
            SignalRBackplaneConsumersTestHarness <MyHub> backplane2Harness = RegisterBusEndpoint("receiveEndpoint2");

            await Harness.Start();

            try
            {
                backplane1Harness.SetHubLifetimeManager(CreateLifetimeManager(messagePackOptions, jsonOptions));
                backplane2Harness.SetHubLifetimeManager(CreateLifetimeManager());
                using (var client1 = new TestClient())
                    using (var client2 = new TestClient())
                    {
                        MassTransitHubLifetimeManager <MyHub> manager1 = backplane1Harness.HubLifetimeManager;
                        MassTransitHubLifetimeManager <MyHub> 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[] { new TestObject {
                                                                                TestProperty = "Foo"
                                                                            } }).OrTimeout(Harness.TestTimeout);

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

                        var message = await client2.ReadAsync().OrTimeout() as InvocationMessage;

                        Assert.NotNull(message);
                        Assert.AreEqual("Hello", message.Target);
                        CollectionAssert.AllItemsAreInstancesOfType(message.Arguments, typeof(JObject));
                        var jObject = message.Arguments[0] as JObject;
                        Assert.NotNull(jObject);
                        var firstProperty = jObject.Properties().First();
                        Assert.AreEqual("testProperty", firstProperty.Name);
                        Assert.AreEqual("Foo", firstProperty.Value.Value <string>());
                    }
            }
            finally
            {
                await Harness.Stop();
            }
        }
        public async Task Setup()
        {
            Harness = new InMemoryTestHarness();

            BackplaneHarness = RegisterBusEndpoint();

            await Harness.Start();

            // Need the bus to be started before we can set the manager for our Consumer Factory (so it can be injected into the consumers on creation);
            MassTransitHubLifetimeManager <THub> hubLifetimeManager = CreateLifetimeManager();

            BackplaneHarness.SetHubLifetimeManager(hubLifetimeManager);
        }
        public HubLifetimeManager <THub> CreateLifetimeManager(MessagePackHubProtocolOptions messagePackOptions = null, JsonHubProtocolOptions jsonOptions = null)
        {
            messagePackOptions = messagePackOptions ?? new MessagePackHubProtocolOptions();
            jsonOptions        = jsonOptions ?? new JsonHubProtocolOptions();

            var manager = new MassTransitHubLifetimeManager <THub>(
                Harness.Bus,
                Harness.Bus.CreateClientFactory(TimeSpan.FromSeconds(5)),
                new DefaultHubProtocolResolver(new IHubProtocol[]
            {
                new JsonHubProtocol(Options.Create(jsonOptions)),
                new MessagePackHubProtocol(Options.Create(messagePackOptions)),
            }, NullLogger <DefaultHubProtocolResolver> .Instance));

            return(manager);
        }
        public async Task RemoveGroupFromLocalConnectionNotInGroupDoesNothing()
        {
            using (var client = new TestClient())
            {
                MassTransitHubLifetimeManager <MyHub> manager = BackplaneHarness.HubLifetimeManager;

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

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

                await manager.RemoveFromGroupAsync(connection.ConnectionId, "name").OrTimeout(Harness.TestTimeout);

                Assert.IsFalse(BackplaneHarness.GroupManagement.Consumed.Select <GroupManagement <MyHub> >()
                               .Any()); // Should not have published, because connection was local
            }
        }
        public async Task InvokeConnectionAsyncOnServerWithoutConnectionWritesOutputToConnection()
        {
            using (var client = new TestClient())
            {
                MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                MassTransitHubLifetimeManager <MyHub> manager2 = Backplane2Harness.HubLifetimeManager;

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

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

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

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

                await AssertMessageAsync(client);
            }
        }
        protected MassTransitHubLifetimeManager <THub> CreateLifetimeManager(MessagePackHubProtocolOptions messagePackOptions = null,
                                                                             JsonHubProtocolOptions jsonOptions = null)
        {
            messagePackOptions ??= new MessagePackHubProtocolOptions();
            jsonOptions ??= new JsonHubProtocolOptions();

            var manager = new MassTransitHubLifetimeManager <THub>(
                new HubLifetimeManagerOptions <THub> {
                ServerName = $"{_prefix}_{Guid.NewGuid():N}"
            },
                new BusHubLifetimeScopeProvider(Harness.Bus),
                new DefaultHubProtocolResolver(
                    new IHubProtocol[] { new JsonHubProtocol(Options.Create(jsonOptions)), new MessagePackHubProtocol(Options.Create(messagePackOptions)) },
                    NullLogger <DefaultHubProtocolResolver> .Instance)
                );

            return(manager);
        }
        public async Task WritingToRemoteConnectionThatFailsDoesNotThrow()
        {
            using (var client = new TestClient())
            {
                MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                MassTransitHubLifetimeManager <MyHub> manager2 = Backplane2Harness.HubLifetimeManager;

                // Force an exception when writing to connection
                var connectionMock = HubConnectionContextUtils.CreateMock(client.Connection);

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

                // This doesn't throw because there is no connection.ConnectionId on this server so it has to publish to the backplane.
                // And once that happens there is no way to know if the invocation was successful or not.
                await manager1.SendConnectionAsync(connectionMock.ConnectionId, "Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);

                Assert.IsTrue(Backplane2Harness.Connection.Consumed.Select <Connection <MyHub> >().Any());
            }
        }
        public async Task AddGroupAsyncForLocalConnectionAlreadyInGroupDoesNothing()
        {
            using (var client = new TestClient())
            {
                MassTransitHubLifetimeManager <MyHub> manager = BackplaneHarness.HubLifetimeManager;

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

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

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

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

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

                await AssertMessageAsync(client);

                Assert.Null(client.TryRead());
            }
        }
        public async Task RemoveGroupFromConnectionOnDifferentServerNotInGroupDoesNothing()
        {
            using (var client = new TestClient())
            {
                Task <ConsumeContext <Ack <MyHub> > > ackHandler =
                    Harness.SubscribeHandler <Ack <MyHub> >(); // Lets us verify that the ack was sent back to our bus endpoint
                MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                MassTransitHubLifetimeManager <MyHub> manager2 = Backplane2Harness.HubLifetimeManager;

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

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

                await manager2.RemoveFromGroupAsync(connection.ConnectionId, "name").OrTimeout(Harness.TestTimeout);

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

                ConsumeContext <Ack <MyHub> > responseContext = await ackHandler;

                Assert.AreEqual(manager1.ServerName, responseContext.Message.ServerName);
            }
        }
        public async Task InvokeUserSendsToAllConnectionsForUser()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                    using (var client3 = new TestClient())
                    {
                        MassTransitHubLifetimeManager <MyHub> 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(Harness.TestTimeout);

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

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

                        await manager.SendUserAsync("userA", "Hello", new object[] { "World" }).OrTimeout(Harness.TestTimeout);
                        await AssertMessageAsync(client1);
                        await AssertMessageAsync(client2);
                    }
        }
        public async Task InvokeConnectionAsyncForLocalConnectionDoesNotPublishToBackplane()
        {
            using (var client = new TestClient())
            {
                MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                MassTransitHubLifetimeManager <MyHub> 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 InvokeAllAsyncWithMultipleServersWritesToAllConnectionsOutput()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                    MassTransitHubLifetimeManager <MyHub> 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 InvokeAllAsyncWithMultipleServersDoesNotWriteToDisconnectedConnectionsOutput()
        {
            using (var client1 = new TestClient())
                using (var client2 = new TestClient())
                {
                    MassTransitHubLifetimeManager <MyHub> manager1 = Backplane1Harness.HubLifetimeManager;
                    MassTransitHubLifetimeManager <MyHub> 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 manager2.OnDisconnectedAsync(connection2).OrTimeout(Harness.TestTimeout);

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

                    await AssertMessageAsync(client1);

                    Assert.Null(client2.TryRead());
                }
        }
Exemplo n.º 21
0
 public GroupConsumer(MassTransitHubLifetimeManager <THub> hubLifetimeManager)
 {
     _hubLifetimeManager = hubLifetimeManager;
 }
Exemplo n.º 22
0
 public GroupConsumer(HubLifetimeManager <THub> hubLifetimeManager)
 {
     _hubLifetimeManager = hubLifetimeManager as MassTransitHubLifetimeManager <THub> ?? throw new ArgumentNullException(nameof(hubLifetimeManager), "HubLifetimeManager<> must be of type MassTransitHubLifetimeManager<>");
 }
 public ConnectionConsumer(MassTransitHubLifetimeManager <THub> hubLifetimeManager)
 {
     _hubLifetimeManager = hubLifetimeManager;
 }