public void Should_ack_if_auto_ack()
        {
            // Arrange
            var waitHandler = new ManualResetEvent(false);
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => waitHandler.WaitOne());

            var model = Substitute.For<IModel>();
            model.IsOpen.Returns(true);
            model.When(x => x.BasicAck(Arg.Any<ulong>(), Arg.Any<bool>())).Do(callInfo => waitHandler.Set());

            var handler = Substitute.For<IMessageHandler>();
            var subscription = new CompositeSubscription();
            subscription.AddSubscription(new Subscription(model) {ConsumerTag = "ConsumerTag"});

            var consumer = new PriorityBurrowConsumer(model, handler, Substitute.For<IRabbitWatcher>(), true, 1);
            consumer.Init(queue, subscription, 1, Guid.NewGuid().ToString());
            consumer.Ready();

            // Action
            handler.HandlingComplete += Raise.Event<MessageHandlingEvent>(new BasicDeliverEventArgs{ConsumerTag = "ConsumerTag"});
            waitHandler.WaitOne();

            // Assert
            model.Received(1).BasicAck(Arg.Any<ulong>(), false);
            consumer.Dispose();
        }
Beispiel #2
0
        public void Should_start_a_thread_to_dequeue_on_priority_queue()
        {
            // Arrange
            var dequeueCount = new AutoResetEvent(false);
            var enqueueCount = new AutoResetEvent(false);
            var channel = Substitute.For<IModel>();
            
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.Dequeue().Returns(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 1));
            queue.When(x => x.Dequeue()).Do(callInfo => dequeueCount.Set());
            queue.When(x => x.Enqueue(Arg.Any<GenericPriorityMessage<BasicDeliverEventArgs>>()))
                 .Do(callInfo => enqueueCount.Set());

            var handler = Substitute.For<IMessageHandler>();
            handler.When(h => h.HandleMessage(Arg.Any<BasicDeliverEventArgs>()))
                   .Do(callInfo => handler.HandlingComplete += Raise.Event<MessageHandlingEvent>(new BasicDeliverEventArgs()));

            var consumer = new PriorityBurrowConsumer(channel, handler, Substitute.For<IRabbitWatcher>(), true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());

            // Action
            consumer.Ready();
            dequeueCount.WaitOne();
            consumer.PriorityQueue.Enqueue(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 1));
            enqueueCount.WaitOne();
            
            

            // Assert
            consumer.Dispose();
        }
