public void Respects_cancellation_token()
        {
            // setup
            var handler = new ConcurrencyLimitingMessageHandler(0, new TestHandler(0));
            var client  = new HttpClient(handler)
            {
                Timeout = TimeSpan.FromMilliseconds(1)
            };

            // execute
            Func <Task> exec = async() => await client.GetAsync("http://localhost/bar");

            // validate
            exec.ShouldThrow <OperationCanceledException>();
        }
        public void Does_not_exceed_concurrency(IEnumerable <Uri> uris, int maxConcurrency)
        {
            // setup
            var testHandler = new TestHandler(maxConcurrency);
            var handler     = new ConcurrencyLimitingMessageHandler(maxConcurrency, testHandler);
            var client      = new HttpClient(handler);

            // execute
            var         parallelRequests = uris.Select(uri => client.GetAsync(uri));
            Func <Task> exec             = async() => await Task.WhenAll(parallelRequests);

            // validate
            // when validating the maximal seen number of execution, let's allow for some error in case the
            // test ran a bit slower. Usually it should match though.
            exec.ShouldNotThrow($"Error while executing with max concurrency of {maxConcurrency}");
            testHandler.MaxSeenNumberOfExecutions.Should().BeInRange(maxConcurrency - 2, maxConcurrency);
        }