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 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());
        }