Example #1
0
        public void ConsumeShouldExecuteActionToEachConsumedMessage()
        {
            // Arrange
            var topic = "my-topic";

            var consumeResultMock = new ConsumeResult <string, string>
            {
                Message = new Message <string, string>()
            };

            var actionMock   = new Mock <Action <AgnosticMessage <string> > >();
            var producerMock = new Mock <IProducer <string, string> >();
            var loggerMock   = new Mock <ILogger <KafkaConsumerWrapper <string> > >();

            // Simulates a consumer with 3 messages to be read before being terminated.
            var consumerMock = new Mock <IConsumer <string, string> >();

            consumerMock.SetupSequence(consumer => consumer.Consume(It.IsAny <CancellationToken>()))
            .Returns(consumeResultMock)
            .Returns(consumeResultMock)
            .Returns(consumeResultMock)
            .Throws <OperationCanceledException>();

            // Act
            using (var kafkaConsumerWrapper = new KafkaConsumerWrapper <string>(consumerMock.Object, producerMock.Object, loggerMock.Object))
            {
                kafkaConsumerWrapper.Consume(topic, actionMock.Object);
            }

            // Assert
            actionMock.Verify(action => action(It.IsAny <AgnosticMessage <string> >()), Times.Exactly(3));
        }
Example #2
0
        public void ConsumeShouldSubscribeToTopic()
        {
            // Arrange
            var topic = "my-topic";

            var consumeResultMock = new ConsumeResult <string, string>
            {
                Message = new Message <string, string>()
            };

            // Simulates a consumer being terminated immediately.
            var consumerMock = new Mock <IConsumer <string, string> >();

            consumerMock.SetupSequence(consumer => consumer.Consume(It.IsAny <CancellationToken>()))
            .Returns(consumeResultMock)
            .Throws <OperationCanceledException>();

            var producerMock = new Mock <IProducer <string, string> >();
            var loggerMock   = new Mock <ILogger <KafkaConsumerWrapper <string> > >();

            // Act
            using (var kafkaConsumerWrapper = new KafkaConsumerWrapper <string>(consumerMock.Object, producerMock.Object, loggerMock.Object))
            {
                kafkaConsumerWrapper.Consume(topic, (AgnosticMessage <string> message) => {});
            }

            // Assert
            consumerMock.Verify(consumer => consumer.Subscribe(topic), Times.Once);
        }
Example #3
0
        public void ConsumeShouldStopConsumingAndLeaveGroupWhenCanceled()
        {
            // Arrange
            var topic = "my-topic";

            var consumeResultMock = new ConsumeResult <string, string>
            {
                Message = new Message <string, string>()
            };

            var actionMock   = new Mock <Action <AgnosticMessage <string> > >();
            var producerMock = new Mock <IProducer <string, string> >();
            var loggerMock   = new Mock <ILogger <KafkaConsumerWrapper <string> > >();

            // Simulates a consumer being terminated immediately.
            var consumerMock = new Mock <IConsumer <string, string> >();

            consumerMock.SetupSequence(consumer => consumer.Consume(It.IsAny <CancellationToken>()))
            .Throws <OperationCanceledException>();

            // Act
            using (var kafkaConsumerWrapper = new KafkaConsumerWrapper <string>(consumerMock.Object, producerMock.Object, loggerMock.Object))
            {
                kafkaConsumerWrapper.Consume(topic, actionMock.Object);
            }

            // Assert
            actionMock.Verify(action => action(It.IsAny <AgnosticMessage <string> >()), Times.Never);
            consumerMock.Verify(consumer => consumer.Close(), Times.Once);
        }
Example #4
0
        public void ConsumeShouldSendMessageToDeadLetterTopicAfterSuccessiveFailedRetries()
        {
            // Arrange
            var topic           = "my-topic";
            var deadLetterTopic = "_dead-letter_my-topic";

            var consumeResultMock = new ConsumeResult <string, string>
            {
                Topic   = topic,
                Message = new Message <string, string> {
                    Key = "msg-1"
                }
            };

            var loggerMock = new Mock <ILogger <KafkaConsumerWrapper <string> > >();

            // Simulates an action that always fail.
            var actionMock = new Mock <Action <AgnosticMessage <string> > >();

            actionMock.Setup(action => action(It.Is <AgnosticMessage <string> >(message => message.Key == consumeResultMock.Message.Key)))
            .Throws <Exception>();

            // Simulates a consumer with one message to be read before being terminated.
            var consumerMock = new Mock <IConsumer <string, string> >();

            consumerMock.SetupSequence(consumer => consumer.Consume(It.IsAny <CancellationToken>()))
            .Returns(consumeResultMock)
            .Throws <OperationCanceledException>();

            var producerMock = new Mock <IProducer <string, string> >();

            producerMock.Setup(producer => producer.ProduceAsync(deadLetterTopic, consumeResultMock.Message))
            .ReturnsAsync(new DeliveryResult <string, string>());

            // Act
            using (var kafkaConsumerWrapper = new KafkaConsumerWrapper <string>(consumerMock.Object, producerMock.Object, loggerMock.Object))
            {
                kafkaConsumerWrapper.Consume(topic, actionMock.Object);
            }

            // Assert
            actionMock.Verify(action => action(It.IsAny <AgnosticMessage <string> >()), Times.Exactly(4));
            producerMock.Verify(producer => producer.ProduceAsync(deadLetterTopic, consumeResultMock.Message), Times.Once);
        }
Example #5
0
        public void ConsumeShouldRetryExecutingActionUponFailure()
        {
            // Arrange
            var topic = "my-topic";

            var consumeResultMock = new ConsumeResult <string, string>
            {
                Message = new Message <string, string> {
                    Key = "msg-1"
                }
            };

            var producerMock = new Mock <IProducer <string, string> >();
            var loggerMock   = new Mock <ILogger <KafkaConsumerWrapper <string> > >();

            // Simulates an action that fails twice and executes successfully on the third attempt.
            var actionMock = new Mock <Action <AgnosticMessage <string> > >();

            actionMock.SetupSequence(action => action(It.Is <AgnosticMessage <string> >(message => message.Key == consumeResultMock.Message.Key)))
            .Throws <Exception>()
            .Throws <Exception>();

            // Simulates a consumer with one message to be read before being terminated.
            var consumerMock = new Mock <IConsumer <string, string> >();

            consumerMock.SetupSequence(consumer => consumer.Consume(It.IsAny <CancellationToken>()))
            .Returns(consumeResultMock)
            .Throws <OperationCanceledException>();

            // Act
            using (var kafkaConsumerWrapper = new KafkaConsumerWrapper <string>(consumerMock.Object, producerMock.Object, loggerMock.Object))
            {
                kafkaConsumerWrapper.Consume(topic, actionMock.Object);
            }

            // Assert
            actionMock.Verify(action => action(It.IsAny <AgnosticMessage <string> >()), Times.Exactly(3));
        }