Пример #1
0
        static MsmqSubscriptionStorage CreateAndInit(FakeStorageQueue queue)
        {
            var storage = new MsmqSubscriptionStorage(queue);

            storage.Init();
            return(storage);
        }
        public async Task Subscribers_are_deduplicated_based_on_transport_address_comparison_case_invariant()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("SUB1", null), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag());
            Assert.AreEqual(1, subscribers.Count());
        }
Пример #3
0
        public async Task Subscribers_are_deduplicated_based_on_transport_address_comparison_case_invariant()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("SUB1", null), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag());

            Assert.AreEqual(1, subscribers.Count());
        }
Пример #4
0
        public async Task Can_have_multiple_subscribers_to_same_event_type()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub2", null), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag());

            Assert.AreEqual(2, subscribers.Count());
        }
        public async Task Unsubscribe_is_persistent()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());
            storage = CreateAndInit(queue);

            await storage.Unsubscribe(new Subscriber("sub1", "endpointA"), messageType, new ContextBag());
            Assert.That(queue.GetAllMessages(), Is.Empty);

            storage = CreateAndInit(queue);
            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag());
            Assert.AreEqual(0, subscribers.Count());
        }
        public async Task Messages_with_the_same_timestamp_have_repeatedly_same_order()
        {
            var now = DateTime.Now;

            var msg1 = new MsmqSubscriptionMessage
            {
                ArrivedTime = now,
                Id          = Guid.NewGuid().ToString(),
                Body        = "SomeMessageType, Version=1.0.0",
                Label       = "address|endpoint"
            };
            var msg2 = new MsmqSubscriptionMessage
            {
                ArrivedTime = now,
                Id          = Guid.NewGuid().ToString(),
                Body        = "SomeMessageType, Version=1.0.0",
                Label       = "address|endpoint"
            };

            var queue1 = new FakeStorageQueue();

            queue1.Messages.AddRange(new[]
            {
                msg1,
                msg2,
            });

            var queue2 = new FakeStorageQueue();

            queue2.Messages.AddRange(new[]
            {
                msg2, // inverted order
                msg1,
            });

            var storage1 = new MsmqSubscriptionStorage(queue1);
            var storage2 = new MsmqSubscriptionStorage(queue2);

            //GetSubscriberAddressesForMessage ensures storage is initialized
            _ = await storage1.GetSubscriberAddressesForMessage(new MessageType[0], new ContextBag());

            _ = await storage2.GetSubscriberAddressesForMessage(new MessageType[0], new ContextBag());

            // both endpoints should delete the same message although they have the same timestamp and are read in different order from the queue.
            Assert.That(queue1.Messages.Count, Is.EqualTo(1), "Message count");
            Assert.AreEqual(queue1.Messages.Single(), queue2.Messages.Single());
        }
Пример #7
0
        public async Task Unsubscribing_removes_all_subscriptions_with_same_address_but_different_endpoint_names()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType  = new MessageType(typeof(SomeMessage));
            var messageTypes = new[] { messageType };
            await storage.Subscribe(new Subscriber("sub1", "e1"), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub1", "e2"), messageType, new ContextBag());

            await storage.Unsubscribe(new Subscriber("sub1", "e3"), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(messageTypes, new ContextBag());

            Assert.AreEqual(0, subscribers.Count());
        }
        public async Task Subscribe_is_persistent()
        {
            var queue = new FakeStorageQueue();
            var messageType = new MessageType(typeof(SomeMessage));
            var storage = CreateAndInit(queue);

            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub2", "endpointA"), messageType, new ContextBag());

            var storedMessages = queue.GetAllMessages().ToArray();
            Assert.That(storedMessages.Length, Is.EqualTo(2));

            storage = CreateAndInit(queue);
            var subscribers = (await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag())).ToArray();
            Assert.That(subscribers, Has.Exactly(1).Matches<Subscriber>(s => s.TransportAddress == "sub1" && s.Endpoint == null));
            Assert.That(subscribers, Has.Exactly(1).Matches<Subscriber>(s => s.TransportAddress == "sub2" && s.Endpoint == "endpointA"));
        }
Пример #9
0
        public async Task Can_handle_legacy_and_new_format()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType  = new MessageType(typeof(SomeMessage));
            var messageTypes = new[] { messageType };
            await storage.Subscribe(new Subscriber("legacy", null), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("new", "endpoint"), messageType, new ContextBag());

            var subscribers = (await storage.GetSubscriberAddressesForMessage(messageTypes, new ContextBag())).ToArray();

            Assert.AreEqual(2, subscribers.Length);
            Assert.IsTrue(subscribers.Any(s => s.TransportAddress == "legacy" && s.Endpoint == null));
            Assert.IsTrue(subscribers.Any(s => s.TransportAddress == "new" && s.Endpoint == "endpoint"));
        }
        public async Task Remove_outdated_subscriptions_on_initialization()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", "1"), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub1", "2"), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub1", "3"), messageType, new ContextBag());

            storage = CreateAndInit(queue);
            var subscribers = (await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag())).ToArray();

            Assert.That(subscribers.Length, Is.EqualTo(1));
            Assert.That(subscribers[0].TransportAddress, Is.EqualTo("sub1"));
            Assert.That(subscribers[0].Endpoint, Is.EqualTo("3"));
            Assert.That(queue.GetAllMessages().Count(), Is.EqualTo(1));
        }
