Example #1
0
        public void ParallelAccessHandlingMessagesWithRealValidator()
        {
            // arrange
            var receivedMessages = new LinkedList <Message>();
            var messageValidator = new MessageValidator();
            var messageLoader    = new Mock <IMessageLoader>(MockBehavior.Strict);
            var message1         = new Message(1, "message1");
            var message1A        = new Message(1, "message1a");
            var message2         = new Message(2, "message2");

            // act
            var messageHandler = new MessageHandler((channel, msg) =>
            {
                receivedMessages.AddLast(msg);
                Thread.Sleep(10 * (int)msg.Id);
            });
            var messageProcessor = new MessageProcessor(
                "test-channel",
                messageValidator,
                messageLoader.Object,
                messageHandler);

            var messages = new[] { message1A, message2 };

            messageLoader.Setup(_ => _.GetMessages("test-channel", It.IsAny <long>(), long.MaxValue))
            .Returns(messages);
            messageProcessor.ProcessMessage(message1, "test-channel");
            ThreadPool.QueueUserWorkItem(state => messageProcessor.ProcessMessage(message1, "test-channel"));
            Thread.Sleep(1);
            ThreadPool.QueueUserWorkItem(state => messageProcessor.CheckForMissedMessages());
            Thread.Sleep(100);

            // assert
            Assert.Equal(2, receivedMessages.Count);
            Assert.Collection(
                receivedMessages,
                m =>
            {
                Assert.Equal(1, m.Id);
                Assert.Equal("message1", m.Content);
            },
                m => Assert.Equal(2, m.Id));
        }