public async Task Given_Existing_Queue_When_New_Message_Queued_Then_Listener_Should_Fire() { var listenerCalledEvent = new ManualResetEvent(false); var queueName = new QueueName(Guid.NewGuid().ToString()); var rmqQueueingService = new RabbitMQMessageQueueingService(RabbitMQUri); try { var mockListener = new Mock<IQueueListener>(); mockListener.Setup( x => x.MessageReceived(It.IsAny<Message>(), It.IsAny<IQueuedMessageContext>(), It.IsAny<CancellationToken>())) .Callback<Message, IQueuedMessageContext, CancellationToken>((msg, ctx, ct) => { ctx.Acknowledge(); listenerCalledEvent.Set(); }) .Returns(Task.FromResult(true)); await rmqQueueingService.CreateQueue(queueName, mockListener.Object, new QueueOptions {MaxAttempts = 1}); var message = new Message(new MessageHeaders { {HeaderName.ContentType, "text/plain"}, {HeaderName.MessageId, Guid.NewGuid().ToString()} }, "Hello, world!"); await rmqQueueingService.EnqueueMessage(queueName, message, Thread.CurrentPrincipal); await listenerCalledEvent.WaitOneAsync(TimeSpan.FromSeconds(1)); var messageEqualityComparer = new MessageEqualityComparer(); mockListener.Verify( x => x.MessageReceived(It.Is<Message>(m => messageEqualityComparer.Equals(m, message)), It.IsAny<IQueuedMessageContext>(), It.IsAny<CancellationToken>()), Times.Once()); Assert.That(GetQueueDepth(queueName), Is.EqualTo(0)); Assert.That(GetQueueDepth(queueName.GetRetryQueueName()), Is.EqualTo(0)); } finally { rmqQueueingService.Dispose(); DeleteQueue(queueName); } }
public async Task Given_10_Existing_Messages_10_New_Messages_Then_Listener_Should_Fire_For_All_20_Messages() { var queueName = new QueueName(Guid.NewGuid().ToString()); var rmqQueueingService = new RabbitMQMessageQueueingService(RabbitMQUri); try { var existingMessages = Enumerable.Range(1, 10) .Select(i => new Message(new MessageHeaders { {HeaderName.ContentType, "text/plain"}, {HeaderName.MessageId, Guid.NewGuid().ToString()} }, "Hello, world! (" + i + ")")) .ToList(); await Task.WhenAll(existingMessages.Select(msg => StageExistingMessage(msg, queueName))); var newMessages = Enumerable.Range(11, 10) .Select(i => new Message(new MessageHeaders { {HeaderName.ContentType, "text/plain"}, {HeaderName.MessageId, Guid.NewGuid().ToString()} }, "Hello, world! (" + i + ")")) .ToList(); var listenerCountdown = new CountdownEvent(existingMessages.Count + newMessages.Count); var mockListener = new Mock<IQueueListener>(); mockListener.Setup( x => x.MessageReceived(It.IsAny<Message>(), It.IsAny<IQueuedMessageContext>(), It.IsAny<CancellationToken>())) .Callback<Message, IQueuedMessageContext, CancellationToken>((msg, ctx, ct) => { ctx.Acknowledge(); listenerCountdown.Signal(); }) .Returns(Task.FromResult(true)); await rmqQueueingService.CreateQueue(queueName, mockListener.Object, new QueueOptions {MaxAttempts = 1}); await Task.WhenAll(newMessages.Select(msg => rmqQueueingService.EnqueueMessage(queueName, msg, Thread.CurrentPrincipal))); var timedOut = !await listenerCountdown.WaitHandle.WaitOneAsync(TimeSpan.FromSeconds(10)); Assert.That(timedOut, Is.False, "Timed out waiting for listeners to be called"); var messageEqualityComparer = new MessageEqualityComparer(); var allmessages = existingMessages.Union(newMessages); foreach (var message in allmessages) { mockListener.Verify( x => x.MessageReceived(It.Is<Message>(m => messageEqualityComparer.Equals(m, message)), It.IsAny<IQueuedMessageContext>(), It.IsAny<CancellationToken>()), Times.Once()); } Assert.That(GetQueueDepth(queueName), Is.EqualTo(0)); Assert.That(GetQueueDepth(queueName.GetRetryQueueName()), Is.EqualTo(0)); } finally { rmqQueueingService.Dispose(); DeleteQueue(queueName); } }
public async Task Given_Auto_Acknowledge_Queue_When_Not_Acknowledged_Then_Message_Should_Be_Deleted() { var queueName = new QueueName(Guid.NewGuid().ToString()); var rmqQueueingService = new RabbitMQMessageQueueingService(RabbitMQUri); try { var listenerCalledEvent = new ManualResetEvent(false); var mockListener = new Mock<IQueueListener>(); mockListener.Setup(x => x.MessageReceived(It.IsAny<Message>(), It.IsAny<IQueuedMessageContext>(), It.IsAny<CancellationToken>())) .Callback<Message, IQueuedMessageContext, CancellationToken>( (msg, ctx, ct) => { listenerCalledEvent.Set(); }) .Returns(Task.FromResult(true)); await rmqQueueingService.CreateQueue(queueName, mockListener.Object, new QueueOptions {AutoAcknowledge = true}); var message = new Message(new MessageHeaders { {HeaderName.ContentType, "text/plain"}, {HeaderName.MessageId, Guid.NewGuid().ToString()} }, "Hello, world!"); await rmqQueueingService.EnqueueMessage(queueName, message, Thread.CurrentPrincipal); await listenerCalledEvent.WaitOneAsync(TimeSpan.FromSeconds(1)); // The listener is called before the file is deleted, so there is a possible // race condition here. Wait for a second to allow the delete to take place // before enumerating the files to see that they were actually deleted. await Task.Delay(TimeSpan.FromSeconds(1)); var messageEqualityComparer = new MessageEqualityComparer(); mockListener.Verify(x => x.MessageReceived(It.Is<Message>(m => messageEqualityComparer.Equals(m, message)), It.IsAny<IQueuedMessageContext>(), It.IsAny<CancellationToken>()), Times.Once()); Assert.That(GetQueueDepth(queueName), Is.EqualTo(0)); Assert.That(GetQueueDepth(queueName.GetRetryQueueName()), Is.EqualTo(0)); } finally { rmqQueueingService.Dispose(); DeleteQueue(queueName); } }