private async Task AssertMessagePublishedAndReceivedAsync <T>(
            IServiceCollection services,
            IHandlerAsync <T> handler,
            TaskCompletionSource <object> completionSource)
            where T : Message, new()
        {
            IServiceProvider serviceProvider = services.BuildServiceProvider();

            IMessagePublisher publisher = serviceProvider.GetRequiredService <IMessagePublisher>();
            IMessagingBus     listener  = serviceProvider.GetRequiredService <IMessagingBus>();

            using var source = new CancellationTokenSource(Timeout);
            await listener.StartAsync(source.Token);

            await publisher.StartAsync(source.Token);


            var message = new T();

            // Act
            await publisher.PublishAsync(message, source.Token);

            // Assert
            try
            {
                completionSource.Task.Wait(source.Token);
            }
            catch (OperationCanceledException)
            {
                // Ignore
            }

            await handler.Received(1).Handle(Arg.Is <T>((p) => p.UniqueKey() == message.UniqueKey()));
        }
예제 #2
0
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Kitchen subscriber running");

            _ = _bus.StartAsync(stoppingToken);

            return(Task.CompletedTask);
        }
예제 #3
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Ordering API subscriber running");

            await _publisher.StartAsync(stoppingToken);

            await _bus.StartAsync(stoppingToken);
        }
예제 #4
0
        public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue()
        {
            // Arrange
            var completionSource = new TaskCompletionSource <object>();
            var handler          = Substitute.For <IHandlerAsync <SimpleMessage> >();

            handler.Handle(Arg.Any <SimpleMessage>())
            .Returns(true)
            .AndDoes((_) => completionSource.SetResult(null));

            using var container = new Container(
                      (registry) =>
            {
                registry.For <ILoggerFactory>()
                .Use(() => OutputHelper.ToLoggerFactory())
                .Singleton();

                registry.For <IHandlerAsync <SimpleMessage> >()
                .Use(handler);

                registry.AddJustSaying(
                    (builder) =>
                {
                    builder.Client((options) =>
                                   options.WithBasicCredentials("accessKey", "secretKey")
                                   .WithServiceUri(TestEnvironment.SimulatorUrl))
                    .Messaging((options) => options.WithRegions("eu-west-1"))
                    .Publications((options) => options.WithQueue <SimpleMessage>())
                    .Subscriptions((options) => options.ForQueue <SimpleMessage>());
                });
            });

            IMessagePublisher publisher = container.GetInstance <IMessagePublisher>();
            IMessagingBus     listener  = container.GetInstance <IMessagingBus>();

            var message = new SimpleMessage();

            using var source = new CancellationTokenSource(TimeSpan.FromSeconds(20));
            await listener.StartAsync(source.Token);

            await publisher.StartAsync(source.Token);

            // Act
            await publisher.PublishAsync(message, source.Token);

            completionSource.Task.Wait(source.Token);

            // Assert
            await handler.Received().Handle(Arg.Any <SimpleMessage>());
        }
예제 #5
0
    public async Task Can_Create_Messaging_Bus_Fluently_For_A_Queue()
    {
        // Arrange
        var handler = new InspectableHandler <SimpleMessage>();

        using var container = new Container(
                  (registry) =>
        {
            registry.For <ILoggerFactory>()
            .Use(() => OutputHelper.ToLoggerFactory())
            .Singleton();

            registry.For <IHandlerAsync <SimpleMessage> >()
            .Use(handler);

            registry.AddJustSaying(
                (builder) =>
            {
                builder.Client((options) =>
                               options.WithBasicCredentials("accessKey", "secretKey")
                               .WithServiceUri(TestEnvironment.SimulatorUrl))
                .Messaging((options) => options.WithRegion("eu-west-1"))
                .Publications((options) => options.WithQueue <SimpleMessage>())
                .Subscriptions((options) => options.ForQueue <SimpleMessage>());
            });
        });

        IMessagePublisher publisher = container.GetInstance <IMessagePublisher>();
        IMessagingBus     listener  = container.GetInstance <IMessagingBus>();

        var message = new SimpleMessage();

        using var source = new CancellationTokenSource(TimeSpan.FromSeconds(20));
        await listener.StartAsync(source.Token);

        await publisher.StartAsync(source.Token);

        // Act
        await publisher.PublishAsync(message, source.Token);

        await Patiently.AssertThatAsync(OutputHelper,
                                        () => handler.ReceivedMessages.Any());

        // Assert
        handler.ReceivedMessages.ShouldContain(x => x.GetType() == typeof(SimpleMessage));
    }