Пример #11
0
        public async Task Two_subscribers_with_same_address_but_different_endpoint_are_considered_duplicates()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType  = new MessageType(typeof(SomeMessage));
            var messageTypes = new[] { messageType };
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub1", "endpoint"), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(messageTypes, new ContextBag());

            var subscriber = subscribers.Single();

            Assert.AreEqual("sub1", subscriber.TransportAddress);
            Assert.AreEqual("endpoint", subscriber.Endpoint);
        }
Пример #12
0
        public async Task Can_subscribe_to_multiple_events()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var someMessageType  = new MessageType(typeof(SomeMessage));
            var otherMessageType = new MessageType(typeof(OtherMessage));
            await storage.Subscribe(new Subscriber("sub1", null), someMessageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub1", null), otherMessageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { someMessageType }, new ContextBag());

            Assert.AreEqual(1, subscribers.Count());

            subscribers = await storage.GetSubscriberAddressesForMessage(new[] { otherMessageType }, new ContextBag());

            Assert.AreEqual(1, subscribers.Count());
        }
Пример #13
0
        public async Task Same_subscriber_for_multiple_message_types_is_returned_only_once()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var someMessageType  = new MessageType(typeof(SomeMessage));
            var otherMessageType = new MessageType(typeof(OtherMessage));
            await storage.Subscribe(new Subscriber("sub1", null), someMessageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub1", null), otherMessageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[]
            {
                someMessageType,
                otherMessageType
            }, new ContextBag());

            Assert.AreEqual(1, subscribers.Count());
        }
Пример #14
0
        public async Task Unsubscribe_is_persistent()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());

            storage = CreateAndInit(queue);

            await storage.Unsubscribe(new Subscriber("sub1", "endpointA"), messageType, new ContextBag());

            Assert.That(queue.GetAllMessages(), Is.Empty);

            storage = CreateAndInit(queue);
            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag());

            Assert.AreEqual(0, subscribers.Count());
        }
Пример #15
0
        public async Task Remove_outdated_subscriptions_on_initialization()
        {
            var queue   = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", "1"), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub1", "2"), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub1", "3"), messageType, new ContextBag());

            storage = CreateAndInit(queue);
            var subscribers = (await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag())).ToArray();

            Assert.That(subscribers.Length, Is.EqualTo(1));
            Assert.That(subscribers[0].TransportAddress, Is.EqualTo("sub1"));
            Assert.That(subscribers[0].Endpoint, Is.EqualTo("3"));
            Assert.That(queue.GetAllMessages().Count(), Is.EqualTo(1));
        }
