示例#1
0
        public void When_Config_Published_Subscriber_Receives_Config()
        {
            using var autoResetEvent = new AutoResetEvent(false);

            using var tokenSource = new CancellationTokenSource();
            tokenSource.CancelAfter(TimeSpan.FromSeconds(10));

            using var context    = new ClusterContext(tokenSource, _fixture.ClusterOptions);
            using var httpClient = context.ServiceProvider.GetRequiredService <CouchbaseHttpClient>();

            var handler = new Mock <IConfigHandler>();

            handler
            .Setup(m => m.Publish(It.IsAny <BucketConfig>()))
            .Callback((BucketConfig config) =>
            {
                // ReSharper disable once AccessToDisposedClosure
                autoResetEvent.Set();
            });

            using var listener = new HttpStreamingConfigListener("default", _fixture.ClusterOptions, httpClient, handler.Object,
                                                                 new Mock <ILogger <HttpStreamingConfigListener> >().Object);

            listener.StartListening();
            Assert.True(autoResetEvent.WaitOne(TimeSpan.FromSeconds(5)));
        }
示例#2
0
        public void Subscribe(BucketBase bucket)
        {
            ConfigChanged += bucket.ConfigUpdated;

            if (bucket is MemcachedBucket)
            {
                var httpListener = new HttpStreamingConfigListener(bucket.Name, _configuration, _httpClient, this, TokenSource.Token);
                if (_httpConfigListeners.TryAdd(bucket.Name, httpListener))
                {
                    httpListener.StartListening();
                }
            }
        }
        private Mock <IHttpStreamingConfigListenerFactory> CreateHttpStreamingConfigListenerFactoryMock(out ClusterContext context)
        {
            var clusterOptions = new ClusterOptions();

            context = new ClusterContext(new CancellationTokenSource(), clusterOptions);
            var httpStreamingConfigListenerFactory = new Mock <IHttpStreamingConfigListenerFactory>();
            var httpClientFactory          = new Mock <ICouchbaseHttpClientFactory>();
            var configHandler              = new Mock <IConfigHandler>();
            var logger                     = new Mock <ILogger <HttpStreamingConfigListener> >();
            var htpStreamingConfigListener = new HttpStreamingConfigListener(_bucket, clusterOptions, httpClientFactory.Object, configHandler.Object, logger.Object);

            httpStreamingConfigListenerFactory.Setup(x => x.Create(It.IsAny <IBucket>(), It.IsAny <IConfigHandler>())).Returns(htpStreamingConfigListener);

            return(httpStreamingConfigListenerFactory);
        }
        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 void When_Config_Published_Subscriber_Receives_Config()
        {
            var tokenSource = new CancellationTokenSource();

            tokenSource.CancelAfter(TimeSpan.FromSeconds(10));

            var context = new ConfigContext(_fixture.Configuration);

            context.Start(tokenSource);
            context.Subscribe(_bucket);

            var httpClient = new CouchbaseHttpClient(_fixture.Configuration);
            var listener   = new HttpStreamingConfigListener("default", _fixture.Configuration, httpClient, context, tokenSource.Token);

            listener.StartListening();
            Assert.True(_autoResetEvent.WaitOne(TimeSpan.FromSeconds(1)));
        }
示例#6
0
        public void When_Config_Published_Subscriber_Receives_Config()
        {
            var tokenSource = new CancellationTokenSource();

            tokenSource.CancelAfter(TimeSpan.FromSeconds(10));

            var context    = new ClusterContext(tokenSource, _fixture.ClusterOptions);
            var httpClient = context.ServiceProvider.GetRequiredService <CouchbaseHttpClient>();

            var handler = new ConfigHandler(context, httpClient);

            handler.Start(tokenSource);
            handler.Subscribe(_bucket);

            var listener = new HttpStreamingConfigListener("default", _fixture.ClusterOptions, httpClient, handler, tokenSource.Token);

            listener.StartListening();
            Assert.True(_autoResetEvent.WaitOne(TimeSpan.FromSeconds(1)));
        }
        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();
        }