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(); }
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_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(); }
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(); }
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 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(); }
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(); }
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 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); }
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_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(); }
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(); } }
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[]>()); }
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>()); }