Пример #16
0
        public async Task Subscribe_is_persistent()
        {
            var queue       = new FakeStorageQueue();
            var messageType = new MessageType(typeof(SomeMessage));
            var storage     = CreateAndInit(queue);

            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());

            await storage.Subscribe(new Subscriber("sub2", "endpointA"), messageType, new ContextBag());

            var storedMessages = queue.GetAllMessages().ToArray();

            Assert.That(storedMessages.Length, Is.EqualTo(2));

            storage = CreateAndInit(queue);
            var subscribers = (await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag())).ToArray();

            Assert.That(subscribers, Has.Exactly(1).Matches <Subscriber>(s => s.TransportAddress == "sub1" && s.Endpoint == null));
            Assert.That(subscribers, Has.Exactly(1).Matches <Subscriber>(s => s.TransportAddress == "sub2" && s.Endpoint == "endpointA"));
        }
        public async Task Should_ignore_message_version_on_subscriptions()
        {
            var subscriptionMessage = new MsmqSubscriptionMessage
            {
                ArrivedTime = DateTime.UtcNow,
                Id          = Guid.NewGuid().ToString(),
                Body        = "SomeMessage, Version=1.0.0",
                Label       = "subscriberA@server1|subscriberA"
            };

            var storageQueue = new FakeStorageQueue();

            storageQueue.Messages.Add(subscriptionMessage);

            var subscriptionStorage = new MsmqSubscriptionStorage(storageQueue);

            var subscribers = await subscriptionStorage.GetSubscriberAddressesForMessage(new[]
            {
                new MessageType("SomeMessage", "2.0.0")
            }, new ContextBag());

            Assert.AreEqual("subscriberA", subscribers.Single().Endpoint);
        }
 static MsmqSubscriptionStorage CreateAndInit(FakeStorageQueue queue)
 {
     var storage = new MsmqSubscriptionStorage(queue);
     storage.Init();
     return storage;
 }
        public async Task Unsubscribing_removes_all_subscriptions_with_same_address_but_different_endpoint_names()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            var messageTypes = new[] { messageType };
            await storage.Subscribe(new Subscriber("sub1", "e1"), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub1", "e2"), messageType, new ContextBag());

            await storage.Unsubscribe(new Subscriber("sub1", "e3"), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(messageTypes, new ContextBag());
            Assert.AreEqual(0, subscribers.Count());
        }
        public async Task Two_subscribers_with_same_address_but_different_endpoint_are_considered_duplicates()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            var messageTypes = new[] { messageType };
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub1", "endpoint"), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(messageTypes, new ContextBag());

            var subscriber = subscribers.Single();
            Assert.AreEqual("sub1", subscriber.TransportAddress);
            Assert.AreEqual("endpoint", subscriber.Endpoint);
        }
        public async Task Should_ignore_message_version_on_subscriptions()
        {
            var subscriptionMessage = new MsmqSubscriptionMessage
            {
                ArrivedTime = DateTime.UtcNow,
                Id = Guid.NewGuid().ToString(),
                Body = "SomeMessage, Version=1.0.0",
                Label = "subscriberA@server1|subscriberA"
            };

            var storageQueue = new FakeStorageQueue();
            var subscriptionStorage = new MsmqSubscriptionStorage(storageQueue);

            storageQueue.Messages.Add(subscriptionMessage);

            subscriptionStorage.Init();

            var subscribers = await subscriptionStorage.GetSubscriberAddressesForMessage(new[]
            {
                new MessageType("SomeMessage", "2.0.0")
            }, new ContextBag());

            Assert.AreEqual("subscriberA", subscribers.Single().Endpoint);
        }
        public async Task Same_subscriber_for_multiple_message_types_is_returned_only_once()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var someMessageType = new MessageType(typeof(SomeMessage));
            var otherMessageType = new MessageType(typeof(OtherMessage));
            await storage.Subscribe(new Subscriber("sub1", null), someMessageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub1", null), otherMessageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[]
            {
                someMessageType,
                otherMessageType
            }, new ContextBag());

            Assert.AreEqual(1, subscribers.Count());
        }
        public async Task Can_subscribe_to_multiple_events()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var someMessageType = new MessageType(typeof(SomeMessage));
            var otherMessageType = new MessageType(typeof(OtherMessage));
            await storage.Subscribe(new Subscriber("sub1", null), someMessageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub1", null), otherMessageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { someMessageType }, new ContextBag());
            Assert.AreEqual(1, subscribers.Count());

            subscribers = await storage.GetSubscriberAddressesForMessage(new[] { otherMessageType }, new ContextBag());
            Assert.AreEqual(1, subscribers.Count());
        }
        public async Task Can_have_multiple_subscribers_to_same_event_type()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            await storage.Subscribe(new Subscriber("sub1", null), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("sub2", null), messageType, new ContextBag());

            var subscribers = await storage.GetSubscriberAddressesForMessage(new[] { messageType }, new ContextBag());
            Assert.AreEqual(2, subscribers.Count());
        }
        public async Task Can_handle_legacy_and_new_format()
        {
            var queue = new FakeStorageQueue();
            var storage = CreateAndInit(queue);

            var messageType = new MessageType(typeof(SomeMessage));
            var messageTypes = new[] { messageType };
            await storage.Subscribe(new Subscriber("legacy", null), messageType, new ContextBag());
            await storage.Subscribe(new Subscriber("new", "endpoint"), messageType, new ContextBag());

            var subscribers = (await storage.GetSubscriberAddressesForMessage(messageTypes, new ContextBag())).ToArray();

            Assert.AreEqual(2, subscribers.Length);
            Assert.IsTrue(subscribers.Any(s => s.TransportAddress == "legacy" && s.Endpoint == null));
            Assert.IsTrue(subscribers.Any(s => s.TransportAddress == "new" && s.Endpoint == "endpoint"));
        }
        public void Messages_with_the_same_timestamp_have_repeatedly_same_order()
        {
            var now = DateTime.Now;

            var msg1 = new MsmqSubscriptionMessage
            {
                ArrivedTime = now,
                Id = Guid.NewGuid().ToString(),
                Body = "SomeMessageType, Version=1.0.0",
                Label = "address|endpoint"
            };
            var msg2 = new MsmqSubscriptionMessage
            {
                ArrivedTime = now,
                Id = Guid.NewGuid().ToString(),
                Body = "SomeMessageType, Version=1.0.0",
                Label = "address|endpoint"
            };

            var queue1 = new FakeStorageQueue();
            var storage1 = new MsmqSubscriptionStorage(queue1);
            queue1.Messages.AddRange(new []
            {
                msg1,
                msg2,
            });

            var queue2 = new FakeStorageQueue();
            var storage2 = new MsmqSubscriptionStorage(queue2);
            queue2.Messages.AddRange(new[]
            {
                msg2, // inverted order
                msg1,
            });

            storage1.Init();
            storage2.Init();

            // both endpoints should delete the same message although they have the same timestamp and are read in different order from the queue.
            Assert.That(queue1.Messages.Count, Is.EqualTo(1));
            Assert.AreEqual(queue1.Messages.Single(), queue2.Messages.Single());
        }