예제 #6
0
        public async Task Can_Create_Messaging_Bus_Fluently_For_A_Topic()
        {
            var topicName = Guid.NewGuid().ToString();

            // Arrange
            var services = new ServiceCollection()
                           .AddLogging((p) => p.AddXUnit(OutputHelper))
                           .AddJustSaying(
                (builder) =>
            {
                builder
                .Client((options) =>
                        options.WithBasicCredentials("accessKey", "secretKey")
                        .WithServiceUri(TestEnvironment.SimulatorUrl))
                .Messaging((options) => options.WithRegion("eu-west-1"))
                .Publications((options) => options.WithTopic <TopicMessage>())
                .Subscriptions((options) => options.ForTopic <TopicMessage>(cfg => cfg.WithName(topicName)));
            })
                           .AddSingleton <IMessageStore <TopicMessage>, TestMessageStore <TopicMessage> >()
                           .AddJustSayingHandler <TopicMessage, MessageStoringHandler <TopicMessage> >();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            IMessagePublisher publisher = serviceProvider.GetRequiredService <IMessagePublisher>();
            IMessagingBus     listener  = serviceProvider.GetRequiredService <IMessagingBus>();

            using (var source = new CancellationTokenSource(TimeSpan.FromSeconds(20)))
            {
                // Act
                await listener.StartAsync(source.Token);

                await publisher.StartAsync(source.Token);

                var message = new TopicMessage();

                await publisher.PublishAsync(message, source.Token);

                var store = serviceProvider.GetService <IMessageStore <TopicMessage> >();

                await Patiently.AssertThatAsync(OutputHelper,
                                                () => store.Messages.Any(msg => msg.Id == message.Id));
            }
        }
        public void Can_Create_Messaging_Bus()
        {
            // Arrange
            var services = new ServiceCollection()
                           .AddLogging((p) => p.AddXUnit(OutputHelper))
                           .AddJustSaying("eu-west-1")
                           .AddJustSayingHandler <QueueMessage, QueueHandler>();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            IMessagePublisher publisher = serviceProvider.GetRequiredService <IMessagePublisher>();
            IMessagingBus     listener  = serviceProvider.GetRequiredService <IMessagingBus>();

            using (var source = new CancellationTokenSource(TimeSpan.FromSeconds(20)))
            {
                // Act
                listener.StartAsync(source.Token);
            }
        }
        public async Task Can_Create_Messaging_Bus_Fluently_For_A_Topic()
        {
            // Arrange
            var services = new ServiceCollection()
                           .AddLogging((p) => p.AddXUnit(OutputHelper))
                           .AddJustSaying(
                (builder) =>
            {
                builder
                .Client((options) =>
                        options.WithBasicCredentials("accessKey", "secretKey")
                        .WithServiceUri(TestEnvironment.SimulatorUrl))
                .Messaging((options) => options.WithRegions("eu-west-1"))
                .Publications((options) => options.WithTopic <TopicMessage>())
                .Subscriptions((options) => options.ForTopic <TopicMessage>());
            })
                           .AddJustSayingHandler <TopicMessage, TopicHandler>();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            IMessagePublisher publisher = serviceProvider.GetRequiredService <IMessagePublisher>();
            IMessagingBus     listener  = serviceProvider.GetRequiredService <IMessagingBus>();

            using (var source = new CancellationTokenSource(TimeSpan.FromSeconds(20)))
            {
                // Act
                await listener.StartAsync(source.Token);

                await publisher.StartAsync(source.Token);

                var message = new TopicMessage();

                await publisher.PublishAsync(message, source.Token);

                // Assert
                while (!source.IsCancellationRequested && !TopicHandler.MessageIds.Contains(message.Id))
                {
                    await Task.Delay(TimeSpan.FromSeconds(0.2), source.Token);
                }

                TopicHandler.MessageIds.ShouldContain(message.Id);
            }
        }
