public async Task ShouldDeadLetterAndDelete_When_MaxRetriesExceeded(int maxRetries, bool deadLetterMessages)
{
// arrange
var options = new InboundTransportOptions("queue", maxRetries, deadLetterMessages);
var deadLetterOptions = new InboundTransportOptions(options.GetDeadLetterEndpoint(), 1, false);
var sender = this.factory.CreateOutboundTransport();
var receiver = this.factory.CreateInboundTransport(options);
var deadletterReceiver = this.factory.CreateInboundTransport(deadLetterOptions);
await sender.Send(CreateMessageFor(options.Endpoint));
IMessageTransaction msg;
for (var i = 0; i < maxRetries - 1; ++i)
{
msg = await receiver.Receive(TimeSpan.FromMilliseconds(1));
await msg.Fail();
}
// ensure dead letter is still empty
var deadLetterMsg = await deadletterReceiver.Receive(TimeSpan.FromMilliseconds(1));
Assume.That(deadLetterMsg, Is.Null);
// act
// last attempt
msg = await receiver.Receive(TimeSpan.FromMilliseconds(1));
await msg.Fail();
// assert
msg = await receiver.Receive(TimeSpan.FromMilliseconds(1));
Assert.That(msg, Is.Null);
deadLetterMsg = await deadletterReceiver.Receive(TimeSpan.FromMilliseconds(1));
if (deadLetterMessages)
{
Assert.That(deadLetterMsg, Is.Not.Null);
Assert.That(deadLetterMsg.Message.Headers[MessageHeaders.OriginalEndpoint], Is.EqualTo(options.Endpoint));
}
else
{
Assert.That(deadLetterMsg, Is.Null);
}
}