public void AttachingNullConsumerToMsmqReaderThrows()
        {
            var messageQueueMock = new Mock <IMessageQueue>();
            var receiverReader   = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body);

            Assert.Throws <ArgumentNullException>(() => receiverReader.AttachConsumer(null));
        }
        public void TestQueueReaderWithMockMsmqWithNoConsumer()
        {
            var actualMessage = new Message1 {
                CorrelationId = "f3e608d4-96cf-4093-9923-91b13f4b7555"
            };
            var messageQueueMock = new Mock <IMessageQueue>();
            var messageMock      = new MessageQueueMessageWrapper(new Message {
                Body = actualMessage
            });

            messageQueueMock.Setup(m => m.EndReceive(It.IsAny <IAsyncResult>())).Returns(messageMock);
            var beginReceiveCalled = false;

            messageQueueMock.Setup(m => m.BeginReceive(It.IsAny <TimeSpan>()))
            .Callback(
                () =>
            {
                if (beginReceiveCalled)
                {
                    throw CreateMessageQueueException();
                }
                beginReceiveCalled = true;
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });

            var receiverReader = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body);

            receiverReader.Start();

            messageQueueMock.Verify(m => m.BeginReceive(It.IsAny <TimeSpan>()), Times.Exactly(1));
        }
        public void TestQueueReaderWithMockMsmqEndReceiveThrowsOn2ndRetry()
        {
            var messageQueueMock = new Mock <IMessageQueue>();

            var throwCount = 0;

            messageQueueMock
            .Setup(m => m.EndReceive(It.IsAny <IAsyncResult>()))
            .Callback(() =>
            {
                throwCount++;
                throw CreateMessageQueueException((int)MessageQueueErrorCode.IOTimeout);
            });
            messageQueueMock.Setup(m => m.BeginReceive(It.IsAny <TimeSpan>()))
            .Callback(
                () =>
            {
                if (throwCount++ == 1)
                {
                    throw CreateMessageQueueException((int)MessageQueueErrorCode.IOTimeout);
                }
                if (throwCount > 1)
                {
                    throw CreateMessageQueueException((int)MessageQueueErrorCode.AccessDenied);
                }
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });

            using (var receiverReader = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body))
            {
                receiverReader.AttachConsumer(new ActionConsumer <Message1>(m => { }));
                Assert.Throws <MessageQueueException>(() => receiverReader.Start());
            }
        }
        public void TestQueueReaderWithMockMsmqEndReceiveOneRetry()
        {
            var actualMessage = new Message1 {
                CorrelationId = "f3e608d4-96cf-4093-9923-91b13f4b7555"
            };
            var messageQueueMock = new Mock <IMessageQueue>();
            var messageMock      = new MessageQueueMessageWrapper(new Message {
                Body = actualMessage
            });

            var throwCount = 0;

            messageQueueMock
            .Setup(m => m.EndReceive(It.IsAny <IAsyncResult>()))
            .Returns(() => messageMock)
            .Callback(() =>
            {
                throwCount++;
                if (throwCount == 2)
                {
                    throw CreateMessageQueueException((int)MessageQueueErrorCode.IOTimeout);
                }
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });
            bool beginReceiveCalled = false;

            messageQueueMock.Setup(m => m.BeginReceive(It.IsAny <TimeSpan>()))
            .Callback(
                () =>
            {
                if (beginReceiveCalled)
                {
                    throw CreateMessageQueueException();
                }
                beginReceiveCalled = true;
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });

            Message1 message = null;

            using (var receiverReader = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body))
            {
                receiverReader.AttachConsumer(new ActionConsumer <Message1>(m =>
                {
                    message = m;
                    receiverReader.Dispose();
                }));
                receiverReader.Start();
                Assert.IsNotNull(message);
                Assert.AreEqual("f3e608d4-96cf-4093-9923-91b13f4b7555", message.CorrelationId);
                messageQueueMock.Verify(m => m.BeginReceive(It.IsAny <TimeSpan>()), Times.Exactly(2));
            }
        }
        public void TestMsmqReader()
        {
            var          queueName = @".\private$\Orders";
            MessageQueue messageQueue;

            if (MessageQueue.Exists(queueName))
            {
                messageQueue = new MessageQueue(queueName);
            }
            else
            {
                messageQueue = MessageQueue.Create(queueName);
            }
            try
            {
                Message1        message;
                EventWaitHandle waitHandle;
                using (var receiverReader = new MsmqReader <Message1>(new MessageQueueWrapper(messageQueue),
                                                                      message1 => (Message1)message1.Message.Body)
                       )
                {
                    message    = null;
                    waitHandle = new ManualResetEvent(false);
                    receiverReader.AttachConsumer(new ActionConsumer <Message1>(m =>
                    {
                        message = m;
                        waitHandle.Set();
                    }));
                    receiverReader.Start();
                    var msmqMessage = new Message
                    {
                        Body = new Message1 {
                            CorrelationId = "f3e608d4-96cf-4093-9923-91b13f4b7555"
                        },
                        Formatter = new BinaryMessageFormatter()
                    };
                    messageQueue.Formatter = msmqMessage.Formatter;
                    messageQueue.Send(msmqMessage);
                    var result = waitHandle.WaitOne(TimeSpan.FromSeconds(2));
                }

                Assert.IsNotNull(message);
                Assert.AreEqual("f3e608d4-96cf-4093-9923-91b13f4b7555", message.CorrelationId);
            }
            finally
            {
                MessageQueue.Delete(queueName);
            }
        }
        public void TestQueueReaderWithMockMsmqEndReceiveThrows()
        {
            var messageQueueMock = new Mock <IMessageQueue>();

            messageQueueMock.Setup(m => m.EndReceive(It.IsAny <IAsyncResult>())).Throws(CreateMessageQueueException(-1072824283));
            messageQueueMock.Setup(m => m.BeginReceive(It.IsAny <TimeSpan>()))
            .Callback(
                () =>
            {
                messageQueueMock.Raise(m => m.ReceiveCompleted += null,
                                       new MessageQueueReceiveCompletedEventArgs(null));
            });

            using (var receiverReader = new MsmqReader <Message1>(messageQueueMock.Object, message1 => (Message1)message1.Message.Body))
            {
                receiverReader.AttachConsumer(new ActionConsumer <Message1>(m => { }));
                Assert.Throws <MessageQueueException>(() => receiverReader.Start());
            }
        }