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);
        }
示例#2
0
        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();
        }
示例#3
0
        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>());
        }
示例#4
0
        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();
        }
示例#8
0
        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);
        }