Example #1
0
        public async Task expected_order_of_handler_invocation_in_unit_of_work()
        {
            var orderOfInvocation = new LinkedList <string>();

            var dummyMessageResult       = new MessageResultBuilder().WithTransportLevelMessage(new TransportLevelMessageBuilder().WithType("foo").Build()).Build();
            var dummyMessageRegistration = new MessageRegistrationBuilder().WithMessageType("foo").Build();

            var registry = new MessageHandlerRegistry();

            registry.Register(dummyMessageRegistration);

            var sut = new ConsumerBuilder()
                      .WithUnitOfWork(new UnitOfWorkSpy(
                                          handlerInstance: new MessageHandlerSpy <FooMessage>(() => orderOfInvocation.AddLast("during")),
                                          pre: () => orderOfInvocation.AddLast("before"),
                                          post: () => orderOfInvocation.AddLast("after")
                                          ))
                      .WithConsumerScopeFactory(new ConsumerScopeFactoryStub(new ConsumerScopeStub(dummyMessageResult)))
                      .WithMessageHandlerRegistry(registry)
                      .Build();

            await sut.ConsumeSingle(CancellationToken.None);

            Assert.Equal(new[] { "before", "during", "after" }, orderOfInvocation);
        }
Example #2
0
        public async Task Can_consume_message_2()
        {
            var dummyMessage = new DummyMessage();
            var messageStub  = new TransportLevelMessageBuilder()
                               .WithType(nameof(DummyMessage))
                               .WithData(dummyMessage)
                               .Build();
            var messageResult = new MessageResultBuilder()
                                .WithTransportLevelMessage(messageStub)
                                .Build();

            var services = new ServiceCollection();

            services.AddScoped <Scoped>();
            services.AddConsumer(options =>
            {
                options.WithBootstrapServers("dummyBootstrapServer");
                options.WithGroupId("dummyGroupId");
                options.RegisterMessageHandler <DummyMessage, DummyMessageHandler>("dummyTopic", nameof(DummyMessage));

                options.WithUnitOfWork <UnitOfWork>();

                options.WithTopicSubscriberScopeFactory(new TopicSubscriberScopeFactoryStub(new TopicSubscriberScopeStub(messageResult)));
            });
            var serviceProvider = services.BuildServiceProvider();

            var consumer = serviceProvider.GetRequiredService <Consumer>();

            await consumer.ConsumeSingle(CancellationToken.None);

            Assert.Equal(dummyMessage, DummyMessageHandler.LastHandledMessage);
            Assert.Equal(1, Scoped.Instanciated);
        }
Example #3
0
        public async Task disposes_consumer_scope_when_consuming_single_message()
        {
            var messageResultStub = new MessageResultBuilder().WithTransportLevelMessage(new TransportLevelMessageBuilder().WithType("foo").Build()).Build();
            var handlerStub       = Dummy.Of <IMessageHandler <FooMessage> >();

            var messageRegistrationStub = new MessageRegistrationBuilder()
                                          .WithHandlerInstanceType(handlerStub.GetType())
                                          .WithMessageInstanceType(typeof(FooMessage))
                                          .WithMessageType("foo")
                                          .Build();

            var spy = new ConsumerScopeSpy(messageResultStub);

            var registry = new MessageHandlerRegistry();

            registry.Register(messageRegistrationStub);

            var consumer = new ConsumerBuilder()
                           .WithConsumerScopeFactory(new ConsumerScopeFactoryStub(spy))
                           .WithUnitOfWork(new UnitOfWorkStub(handlerStub))
                           .WithMessageHandlerRegistry(registry)
                           .Build();

            await consumer.ConsumeSingle(CancellationToken.None);


            Assert.Equal(1, spy.Disposed);
        }
