public async Task ReceivesAndSendsMessagesHighPerformance()
        {
            var inputSubscription = nameof(ReceivesAndSendsMessagesHighPerformance);

            await CreateEndToEndTestSubscriptionsAsync(inputSubscription);

            var services = new ServiceCollection();

            services.AddHostedService <MessageBusHostedService>()
            .AddSingleton <IMessageTracker, MessageTracker>()
            .AddMessageBus(new AzureServiceBusAdminClient(Configuration["Hostname"],
                                                          Configuration["Topic"], inputSubscription, Configuration["TenantId"]),
                           CreateHighPerformanceClient(inputSubscription))
            .SubscribeToMessage <CreateNewFlightPlan, CreateNewFlightPlanHandler>()
            .SubscribeToMessage <AircraftTakenOff, AircraftTakenOffHandler>()
            .SubscribeToMessage <AircraftLeftRunway, AircraftLeftRunwayHandlerDeadLetter>();
            _serviceProvider = services.BuildServiceProvider();
            await StartMessageBusHostedServiceAsync(_serviceProvider);

            var count = 25;
            var createNewFlightPlanCommand = new CreateNewFlightPlan {
                Destination = Guid.NewGuid().ToString()
            };
            var aircraftTakenOffEvent1   = BuildAircraftTakenOffEvent();
            var aircraftTakenOffEvent2   = BuildAircraftTakenOffEvent();
            var aircraftLeftRunwayEvent1 = new AircraftLeftRunway {
                RunwayId = Guid.NewGuid().ToString()
            };
            var aircraftLeftRunwayEvent2 = new AircraftLeftRunway {
                RunwayId = Guid.NewGuid().ToString()
            };
            var tasks = new List <Task>
            {
                SendMessagesAsync(createNewFlightPlanCommand, nameof(CreateNewFlightPlan), count),
                SendMessagesAsync(aircraftTakenOffEvent1, nameof(AircraftTakenOff), count),
                SendMessagesAsync(aircraftTakenOffEvent2, nameof(AircraftTakenOff), count),
                SendMessagesAsync(aircraftLeftRunwayEvent1, nameof(AircraftLeftRunway), count),
                SendMessagesAsync(aircraftLeftRunwayEvent2, nameof(AircraftLeftRunway), count)
            };
            await Task.WhenAll(tasks);

            await Task.Delay(TimeSpan.FromSeconds(4));

            Assert.DoesNotContain(await ReceiveMessagesForSubscriptionAsync(inputSubscription),
                                  m => m.Body.ToObjectFromJson <AircraftTakenOff>().AircraftId == aircraftTakenOffEvent1.AircraftId);
            var messages = await ReceiveMessagesForSubscriptionAsync($"{inputSubscription}-Output");

            var deadLetterMessages = await ReceiveMessagesForSubscriptionAsync($"{inputSubscription}", deadLetter : true);

            Assert.Equal(count, messages.Count(m => m.Subject == nameof(StartEngines) &&
                                               m.Body.ToObjectFromJson <StartEngines>().EngineId == createNewFlightPlanCommand.Destination));
            Assert.Equal(count, messages.Count(m => m.Subject == nameof(AircraftLeftAirspace) &&
                                               m.Body.ToObjectFromJson <AircraftLeftAirspace>().AircraftIdentifier == aircraftTakenOffEvent1.AircraftId));
            Assert.Equal(count, messages.Count(m => m.Subject == nameof(AircraftLeftAirspace) &&
                                               m.Body.ToObjectFromJson <AircraftLeftAirspace>().AircraftIdentifier == aircraftTakenOffEvent2.AircraftId));
            Assert.Equal(count, deadLetterMessages.Count(m => m.Subject == nameof(AircraftLeftRunway) &&
                                                         m.DeadLetterReason == aircraftLeftRunwayEvent1.RunwayId));
            Assert.Equal(count, deadLetterMessages.Count(m => m.Subject == nameof(AircraftLeftRunway) &&
                                                         m.DeadLetterReason == aircraftLeftRunwayEvent2.RunwayId));
        }
        public async Task ReceivesAndDeadLettersCommand()
        {
            var createNewFlightPlan = new CreateNewFlightPlan {
                Destination = Guid.NewGuid().ToString()
            };
            var subscription = nameof(ReceivesAndDeadLettersCommand);

            await CreateEndToEndTestSubscriptionsAsync(subscription);

            var services = new ServiceCollection();

            services.AddHostedService <MessageBusHostedService>()
            .AddSingleton <IMessageTracker, MessageTracker>()
            .AddMessageBus(new AzureServiceBusClientBuilder(Configuration["Hostname"],
                                                            Configuration["Topic"], subscription, Configuration["TenantId"]))
            .SubscribeToMessage <CreateNewFlightPlan, CreateNewFlightPlanHandlerDeadLetter>();
            _serviceProvider = services.BuildServiceProvider();
            await StartMessageBusHostedServiceAsync(_serviceProvider);

            await SendMessagesAsync(createNewFlightPlan, nameof(CreateNewFlightPlan));

            await Task.Delay(TimeSpan.FromSeconds(4));

            Assert.DoesNotContain(await ReceiveMessagesForSubscriptionAsync(subscription),
                                  m => m.Body.ToObjectFromJson <CreateNewFlightPlan>().Destination == createNewFlightPlan.Destination);
            Assert.Single(await ReceiveMessagesForSubscriptionAsync($"{subscription}", deadLetter: true),
                          m => m.Subject == nameof(CreateNewFlightPlan) &&
                          m.DeadLetterReason == createNewFlightPlan.Destination);
        }
        public async Task SendsCommandsWithCustomCorrelationId()
        {
            var subscription = nameof(SendsCommandBody);

            await CreateSubscriptionAsync(subscription);

            var createNewFlightPlanCommand = new CreateNewFlightPlan {
                Destination = Guid.NewGuid().ToString()
            };
            var correlationId = Guid.NewGuid().ToString();
            var message       = new Message <ICommand>(createNewFlightPlanCommand)
            {
                CorrelationId = correlationId
            };

            _azureServiceBusClient = BuildAzureServiceBusClient(AuthenticationType.ManagedIdentity, subscription);
            await _azureServiceBusClient.SendAsync(message);

            var matchingMessages = (await ReceiveMessagesForSubscriptionAsync(subscription))
                                   .Where(m => m.Body.ToObjectFromJson <CreateNewFlightPlan>().Destination ==
                                          createNewFlightPlanCommand.Destination &&
                                          m.CorrelationId == correlationId);

            Assert.Single(matchingMessages);
            Assert.Equal(nameof(CreateNewFlightPlan), matchingMessages.First().Subject);
        }
        public async Task SendsCommandBody(string aircraftType, AuthenticationType authenticationType)
        {
            var subscription = nameof(SendsCommandBody);

            await CreateSubscriptionAsync(subscription);

            var createNewFlightPlanCommand = new CreateNewFlightPlan {
                Destination = Guid.NewGuid().ToString()
            };
            var message = new Message <ICommand>(createNewFlightPlanCommand)
            {
                MessageProperties = new Dictionary <string, string>
                {
                    { "AircraftType", aircraftType },
                    { "AircraftSize", "Heavy" }
                }
            };

            _azureServiceBusClient = BuildAzureServiceBusClient(authenticationType, subscription);
            await _azureServiceBusClient.SendAsync(message);

            var matchingMessages = (await ReceiveMessagesForSubscriptionAsync(subscription))
                                   .Where(m => m.Body.ToObjectFromJson <CreateNewFlightPlan>().Destination ==
                                          createNewFlightPlanCommand.Destination);

            Assert.Single(matchingMessages);
            Assert.Equal(aircraftType, matchingMessages.First().ApplicationProperties["AircraftType"]);
            Assert.Equal("Heavy", matchingMessages.First().ApplicationProperties["AircraftSize"]);
            Assert.Equal(nameof(CreateNewFlightPlan), matchingMessages.First().Subject);
        }
