public async Task ConfigurationIsWorking()
        {
            // serviceCollection.AddSingleton<HttpJsonPlaceholderService, HttpJsonPlaceholderService>();
            var factory = HttpOptionsBuilder.Configure(services =>
            {
                services.Configure(options =>
                {
                    options.Defaults.Connection.Server = "defaults.com";
                    options.AddClient("service", options =>
                    {
                        options.ServiceName          = "service";
                        options.Connection.Server    = "service.com";
                        options.Connection.Schema    = "https";
                        options.Connection.Port      = 443;
                        options.Connection.TimeoutMS = 50;
                    });

                    options.AddClient("service2", options =>
                    {
                        options.Connection.Server    = "service2.com";
                        options.Connection.Schema    = "http";
                        options.Connection.Port      = 443;
                        options.Connection.TimeoutMS = 50;
                    });

                    options.AddClient("service3", options =>
                    {
                        options.Connection.Server    = "service3.com";
                        options.Connection.Schema    = "https";
                        options.Connection.Port      = 1234;
                        options.Connection.TimeoutMS = 50;
                    });
                });
            })
                          .Build();

            var client   = factory.CreateClient("service");
            var client2  = factory.CreateClient("service2");
            var client3  = factory.CreateClient("service3");
            var defaults = factory.CreateClient("service4");

            Assert.Multiple(() =>
            {
                Assert.AreEqual(client.BaseAddress.ToString(), new Uri("https://service.com:443").ToString());
                Assert.AreEqual(client2.BaseAddress.ToString(), new Uri("http://service2.com:443").ToString());
                Assert.AreEqual(client3.BaseAddress.ToString(), new Uri("https://service3.com:1234").ToString());
                Assert.AreEqual(defaults.BaseAddress.ToString(), new Uri("http://defaults.com").ToString());
            });
        }
        public async Task HttpConnectionChangesAfterTimeoutChange_RemoveFromCache()
        {
            using var server = new WireServer(WireMockServer.Start());

            var timeout = new HttpTimeoutOptions()
            {
                TimeoutMS = 5000
            };

            var httpClientCollection = HttpOptionsBuilder.Configure(builder =>
            {
                builder.Configure(options =>
                {
                    options.AddClient("service", clientOptions =>
                    {
                        server.ConfigureWireMockServer(clientOptions);

                        clientOptions.Handler.HandlerLifeTimeMinutes = 0.05;
                        clientOptions.Timeout.Timeout = timeout.Timeout;
                    });
                }
                                  );
            }).Build();


            var client = httpClientCollection.CreateClient("service");
            await client.GetAsync("/delay/300ms");

            timeout.TimeoutMS = 1;
            httpClientCollection.ServiceProvider().GetRequiredService <IOptionsMonitorCache <HttpClientOptions> >().Clear();
            httpClientCollection.ServiceProvider().GetRequiredService <IOptionsMonitorCache <HttpClientCollectionOptions> >().TryRemove(HttpClientCollectionOptions.DefaultName);

            await Task.Delay(TimeSpan.FromSeconds(10));

            var ex = Policy.Handle <AssertionException>().WaitAndRetry(new[]
            {
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(20),
            }).Execute(() =>
                       Assert.ThrowsAsync <TimeoutException>(() => httpClientCollection.CreateClient("service").GetAsync("/delay/300ms")));

            // factory.ServiceProvider().GetRequiredService<IOptionsMonitorCache<HttpClientOptions>>().Clear();
            // factory.ServiceProvider().GetRequiredService<IOptionsMonitorCache<HttpClientCollectionOptions>>().Clear();

            Assert.That(ex.Data.Keys, Has.One.Items.Contains("timeout"));
            Assert.That(ex.Data["timeout"], Is.EqualTo(TimeSpan.FromMilliseconds(1)));
        }
        public async Task HttpClient_ErrorCircuitBreakerTest()
        {
            using var server = new WireServer(WireMockServer.Start());


            var httpClientCollection = HttpOptionsBuilder.Configure(builder =>
            {
                builder.Configure(options =>
                {
                    options.AddClient("service", clientOptions =>
                    {
                        server.ConfigureWireMockServer(clientOptions);
                        clientOptions.Polly.CircuitBreaker.SamplingDuration = 3000;
                        clientOptions.Polly.CircuitBreaker.Enabled          = true;
                    });
                }
                                  );
            }).Build();


            var factory = httpClientCollection.GetFactory();
            var client  = factory.CreateClient("service");

            await Observable
            .FromAsync(ct =>
                       client
                       .GetAsync("/error/5ms", ct))
            .Catch(Observable.Return(new HttpResponseMessage()))
            .Repeat(50)
            .RepeatWhen(c => c.DelaySubscription(TimeSpan.FromMilliseconds(10)))
            .TakeUntil(DateTimeOffset.Now.AddSeconds(5));

            Assert.That(async() => await client.GetAsync("/error/5ms"), Throws.InstanceOf <BrokenCircuitException>());
            Assert.That(async() => await client.GetAsync("/delay/5ms"), Throws.InstanceOf <BrokenCircuitException>());
            Assert.That(async() => await client.GetAsync("/delay/1s"), Throws.InstanceOf <BrokenCircuitException>());
        }