public void When_called_should_dispose_the_thread_if_the_message_handler_throws_exception()
        {
            var waitHandler = new ManualResetEvent(false);
            var watcher = Substitute.For<IRabbitWatcher>();
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                .Do(callInfo =>
                    {
                        throw new Exception("Bad excepton");
                    }
                );

            watcher.When(x => x.Error(Arg.Any<BadMessageHandlerException>())).Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3);

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>()
            });
            waitHandler.WaitOne();

            // Assert
            watcher.Received(1).Error(Arg.Any<BadMessageHandlerException>());
        }
        public void When_called_should_dispose_if_the_message_handler_throws_exception()
        {
            var waitHandler = new ManualResetEvent(false);
            var watcher = Substitute.For<IRabbitWatcher>();
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                .Do(callInfo =>
                    {
                        throw new Exception("Bad excepton");
                    }
                );

            watcher.When(x => x.Error(Arg.Any<Exception>())).Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3) { ConsumerTag = "ConsumerTag" };
            Subscription.OutstandingDeliveryTags[consumer.ConsumerTag] = new List<ulong>();

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>(),
                ConsumerTag = "ConsumerTag"
            });
            Assert.IsTrue(waitHandler.WaitOne(1000));

            // Assert
            watcher.Received(1).Error(Arg.Any<Exception>());
            Assert.IsTrue(consumer.Status != ConsumerStatus.Active);
            
            Subscription.OutstandingDeliveryTags[consumer.ConsumerTag].Clear(); // To kill the while loop
        }
Exemplo n.º 3
0
        public void When_called_should_execute_methods_on_message_handler()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model       = Substitute.For <IModel>();

            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For <IMessageHandler>();

            msgHandler.When(x => x.HandleMessage(Arg.Any <BasicDeliverEventArgs>()))
            .Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, Substitute.For <IRabbitWatcher>(), true, 3);

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For <IBasicProperties>()
            });
            waitHandler.WaitOne();


            // Assert
            msgHandler.DidNotReceive().HandleError(Arg.Any <BasicDeliverEventArgs>(), Arg.Any <Exception>());
            consumer.Dispose();
        }
        public void Should_handle_all_exception()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model       = Substitute.For <IModel>();

            model.IsOpen.Returns(true);
            model.When(x => x.BasicAck(Arg.Any <ulong>(), Arg.Any <bool>())).Do(callInfo => { throw new SubscriptionNotFoundException("Ack error"); });
            var msgHandler = Substitute.For <IMessageHandler>();
            var watcher    = Substitute.For <IRabbitWatcher>();

            watcher.When(w => w.Error(Arg.Any <SubscriptionNotFoundException>())).Do(callInfo => waitHandler.Set());

            var consumer = new BurrowConsumer(model, msgHandler, watcher, false, 3)
            {
                ConsumerTag = "ConsumerTag"
            };


            // Action
            msgHandler.MessageWasNotHandled += Raise.Event <MessageWasNotHandledEvent>(BurrowConsumerForTest.ADeliverEventArgs);
            Assert.IsTrue(waitHandler.WaitOne(1000));

            // Assert
            consumer.Dispose();
        }
        public void When_called_should_execute_methods_on_message_handler()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            //To decrease the messagages in progress so it doesn't have to wait when dispose at the end
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                      .Do(callInfo => msgHandler.HandlingComplete += Raise.Event<MessageHandlingEvent>(callInfo.Arg<BasicDeliverEventArgs>()));

            var watcher = Substitute.For<IRabbitWatcher>();
            watcher.IsDebugEnable.Returns(true);
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                      .Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3); 

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>()
            });
            waitHandler.WaitOne();


            // Assert
            msgHandler.DidNotReceive().HandleError(Arg.Any<BasicDeliverEventArgs>(), Arg.Any<Exception>());
            consumer.Dispose();
        }
