Ejemplo n.º 1
0
        public async Task WaitForAvailableUnidirectionStreamsAsyncWorks()
        {
            using QuicListener listener           = CreateQuicListener(maxUnidirectionalStreams: 1);
            using QuicConnection clientConnection = CreateQuicConnection(listener.ListenEndPoint);
            Task <QuicConnection> serverTask = listener.AcceptConnectionAsync().AsTask();
            await TaskTimeoutExtensions.WhenAllOrAnyFailed(clientConnection.ConnectAsync().AsTask(), serverTask, PassingTestTimeoutMilliseconds);

            using QuicConnection serverConnection = serverTask.Result;
            listener.Dispose();

            // No stream opened yet, should return immediately.
            Assert.True(clientConnection.WaitForAvailableUnidirectionalStreamsAsync().IsCompletedSuccessfully);

            // Open one stream, should wait till it closes.
            QuicStream stream   = clientConnection.OpenUnidirectionalStream();
            ValueTask  waitTask = clientConnection.WaitForAvailableUnidirectionalStreamsAsync();

            Assert.False(waitTask.IsCompleted);
            Assert.Throws <QuicException>(() => clientConnection.OpenUnidirectionalStream());
            // Close the streams, the waitTask should finish as a result.
            stream.Dispose();
            QuicStream newStream = await serverConnection.AcceptStreamAsync();

            newStream.Dispose();

            await waitTask.AsTask().WaitAsync(TimeSpan.FromSeconds(10));
        }
        public ValueTask DisposeAsync()
        {
            if (_disposed)
            {
                return(ValueTask.CompletedTask);
            }

            _listener.Dispose();
            _disposed = true;

            return(ValueTask.CompletedTask);
        }
Ejemplo n.º 3
0
        protected override async Task <StreamPair> CreateConnectedStreamsAsync()
        {
            QuicImplementationProvider provider = Provider;
            var listener = new QuicListener(
                provider,
                new IPEndPoint(IPAddress.Loopback, 0),
                GetSslServerAuthenticationOptions());

            byte[] buffer = new byte[1] {
                42
            };
            QuicConnection connection1 = null, connection2 = null;
            QuicStream     stream1 = null, stream2 = null;

            await WhenAllOrAnyFailed(
                Task.Run(async() =>
            {
                connection1 = await listener.AcceptConnectionAsync();
                stream1     = await connection1.AcceptStreamAsync();
                Assert.Equal(1, await stream1.ReadAsync(buffer));
            }),
                Task.Run(async() =>
            {
                try
                {
                    connection2 = new QuicConnection(
                        provider,
                        listener.ListenEndPoint,
                        GetSslClientAuthenticationOptions());
                    await connection2.ConnectAsync();
                    stream2 = await connection2.OpenBidirectionalStreamAsync();
                    // OpenBidirectionalStream only allocates ID. We will force stream opening
                    // by Writing there and receiving data on the other side.
                    await stream2.WriteAsync(buffer);
                }
                catch (Exception ex)
                {
                    _output?.WriteLine($"Failed to {ex.Message}");
                    throw;
                }
            }));

            // No need to keep the listener once we have connected connection and streams
            listener.Dispose();

            var result = new StreamPairWithOtherDisposables(stream1, stream2);

            result.Disposables.Add(connection1);
            result.Disposables.Add(connection2);

            return(result);
        }
Ejemplo n.º 4
0
        public ValueTask DisposeAsync()
        {
            if (_disposed)
            {
                return(new ValueTask());
            }

            _disposed = true;

            _listener.Dispose();

            return(new ValueTask());
        }
Ejemplo n.º 5
0
 public override void Dispose()
 {
     _listener.Dispose();
     _cert.Dispose();
 }
Ejemplo n.º 6
0
 public void DoGlobalCleanupQuicStream()
 {
     StopServer();
     QuicListener.Dispose();
     GlobalCleanupQuicStream();
 }