public void Publish_MultipleSubscribedMessageTypes_AllMessagesReceived()
        {
            // Arrange
            TestMessageType1  msg1     = new TestMessageType1("Msg1", 1, 1.2);
            TestMessageType2  msg2     = new TestMessageType2("Msg2", 2);
            TestMessageType3  msg3     = new TestMessageType3("Msg3", 3);
            TestMessageType4  msg4     = new TestMessageType4("Msg4", 4);
            TestEventConsumer consumer = GetTestConsumer();

            // Act
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg1
            });
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg2
            });
            GetTestPublisher().Publish(AggregateType34, AggregateType34, new List <IDomainEvent> {
                msg3
            });
            GetTestPublisher().Publish(AggregateType34, AggregateType34, new List <IDomainEvent> {
                msg4
            });

            // Allow time for messages to process
            int count = 10;

            while (consumer.TotalMessageCount() < 4 && count > 0)
            {
                Thread.Sleep(1000);
                count--;
            }

            ShowTestResults();

            // Assert
            Assert.That(GetDbContext().Messages.Count(),
                        Is.EqualTo(4), "Number of messages produced");
            Assert.That(GetDbContext().Messages.Count(msg => msg.Published == 0),
                        Is.EqualTo(0), "Number of unpublished messages");
            foreach (Type eventType in consumer.GetEventTypes())
            {
                TestEventConsumer.EventStatistics eventStatistics = consumer.GetEventStatistics(eventType);
                Assert.That(eventStatistics.MessageCount,
                            Is.EqualTo(1), $"Number of {eventType.Name} messages received by consumer");
                Assert.That(eventStatistics.ReceivedMessages.Count,
                            Is.EqualTo(1), $"Number of received {eventType.Name} messages");
            }

            Assert.That(consumer.TotalMessageCount(),
                        Is.EqualTo(4), "Total number of messages received by consumer");
            Assert.That(GetDbContext().ReceivedMessages.Count(msg => msg.MessageId != null),
                        Is.EqualTo(4), "Number of received messages");
            msg1.AssertGoodMessageReceived(consumer.GetEventStatistics(typeof(TestMessageType1)).ReceivedMessages[0]);
            msg2.AssertGoodMessageReceived(consumer.GetEventStatistics(typeof(TestMessageType2)).ReceivedMessages[0]);
            msg3.AssertGoodMessageReceived(consumer.GetEventStatistics(typeof(TestMessageType3)).ReceivedMessages[0]);
            msg4.AssertGoodMessageReceived(consumer.GetEventStatistics(typeof(TestMessageType4)).ReceivedMessages[0]);

            GetTestMessageInterceptor()?.AssertCounts(4, 4, 4, 4, 4, 4);
        }
        public void Publish_SubscriberThrowsExceptionOnFirstOfMultipleMessages_MessagesHandlingStops()
        {
            // Arrange
            TestMessageType1  badmsg1  = new TestMessageType1("ThrowException", 1, 1.2);
            TestMessageType2  msg2A    = new TestMessageType2("Msg2a", 1);
            TestMessageType2  msg2B    = new TestMessageType2("Msg2b", 2);
            TestEventConsumer consumer = GetTestConsumer();

            // Act
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                badmsg1
            });
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg2A
            });
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg2B
            });

            // Allow time for messages to process
            int count = 10;

            TestEventConsumer.EventStatistics type2Statistics = consumer.GetEventStatistics(typeof(TestMessageType2));
            while (type2Statistics.MessageCount < 2 && count > 0)
            {
                Thread.Sleep(1000);
                count--;
            }

            ShowTestResults();

            // Assert
            Assert.That(GetDbContext().Messages.Count(),
                        Is.EqualTo(3), "Number of messages produced");
            Assert.That(GetDbContext().Messages.Count(msg => msg.Published == 0),
                        Is.EqualTo(0), "Number of unpublished messages");
            Assert.That(GetDbContext().ReceivedMessages.Count(msg => msg.MessageId != null),
                        Is.EqualTo(0), "Number of received messages");
            Assert.That(consumer.TotalMessageCount(),
                        Is.EqualTo(1), "Total number of messages received by consumer");
            Assert.That(consumer.GetEventStatistics(typeof(TestMessageType1)).MessageCount,
                        Is.EqualTo(1), "Number of Type 1 messages received by consumer");
            Assert.That(consumer.GetEventStatistics(typeof(TestMessageType2)).MessageCount,
                        Is.EqualTo(0), "Number of Type 2 messages received by consumer");
        }
        public void Publish_SingleSubscribedMessageType2_MessageReceived()
        {
            // Arrange
            TestMessageType2 msg2 = new TestMessageType2("Msg2", 2);

            TestEventConsumer.EventStatistics eventStatistics = GetTestConsumer().GetEventStatistics(
                typeof(TestMessageType2));

            // Act
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg2
            });

            // Allow time for messages to process
            AssertMessagesArePublishedAndConsumed(eventStatistics);

            msg2.AssertGoodMessageReceived(eventStatistics.ReceivedMessages[0]);

            GetTestMessageInterceptor()?.AssertCounts(1, 1, 1, 1, 1, 1);
        }
        public async Task PublishAsync_SingleSubscribedMessageType1_MessageReceived()
        {
            // Arrange
            TestMessageType1 msg1 = new TestMessageType1("Msg1", 1, 1.2);

            TestEventConsumer.EventStatistics eventStatistics = GetTestConsumer().GetEventStatistics(
                typeof(TestMessageType1));

            // Act
            await GetTestPublisher().PublishAsync(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg1
            });

            // Allow time for messages to process
            AssertMessagesArePublishedAndConsumed(eventStatistics);

            msg1.AssertGoodMessageReceived(eventStatistics.ReceivedMessages[0]);

            GetTestMessageInterceptor()?.AssertCounts(1, 1, 1, 1, 1, 1);
        }
        public void Publish_CustomEventTypeName_CorrectEventTypeHeader()
        {
            // Arrange
            TestMessageType2  msg2     = new TestMessageType2("Msg2", 2);
            TestEventConsumer consumer = GetTestConsumer();

            // Act
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg2
            });

            // Allow time for messages to process
            int count = 10;

            TestEventConsumer.EventStatistics type2Statistics = consumer.GetEventStatistics(typeof(TestMessageType2));
            while (type2Statistics.MessageCount < 1 && count > 0)
            {
                Thread.Sleep(1000);
                count--;
            }

            ShowTestResults();

            // Assert
            Assert.That(GetDbContext().Messages.Count(),
                        Is.EqualTo(1), "Number of messages produced");
            Assert.That(GetDbContext().Messages.Count(msg => msg.Published == 0),
                        Is.EqualTo(0), "Number of unpublished messages");
            Assert.That(GetDbContext().ReceivedMessages.Count(msg => msg.MessageId != null),
                        Is.EqualTo(1), "Number of received messages");
            Assert.That(type2Statistics.MessageCount,
                        Is.EqualTo(1), "Number of Type 2 messages received by consumer");
            Assert.That(type2Statistics.ReceivedMessages.Count,
                        Is.EqualTo(1), "Number of received type 2 messages");

            msg2.AssertGoodMessageReceived(type2Statistics.ReceivedMessages[0]);
            Assert.That(type2Statistics.ReceivedMessages[0].Message.GetHeader(EventMessageHeaders.EventType),
                        Is.EqualTo(TestMessageType2.EventTypeName), "Event type header");

            GetTestMessageInterceptor()?.AssertCounts(1, 1, 1, 1, 1, 1);
        }
        public void Publish_SubscribedMessageTypeAndUnsubscribedMessageType_ReceivedOnlySubscribedMessageType()
        {
            // Arrange
            TestMessageType1            msg1 = new TestMessageType1("Msg1", 1, 1.2);
            TestMessageUnsubscribedType unsubscribedMessage = new TestMessageUnsubscribedType("Msg3");
            TestEventConsumer           consumer            = GetTestConsumer();

            // Act
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                unsubscribedMessage
            });
            // Send a following message to identify when we're done
            GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                msg1
            });

            // Allow time for messages to process
            int count = 10;

            TestEventConsumer.EventStatistics type1Statistics = consumer.GetEventStatistics(typeof(TestMessageType1));
            while (type1Statistics.MessageCount < 1 && count > 0)
            {
                Thread.Sleep(1000);
                count--;
            }

            ShowTestResults();

            // Assert
            Assert.That(GetDbContext().Messages.Count(),
                        Is.EqualTo(2), "Number of messages produced");
            Assert.That(GetDbContext().Messages.Count(msg => msg.Published == 0),
                        Is.EqualTo(0), "Number of unpublished messages");
            Assert.That(GetDbContext().ReceivedMessages.Count(msg => msg.MessageId != null),
                        Is.EqualTo(2), "Number of received messages");
            Assert.That(consumer.TotalMessageCount(),
                        Is.EqualTo(1), "Total number of messages received by consumer");

            GetTestMessageInterceptor()?.AssertCounts(2, 2, 2, 2, 2, 2);
        }
        public void Send1000Message_Within1Minute()
        {
            // Arrange
            TestMessageType1  msg1     = new TestMessageType1("Msg1", 1, 1.2);
            TestEventConsumer consumer = GetTestConsumer();

            TestEventConsumer.EventStatistics type1Statistics = consumer.GetEventStatistics(
                typeof(TestMessageType1));

            // Act
            for (int x = 0; x < 1000; x++)
            {
                GetTestPublisher().Publish(AggregateType12, AggregateType12, new List <IDomainEvent> {
                    msg1
                });
            }

            // Allow time for messages to process
            int count = 300;

            while (type1Statistics.MessageCount < 1000 && count > 0)
            {
                Thread.Sleep(1000);
                count--;
            }

            ShowTestResults();

            // Assert
            Assert.AreEqual(1000, GetDbContext().Messages.Count(), "Expect 1000 messages produced");
            Assert.AreEqual(1000, type1Statistics.MessageCount, "Received by consumer count must be 1000");
            Assert.AreEqual(0, GetDbContext().Messages.Count(msg => msg.Published == 0), "No unpublished messages");
            Assert.AreEqual(1000, GetDbContext().ReceivedMessages.Count(msg => msg.MessageId != null), "Expect 1000 messages received");
            Assert.Less(type1Statistics.GetDuration().TotalSeconds, 60.0, "Time to send 1000 messages");

            TestContext.WriteLine("Performance Test completed in {0} seconds",
                                  type1Statistics.GetDuration().TotalSeconds);
        }
        private void AssertMessagesArePublishedAndConsumed(TestEventConsumer.EventStatistics eventStatistics)
        {
            int count = 10;

            while (eventStatistics.MessageCount < 1 && count > 0)
            {
                Thread.Sleep(1000);
                count--;
            }

            ShowTestResults();

            // Assert
            Assert.That(GetDbContext().Messages.Count(),
                        Is.EqualTo(1), "Number of messages produced");
            Assert.That(GetDbContext().Messages.Count(msg => msg.Published == 0),
                        Is.EqualTo(0), "Number of unpublished messages");
            Assert.That(GetDbContext().ReceivedMessages.Count(msg => msg.MessageId != null),
                        Is.EqualTo(1), "Number of received messages");
            Assert.That(eventStatistics.MessageCount,
                        Is.EqualTo(1), "Number of Type 1 messages received by consumer");
            Assert.That(eventStatistics.ReceivedMessages.Count,
                        Is.EqualTo(1), "Number of received type 1 messages");
        }