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))); }
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(); } } }
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))); }
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(); }