Example #4
0
        public async Task will_not_call_commit_when_auto_commit_is_enabled()
        {
            var handlerStub = Dummy.Of <IMessageHandler <FooMessage> >();

            var messageRegistrationStub = new MessageRegistrationBuilder()
                                          .WithHandlerInstanceType(handlerStub.GetType())
                                          .WithMessageInstanceType(typeof(FooMessage))
                                          .WithMessageType("foo")
                                          .Build();

            var wasCalled = false;

            var resultSpy = new MessageResultBuilder()
                            .WithOnCommit(() =>
            {
                wasCalled = true;
                return(Task.CompletedTask);
            })
                            .Build();

            var topicSubscriberScopeFactoryStub = new TopicSubscriberScopeFactoryStub(new TopicSubscriberScopeStub(resultSpy));
            var consumer = new ConsumerBuilder()
                           .WithTopicSubscriberScopeFactory(topicSubscriberScopeFactoryStub)
                           .WithUnitOfWorkFactory(x => new UnitOfWorkStub(handlerStub))
                           .WithMessageRegistrations(messageRegistrationStub)
                           .WithEnableAutoCommit(true)
                           .Build();

            await consumer.ConsumeSingle(CancellationToken.None);

            Assert.False(wasCalled);
        }
Example #5
0
        public async Task Has_expected_number_of_creations_and_disposals_when_singleton()
        {
            var dummyMessage = new DummyMessage();
            var messageStub  = new TransportLevelMessageBuilder()
                               .WithType(nameof(DummyMessage))
                               .WithData(dummyMessage)
                               .Build();
            var messageResult = new MessageResultBuilder()
                                .WithTransportLevelMessage(messageStub)
                                .Build();

            var services = new ServiceCollection();

            services.AddTransient <Repository>();
            services.AddSingleton <IHostApplicationLifetime, DummyApplicationLifetime>();
            services.AddTransient <DummyMessageHandler>();
            services.AddLogging();

            var createCount  = 0;
            var disposeCount = 0;

            services.AddSingleton <ScopeSpy>(provider => new ScopeSpy(onCreate: () => createCount++, onDispose: () => disposeCount++));

            var serviceProvider = services.BuildServiceProvider();

            var consumerConfiguration = new ConsumerConfigurationBuilder()
                                        .WithGroupId("dummy")
                                        .WithBootstrapServers("dummy")
                                        .RegisterMessageHandler <DummyMessage, DummyMessageHandler>("dummyTopic", nameof(DummyMessage))
                                        .WithConsumerScopeFactory(_ => new ConsumerScopeFactoryStub(new ConsumerScopeStub(messageResult)))
                                        .WithUnitOfWorkFactory(new ServiceProviderUnitOfWorkFactory(serviceProvider))
                                        .Build();

            var consumer = new ConsumerBuilder()
                           .WithMessageHandlerRegistry(consumerConfiguration.MessageHandlerRegistry)
                           .WithUnitOfWorkFactory(consumerConfiguration.UnitOfWorkFactory)
                           .WithConsumerScopeFactory(consumerConfiguration.ConsumerScopeFactory)
                           .WithEnableAutoCommit(consumerConfiguration.EnableAutoCommit)
                           .Build();

            await consumer.ConsumeSingle(CancellationToken.None);

            await consumer.ConsumeSingle(CancellationToken.None);

            Assert.Equal(1, createCount);
            Assert.Equal(0, disposeCount);
        }
