From 3482411e031a7989912b0ea4adb682002a7fb9b6 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Mon, 30 Mar 2020 09:31:08 +0100 Subject: [PATCH 1/8] add SslOverTdsStream tests --- .../Microsoft.Data.SqlClient.Tests.csproj | 2 + .../SslOverTdsStreamTest.NetCoreApp.cs | 84 ++++++ .../FunctionalTests/SslOverTdsStreamTest.cs | 275 ++++++++++++++++++ 3 files changed, 361 insertions(+) create mode 100644 src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs create mode 100644 src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj index f4617ced90..b89599e628 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj @@ -28,6 +28,7 @@ + @@ -60,6 +61,7 @@ + diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs new file mode 100644 index 0000000000..479fa33610 --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs @@ -0,0 +1,84 @@ +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Data.SqlClient.Tests +{ + public static partial class SslOverTdsStreamTest + { + static partial void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + { + (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + + byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, + (Stream stream, int index) => + { + stream.Write(input.AsSpan(TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE)); + } + ); + + ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, + (Stream stream, byte[] bytes, int offset, int count) => + { + return stream.Read(bytes.AsSpan(offset, count)); + } + ); + + Validate(input, output); + } + + static partial void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + { + (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + + byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, + async (Stream stream, int index) => + { + await stream.WriteAsync( + new ReadOnlyMemory(input, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE) + ); + } + ); + + ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, + async (Stream stream, byte[] bytes, int offset, int count) => + { + return await stream.ReadAsync( + new Memory(bytes, offset, count) + ); + } + ); + + Validate(input, output); + } + } + + public sealed partial class LimitedMemoryStream : MemoryStream + { + public override int Read(Span destination) + { + if (_readLimit > 0) + { + return base.Read(destination.Slice(0, Math.Min(_readLimit, destination.Length))); + } + else + { + return base.Read(destination); + } + } + + public override ValueTask ReadAsync(Memory destination, CancellationToken cancellationToken = default) + { + + if (_readLimit > 0) + { + return base.ReadAsync(destination.Slice(0, Math.Min(_readLimit, destination.Length)), cancellationToken); + } + else + { + return base.ReadAsync(destination, cancellationToken); + } + } + } +} diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs new file mode 100644 index 0000000000..870bec7d55 --- /dev/null +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -0,0 +1,275 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.Data.SqlClient.Tests +{ + public static partial class SslOverTdsStreamTest + { + [Theory] + [InlineData(0),InlineData(3),InlineData(128), InlineData(2048), InlineData(8192)] + public static void ReadWrite(int readLimit) + { + const int EncapulatedPacketCount = 4; + const int PassThroughPacketCount = 5; + + SyncTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); + SyncCoreTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); + AsyncTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); + AsyncCoreTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); + } + + private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + { + (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + + byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, + (Stream stream, int index) => + { + stream.Write(input, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE); + } + ); + + ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, + (Stream stream, byte[] bytes, int offset, int count) => + { + return stream.Read(bytes, offset, count); + } + ); + + Validate(input, output); + } + + static partial void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength); + + private static void AsyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + { + (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + + byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, + async (Stream stream, int index) => + { + await stream.WriteAsync(input, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE); + } + ); + + ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, + async (Stream stream, byte[] bytes, int offset, int count) => + { + return await stream.ReadAsync(bytes, offset, count); + } + ); + + Validate(input, output); + } + + static partial void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength); + + + + private static void ReadPackets(byte[] buffer, int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength, byte[] output, Func> action) + { + using (LimitedMemoryStream stream = new LimitedMemoryStream(buffer, maxPacketReadLength)) + using (Stream tdsStream = CreateSslOverTdsStream(stream)) + { + int offset = 0; + byte[] bytes = new byte[TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; + for (int index = 0; index < encapsulatedPacketCount; index++) + { + Array.Clear(bytes, 0, bytes.Length); + int packetBytes = ReadPacket(tdsStream, action, bytes).GetAwaiter().GetResult(); + Array.Copy(bytes, 0, output, offset, packetBytes); + offset += packetBytes; + } + InvokeFinishHandshake(tdsStream);//tdsStream.FinishHandshake(); + for (int index = 0; index < passthroughPacketCount; index++) + { + Array.Clear(bytes, 0, bytes.Length); + int packetBytes = ReadPacket(tdsStream, action, bytes).GetAwaiter().GetResult(); + Array.Copy(bytes, 0, output, offset, packetBytes); + offset += packetBytes; + } + } + } + + private static void InvokeFinishHandshake(Stream stream) + { + MethodInfo method = stream.GetType().GetMethod("FinishHandshake", BindingFlags.Public | BindingFlags.Instance); + method.Invoke(stream, null); + } + + private static Stream CreateSslOverTdsStream(Stream stream) + { + Type type = typeof(SqlClientFactory).Assembly.GetType("Microsoft.Data.SqlClient.SNI.SslOverTdsStream"); + ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(Stream) }); + Stream instance = (Stream)ctor.Invoke(new object[] { stream }); + return instance; + } + + private static void ReadPackets(byte[] buffer, int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength, byte[] output, Func action) + { + using (LimitedMemoryStream stream = new LimitedMemoryStream(buffer, maxPacketReadLength)) + using (Stream tdsStream = CreateSslOverTdsStream(stream)) + { + int offset = 0; + byte[] bytes = new byte[TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; + for (int index = 0; index < encapsulatedPacketCount; index++) + { + Array.Clear(bytes, 0, bytes.Length); + int packetBytes = ReadPacket(tdsStream, action, bytes); + Array.Copy(bytes, 0, output, offset, packetBytes); + offset += packetBytes; + } + InvokeFinishHandshake(tdsStream); + for (int index = 0; index < passthroughPacketCount; index++) + { + Array.Clear(bytes, 0, bytes.Length); + int packetBytes = ReadPacket(tdsStream, action, bytes); + Array.Copy(bytes, 0, output, offset, packetBytes); + offset += packetBytes; + } + } + + } + + private static int ReadPacket(Stream tdsStream, Func action, byte[] output) + { + int readCount; + int offset = 0; + byte[] bytes = new byte[TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; + do + { + readCount = action(tdsStream, bytes, offset, bytes.Length - offset); + if (readCount > 0) + { + offset += readCount; + } + } + while (readCount > 0 && offset < bytes.Length); + Array.Copy(bytes, 0, output, 0, offset); + return offset; + } + + private static async Task ReadPacket(Stream tdsStream, Func> action, byte[] output) + { + int readCount; + int offset = 0; + byte[] bytes = new byte[TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; + do + { + readCount = await action(tdsStream, bytes, offset, bytes.Length - offset); + if (readCount > 0) + { + offset += readCount; + } + } + while (readCount > 0 && offset < bytes.Length); + Array.Copy(bytes, 0, output, 0, offset); + return offset; + } + + private static byte[] WritePackets(int encapsulatedPacketCount, int passthroughPacketCount, Action action) + { + byte[] buffer = null; + using (LimitedMemoryStream stream = new LimitedMemoryStream()) + { + //using (SslOverTdsStream tdsStream = new SslOverTdsStream(stream)) + using (Stream tdsStream = CreateSslOverTdsStream(stream)) + { + for (int index = 0; index < encapsulatedPacketCount; index++) + { + action(tdsStream, index); + } + InvokeFinishHandshake(tdsStream);//tdsStream.FinishHandshake(); + for (int index = 0; index < passthroughPacketCount; index++) + { + action(tdsStream, encapsulatedPacketCount + index); + } + } + buffer = stream.ToArray(); + } + return buffer; + } + + private static (byte[] input, byte[] output) SetupArrays(int packetCount) + { + byte[] pattern = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; + byte[] input = new byte[packetCount * TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; + byte[] output = new byte[input.Length]; + for (int index = 0; index < packetCount; index++) + { + int position = 0; + while (position < TdsEnums.DEFAULT_LOGIN_PACKET_SIZE) + { + int copyCount = Math.Min(pattern.Length, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE - position); + Array.Copy(pattern, 0, input, (TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index) + position, copyCount); + position += copyCount; + } + } + return (input, output); + } + + private static void Validate(byte[] input, byte[] output) + { + Assert.True(input.AsSpan().SequenceEqual(output.AsSpan())); + } + + internal static class TdsEnums + { + public const int DEFAULT_LOGIN_PACKET_SIZE = 4096; + } + } + + [DebuggerStepThrough] + public sealed partial class LimitedMemoryStream : MemoryStream + { + private readonly int _readLimit; + private readonly int _delay; + + public LimitedMemoryStream(int readLimit = 0, int delay = 0) + { + _readLimit = readLimit; + _delay = delay; + } + + public LimitedMemoryStream(byte[] buffer, int readLimit = 0, int delay = 0) + : base(buffer) + { + _readLimit = readLimit; + _delay = delay; + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (_readLimit > 0) + { + return base.Read(buffer, offset, Math.Min(_readLimit, count)); + } + else + { + return base.Read(buffer, offset, count); + } + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + if (_delay > 0) + { + await Task.Delay(_delay, cancellationToken); + } + if (_readLimit > 0) + { + return await base.ReadAsync(buffer, offset, Math.Min(_readLimit, count), cancellationToken).ConfigureAwait(false); + } + else + { + return await base.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); + } + } + + } +} From 04faf29ec365330d9b1f48fb49e54bf59e7a7621 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Mon, 30 Mar 2020 12:17:03 +0100 Subject: [PATCH 2/8] remove ValueTuple for legacy framework compatibility --- .../SslOverTdsStreamTest.NetCoreApp.cs | 8 ++++++-- .../FunctionalTests/SslOverTdsStreamTest.cs | 16 +++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs index 479fa33610..5b6aa3ec2e 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs @@ -9,7 +9,9 @@ public static partial class SslOverTdsStreamTest { static partial void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { - (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + byte[] input; + byte[] output; + SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, (Stream stream, int index) => @@ -30,7 +32,9 @@ static partial void SyncCoreTest(int encapsulatedPacketCount, int passthroughPac static partial void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { - (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + byte[] input; + byte[] output; + SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, async (Stream stream, int index) => diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index 870bec7d55..9971a07291 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -25,7 +25,9 @@ public static void ReadWrite(int readLimit) private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { - (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); + byte[] input; + byte[] output; + SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, (Stream stream, int index) => @@ -48,8 +50,9 @@ private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketC private static void AsyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { - (byte[] input, byte[] output) = SetupArrays(encapsulatedPacketCount + passthroughPacketCount); - + byte[] input; + byte[] output; + SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, async (Stream stream, int index) => { @@ -195,11 +198,11 @@ private static byte[] WritePackets(int encapsulatedPacketCount, int passthroughP return buffer; } - private static (byte[] input, byte[] output) SetupArrays(int packetCount) + private static void SetupArrays(int packetCount, out byte[] input, out byte[] output) { byte[] pattern = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; - byte[] input = new byte[packetCount * TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; - byte[] output = new byte[input.Length]; + input = new byte[packetCount * TdsEnums.DEFAULT_LOGIN_PACKET_SIZE]; + output = new byte[input.Length]; for (int index = 0; index < packetCount; index++) { int position = 0; @@ -210,7 +213,6 @@ private static (byte[] input, byte[] output) SetupArrays(int packetCount) position += copyCount; } } - return (input, output); } private static void Validate(byte[] input, byte[] output) From 8d23d090f4f3c99dd881dc443517cd78baece7c3 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Mon, 30 Mar 2020 12:50:26 +0100 Subject: [PATCH 3/8] skip on netfx build because there is no implementation --- .../tests/FunctionalTests/SslOverTdsStreamTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index 9971a07291..7ea4f5e9ff 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -11,6 +11,7 @@ namespace Microsoft.Data.SqlClient.Tests public static partial class SslOverTdsStreamTest { [Theory] + [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)] [InlineData(0),InlineData(3),InlineData(128), InlineData(2048), InlineData(8192)] public static void ReadWrite(int readLimit) { From 6992eda846dc46b358f02c0c0b14af6eb74a21c1 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Sun, 5 Apr 2020 23:47:58 +0100 Subject: [PATCH 4/8] make rest run on netcore2.1 and fix spelling --- .../Microsoft.Data.SqlClient.Tests.csproj | 2 ++ .../tests/FunctionalTests/SslOverTdsStreamTest.cs | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj index b89599e628..541a309ab0 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj @@ -61,6 +61,8 @@ + + diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index 7ea4f5e9ff..8bac6177e0 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -15,13 +15,13 @@ public static partial class SslOverTdsStreamTest [InlineData(0),InlineData(3),InlineData(128), InlineData(2048), InlineData(8192)] public static void ReadWrite(int readLimit) { - const int EncapulatedPacketCount = 4; + const int EncaspulatedPacketCount = 4; const int PassThroughPacketCount = 5; - SyncTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); - SyncCoreTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); - AsyncTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); - AsyncCoreTest(EncapulatedPacketCount, PassThroughPacketCount, readLimit); + SyncTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); + SyncCoreTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); + AsyncTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); + AsyncCoreTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); } private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) From 11c44c6595845eda63c738eb2de2fa14efdd6ec3 Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Wed, 8 Apr 2020 00:34:03 +0100 Subject: [PATCH 5/8] make test netcore builds only and coalesce into a single file --- .../Microsoft.Data.SqlClient.Tests.csproj | 3 +- .../SslOverTdsStreamTest.NetCoreApp.cs | 88 ------------------- .../FunctionalTests/SslOverTdsStreamTest.cs | 75 +++++++++++++++- 3 files changed, 72 insertions(+), 94 deletions(-) delete mode 100644 src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj index 541a309ab0..a60e2c2d62 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/Microsoft.Data.SqlClient.Tests.csproj @@ -28,7 +28,6 @@ - @@ -63,7 +62,7 @@ - + diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs deleted file mode 100644 index 5b6aa3ec2e..0000000000 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.NetCoreApp.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.Data.SqlClient.Tests -{ - public static partial class SslOverTdsStreamTest - { - static partial void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) - { - byte[] input; - byte[] output; - SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); - - byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, - (Stream stream, int index) => - { - stream.Write(input.AsSpan(TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE)); - } - ); - - ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, - (Stream stream, byte[] bytes, int offset, int count) => - { - return stream.Read(bytes.AsSpan(offset, count)); - } - ); - - Validate(input, output); - } - - static partial void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) - { - byte[] input; - byte[] output; - SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); - - byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, - async (Stream stream, int index) => - { - await stream.WriteAsync( - new ReadOnlyMemory(input, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE) - ); - } - ); - - ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, - async (Stream stream, byte[] bytes, int offset, int count) => - { - return await stream.ReadAsync( - new Memory(bytes, offset, count) - ); - } - ); - - Validate(input, output); - } - } - - public sealed partial class LimitedMemoryStream : MemoryStream - { - public override int Read(Span destination) - { - if (_readLimit > 0) - { - return base.Read(destination.Slice(0, Math.Min(_readLimit, destination.Length))); - } - else - { - return base.Read(destination); - } - } - - public override ValueTask ReadAsync(Memory destination, CancellationToken cancellationToken = default) - { - - if (_readLimit > 0) - { - return base.ReadAsync(destination.Slice(0, Math.Min(_readLimit, destination.Length)), cancellationToken); - } - else - { - return base.ReadAsync(destination, cancellationToken); - } - } - } -} diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index 8bac6177e0..c05a448aa4 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -11,7 +11,6 @@ namespace Microsoft.Data.SqlClient.Tests public static partial class SslOverTdsStreamTest { [Theory] - [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)] [InlineData(0),InlineData(3),InlineData(128), InlineData(2048), InlineData(8192)] public static void ReadWrite(int readLimit) { @@ -47,8 +46,6 @@ private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketC Validate(input, output); } - static partial void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength); - private static void AsyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { byte[] input; @@ -71,8 +68,55 @@ private static void AsyncTest(int encapsulatedPacketCount, int passthroughPacket Validate(input, output); } - static partial void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength); + private static void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + { + byte[] input; + byte[] output; + SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); + + byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, + (Stream stream, int index) => + { + stream.Write(input.AsSpan(TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE)); + } + ); + + ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, + (Stream stream, byte[] bytes, int offset, int count) => + { + return stream.Read(bytes.AsSpan(offset, count)); + } + ); + + Validate(input, output); + } + + private static void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + { + byte[] input; + byte[] output; + SetupArrays(encapsulatedPacketCount + passthroughPacketCount, out input, out output); + + byte[] buffer = WritePackets(encapsulatedPacketCount, passthroughPacketCount, + async (Stream stream, int index) => + { + await stream.WriteAsync( + new ReadOnlyMemory(input, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE * index, TdsEnums.DEFAULT_LOGIN_PACKET_SIZE) + ); + } + ); + + ReadPackets(buffer, encapsulatedPacketCount, passthroughPacketCount, maxPacketReadLength, output, + async (Stream stream, byte[] bytes, int offset, int count) => + { + return await stream.ReadAsync( + new Memory(bytes, offset, count) + ); + } + ); + Validate(input, output); + } private static void ReadPackets(byte[] buffer, int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength, byte[] output, Func> action) @@ -273,6 +317,29 @@ public override async Task ReadAsync(byte[] buffer, int offset, int count, return await base.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); } } + public override int Read(Span destination) + { + if (_readLimit > 0) + { + return base.Read(destination.Slice(0, Math.Min(_readLimit, destination.Length))); + } + else + { + return base.Read(destination); + } + } + + public override ValueTask ReadAsync(Memory destination, CancellationToken cancellationToken = default) + { + if (_readLimit > 0) + { + return base.ReadAsync(destination.Slice(0, Math.Min(_readLimit, destination.Length)), cancellationToken); + } + else + { + return base.ReadAsync(destination, cancellationToken); + } + } } } From ab13d1e23931f45a3a4ddf17eae5d3e207fb462d Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Fri, 10 Apr 2020 00:46:29 +0100 Subject: [PATCH 6/8] address feedback --- .../tests/FunctionalTests/SslOverTdsStreamTest.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index c05a448aa4..4d0b208459 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -8,7 +8,7 @@ namespace Microsoft.Data.SqlClient.Tests { - public static partial class SslOverTdsStreamTest + public static class SslOverTdsStreamTest { [Theory] [InlineData(0),InlineData(3),InlineData(128), InlineData(2048), InlineData(8192)] @@ -181,7 +181,6 @@ private static void ReadPackets(byte[] buffer, int encapsulatedPacketCount, int offset += packetBytes; } } - } private static int ReadPacket(Stream tdsStream, Func action, byte[] output) @@ -331,7 +330,6 @@ public override int Read(Span destination) public override ValueTask ReadAsync(Memory destination, CancellationToken cancellationToken = default) { - if (_readLimit > 0) { return base.ReadAsync(destination.Slice(0, Math.Min(_readLimit, destination.Length)), cancellationToken); From 1b6591a1d88ef092b05492064dc674996215b4bd Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Wed, 15 Apr 2020 23:58:22 +0100 Subject: [PATCH 7/8] Add license header --- .../tests/FunctionalTests/SslOverTdsStreamTest.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index 4d0b208459..b4a7c6333b 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -1,4 +1,8 @@ -using System; +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; using System.Diagnostics; using System.IO; using System.Reflection; From c21872498fc7163d7559c0a6f302bde55f1b593e Mon Sep 17 00:00:00 2001 From: Wraith2 Date: Thu, 23 Apr 2020 00:24:06 +0100 Subject: [PATCH 8/8] address feedback --- .../FunctionalTests/SslOverTdsStreamTest.cs | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs index b4a7c6333b..56cc653744 100644 --- a/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs +++ b/src/Microsoft.Data.SqlClient/tests/FunctionalTests/SslOverTdsStreamTest.cs @@ -14,20 +14,29 @@ namespace Microsoft.Data.SqlClient.Tests { public static class SslOverTdsStreamTest { - [Theory] - [InlineData(0),InlineData(3),InlineData(128), InlineData(2048), InlineData(8192)] - public static void ReadWrite(int readLimit) + public static TheoryData PacketSizes { - const int EncaspulatedPacketCount = 4; - const int PassThroughPacketCount = 5; + get + { + const int EncapsulatedPacketCount = 4; + const int PassThroughPacketCount = 5; + + TheoryData data = new TheoryData(); - SyncTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); - SyncCoreTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); - AsyncTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); - AsyncCoreTest(EncaspulatedPacketCount, PassThroughPacketCount, readLimit); + data.Add(EncapsulatedPacketCount, PassThroughPacketCount, 0); + data.Add(EncapsulatedPacketCount, PassThroughPacketCount, 2); + data.Add(EncapsulatedPacketCount, PassThroughPacketCount, 128); + data.Add(EncapsulatedPacketCount, PassThroughPacketCount, 2048); + data.Add(EncapsulatedPacketCount, PassThroughPacketCount, 8192); + + return data; + } } - private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + + [Theory] + [MemberData(nameof(PacketSizes))] + public static void SyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { byte[] input; byte[] output; @@ -50,7 +59,9 @@ private static void SyncTest(int encapsulatedPacketCount, int passthroughPacketC Validate(input, output); } - private static void AsyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + [Theory] + [MemberData(nameof(PacketSizes))] + public static void AsyncTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { byte[] input; byte[] output; @@ -72,7 +83,9 @@ private static void AsyncTest(int encapsulatedPacketCount, int passthroughPacket Validate(input, output); } - private static void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + [Theory] + [MemberData(nameof(PacketSizes))] + public static void SyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { byte[] input; byte[] output; @@ -95,7 +108,9 @@ private static void SyncCoreTest(int encapsulatedPacketCount, int passthroughPac Validate(input, output); } - private static void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) + [Theory] + [MemberData(nameof(PacketSizes))] + public static void AsyncCoreTest(int encapsulatedPacketCount, int passthroughPacketCount, int maxPacketReadLength) { byte[] input; byte[] output; @@ -137,7 +152,7 @@ private static void ReadPackets(byte[] buffer, int encapsulatedPacketCount, int Array.Copy(bytes, 0, output, offset, packetBytes); offset += packetBytes; } - InvokeFinishHandshake(tdsStream);//tdsStream.FinishHandshake(); + InvokeFinishHandshake(tdsStream); for (int index = 0; index < passthroughPacketCount; index++) { Array.Clear(bytes, 0, bytes.Length); @@ -228,7 +243,6 @@ private static byte[] WritePackets(int encapsulatedPacketCount, int passthroughP byte[] buffer = null; using (LimitedMemoryStream stream = new LimitedMemoryStream()) { - //using (SslOverTdsStream tdsStream = new SslOverTdsStream(stream)) using (Stream tdsStream = CreateSslOverTdsStream(stream)) { for (int index = 0; index < encapsulatedPacketCount; index++)