Beispiel #3
0
        public void Should_catch_EndOfStreamException()
        {
            // Arrange
            var count = new CountdownEvent(2);
            var channel = Substitute.For<IModel>();
            var watcher = Substitute.For<IRabbitWatcher>();
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => {
                count.Signal();
                throw new EndOfStreamException();                
            });
            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), watcher, true, 2);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            

            // Action
            consumer.Ready();
            count.Wait();

            // Assert
            consumer.Dispose();
        }
        public void When_called_should_execute_methods_on_message_handler()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var handler = Substitute.For<IMessageHandler>();
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => Thread.Sleep(100));

            var consumer = new PriorityBurrowConsumer(channel, handler, Substitute.For<IRabbitWatcher>(), true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            consumer.HandleMessageDelivery(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>()
            });

            // Assert
            handler.Received(1).HandleMessage(consumer, Arg.Any<BasicDeliverEventArgs>());
            consumer.Dispose();
        }
        public void Should_release_the_pool()
        {
            // Arrange
            var blockTheThread = new AutoResetEvent(false);
            var countdownEvent = new CountdownEvent(1);

            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => { countdownEvent.Signal(); blockTheThread.WaitOne(); });
            
            var consumer = new PriorityBurrowConsumer(Substitute.For<IModel>(), Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), false, 1);
            consumer.Init(queue, Substitute.For<CompositeSubscription>(), 1, Guid.NewGuid().ToString());
            consumer.Ready();
            

            // Action
            countdownEvent.Wait();
            countdownEvent.Reset();
            blockTheThread.Set();
            consumer.MessageHandlerHandlingComplete(null);
            countdownEvent.Wait();
            // Assert
            
            queue.Received(2).Dequeue();
            consumer.Dispose();
            blockTheThread.Dispose();
        }
        public void When_called_should_catch_all_exception()
        {
            // Arrange
            var blockTheThread = new AutoResetEvent(false);
            var waitForFirstDequeue = new AutoResetEvent(false);

            var channel = Substitute.For<IModel>();
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<IBasicConsumer>(), Arg.Any<BasicDeliverEventArgs>()))
                      .Do(callInfo => { throw new Exception(); });

            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => { waitForFirstDequeue.Set(); blockTheThread.WaitOne(); });

            var consumer = new PriorityBurrowConsumer(channel, msgHandler, Substitute.For<IRabbitWatcher>(), true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            waitForFirstDequeue.WaitOne();
            consumer.HandleMessageDelivery(new BasicDeliverEventArgs
            {
                BasicProperties = Substitute.For<IBasicProperties>(),
                ConsumerTag = "Burrow"
            });

            // Assert
            msgHandler.Received().HandleError(Arg.Any<IBasicConsumer>(), Arg.Any<BasicDeliverEventArgs>(), Arg.Any<Exception>());
            consumer.Dispose();
            blockTheThread.Set();
        }
        public override 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 PriorityBurrowConsumer(channel, messageHandler, _watcher, true, (consumerThreadCount > 0 ? consumerThreadCount.Value : Global.DefaultConsumerBatchSize));

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Beispiel #8
0
        public override IBasicConsumer CreateAsyncConsumer <T>(IModel channel, string subscriptionName, Action <T, MessageDeliverEventArgs> onReceiveMessage, ushort?batchSize)
        {
            var messageHandler = MessageHandlerFactory.Create(subscriptionName, onReceiveMessage);
            var consumer       = new PriorityBurrowConsumer(channel, messageHandler, _watcher, false, (batchSize > 1 ? batchSize.Value : Global.DefaultConsumerBatchSize));

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Beispiel #9
0
        public override IBasicConsumer CreateConsumer <T>(IModel channel, string subscriptionName, Action <T, MessageDeliverEventArgs> onReceiveMessage)
        {
            var messageHandler = MessageHandlerFactory.Create(subscriptionName, onReceiveMessage);
            var consumer       = new PriorityBurrowConsumer(channel, messageHandler, _watcher, false, 1);

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Beispiel #10
0
        public override IBasicConsumer CreateConsumer <T>(IModel channel, string subscriptionName, Action <T> onReceiveMessage)
        {
            var messageHandler = MessageHandlerFactory.Create <T>(subscriptionName, (msg, evt) => onReceiveMessage(msg));
            var consumer       = new PriorityBurrowConsumer(channel, messageHandler, _watcher, true, 1);

            _createdConsumers.Add(consumer);
            return(consumer);
        }
Beispiel #11
0
        public void Should_throw_exception_if_subscription_is_null()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), true, 1);

            // Action
            consumer.Ready();
        }
        public void Can_called_many_times()
        {
            // Arrange
            var consumer = new PriorityBurrowConsumer(Substitute.For<IModel>(), Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), false, 1);
            consumer.Init(Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>(), new CompositeSubscription(), 1, "sem");

            // Action
            consumer.Dispose();
            consumer.Dispose();
        }
        public void Should_throw_exception_if_PriorityQueue_is_null()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), true, 1);
            

            // Action
            consumer.Init(null, new CompositeSubscription(), 1, "sem");
        }
        public void Should_throw_exception_if_semaphore_name_is_null()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), true, 1);
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();

            // Action
            consumer.Init(queue, new CompositeSubscription(), 1, null);
        }
Beispiel #15
0
        public void Can_called_many_times()
        {
            // Arrange
            var waitHandler = new AutoResetEvent(false);
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => waitHandler.WaitOne());
            var consumer = new PriorityBurrowConsumer(Substitute.For<IModel>(), Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), false, 1);
            consumer.Init(queue, new CompositeSubscription(), 1, "sem");
            consumer.Ready();

            // Action
            consumer.Dispose();
            consumer.Dispose();
            waitHandler.Set();
        }
        public void Should_do_nothing_if_already_disposed()
        {
            // Arrange
            var model = Substitute.For<IModel>();
            var consumer = new PriorityBurrowConsumer(model, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), false, 1);
            consumer.Init(Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>(), new CompositeSubscription(), 1, "sem");

            // Action
            consumer.Dispose();
            consumer.DoAck(new BasicDeliverEventArgs());


            // Assert
            model.DidNotReceive().BasicAck(Arg.Any<ulong>(), Arg.Any<bool>());
        }
Beispiel #17
0
        public void Should_delete_all_existing_msgs_that_have_same_priority()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), true, 1);
            var queue = new InMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>(5, new PriorityComparer<GenericPriorityMessage<BasicDeliverEventArgs>>());
            queue.Enqueue(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 2));
            queue.Enqueue(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 2));
            queue.Enqueue(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 2));
            queue.Enqueue(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 2));
            

            // Action
            consumer.Init(queue, new CompositeSubscription(), 2, "sem");

            // Assert
            Assert.AreEqual(0, queue.Count);
        }