Exemple #5
0
        public async Task SendAsyncCallsMessageBusClient()
        {
            var aircraftId = Guid.NewGuid().ToString();
            var createNewFlightPlanCommand = new CreateNewFlightPlan {
                Destination = Guid.NewGuid().ToString()
            };
            var command = new Message <ICommand>(createNewFlightPlanCommand);

            await _sut.SendAsync(command);

            _mockMessageBusClient.Verify(m => m.SendAsync(command), Times.Once);
        }
Exemple #6
0
        public async Task SendsCommandWithSameCorrelationIdAsReceivedMessage(string expectedCorrelationId)
        {
            var createNewFlightPlanCommand = new CreateNewFlightPlan()
            {
                Destination = Guid.NewGuid().ToString()
            };
            var message = new Message <ICommand>(createNewFlightPlanCommand);
            Message <ICommand> callbackEvent = null;

            _mockMessageBus.Setup(m => m.SendAsync(It.Is <Message <ICommand> >(e
                                                                               => (e.Body as CreateNewFlightPlan).Destination == createNewFlightPlanCommand.Destination)))
            .Callback <Message <ICommand> >(e => callbackEvent = e);

            _sut.CorrelationId = expectedCorrelationId;
            await _sut.SendAsync(message);

            Assert.Equal(expectedCorrelationId, callbackEvent.CorrelationId);
        }
Exemple #7
0
        public async Task SendsCommandWithScheduledEnqueueTime(int delayInSeconds)
        {
            var createNewFlightPlanCommand = new CreateNewFlightPlan()
            {
                Destination = Guid.NewGuid().ToString()
            };
            var expectedEnqueueTime = DateTimeOffset.Now.AddSeconds(delayInSeconds);
            var message             = new Message <ICommand>(createNewFlightPlanCommand)
            {
                ScheduledEnqueueTime = expectedEnqueueTime
            };
            Message <ICommand> callbackEvent = null;

            _mockMessageBus.Setup(m => m.SendAsync(It.Is <Message <ICommand> >(e
                                                                               => (e.Body as CreateNewFlightPlan).Destination == createNewFlightPlanCommand.Destination)))
            .Callback <Message <ICommand> >(e => callbackEvent = e);

            await _sut.SendAsync(message);

            Assert.Equal(expectedEnqueueTime, callbackEvent.ScheduledEnqueueTime);
        }