From baedfec539e176714b020124dc4cf0551177bd02 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Sun, 31 May 2020 10:19:39 -0400 Subject: [PATCH] Add SslStream test for zero-byte reads (#37128) * Add SslStream test for zero-byte reads We have higher-level tests for libraries like WebSockets that validate the behavior of zero-byte reads, but we don't currently have one in System.Net.Security's tests. Adding one. * Address PR feedback --- .../FunctionalTests/SslStreamStreamToStreamTest.cs | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs b/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs index 9fb2ac9..d04f4b5 100644 --- a/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs +++ b/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs @@ -259,6 +259,34 @@ namespace System.Net.Security.Tests } } + [Fact] + public async Task SslStream_StreamToStream_ZeroByteRead_SucceedsWhenDataAvailable() + { + (NetworkStream clientStream, NetworkStream serverStream) = TestHelper.GetConnectedTcpStreams(); + using var clientSslStream = new SslStream(clientStream, leaveInnerStreamOpen: false, AllowAnyServerCertificate); + using var serverSslStream = new SslStream(serverStream); + await DoHandshake(clientSslStream, serverSslStream); + + for (int iter = 0; iter < 2; iter++) + { + ValueTask zeroByteRead = clientSslStream.ReadAsync(Memory.Empty); + Assert.False(zeroByteRead.IsCompleted); + + await serverSslStream.WriteAsync(Encoding.UTF8.GetBytes("hello")); + Assert.Equal(0, await zeroByteRead); + + var readBytes = new byte[5]; + int count = 0; + while (count < readBytes.Length) + { + int n = await clientSslStream.ReadAsync(readBytes.AsMemory(count)); + Assert.InRange(n, 1, readBytes.Length - count); + count += n; + } + Assert.Equal("hello", Encoding.UTF8.GetString(readBytes)); + } + } + [Theory] [InlineData(false)] [InlineData(true)] -- 2.7.4