public async Task SimulatedListenLoop_ProcessedAllMessages_Sequentially( int numberOfMessagesToProcess, int concurrency) { var options = new ThrottledOptions() { MaxConcurrency = concurrency, Logger = Substitute.For <ILogger>(), MessageMonitor = Substitute.For <IMessageMonitor>(), StartTimeout = StartTimeout, ProcessMessagesSequentially = true, }; var messageProcessingStrategy = new Throttled(options); var counter = new ThreadSafeCounter(); var watch = Stopwatch.StartNew(); var actions = BuildFakeIncomingMessages(numberOfMessagesToProcess, counter); await ListenLoopExecuted(actions, messageProcessingStrategy); watch.Stop(); await Task.Delay(2000); counter.Count.ShouldBe(numberOfMessagesToProcess); }
public async Task SimulatedListenLoop_WhenThrottlingDoesNotOccur_DoNotCallMessageMonitor(int messageCount, int capacity) { messageCount.ShouldBeLessThanOrEqualTo(capacity, "To avoid throttling, message count must be not be over capacity"); var fakeMonitor = Substitute.For <IMessageMonitor>(); var messageProcessingStrategy = new Throttled(capacity, fakeMonitor); var counter = new ThreadSafeCounter(); var actions = BuildFakeIncomingMessages(messageCount, counter); await ListenLoopExecuted(actions, messageProcessingStrategy); fakeMonitor.DidNotReceive().IncrementThrottlingStatistic(); }
public async Task SimulatedListenLoop_WhenThrottlingOccurs_CallsMessageMonitor(int messageCount, int capacity) { messageCount.ShouldBeGreaterThan(capacity, "To cause throttling, message count must be over capacity"); var fakeMonitor = Substitute.For <IMessageMonitor>(); var messageProcessingStrategy = new Throttled(capacity, fakeMonitor); var counter = new ThreadSafeCounter(); var actions = BuildFakeIncomingMessages(messageCount, counter); await ListenLoopExecuted(actions, messageProcessingStrategy); fakeMonitor.Received().IncrementThrottlingStatistic(); fakeMonitor.Received().HandleThrottlingTime(Arg.Any <long>()); }
public async Task SimulatedListenLoop_ProcessedAllMessages(int numberOfMessagesToProcess) { var fakeMonitor = Substitute.For <IMessageMonitor>(); var messageProcessingStrategy = new Throttled(ConcurrencyLevel, fakeMonitor); var counter = new ThreadSafeCounter(); var watch = new Stopwatch(); watch.Start(); var actions = BuildFakeIncomingMessages(numberOfMessagesToProcess, counter); await ListenLoopExecuted(actions, messageProcessingStrategy); watch.Stop(); await Task.Delay(2000); counter.Count.ShouldBe(numberOfMessagesToProcess); }
public async Task SimulatedListenLoop_WhenThrottlingOccurs_CallsMessageMonitor(int messageCount, int concurrency) { messageCount.ShouldBeGreaterThan(concurrency, "To cause throttling, message count must be greater than concurrency."); var fakeMonitor = Substitute.For <IMessageMonitor>(); var options = new ThrottledOptions() { MaxConcurrency = concurrency, Logger = Substitute.For <ILogger>(), MessageMonitor = fakeMonitor, StartTimeout = TimeSpan.FromTicks(1), }; var messageProcessingStrategy = new Throttled(options); var counter = new ThreadSafeCounter(); var tcs = new TaskCompletionSource <bool>(); for (int i = 0; i < concurrency; i++) { (await messageProcessingStrategy.StartWorkerAsync( async() => await tcs.Task, CancellationToken.None)).ShouldBeTrue(); } messageProcessingStrategy.AvailableWorkers.ShouldBe(0); for (int i = 0; i < messageCount - concurrency; i++) { (await messageProcessingStrategy.StartWorkerAsync(() => Task.CompletedTask, CancellationToken.None)).ShouldBeFalse(); } messageProcessingStrategy.AvailableWorkers.ShouldBe(0); tcs.SetResult(true); (await messageProcessingStrategy.WaitForAvailableWorkerAsync()).ShouldBeGreaterThan(0); fakeMonitor.Received().IncrementThrottlingStatistic(); fakeMonitor.Received().HandleThrottlingTime(Arg.Any <TimeSpan>()); }
public async Task SimulatedListenLoop_WhenThrottlingDoesNotOccur_CallsMessageMonitor_Once(int messageCount, int concurrency) { var fakeMonitor = Substitute.For <IMessageMonitor>(); var options = new ThrottledOptions() { MaxConcurrency = concurrency, Logger = Substitute.For <ILogger>(), MessageMonitor = fakeMonitor, StartTimeout = Timeout.InfiniteTimeSpan, }; var messageProcessingStrategy = new Throttled(options); var counter = new ThreadSafeCounter(); var actions = BuildFakeIncomingMessages(messageCount, counter); await ListenLoopExecuted(actions, messageProcessingStrategy); fakeMonitor.Received(1).IncrementThrottlingStatistic(); }
public async Task SimulatedListenLoop_WhenThrottlingDoesNotOccur_DoNotCallMessageMonitor(int messageCount, int concurrency) { messageCount.ShouldBeLessThanOrEqualTo(concurrency, "To avoid throttling, message count must be not be greater than capacity."); var fakeMonitor = Substitute.For <IMessageMonitor>(); var options = new ThrottledOptions() { MaxConcurrency = concurrency, Logger = Substitute.For <ILogger>(), MessageMonitor = fakeMonitor, StartTimeout = Timeout.InfiniteTimeSpan, }; var messageProcessingStrategy = new Throttled(options); var counter = new ThreadSafeCounter(); var actions = BuildFakeIncomingMessages(messageCount, counter); await ListenLoopExecuted(actions, messageProcessingStrategy); fakeMonitor.DidNotReceive().IncrementThrottlingStatistic(); }
private Queue <Func <Task> > BuildFakeIncomingMessages(int numberOfMessagesToCreate, ThreadSafeCounter counter) { var random = new Random(); var actions = new Queue <Func <Task> >(); for (var i = 0; i != numberOfMessagesToCreate; i++) { var duration = MinTaskDuration + random.Next(TaskDurationVariance); var action = new Func <Task>(async() => { await Task.Delay(duration); counter.Increment(); }); actions.Enqueue(action); } return(actions); }