public async Task InitializeAsync() { GivenInternal(); SystemUnderTest = CreateSystemUnderTest(); await WhenInternalAsync().ConfigureAwait(false); }
public async Task Subscriber_Not_Started_No_Buffer_Filled_Then_No_More_Messages_Requested() { // Arrange int messagesFromQueue = 0; int messagesDispatched = 0; int receivebufferSize = 2; int multiplexerCapacity = 2; // plus one "in flight" between buffer and multiplexer int expectedReceiveFromQueueCount = receivebufferSize + multiplexerCapacity + 1; var sqsQueue = TestQueue(() => Interlocked.Increment(ref messagesFromQueue)); IMessageReceiveBuffer buffer = CreateMessageReceiveBuffer(sqsQueue, receivebufferSize); IMessageDispatcher dispatcher = new FakeDispatcher(() => Interlocked.Increment(ref messagesDispatched)); IMultiplexerSubscriber consumer1 = CreateSubscriber(dispatcher); IMultiplexer multiplexer = CreateMultiplexer(multiplexerCapacity); multiplexer.ReadFrom(buffer.Reader); consumer1.Subscribe(multiplexer.GetMessagesAsync()); // need to start the multiplexer before calling Messages using var cts = new CancellationTokenSource(); // Act and Assert var multiplexerCompletion = multiplexer.RunAsync(cts.Token); var bufferCompletion = buffer.RunAsync(cts.Token); cts.CancelAfter(TimeSpan.FromSeconds(3)); await multiplexerCompletion.HandleCancellation(); await Assert.ThrowsAnyAsync <OperationCanceledException>(() => bufferCompletion); await Patiently.AssertThatAsync(OutputHelper, () => { messagesFromQueue.ShouldBe(expectedReceiveFromQueueCount); messagesDispatched.ShouldBe(0); return(true); }); // Starting the consumer after the token is cancelled will not dispatch messages await Assert.ThrowsAnyAsync <OperationCanceledException>(() => consumer1.RunAsync(cts.Token)); await Patiently.AssertThatAsync(OutputHelper, () => { messagesFromQueue.ShouldBe(expectedReceiveFromQueueCount); messagesDispatched.ShouldBe(0); return(true); }); }
public async Task WhenSubscriberNotStarted_BufferShouldFillUp_AndStopDownloading(int receivePrefetch, int receiveBufferSize, int multiplexerCapacity, int expectedDownloadCount) { var sqsQueue = TestQueue(); IMessageReceiveBuffer buffer = CreateMessageReceiveBuffer(sqsQueue, receivePrefetch, receiveBufferSize); FakeDispatcher dispatcher = new FakeDispatcher(); IMultiplexerSubscriber consumer1 = CreateSubscriber(dispatcher); IMultiplexer multiplexer = CreateMultiplexer(multiplexerCapacity); multiplexer.ReadFrom(buffer.Reader); consumer1.Subscribe(multiplexer.GetMessagesAsync()); OutputHelper.WriteLine("Multiplexer" + JsonConvert.SerializeObject(multiplexer.Interrogate())); OutputHelper.WriteLine("MessageReceiveBuffer" + JsonConvert.SerializeObject(buffer.Interrogate())); using var cts = new CancellationTokenSource(); // Act and Assert var multiplexerCompletion = multiplexer.RunAsync(cts.Token); var bufferCompletion = buffer.RunAsync(cts.Token); cts.CancelAfter(3.Seconds()); await multiplexerCompletion.HandleCancellation(); await bufferCompletion.HandleCancellation(); sqsQueue.ReceiveMessageRequests.Sum(x => x.NumMessagesReceived).ShouldBe(expectedDownloadCount); dispatcher.DispatchedMessages.Count.ShouldBe(0); // Starting the consumer after the token is cancelled will not dispatch messages await Assert.ThrowsAnyAsync <OperationCanceledException>(() => consumer1.RunAsync(cts.Token)); await Patiently.AssertThatAsync(OutputHelper, () => { sqsQueue.ReceiveMessageRequests.Sum(x => x.NumMessagesReceived).ShouldBe(expectedDownloadCount); dispatcher.DispatchedMessages.Count.ShouldBe(0); }); }