public async Task ServiceTest()
        {
            var serviceInfo = new CalledServiceInfo
            {
                Name               = "Service",
                Id                 = Guid.NewGuid(),
                Endpoint           = "Endpoint",
                CircuitBreakerInfo = new CircuitBreakerInfo
                {
                    ExceptionCount = 1,
                    BreakDuration  = TimeSpan.FromMilliseconds(1)
                },
                Timeout = TimeSpan.FromMilliseconds(100)
            };
            var httpClientResponse = new HttpClientResponse
            {
                HttpStatusCode = HttpStatusCode.NoContent,
                Response       = ""
            };
            var cacheRegion = "cacheRegion";

            var cache             = Substitute.For <ICache>();
            var httpClientWrapper = Substitute.For <IHttpClientWrapper>();
            var tokenService      = Substitute.For <ITokenService>();

            httpClientWrapper.PostAsync(serviceInfo.Endpoint, null, CancellationToken.None).ReturnsForAnyArgs(httpClientResponse);

            var sut = new CachedService(cache, httpClientWrapper, tokenService);

            ServiceResponse actual = await sut.CallService(serviceInfo, cacheRegion, CancellationToken.None, null);

            Assert.AreEqual(ServiceResponseStatus.Success, actual.Status);
        }
        public async Task SemaphoreTest()
        {
            var cacheRegion = "cacheRegion";
            var serviceInfo = new CalledServiceInfo
            {
                Name               = "Service",
                Id                 = Guid.NewGuid(),
                Endpoint           = "Endpoint",
                CircuitBreakerInfo = new CircuitBreakerInfo
                {
                    ExceptionCount = 1,
                    BreakDuration  = TimeSpan.FromMilliseconds(1)
                },
                Timeout = TimeSpan.FromMilliseconds(100)
            };
            var httpClientResponse = new HttpClientResponse
            {
                HttpStatusCode = HttpStatusCode.NoContent,
                Response       = ""
            };

            var cache             = new CacheMock();
            var httpClientWrapper = Substitute.For <IHttpClientWrapper>();
            var tokenService      = Substitute.For <ITokenService>();

            httpClientWrapper.PostAsync(serviceInfo.Endpoint, null, CancellationToken.None).ReturnsForAnyArgs(async callInfo =>
            {
                await Task.Delay(20);
                return(httpClientResponse);
            });

            var sut = new CachedService(cache, httpClientWrapper, tokenService);

            Task <ServiceResponse> task1 = Task.Run(async() => await sut.CallService(serviceInfo, cacheRegion, CancellationToken.None, null));

            Task <ServiceResponse> task2 = Task.Run(async() => await sut.CallService(serviceInfo, cacheRegion, CancellationToken.None, null));

            await Task.WhenAll(task1, task2);

            await httpClientWrapper.ReceivedWithAnyArgs(1).PostAsync(serviceInfo.Endpoint, null, CancellationToken.None);
        }