public void Open_should_not_complete_the_second_call_until_the_first_is_completed( [Values(false, true)] bool async1, [Values(false, true)] bool async2) { var task1IsBlocked = false; var completionSource = new TaskCompletionSource <Stream>(); _streamFactory.CreateStream(null, CancellationToken.None) .ReturnsForAnyArgs(_ => { task1IsBlocked = true; return(completionSource.Task.GetAwaiter().GetResult()); }); _streamFactory.CreateStreamAsync(null, CancellationToken.None) .ReturnsForAnyArgs(_ => { task1IsBlocked = true; return(completionSource.Task); }); Task openTask1; if (async1) { openTask1 = _subject.OpenAsync(CancellationToken.None); } else { openTask1 = Task.Run(() => _subject.Open(CancellationToken.None)); } SpinWait.SpinUntil(() => task1IsBlocked); Task openTask2; if (async2) { openTask2 = _subject.OpenAsync(CancellationToken.None); } else { openTask2 = Task.Run(() => _subject.Open(CancellationToken.None)); } openTask1.IsCompleted.Should().BeFalse(); openTask2.IsCompleted.Should().BeFalse(); _subject.Description.Should().BeNull(); completionSource.SetResult(Substitute.For <Stream>()); SpinWait.SpinUntil(() => openTask1.IsCompleted); SpinWait.SpinUntil(() => openTask2.IsCompleted); _subject.Description.Should().NotBeNull(); _capturedEvents.Next().Should().BeOfType <ConnectionOpeningEvent>(); _capturedEvents.Next().Should().BeOfType <ConnectionOpenedEvent>(); _capturedEvents.Any().Should().BeFalse(); }
public async Task <Stream> CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken) { var stream = await _wrapped.CreateStreamAsync(endPoint, cancellationToken).ConfigureAwait(false); var sslStream = new SslStream( stream, leaveInnerStreamOpen: false, userCertificateValidationCallback: _settings.ServerCertificateValidationCallback, userCertificateSelectionCallback: _settings.ClientCertificateSelectionCallback); string targetHost; DnsEndPoint dnsEndPoint; IPEndPoint ipEndPoint; if ((dnsEndPoint = endPoint as DnsEndPoint) != null) { targetHost = dnsEndPoint.Host; } else if ((ipEndPoint = endPoint as IPEndPoint) != null) { targetHost = ipEndPoint.Address.ToString(); } else { targetHost = endPoint.ToString(); } var clientCertificates = new X509CertificateCollection(_settings.ClientCertificates.ToArray()); await sslStream.AuthenticateAsClientAsync(targetHost, clientCertificates, _settings.EnabledSslProtocols, _settings.CheckCertificateRevocation).ConfigureAwait(false); return(sslStream); }
public void Setup() { _capturedEvents = new EventCapturer() .Capture<CommandStartedEvent>() .Capture<CommandSucceededEvent>() .Capture<CommandFailedEvent>(); _streamFactory = Substitute.For<IStreamFactory>(); _endPoint = new DnsEndPoint("localhost", 27017); var serverId = new ServerId(new ClusterId(), _endPoint); _connectionInitializer = Substitute.For<IConnectionInitializer>(); _connectionInitializer.InitializeConnectionAsync(null, CancellationToken.None) .ReturnsForAnyArgs(Task.FromResult(new ConnectionDescription( new ConnectionId(serverId), new IsMasterResult(new BsonDocument()), new BuildInfoResult(new BsonDocument("version", "2.6.3"))))); _subject = new BinaryConnection( serverId: serverId, endPoint: _endPoint, settings: new ConnectionSettings(), streamFactory: _streamFactory, connectionInitializer: _connectionInitializer, eventSubscriber: _capturedEvents); _stream = new BlockingMemoryStream(); _streamFactory.CreateStreamAsync(null, CancellationToken.None) .ReturnsForAnyArgs(Task.FromResult<Stream>(_stream)); _subject.OpenAsync(CancellationToken.None).Wait(); _capturedEvents.Clear(); _operationIdDisposer = EventContext.BeginOperation(); }
public void Setup() { _capturedEvents = new EventCapturer() .Capture <CommandStartedEvent>() .Capture <CommandSucceededEvent>() .Capture <CommandFailedEvent>(); _streamFactory = Substitute.For <IStreamFactory>(); _endPoint = new DnsEndPoint("localhost", 27017); var serverId = new ServerId(new ClusterId(), _endPoint); _connectionInitializer = Substitute.For <IConnectionInitializer>(); _connectionInitializer.InitializeConnectionAsync(null, CancellationToken.None) .ReturnsForAnyArgs(Task.FromResult(new ConnectionDescription( new ConnectionId(serverId), new IsMasterResult(new BsonDocument()), new BuildInfoResult(new BsonDocument("version", "2.6.3"))))); _subject = new BinaryConnection( serverId: serverId, endPoint: _endPoint, settings: new ConnectionSettings(), streamFactory: _streamFactory, connectionInitializer: _connectionInitializer, eventSubscriber: _capturedEvents); _stream = new BlockingMemoryStream(); _streamFactory.CreateStreamAsync(null, CancellationToken.None) .ReturnsForAnyArgs(Task.FromResult <Stream>(_stream)); _subject.OpenAsync(CancellationToken.None).Wait(); _capturedEvents.Clear(); _operationIdDisposer = EventContext.BeginOperation(); }
public void OpenAsync_should_not_complete_the_second_call_until_the_first_is_completed() { var completionSource = new TaskCompletionSource <Stream>(); _streamFactory.CreateStreamAsync(null, CancellationToken.None) .ReturnsForAnyArgs(completionSource.Task); _subject.OpenAsync(CancellationToken.None); var openTask2 = _subject.OpenAsync(CancellationToken.None); openTask2.IsCompleted.Should().BeFalse(); _subject.Description.Should().BeNull(); completionSource.SetResult(Substitute.For <Stream>()); openTask2.IsCompleted.Should().BeTrue(); _subject.Description.Should().NotBeNull(); }
public async Task <Stream> CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken) { var stream = await _wrapped.CreateStreamAsync(endPoint, cancellationToken).ConfigureAwait(false); try { var sslStream = CreateSslStream(stream); var targetHost = GetTargetHost(endPoint); var clientCertificates = new X509CertificateCollection(_settings.ClientCertificates.ToArray()); await sslStream.AuthenticateAsClientAsync(targetHost, clientCertificates, _settings.EnabledSslProtocols, _settings.CheckCertificateRevocation).ConfigureAwait(false); return(sslStream); } catch { DisposeStreamIgnoringExceptions(stream); throw; } }
public Task <Stream> CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken) { return(IsUnixEndPoint(endPoint, out var unixEndPoint) ? CreateStreamAsync(unixEndPoint, cancellationToken) : _innerFactory.CreateStreamAsync(endPoint, cancellationToken)); }