Example #6
0
        public async Task creates_consumer_scope_when_consuming_multiple_messages()
        {
            var messageResultStub = new MessageResultBuilder().WithTransportLevelMessage(new TransportLevelMessageBuilder().WithType("foo").Build()).Build();
            var handlerStub       = Dummy.Of <IMessageHandler <FooMessage> >();

            var messageRegistrationStub = new MessageRegistrationBuilder()
                                          .WithHandlerInstanceType(handlerStub.GetType())
                                          .WithMessageInstanceType(typeof(FooMessage))
                                          .WithMessageType("foo")
                                          .Build();

            using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
            {
                var loops = 0;

                var subscriberScopeStub = new ConsumerScopeDecoratorWithHooks(
                    inner: new ConsumerScopeStub(messageResultStub),
                    postHook: () =>
                {
                    loops++;

                    if (loops == 2)
                    {
                        cancellationTokenSource.Cancel();
                    }
                }
                    );

                var spy = new ConsumerScopeFactorySpy(subscriberScopeStub);

                var registry = new MessageHandlerRegistry();
                registry.Register(messageRegistrationStub);

                var consumer = new ConsumerBuilder()
                               .WithConsumerScopeFactory(spy)
                               .WithUnitOfWork(new UnitOfWorkStub(handlerStub))
                               .WithMessageHandlerRegistry(registry)
                               .Build();

                await consumer.ConsumeAll(cancellationTokenSource.Token);

                Assert.Equal(2, loops);
                Assert.Equal(1, spy.CreateConsumerScopeCalled);
            }
        }
Example #7
0
        public async Task Has_expected_number_of_creations_and_disposals_when_singleton()
        {
            var dummyMessage = new DummyMessage();
            var messageStub  = new TransportLevelMessageBuilder()
                               .WithType(nameof(DummyMessage))
                               .WithData(dummyMessage)
                               .Build();
            var messageResult = new MessageResultBuilder()
                                .WithTransportLevelMessage(messageStub)
                                .Build();

            var services = new ServiceCollection();

            services.AddTransient <Repository>();
            services.AddSingleton <IApplicationLifetime, DummyApplicationLifetime>();
            services.AddTransient <DummyMessageHandler>();
            services.AddLogging();
            services.AddConsumer(options =>
            {
                options.WithBootstrapServers("dummyBootstrapServer");
                options.WithGroupId("dummyGroupId");
                options.RegisterMessageHandler <DummyMessage, DummyMessageHandler>("dummyTopic", nameof(DummyMessage));

                options.WithTopicSubscriberScopeFactory(new TopicSubscriberScopeFactoryStub(new TopicSubscriberScopeStub(messageResult)));
            });

            services.AddSingleton <ScopeSpy>();

            var serviceProvider = services.BuildServiceProvider();
            var consumer        = serviceProvider.GetRequiredService <Consumer>();

            ScopeSpy.Reset();

            await consumer.ConsumeSingle(CancellationToken.None);

            await consumer.ConsumeSingle(CancellationToken.None);

            Assert.Equal(1, ScopeSpy.Created);
            Assert.Equal(0, ScopeSpy.Disposed);
        }
        public async Task Can_consume_message()
        {
            var dummyMessage = new DummyMessage();
            var messageStub  = new TransportLevelMessageBuilder()
                               .WithType(nameof(DummyMessage))
                               .WithData(dummyMessage)
                               .Build();
            var messageResult = new MessageResultBuilder()
                                .WithTransportLevelMessage(messageStub)
                                .Build();

            var services = new ServiceCollection();

            services.AddLogging();
            services.AddSingleton <IHostApplicationLifetime, DummyApplicationLifetime>();
            services.AddConsumer(options =>
            {
                options.WithBootstrapServers("dummyBootstrapServer");
                options.WithGroupId("dummyGroupId");
                options.RegisterMessageHandler <DummyMessage, DummyMessageHandler>("dummyTopic", nameof(DummyMessage));

                options.WithConsumerScopeFactory(_ => new ConsumerScopeFactoryStub(new ConsumerScopeStub(messageResult)));
            });
            var serviceProvider = services.BuildServiceProvider();

            var consumerHostedService = serviceProvider.GetServices <IHostedService>()
                                        .OfType <ConsumerHostedService>()
                                        .First();

            using (var cts = new CancellationTokenSource(50))
            {
                await consumerHostedService.ConsumeAll(cts.Token);
            }

            Assert.Equal(dummyMessage, DummyMessageHandler.LastHandledMessage);
        }