Beispiel #18
0
        public void Should_do_nothing_if_already_disposed()
        {
            // Arrange
            var waitHandler = new ManualResetEvent(false);
            var model = Substitute.For<IModel>();
            var consumer = new PriorityBurrowConsumer(model, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), false, 1);
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => waitHandler.WaitOne());
            consumer.Init(queue, new CompositeSubscription(), 1, "sem");
            consumer.Ready();

            // Action
            consumer.Dispose();
            consumer.DoAck(new BasicDeliverEventArgs());

            // Assert
            model.DidNotReceive().BasicAck(Arg.Any<ulong>(), Arg.Any<bool>());
            waitHandler.Set();
        }
        public void Should_catch_IOException()
        {
            // Arrange
            var model = Substitute.For<IModel>();
            model.When(x => x.BasicAck(Arg.Any<ulong>(), Arg.Any<bool>())).Do(callInfo => { throw new IOException(); });
            var watcher = Substitute.For<IRabbitWatcher>();
            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(model) { ConsumerTag = "Burrow" });

            var consumer = new PriorityBurrowConsumer(model, Substitute.For<IMessageHandler>(), watcher, false, 1);
            consumer.Init(Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>(), sub, 1, "sem");

            // Action

            consumer.DoAck(new BasicDeliverEventArgs { ConsumerTag = "Burrow" });


            // Assert
            watcher.Received().WarnFormat(Arg.Any<string>(), Arg.Any<object[]>());
            consumer.Dispose();
        }
Beispiel #20
0
        public void Should_close_queue_and_end_other_thread()
        {
            // Arrange
            var channel = Substitute.For<IModel>();

            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => Thread.Sleep(100));

            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), Substitute.For<IRabbitWatcher>(), true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            consumer.OnCancel();

            // Assert
            consumer.Dispose();
        }
        public void When_called_should_throw_BadMessageHandlerException_if_handler_error()
        {
            // Arrange
            var waitHandler = new ManualResetEvent(false);
            var watcher = Substitute.For<IRabbitWatcher>();
            var channel = Substitute.For<IModel>();
            channel.IsOpen.Returns(true);
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>())).Do(callInfo =>{
                waitHandler.Set();
                throw new Exception("Bad excepton");
            });

            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => waitHandler.WaitOne());

            var consumer = new PriorityBurrowConsumer(channel, msgHandler, watcher, true, 1);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            try
            {
                consumer.HandleMessageDelivery(new BasicDeliverEventArgs
                {
                    BasicProperties = Substitute.For<IBasicProperties>(),
                    ConsumerTag = "Burrow"
                });
            }
            catch (BadMessageHandlerException)
            {
                waitHandler.Set();
            }
        }
        public void Should_put_msg_to_queue()
        {
            // Arrange
            var channel = Substitute.For<IModel>();
            var handler = Substitute.For<IMessageHandler>();
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo => Thread.Sleep(100));

            var consumer = new PriorityBurrowConsumer(channel, handler, Substitute.For<IRabbitWatcher>(), true, 10);
            consumer.ConsumerTag = "ConsumerTag";
            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "ConsumerTag" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();


            // Action
            consumer.HandleBasicDeliver("",0, false,"", "", null, null);

            // Assert
            queue.Received(1).Enqueue(Arg.Any<GenericPriorityMessage<BasicDeliverEventArgs>>());
            consumer.Dispose();
        }
        public void When_called_should_dispose_the_thread_if_the_message_handler_throws_exception()
        {
            var waitHandler = new ManualResetEvent(false);
            
            var watcher = Substitute.For<IRabbitWatcher>();
            watcher.When(x => x.Error(Arg.Any<BadMessageHandlerException>())).Do(callInfo => waitHandler.Set());

            var channel = Substitute.For<IModel>();
            channel.IsOpen.Returns(true);
            
            var msgHandler = Substitute.For<IMessageHandler>();
            msgHandler.When(x => x.HandleMessage(Arg.Any<BasicDeliverEventArgs>())).Do(callInfo =>
            {
                throw new Exception("Bad excepton");
            });

            var queue = new InMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>(10, new PriorityComparer<GenericPriorityMessage<BasicDeliverEventArgs>>());

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });

            var consumer = new PriorityBurrowConsumer(channel, msgHandler, watcher, true, 1);
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());
            consumer.Ready();

            
            // Action
            queue.Enqueue(new GenericPriorityMessage<BasicDeliverEventArgs>(new BasicDeliverEventArgs(), 1));
            waitHandler.WaitOne();


            // Assert
            watcher.Received(1).Error(Arg.Any<BadMessageHandlerException>());
        }
Beispiel #24
0
        public void Should_catch_ThreadInterruptedException()
        {
            // Arrange
            var count = new AutoResetEvent(false);
            var channel = Substitute.For<IModel>();
            var watcher = Substitute.For<IRabbitWatcher>();
            watcher.When(w => w.WarnFormat(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<uint>(), Arg.Any<string>(), Arg.Any<string>())).Do(c => count.Set());
            var queue = Substitute.For<IInMemoryPriorityQueue<GenericPriorityMessage<BasicDeliverEventArgs>>>();
            queue.When(x => x.Dequeue()).Do(callInfo =>
            {
                throw new ThreadInterruptedException();
            });
            var consumer = new PriorityBurrowConsumer(channel, Substitute.For<IMessageHandler>(), watcher, true, 2);

            var sub = Substitute.For<CompositeSubscription>();
            sub.AddSubscription(new Subscription(channel) { ConsumerTag = "Burrow" });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());


            // Action
            consumer.Ready();
            count.WaitOne(2000);

            // Assert
            consumer.Dispose();
        }