Example #1
0
        static MsmqSubscriptionStorage CreateAndInit(FakeStorageQueue queue)
        {
            var storage = new MsmqSubscriptionStorage(queue);

            storage.Init();
            return(storage);
        }
Example #2
0
        public void Can_read_subscription_from_queue()
        {
            var serializer = new XmlMessageSerializer(new DefaultReflection(),
                                                      new CastleServiceLocator(new WindsorContainer()));

            var msg = new Message();

            serializer.Serialize(new object[] { new AddSubscription
                                                {
                                                    Endpoint = TransactionalTestQueueUri,
                                                    Type     = typeof(TestMessage).FullName,
                                                } }, msg.BodyStream);

            msg.Extension = Guid.NewGuid().ToByteArray();
            queue.Send(msg, MessageQueueTransactionType.None);
            msg = queue.Peek(TimeSpan.FromSeconds(30));
            queue.MoveToSubQueue("subscriptions", msg);


            var subscriptionStorage = new MsmqSubscriptionStorage(new DefaultReflection(),
                                                                  serializer,
                                                                  TestQueueUri.Uri,
                                                                  new EndpointRouter(),
                                                                  new SubQueueStrategy());

            subscriptionStorage.Initialize();

            var uri = subscriptionStorage
                      .GetSubscriptionsFor(typeof(TestMessage))
                      .Single();

            Assert.Equal(TransactionalTestQueueUri.Uri, uri);
        }
Example #3
0
        public void Adding_then_removing_will_result_in_no_subscriptions()
        {
            var serializer = new XmlMessageSerializer(new DefaultReflection(), new DefaultKernel());
            var msg        = new Message();

            serializer.Serialize(new object[] { new AddSubscription
                                                {
                                                    Endpoint = TransactionalTestQueueUri,
                                                    Type     = typeof(TestMessage).FullName,
                                                } }, msg.BodyStream);
            msg.Extension = Guid.NewGuid().ToByteArray();

            queue.Send(msg, MessageQueueTransactionType.None);
            msg = queue.Peek(TimeSpan.FromSeconds(30));
            queue.MoveToSubQueue("subscriptions", msg);

            var subscriptionStorage = new MsmqSubscriptionStorage(new DefaultReflection(),
                                                                  serializer,
                                                                  TestQueueUri.Uri,
                                                                  new EndpointRouter(),
                                                                  new SubQueueStrategy());

            subscriptionStorage.Initialize();
            subscriptionStorage.RemoveSubscription(typeof(TestMessage).FullName, TransactionalTestQueueUri.Uri.ToString());

            var uris = subscriptionStorage
                       .GetSubscriptionsFor(typeof(TestMessage));

            Assert.Equal(0, uris.Count());
        }
        public void Adding_then_removing_will_result_in_no_subscriptions()
        {
            var serializer = new XmlMessageSerializer(new DefaultReflection(), new DefaultKernel());
            var msg        = new Message();

            serializer.Serialize(new object[] { new AddSubscription
                                                {
                                                    Endpoint = transactionalTestQueueEndpoint,
                                                    Type     = typeof(TestMessage).FullName,
                                                } }, msg.BodyStream);

            msg.Extension = Guid.NewGuid().ToByteArray();
            queue.OpenSiblngQueue(SubQueue.Subscriptions, QueueAccessMode.Send).Send(msg);

            var subscriptionStorage = new MsmqSubscriptionStorage(new DefaultReflection(),
                                                                  serializer,
                                                                  testQueueEndPoint.Uri,
                                                                  new EndpointRouter(),
                                                                  new FlatQueueStrategy(new EndpointRouter(), testQueueEndPoint.Uri));

            subscriptionStorage.Initialize();
            subscriptionStorage.RemoveSubscription(typeof(TestMessage).FullName, transactionalTestQueueEndpoint.Uri.ToString());

            var uris = subscriptionStorage
                       .GetSubscriptionsFor(typeof(TestMessage));

            Assert.Equal(0, uris.Count());
        }
Example #5
0
        public async Task ShouldRemoveSubscriptionsInNonTransactionalMode()
        {
            var address   = MsmqAddress.Parse("MsmqSubscriptionStorageQueueTests.PersistNonTransactional");
            var queuePath = address.PathWithoutPrefix;

            if (MessageQueue.Exists(queuePath))
            {
                MessageQueue.Delete(queuePath);
            }

            MessageQueue.Create(queuePath, false);

            using (var queue = new MessageQueue(queuePath))
            {
                queue.Send(new Message
                {
                    Label = "subscriber",
                    Body  = typeof(MyMessage).AssemblyQualifiedName
                }, MessageQueueTransactionType.None);
            }

            var storage = new MsmqSubscriptionStorage(new MsmqSubscriptionStorageQueue(address, false));

            storage.Init();

            await storage.Unsubscribe(new Subscriber("subscriber", "subscriber"), new MessageType(typeof(MyMessage)), new ContextBag());

            using (var queue = new MessageQueue(queuePath))
            {
                CollectionAssert.IsEmpty(queue.GetAllMessages());
            }
        }
        public async Task ShouldRemoveSubscriptionsInNonTransactionalMode()
        {
            var address = MsmqAddress.Parse("MsmqSubscriptionStorageQueueTests.PersistNonTransactional");
            var queuePath = address.PathWithoutPrefix;

            if (MessageQueue.Exists(queuePath))
            {
                MessageQueue.Delete(queuePath);
            }

            MessageQueue.Create(queuePath, false);

            using (var queue = new MessageQueue(queuePath))
            {
                queue.Send(new Message
                {
                    Label = "subscriber",
                    Body = typeof(MyMessage).AssemblyQualifiedName
                }, MessageQueueTransactionType.None);
            }

            var storage = new MsmqSubscriptionStorage(new MsmqSubscriptionStorageQueue(address, false));

            storage.Init();

            await storage.Unsubscribe(new Subscriber("subscriber", "subscriber"), new MessageType(typeof(MyMessage)), new ContextBag());

            using (var queue = new MessageQueue(queuePath))
            {
                CollectionAssert.IsEmpty(queue.GetAllMessages());
            }
        }