Exemplo n.º 6
0
        public void Can_wait_until_messageInProcess_down_to_0()
        {
            // Arrange
            var fireHandlingComplete = false;
            var waitHandler          = new AutoResetEvent(false);
            var model = Substitute.For <IModel>();

            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For <IMessageHandler>();


            var watcher = Substitute.For <IRabbitWatcher>();

            watcher.IsDebugEnable.Returns(true);
            //To decrease the messagages in progress so it doesn't have to wait when dispose at the end
            watcher.When(x => x.InfoFormat(Arg.Any <string>(), Arg.Any <object[]>()))
            .Do(callInfo => Task.Factory.StartNew(() =>
            {
                if (fireHandlingComplete)
                {
                    return;
                }
                //When print log for waiting, fire HandlingComplete on msgHandler to decrease the messageInProcessCount
                Thread.Sleep(2000);
                msgHandler.HandlingComplete += Raise.Event <MessageHandlingEvent>(new BasicDeliverEventArgs
                {
                    BasicProperties = Substitute.For <IBasicProperties>(),
                    ConsumerTag     = "ConsumerTag"
                });
                fireHandlingComplete = true;
            }));


            msgHandler.When(x => x.HandleMessage(Arg.Any <BasicDeliverEventArgs>()))
            .Do(callInfo => Task.Factory.StartNew(() =>
            {
                Thread.Sleep(1000);           // Wait 1 sec so the messageInProcessCount will increase, it will block the dispose later
                waitHandler.Set();            // Release the waitHandler so Dispose can be called
            }));

            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3)
            {
                ConsumerTag = "ConsumerTag"
            };

            Subscription.OutstandingDeliveryTags[consumer.ConsumerTag] = new List <ulong>();
            // Action
            // Enqueue only 1 msg
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For <IBasicProperties>(),
                ConsumerTag     = "ConsumerTag"
            });
            Assert.IsTrue(waitHandler.WaitOne(1500));
            consumer.Dispose();


            // Assert
            watcher.Received().InfoFormat("Wait for {0} messages in progress", Arg.Any <object[]>());
        }
Exemplo n.º 7
0
        public void When_called_should_execute_methods_on_message_handler()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model       = Substitute.For <IModel>();

            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For <IMessageHandler>();

            //To decrease the messagages in progress so it doesn't have to wait when dispose at the end
            msgHandler.When(x => x.HandleMessage(Arg.Any <BasicDeliverEventArgs>()))
            .Do(callInfo => msgHandler.HandlingComplete += Raise.Event <MessageHandlingEvent>(callInfo.Arg <BasicDeliverEventArgs>()));

            var watcher = Substitute.For <IRabbitWatcher>();

            watcher.IsDebugEnable.Returns(true);
            msgHandler.When(x => x.HandleMessage(Arg.Any <BasicDeliverEventArgs>()))
            .Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3);

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For <IBasicProperties>()
            });
            waitHandler.WaitOne();


            // Assert
            msgHandler.DidNotReceive().HandleError(Arg.Any <BasicDeliverEventArgs>(), Arg.Any <Exception>());
            consumer.Dispose();
        }
Exemplo n.º 8
0
        public void When_called_should_dispose_the_thread_if_the_message_handler_throws_exception()
        {
            var waitHandler = new ManualResetEvent(false);
            var watcher     = Substitute.For <IRabbitWatcher>();
            var model       = Substitute.For <IModel>();

            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For <IMessageHandler>();

            msgHandler.When(x => x.HandleMessage(Arg.Any <BasicDeliverEventArgs>()))
            .Do(callInfo =>
            {
                throw new Exception("Bad excepton");
            }
                );

            watcher.When(x => x.Error(Arg.Any <BadMessageHandlerException>())).Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3);

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For <IBasicProperties>()
            });
            waitHandler.WaitOne();

            // Assert
            watcher.Received(1).Error(Arg.Any <BadMessageHandlerException>());
        }
