Exemple #1
0
        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;
            }
        }
Exemple #7
0
 public Task <Stream> CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken)
 {
     return(IsUnixEndPoint(endPoint, out var unixEndPoint)
         ? CreateStreamAsync(unixEndPoint, cancellationToken)
         : _innerFactory.CreateStreamAsync(endPoint, cancellationToken));
 }