Exemplo n.º 1
0
        public void TestBasicOperation()
        {
            Assert.True(_deadLetterCollection.CountDocuments(FilterDefinition <MongoDeadLetterDocument> .Empty) == 0);
            Assert.True(_deadLetterGraveyard.CountDocuments(FilterDefinition <MongoDeadLetterGraveyardDocument> .Empty) == 0);

            // Setup a test message and send it, then wait for it to be rejected
            var testMessage = new AccessionDirectoryMessage
            {
                NationalPACSAccessionNumber = "1234",
                DirectoryPath = TestContext.CurrentContext.TestDirectory
            };

            _testHelper.TestProducer.SendMessage(testMessage, null, DeadLetterTestHelper.TestRoutingKey);
            new TestTimelineAwaiter().Await(() => _testHelper.MessageRejectorConsumer.NackCount == 1);

            IMessageHeader        originalHeader = _testHelper.MessageRejectorConsumer.LastHeader;
            BasicDeliverEventArgs originalArgs   = _testHelper.MessageRejectorConsumer.LastArgs;

            Assert.NotNull(originalHeader);
            Assert.NotNull(originalArgs);

            // Set so the next message is accepted
            _testHelper.MessageRejectorConsumer.AcceptNext = true;

            // Check 1 message on the DLQ
            Assert.AreEqual(1, _testHelper.TestModel.MessageCount(DeadLetterTestHelper.TestDlQueueName));

            // Start the host and check message has been read from DLQ into store
            var host = new DeadLetterReprocessorHost(_testHelper.GlobalOptions, _cliOptions);

            host.Start();

            Assert.True(_deadLetterCollection.CountDocuments(FilterDefinition <MongoDeadLetterDocument> .Empty) == 1);
            Assert.True(_deadLetterGraveyard.CountDocuments(FilterDefinition <MongoDeadLetterGraveyardDocument> .Empty) == 0);
            Assert.AreEqual(0, _testHelper.TestModel.MessageCount(DeadLetterTestHelper.TestDlQueueName));

            // Now run the host again with the FlushMessages option set
            _cliOptions.FlushMessages = true;
            host = new DeadLetterReprocessorHost(_testHelper.GlobalOptions, _cliOptions);
            host.Start();

            // Check the message has been sent back to the exchange and received by the consumer
            Assert.True(_deadLetterCollection.CountDocuments(FilterDefinition <MongoDeadLetterDocument> .Empty) == 0);
            Assert.True(_deadLetterGraveyard.CountDocuments(FilterDefinition <MongoDeadLetterGraveyardDocument> .Empty) == 0);
            new TestTimelineAwaiter().Await(() => _testHelper.MessageRejectorConsumer.AckCount == 1);

            IMessageHeader        reprocessedHeader = _testHelper.MessageRejectorConsumer.LastHeader;
            BasicDeliverEventArgs reprocessedArgs   = _testHelper.MessageRejectorConsumer.LastArgs;

            Assert.NotNull(reprocessedHeader);
            Assert.NotNull(reprocessedArgs);

            // Check the received message matches the original (where expected)
            Assert.AreNotEqual(originalHeader.MessageGuid, reprocessedHeader.MessageGuid);
            Assert.AreEqual(originalHeader.ProducerExecutableName, reprocessedHeader.ProducerExecutableName);
            Assert.AreEqual(originalHeader.ProducerProcessID, reprocessedHeader.ProducerProcessID);
            Assert.AreEqual(originalHeader.OriginalPublishTimestamp, reprocessedHeader.OriginalPublishTimestamp);
            Assert.True(reprocessedHeader.IsDescendantOf(originalHeader));

            // Check the xDeathHeaders
            var reprocessedXDeathHeaders = new RabbitMqXDeathHeaders(reprocessedArgs.BasicProperties.Headers, Encoding.UTF8);

            // Can't really get the expected time, just have to copy from the result
            long expectedTime = reprocessedXDeathHeaders.XDeaths[0].Time;

            var expectedXDeathHeaders = new RabbitMqXDeathHeaders
            {
                XDeaths = new List <RabbitMqXDeath>
                {
                    new RabbitMqXDeath
                    {
                        Count       = 1,
                        Exchange    = DeadLetterTestHelper.RejectExchangeName,
                        Queue       = DeadLetterTestHelper.RejectQueueName,
                        Reason      = "rejected",
                        RoutingKeys = new List <string>
                        {
                            DeadLetterTestHelper.TestRoutingKey
                        },
                        Time = expectedTime
                    }
                },
                XFirstDeathExchange = DeadLetterTestHelper.RejectExchangeName,
                XFirstDeathQueue    = DeadLetterTestHelper.RejectQueueName,
                XFirstDeathReason   = "rejected",
            };

            Assert.AreEqual(expectedXDeathHeaders, reprocessedXDeathHeaders);
        }