Exemplo n.º 9
0
        public virtual IBasicConsumer CreateConsumer <T>(IModel channel, string subscriptionName, Action <T> onReceiveMessage, ushort?consumerThreadCount)
        {
            var messageHandler = MessageHandlerFactory.Create <T>(subscriptionName, (msg, evt) => onReceiveMessage(msg));
            var consumer       = new BurrowConsumer(channel, messageHandler, _watcher, true, (consumerThreadCount > 0 ? consumerThreadCount.Value : Global.DefaultConsumerBatchSize));

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Exemplo n.º 10
0
        public virtual IBasicConsumer CreateAsyncConsumer <T>(IModel channel, string subscriptionName, Action <T, MessageDeliverEventArgs> onReceiveMessage, ushort?batchSize)
        {
            var messageHandler = MessageHandlerFactory.Create(subscriptionName, onReceiveMessage);
            var consumer       = new BurrowConsumer(channel, messageHandler, _watcher, false, (batchSize > 1 ? batchSize.Value : Global.DefaultConsumerBatchSize));

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Exemplo n.º 11
0
        public virtual IBasicConsumer CreateConsumer <T>(IModel channel, string subscriptionName, Action <T, MessageDeliverEventArgs> onReceiveMessage)
        {
            var messageHandler = MessageHandlerFactory.Create(subscriptionName, onReceiveMessage);
            var consumer       = new BurrowConsumer(channel, messageHandler, _watcher, false, 1);

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Exemplo n.º 12
0
        public virtual IBasicConsumer CreateConsumer <T>(IModel channel, string subscriptionName, Action <T> onReceiveMessage)
        {
            var messageHandler = MessageHandlerFactory.Create <T>(subscriptionName, (msg, evt) => onReceiveMessage(msg));
            var consumer       = new BurrowConsumer(channel, messageHandler, _watcher, true, 1);

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Exemplo n.º 13
0
        public void Can_called_many_times()
        {
            // Arrange
            var consumer = new BurrowConsumer(Substitute.For<IModel>(), Substitute.For<IMessageHandler>(),
                                              Substitute.For<IRabbitWatcher>(), false, 3) { ConsumerTag = "ConsumerTag" };

            // Action
            consumer.Dispose();
            consumer.Dispose();
        }
Exemplo n.º 14
0
        public void Can_called_many_times()
        {
            // Arrange
            var consumer = new BurrowConsumer(Substitute.For <IModel>(), Substitute.For <IMessageHandler>(),
                                              Substitute.For <IRabbitWatcher>(), false, 3);

            // Action
            consumer.Dispose();
            consumer.Dispose();
        }
Exemplo n.º 15
0
        public void Can_wait_until_messageInProcess_down_to_0()
        {
            // Arrange
            var fireHandlingComplete = false;
            var waitHandler = new AutoResetEvent(false);
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            

            var watcher = Substitute.For<IRabbitWatcher>();
            watcher.IsDebugEnable.Returns(true);
            //To decrease the messagages in progress so it doesn't have to wait when dispose at the end
            watcher.When(x => x.InfoFormat(Arg.Any<string>(), Arg.Any<object[]>()))
                    .Do(callInfo => Task.Factory.StartNew(() =>
                    {
                        if (fireHandlingComplete) return;
                        //When print log for waiting, fire HandlingComplete on msgHandler to decrease the messageInProcessCount
                        Thread.Sleep(2000);
                        msgHandler.HandlingComplete += Raise.Event<MessageHandlingEvent>(new BasicDeliverEventArgs
                        {
                            BasicProperties = Substitute.For<IBasicProperties>(),
                            ConsumerTag = "ConsumerTag"
                        });
                        fireHandlingComplete = true;
                    }));


            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                      .Do(callInfo => Task.Factory.StartNew(() =>
                      {
                          Thread.Sleep(1000); // Wait 1 sec so the messageInProcessCount will increase, it will block the dispose later
                          waitHandler.Set();  // Release the waitHandler so Dispose can be called
                      }));

            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3) { ConsumerTag = "ConsumerTag" };
            Subscription.OutstandingDeliveryTags[consumer.ConsumerTag] = new List<ulong>();
            // Action
            // Enqueue only 1 msg
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>(),
                ConsumerTag = "ConsumerTag"
            });
            Assert.IsTrue(waitHandler.WaitOne(1500));
            consumer.Dispose();


            // Assert
            watcher.Received().InfoFormat("Wait for {0} messages in progress", Arg.Any<object[]>());
        }
Exemplo n.º 16
0
        public void Should_handle_all_exception()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            model.When(x => x.BasicAck(Arg.Any<ulong>(), Arg.Any<bool>())).Do(callInfo => { throw new SubscriptionNotFoundException("Ack error"); });
            var msgHandler = Substitute.For<IMessageHandler>();
            var watcher = Substitute.For<IRabbitWatcher>();
            watcher.When(w => w.Error(Arg.Any<SubscriptionNotFoundException>())).Do(callInfo => waitHandler.Set());

            var consumer = new BurrowConsumer(model, msgHandler, watcher, false, 3);


            // Action
            msgHandler.MessageWasNotHandled += Raise.Event<MessageWasNotHandledEvent>(Substitute.For<BasicDeliverEventArgs>());
            waitHandler.WaitOne();

            // Assert
            consumer.Dispose();
        }
        public void Should_handle_all_exception()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            model.When(x => x.BasicAck(Arg.Any<ulong>(), Arg.Any<bool>())).Do(callInfo => { throw new SubscriptionNotFoundException("Ack error"); });
            var msgHandler = Substitute.For<IMessageHandler>();
            var watcher = Substitute.For<IRabbitWatcher>();
            watcher.When(w => w.Error(Arg.Any<SubscriptionNotFoundException>())).Do(callInfo => waitHandler.Set());

            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3) { ConsumerTag = "ConsumerTag" };
            consumer.ConsumerTag = "ConsumerTag";

            // Action
            msgHandler.HandlingComplete += Raise.Event<MessageHandlingEvent>(BurrowConsumerForTest.ADeliverEventArgs);
            Assert.IsTrue(waitHandler.WaitOne(5000), "Test wait timeout");

            // Assert
            consumer.Dispose();
        }
        public void When_called_should_dispose_if_the_message_handler_throws_exception()
        {
            var waitHandler = new ManualResetEvent(false);
            var watcher     = Substitute.For <IRabbitWatcher>();
            var model       = Substitute.For <IModel>();

            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For <IMessageHandler>();

            msgHandler.When(x => x.HandleMessage(Arg.Any <BasicDeliverEventArgs>()))
            .Do(callInfo =>
            {
                throw new Exception("Bad excepton");
            }
                );

            watcher.When(x => x.Error(Arg.Any <Exception>())).Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, watcher, true, 3)
            {
                ConsumerTag = "ConsumerTag"
            };

            Subscription.OutstandingDeliveryTags[consumer.ConsumerTag] = new List <ulong>();

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For <IBasicProperties>(),
                ConsumerTag     = "ConsumerTag"
            });
            Assert.IsTrue(waitHandler.WaitOne(1000));

            // Assert
            watcher.Received(1).Error(Arg.Any <Exception>());
            Assert.IsTrue(consumer.Status != ConsumerStatus.Active);

            Subscription.OutstandingDeliveryTags[consumer.ConsumerTag].Clear(); // To kill the while loop
        }
        public void When_called_should_execute_methods_on_message_handler()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                      .Do(callInfo => waitHandler.Set());
            var consumer = new BurrowConsumer(model, msgHandler, Substitute.For<IRabbitWatcher>(), true, 3);

            // Action
            consumer.Queue.Enqueue(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>()
            });
            waitHandler.WaitOne();


            // Assert
            msgHandler.DidNotReceive().HandleError(Arg.Any<BasicDeliverEventArgs>(), Arg.Any<Exception>());
            consumer.Dispose();
        }