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); }
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); }
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); }
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); }