static MsmqSubscriptionStorage CreateAndInit(FakeStorageQueue queue) { var storage = new MsmqSubscriptionStorage(queue); storage.Init(); return(storage); }
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); }
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()); }
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 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); }
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()); }