From ee1bf778ebf4e08a8a2616c40694e69c0bda536b Mon Sep 17 00:00:00 2001 From: Radek Zikmund Date: Tue, 2 Aug 2022 14:10:23 +0200 Subject: [PATCH 1/3] Improve idle timeout tests --- .../tests/FunctionalTests/MsQuicTests.cs | 55 ++++++++++++------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs index f21105936a107..6ff3d8be3d581 100644 --- a/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs +++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs @@ -611,25 +611,6 @@ ValueTask OpenStreamAsync(QuicConnection connection, CancellationTok await serverConnection.DisposeAsync(); } - - [Fact] - [OuterLoop("May take several seconds")] - public async Task SetListenerTimeoutWorksWithSmallTimeout() - { - var listenerOptions = new QuicListenerOptions() - { - ListenEndPoint = new IPEndPoint(IPAddress.Loopback, 0), - ApplicationProtocols = new List() { ApplicationProtocol }, - ConnectionOptionsCallback = (_, _, _) => ValueTask.FromResult(CreateQuicServerOptions()) - }; - - (QuicConnection clientConnection, QuicConnection serverConnection) = await CreateConnectedQuicConnection(null, listenerOptions); - await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverConnection.AcceptInboundStreamAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(100))); - - await serverConnection.DisposeAsync(); - await clientConnection.DisposeAsync(); - } - [Theory] [MemberData(nameof(WriteData))] public async Task WriteTests(int[][] writes) @@ -1082,5 +1063,41 @@ await RunBidirectionalClientServer( Assert.True(serverStream.ReadsClosed.IsCompletedSuccessfully); }); } + + [Fact] + [OuterLoop("May take several seconds")] + public async Task IdleTimeout_ThrowsQuicException() + { + QuicListenerOptions listenerOptions = new QuicListenerOptions() + { + ListenEndPoint = new IPEndPoint(IPAddress.Loopback, 0), + ApplicationProtocols = new List() { ApplicationProtocol }, + ConnectionOptionsCallback = (_, _, _) => + { + var serverOptions = CreateQuicServerOptions(); + serverOptions.MaxInboundBidirectionalStreams = 1; + serverOptions.MaxInboundUnidirectionalStreams = 1; + serverOptions.IdleTimeout = TimeSpan.FromSeconds(5); + return ValueTask.FromResult(serverOptions); + } + }; + (QuicConnection clientConnection, QuicConnection serverConnection) = await CreateConnectedQuicConnection(null, listenerOptions); + + await using (clientConnection) + await using (serverConnection) + { + using QuicStream clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional); + await clientStream.WriteAsync(new byte[1]); + using QuicStream serverStream = await serverConnection.AcceptInboundStreamAsync(); + + var acceptTask = serverConnection.AcceptInboundStreamAsync(); + + // Wait for idle timeout + await Task.Delay(TimeSpan.FromSeconds(10)); + + await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.ReadAsync(new byte[10])); + await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await acceptTask); + } + } } } From d4c46b0d692ce95a9145155b28e7cf50b1d936dc Mon Sep 17 00:00:00 2001 From: Radek Zikmund Date: Tue, 2 Aug 2022 14:12:44 +0200 Subject: [PATCH 2/3] Minor change --- .../System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs index 6ff3d8be3d581..f11a986ec99ef 100644 --- a/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs +++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs @@ -1096,6 +1096,7 @@ public async Task IdleTimeout_ThrowsQuicException() await Task.Delay(TimeSpan.FromSeconds(10)); await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.ReadAsync(new byte[10])); + await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.WriteAsync(new byte[10])); await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await acceptTask); } } From 4e95fb223f9f097ea2d2ab684fc37b5227031a0c Mon Sep 17 00:00:00 2001 From: Radek Zikmund Date: Tue, 2 Aug 2022 17:15:24 +0200 Subject: [PATCH 3/3] Code review feedback --- .../tests/FunctionalTests/MsQuicTests.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs index f11a986ec99ef..86601b039c67a 100644 --- a/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs +++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/MsQuicTests.cs @@ -1077,7 +1077,7 @@ public async Task IdleTimeout_ThrowsQuicException() var serverOptions = CreateQuicServerOptions(); serverOptions.MaxInboundBidirectionalStreams = 1; serverOptions.MaxInboundUnidirectionalStreams = 1; - serverOptions.IdleTimeout = TimeSpan.FromSeconds(5); + serverOptions.IdleTimeout = TimeSpan.FromSeconds(1); return ValueTask.FromResult(serverOptions); } }; @@ -1086,18 +1086,19 @@ public async Task IdleTimeout_ThrowsQuicException() await using (clientConnection) await using (serverConnection) { - using QuicStream clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional); + using QuicStream clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional); await clientStream.WriteAsync(new byte[1]); - using QuicStream serverStream = await serverConnection.AcceptInboundStreamAsync(); + using QuicStream serverStream = await serverConnection.AcceptInboundStreamAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(10)); + await serverStream.ReadAsync(new byte[1]); - var acceptTask = serverConnection.AcceptInboundStreamAsync(); + ValueTask acceptTask = serverConnection.AcceptInboundStreamAsync(); - // Wait for idle timeout - await Task.Delay(TimeSpan.FromSeconds(10)); + // read attempts should block until idle timeout + await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.ReadAsync(new byte[10])).WaitAsync(TimeSpan.FromSeconds(10)); - await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.ReadAsync(new byte[10])); - await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.WriteAsync(new byte[10])); - await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await acceptTask); + // write and accept should throw as well + await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await serverStream.WriteAsync(new byte[10])).WaitAsync(TimeSpan.FromSeconds(10)); + await AssertThrowsQuicExceptionAsync(QuicError.ConnectionIdle, async () => await acceptTask).WaitAsync(TimeSpan.FromSeconds(10)); } } }