예제 #9
0
        public async Task Can_Create_Messaging_Bus_With_Contributors()
        {
            // Arrange
            var services = new ServiceCollection()
                           .AddLogging((p) => p.AddXUnit(OutputHelper))
                           .AddJustSaying()
                           .AddSingleton <IMessageBusConfigurationContributor, AwsContributor>()
                           .AddSingleton <IMessageBusConfigurationContributor, MessagingContributor>()
                           .AddSingleton <IMessageBusConfigurationContributor, QueueContributor>()
                           .AddSingleton <IMessageBusConfigurationContributor, RegionContributor>()
                           .AddJustSayingHandler <QueueMessage, MessageStoringHandler <QueueMessage> >()
                           .AddSingleton <IMessageStore <QueueMessage>, TestMessageStore <QueueMessage> >()
                           .AddSingleton <MyMonitor>();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            IMessagePublisher publisher = serviceProvider.GetRequiredService <IMessagePublisher>();
            IMessagingBus     listener  = serviceProvider.GetRequiredService <IMessagingBus>();

            using (var source = new CancellationTokenSource(TimeSpan.FromSeconds(20)))
            {
                // Act
                await listener.StartAsync(source.Token);

                await publisher.StartAsync(source.Token);

                var message = new QueueMessage();

                await publisher.PublishAsync(message, source.Token);

                // Assert
                var messageStore = serviceProvider.GetService <IMessageStore <QueueMessage> >();

                await Patiently.AssertThatAsync(OutputHelper,
                                                () =>
                {
                    messageStore.Messages.ShouldContain(msg =>
                                                        msg.Id.Equals(message.Id));
                });
            }
        }
        public async Task Can_Create_Messaging_Bus_With_Contributors()
        {
            // Arrange
            var services = new ServiceCollection()
                           .AddLogging((p) => p.AddXUnit(OutputHelper))
                           .AddJustSaying()
                           .AddSingleton <IMessageBusConfigurationContributor, AwsContributor>()
                           .AddSingleton <IMessageBusConfigurationContributor, MessagingContributor>()
                           .AddSingleton <IMessageBusConfigurationContributor, QueueContributor>()
                           .AddSingleton <IMessageBusConfigurationContributor, RegionContributor>()
                           .AddJustSayingHandler <QueueMessage, QueueHandler>()
                           .AddSingleton <MyMonitor>();

            IServiceProvider serviceProvider = services.BuildServiceProvider();

            IMessagePublisher publisher = serviceProvider.GetRequiredService <IMessagePublisher>();
            IMessagingBus     listener  = serviceProvider.GetRequiredService <IMessagingBus>();

            using (var source = new CancellationTokenSource(TimeSpan.FromSeconds(20)))
            {
                // Act
                await listener.StartAsync(source.Token);

                await publisher.StartAsync(source.Token);

                var message = new QueueMessage();

                await publisher.PublishAsync(message, source.Token);

                // Assert
                while (!source.IsCancellationRequested && !QueueHandler.MessageIds.Contains(message.Id))
                {
                    await Task.Delay(TimeSpan.FromSeconds(0.2), source.Token);
                }

                QueueHandler.MessageIds.ShouldContain(message.Id);
            }
        }