public async Task Should_Continue_After_Failures()
        {
            var clusterOptions = new ClusterOptions()
                                 .WithConnectionString($"couchbases://NOSUCHHOST{nameof(Should_Continue_After_Failures)}")
                                 .WithCredentials("UnitTestUser", "PasswordDoesn'tMatter");

            var messageHandler    = new ThrowsEveryTimeMessageHandler();
            var httpClientFactory = new MockHttpClientFactory(() => new HttpClient(messageHandler, false));
            var configHandler     = new Mock <IConfigHandler>(MockBehavior.Loose).Object;
            var mockLogger        = new Mock <ILogger <HttpStreamingConfigListener> >(MockBehavior.Loose).Object;
            var mockBucket        = new Mock <BucketBase>();

            var clusterNodeCollection = new ClusterNodeCollection();
            var clusterNode           = new Mock <IClusterNode>();

            clusterNode.Setup(x => x.KeyEndPoints).Returns(new ReadOnlyObservableCollection <HostEndpointWithPort>(new ObservableCollection <HostEndpointWithPort>()));
            clusterNode.Setup(x => x.ManagementUri).Returns(new Uri($"http://NOSUCHHOST{nameof(Should_Continue_After_Failures)}:8091"));
            clusterNode.Setup(x => x.EndPoint).Returns(new HostEndpointWithPort($"NOSUCHHOST{nameof(Should_Continue_After_Failures)}", 11210));
            clusterNodeCollection.Add(clusterNode.Object);
            mockBucket.Object.Nodes.Add(clusterNode.Object);

            using var configListener = new HttpStreamingConfigListener(mockBucket.Object,
                                                                       clusterOptions, httpClientFactory, configHandler, mockLogger);
            configListener.StartListening();
            var exitedSpinBeforeTimeout = SpinWait.SpinUntil(() => messageHandler.CallCount > 0, TimeSpan.FromSeconds(10));

            if (!exitedSpinBeforeTimeout)
            {
                throw new TimeoutException($"{nameof(HttpStreamingConfigListener)} didn't start in time.");
            }

            await Task.Delay(500);

            Assert.NotInRange(messageHandler.CallCount, 0, 2);
            configListener.Dispose();

            // give it a little time to finish up.
            await Task.Delay(500);

            var callCountAfterDispose = messageHandler.CallCount;

            // a little more time to generate more calls if it was still running.
            await Task.Delay(500);

            Assert.Equal(callCountAfterDispose, messageHandler.CallCount);

            await configListener.DisposeAsync();
        }
        public async Task Should_Continue_After_Failures()
        {
            var clusterOptions = new ClusterOptions()
                                 .WithConnectionString($"couchbases://NOSUCHHOST{nameof(Should_Continue_After_Failures)}")
                                 .WithCredentials("UnitTestUser", "PasswordDoesn'tMatter");
            var messageHandler = new ThrowsEveryTimeMessageHandler();
            var httpClient     = new HttpClient(messageHandler);
            var configHandler  = new Mock <IConfigHandler>(MockBehavior.Loose).Object;
            var mockLogger     = new Mock <ILogger <HttpStreamingConfigListener> >(MockBehavior.Loose).Object;

            using var configListener = new HttpStreamingConfigListener(nameof(Should_Continue_After_Failures),
                                                                       clusterOptions, httpClient, configHandler, mockLogger);
            configListener.StartListening();
            var exitedSpinBeforeTimeout = SpinWait.SpinUntil(() => messageHandler.CallCount > 0, TimeSpan.FromSeconds(10));

            if (!exitedSpinBeforeTimeout)
            {
                throw new TimeoutException($"{nameof(HttpStreamingConfigListener)} didn't start in time.");
            }

            await Task.Delay(500);

            Assert.NotInRange(messageHandler.CallCount, 0, 2);
            configListener.Dispose();

            // give it a little time to finish up.
            await Task.Delay(500);

            var callCountAfterDispose = messageHandler.CallCount;

            // a little more time to generate more calls if it was still running.
            await Task.Delay(500);

            Assert.Equal(callCountAfterDispose, messageHandler.CallCount);

            await configListener.DisposeAsync();
        }