From adb7606fc73d4240122b832635f435c83e445059 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Fri, 15 Mar 2019 14:30:25 -0400 Subject: [PATCH] Add test for using SslStream for concurrent read/writes (dotnet/corefx#36064) Commit migrated from https://github.com/dotnet/corefx/commit/66ddc3e0da1af94c52bd7c78f27d18ea008bea74 --- .../FunctionalTests/SslStreamStreamToStreamTest.cs | 50 +++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs b/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs index 3e0d6ed..2e578e6 100644 --- a/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs +++ b/src/libraries/System.Net.Security/tests/FunctionalTests/SslStreamStreamToStreamTest.cs @@ -8,7 +8,6 @@ using System.Net.Test.Common; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; using System.Text; -using System.Threading; using System.Threading.Tasks; using Xunit; @@ -329,6 +328,55 @@ namespace System.Net.Security.Tests } } + [OuterLoop("Executes for several seconds")] + [Fact] + public async Task SslStream_ConcurrentBidirectionalReadsWrites_Success() + { + VirtualNetwork network = new VirtualNetwork(); + + using (var clientStream = new VirtualNetworkStream(network, isServer: false)) + using (var serverStream = new NotifyReadVirtualNetworkStream(network, isServer: true)) + using (var clientSslStream = new SslStream(clientStream, false, AllowAnyServerCertificate)) + using (var serverSslStream = new SslStream(serverStream)) + { + await DoHandshake(clientSslStream, serverSslStream); + + const int BytesPerSend = 100; + DateTime endTime = DateTime.UtcNow + TimeSpan.FromSeconds(5); + await new Task[] + { + Task.Run(async delegate + { + var buffer = new byte[BytesPerSend]; + while (DateTime.UtcNow < endTime) + { + await clientStream.WriteAsync(buffer, 0, buffer.Length); + int received = 0, bytesRead = 0; + while (received < BytesPerSend && (bytesRead = await serverStream.ReadAsync(buffer, 0, buffer.Length)) != 0) + { + received += bytesRead; + } + Assert.NotEqual(0, bytesRead); + } + }), + Task.Run(async delegate + { + var buffer = new byte[BytesPerSend]; + while (DateTime.UtcNow < endTime) + { + await serverStream.WriteAsync(buffer, 0, buffer.Length); + int received = 0, bytesRead = 0; + while (received < BytesPerSend && (bytesRead = await clientStream.ReadAsync(buffer, 0, buffer.Length)) != 0) + { + received += bytesRead; + } + Assert.NotEqual(0, bytesRead); + } + }) + }.WhenAllOrAnyFailed(); + } + } + [Fact] public async Task SslStream_StreamToStream_Dispose_Throws() { -- 2.7.4