Example #7
0
        public async Task ShouldRemoveSubscriptionsInTransactionalMode()
        {
            var address   = MsmqAddress.Parse(TestQueueName);
            var queuePath = address.PathWithoutPrefix;

            MessageQueue.Create(queuePath, true);

            using (var queue = new MessageQueue(queuePath))
            {
                queue.Send(new Message
                {
                    Label = "subscriber",
                    Body  = typeof(MyMessage).AssemblyQualifiedName
                }, MessageQueueTransactionType.Single);
            }

            var storage = new MsmqSubscriptionStorage(new MsmqSubscriptionStorageQueue(address, true));

            await storage.Unsubscribe(new Subscriber("subscriber", "subscriber"), new MessageType(typeof(MyMessage)), new ContextBag());

            using (var queue = new MessageQueue(queuePath))
            {
                CollectionAssert.IsEmpty(queue.GetAllMessages());
            }
        }
        public void Can_read_subscription_from_queue()
        {
            var serializer = new XmlMessageSerializer(new DefaultReflection(),
                                                      new CastleServiceLocator(new WindsorContainer()));

            var msg = new Message();

            serializer.Serialize(new object[] { new AddSubscription
                                                {
                                                    Endpoint = transactionalTestQueueEndpoint,
                                                    Type     = typeof(TestMessage).FullName,
                                                } }, msg.BodyStream);
            msg.Extension = Guid.NewGuid().ToByteArray();
            queue.OpenSiblngQueue(SubQueue.Subscriptions, QueueAccessMode.Send).Send(msg);


            var subscriptionStorage = new MsmqSubscriptionStorage(new DefaultReflection(),
                                                                  serializer,
                                                                  testQueueEndPoint.Uri,
                                                                  new EndpointRouter(),
                                                                  new FlatQueueStrategy(new EndpointRouter(), testQueueEndPoint.Uri));

            subscriptionStorage.Initialize();

            var uri = subscriptionStorage
                      .GetSubscriptionsFor(typeof(TestMessage))
                      .Single();

            Assert.Equal(transactionalTestQueueEndpoint.Uri, uri);
        }
        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());
        }
        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);
        }
Example #11
0
        public static void Test(ITransport t, IQueueStrategy strategy,
                                Endpoint queueEndpoint, Action <Message> send, Func <MessageEnumerator>
                                enumer)
        {
            Guid id         = Guid.NewGuid();
            var  serializer = new XmlMessageSerializer(new
                                                       DefaultReflection(), new DefaultKernel());

            var subscriptionStorage = new MsmqSubscriptionStorage(new
                                                                  DefaultReflection(),
                                                                  serializer,
                                                                  queueEndpoint.Uri,
                                                                  new
                                                                  EndpointRouter(),
                                                                  strategy);

            subscriptionStorage.Initialize();

            var wait = new ManualResetEvent(false);

            subscriptionStorage.SubscriptionChanged += () => wait.Set();

            t.AdministrativeMessageArrived +=
                subscriptionStorage.HandleAdministrativeMessage;

            Message msg = new MsmqMessageBuilder
                              (serializer, new DefaultKernel()).BuildFromMessageBatch(new
                                                                                      AddInstanceSubscription
            {
                Endpoint = queueEndpoint.Uri.ToString(),
                InstanceSubscriptionKey = id,
                Type = typeof(TestMessage2).FullName,
            });

            send(msg);

            wait.WaitOne();

            msg = new MsmqMessageBuilder
                      (serializer, new DefaultKernel()).BuildFromMessageBatch(new
                                                                              RemoveInstanceSubscription
            {
                Endpoint = queueEndpoint.Uri.ToString(),
                InstanceSubscriptionKey = id,
                Type = typeof(TestMessage2).FullName,
            });

            wait.Reset();

            send(msg);

            wait.WaitOne();

            IEnumerable <Uri> uris = subscriptionStorage
                                     .GetSubscriptionsFor(typeof(TestMessage2));

            Assert.Equal(0, uris.Count());

            int count = 0;
            MessageEnumerator copy = enumer();

            while (copy.MoveNext())
            {
                count++;
            }
            Assert.Equal(0, count);
        }
 static MsmqSubscriptionStorage CreateAndInit(FakeStorageQueue queue)
 {
     var storage = new MsmqSubscriptionStorage(queue);
     storage.Init();
     return storage;
 }
        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 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());
        }