public void Should_not_ack_if_not_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);

            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>(), false, 1);

            consumer.Init(queue, subscription, 1, Guid.NewGuid().ToString());
            consumer.Ready();

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

            // Assert
            model.DidNotReceive().BasicAck(Arg.Any <ulong>(), Arg.Any <bool>());
            waitHandler.Set();
            consumer.Dispose();
        }
Esempio n. 2
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();
        }
Esempio n. 3
0
        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(Arg.Any <BasicDeliverEventArgs>());
            consumer.Dispose();
        }
        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();
        }
Esempio n. 5
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 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());

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



            // Assert
            consumer.Dispose();
        }
Esempio n. 6
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();
        }
Esempio n. 7
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();
        }
        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();
        }
Esempio n. 9
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);

            consumer.ConsumerTag = "ConsumerTag";
            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
            {
                ConsumerTag = "ConsumerTag"
            }, consumer);

            // Assert
            model.DidNotReceive().BasicAck(Arg.Any <ulong>(), Arg.Any <bool>());
            waitHandler.Set();
        }
Esempio n. 10
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();
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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");
        }
Esempio n. 13
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 eventArg     = new BasicDeliverEventArgs
            {
                ConsumerTag = "ConsumerTag",
                DeliveryTag = 1
            };

            var queue = Substitute.For <IInMemoryPriorityQueue <GenericPriorityMessage <BasicDeliverEventArgs> > >();

            queue.Dequeue().Returns(new GenericPriorityMessage <BasicDeliverEventArgs>(eventArg, 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>(eventArg));

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

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


            var sub = Substitute.For <CompositeSubscription>();

            sub.AddSubscription(new Subscription(channel)
            {
                ConsumerTag = "ConsumerTag"
            });
            consumer.Init(queue, sub, 1, Guid.NewGuid().ToString());

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



            // Assert
            consumer.Dispose();
        }
Esempio n. 14
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 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();
            }
        }
Esempio n. 16
0
        public void Can_wait_until_messageInProcess_down_to_0()
        {
            // Arrange
            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 =>
            {
                //When print log for waiting, fire HandlingComplete on msgHandler to decrease the messageInProcessCount
                msgHandler.HandlingComplete += Raise.Event <MessageHandlingEvent>(new BasicDeliverEventArgs
                {
                    BasicProperties = Substitute.For <IBasicProperties>()
                });
            });

            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 PriorityBurrowConsumer(model, msgHandler, watcher, true, 3);

            consumer.Init(SetupMockQueue(), new CompositeSubscription(), 1, "sem");
            consumer.Ready();

            // Action
            waitHandler.WaitOne();
            consumer.Dispose();


            // Assert
            watcher.Received().InfoFormat("Wait for {0} messages on queue {1} in progress", Arg.Any <object[]>());
        }
Esempio n. 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);
        }
        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>());
        }