From 65fc6fcdb0f46f945b4bcd1b9d38a9fe47a729de Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Thu, 5 Nov 2020 15:28:56 -0500 Subject: [PATCH] Tighten argument validation in StreamConformanceTests --- .../Tests/System/IO/StreamConformanceTests.cs | 60 ++++++++----------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/src/libraries/Common/tests/Tests/System/IO/StreamConformanceTests.cs b/src/libraries/Common/tests/Tests/System/IO/StreamConformanceTests.cs index 309a3403889893..5a7c8e8386e0ab 100644 --- a/src/libraries/Common/tests/Tests/System/IO/StreamConformanceTests.cs +++ b/src/libraries/Common/tests/Tests/System/IO/StreamConformanceTests.cs @@ -268,7 +268,6 @@ protected async Task ValidateMisuseExceptionsAsync(Stream stream) // Null arguments foreach ((int offset, int count) in new[] { (0, 0), (1, 2) }) // validate 0, 0 isn't special-cased to be allowed with a null buffer { - AssertExtensions.Throws(ReadWriteBufferName, () => { stream.Read(null!, offset, count); }); AssertExtensions.Throws(ReadWriteBufferName, () => { stream.Read(null!, offset, count); }); AssertExtensions.Throws(ReadWriteBufferName, () => { stream.ReadAsync(null!, offset, count); }); AssertExtensions.Throws(ReadWriteBufferName, () => { stream.ReadAsync(null!, offset, count, default); }); @@ -281,28 +280,23 @@ protected async Task ValidateMisuseExceptionsAsync(Stream stream) AssertExtensions.Throws(ReadWriteOffsetName, () => { stream.ReadAsync(oneByteBuffer, -1, 0); }); AssertExtensions.Throws(ReadWriteOffsetName, () => { stream.ReadAsync(oneByteBuffer, -1, 0, default); }); AssertExtensions.Throws(ReadWriteOffsetName, () => { stream.EndRead(stream.BeginRead(oneByteBuffer, -1, 0, iar => { }, new object())); }); - Assert.ThrowsAny(() => { stream.Read(oneByteBuffer, 2, 0); }); - Assert.ThrowsAny(() => { stream.ReadAsync(oneByteBuffer, 2, 0); }); - Assert.ThrowsAny(() => { stream.ReadAsync(oneByteBuffer, 2, 0, default); }); - Assert.ThrowsAny(() => { stream.EndRead(stream.BeginRead(oneByteBuffer, 2, 0, iar => { }, new object())); }); // Invalid count - AssertExtensions.Throws(ReadWriteCountName, () => { stream.Read(oneByteBuffer, 0, -1); }); - AssertExtensions.Throws(ReadWriteCountName, () => { stream.ReadAsync(oneByteBuffer, 0, -1); }); - AssertExtensions.Throws(ReadWriteCountName, () => { stream.ReadAsync(oneByteBuffer, 0, -1, default); }); - AssertExtensions.Throws(ReadWriteCountName, () => { stream.EndRead(stream.BeginRead(oneByteBuffer, 0, -1, iar => { }, new object())); }); - Assert.ThrowsAny(() => { stream.Read(oneByteBuffer, 0, 2); }); - Assert.ThrowsAny(() => { stream.ReadAsync(oneByteBuffer, 0, 2); }); - Assert.ThrowsAny(() => { stream.ReadAsync(oneByteBuffer, 0, 2, default); }); - Assert.ThrowsAny(() => { stream.EndRead(stream.BeginRead(oneByteBuffer, 0, 2, iar => { }, new object())); }); + foreach (int count in new[] { -1, 2 }) + { + AssertExtensions.Throws(ReadWriteCountName, () => { stream.Read(oneByteBuffer, 0, count); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.ReadAsync(oneByteBuffer, 0, count); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.ReadAsync(oneByteBuffer, 0, count, default); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.EndRead(stream.BeginRead(oneByteBuffer, 0, count, iar => { }, new object())); }); + } // Invalid offset + count - foreach ((int invalidOffset, int invalidCount) in new[] { (1, 1) }) + foreach ((int invalidOffset, int invalidCount) in new[] { (1, 1), (2, 0), (int.MaxValue, int.MaxValue) }) { - Assert.ThrowsAny(() => { stream.Read(oneByteBuffer, invalidOffset, invalidCount); }); - Assert.ThrowsAny(() => { stream.ReadAsync(oneByteBuffer, invalidOffset, invalidCount); }); - Assert.ThrowsAny(() => { stream.ReadAsync(oneByteBuffer, invalidOffset, invalidCount, default); }); - Assert.ThrowsAny(() => { stream.EndRead(stream.BeginRead(oneByteBuffer, invalidOffset, invalidCount, iar => { }, new object())); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.Read(oneByteBuffer, invalidOffset, invalidCount); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.ReadAsync(oneByteBuffer, invalidOffset, invalidCount); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.ReadAsync(oneByteBuffer, invalidOffset, invalidCount, default); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.EndRead(stream.BeginRead(oneByteBuffer, invalidOffset, invalidCount, iar => { }, new object())); }); } // Unknown arguments @@ -365,23 +359,18 @@ protected async Task ValidateMisuseExceptionsAsync(Stream stream) AssertExtensions.Throws(ReadWriteOffsetName, () => { stream.WriteAsync(oneByteBuffer, -1, 0); }); AssertExtensions.Throws(ReadWriteOffsetName, () => { stream.WriteAsync(oneByteBuffer, -1, 0, default); }); AssertExtensions.Throws(ReadWriteOffsetName, () => { stream.EndWrite(stream.BeginWrite(oneByteBuffer, -1, 0, iar => { }, new object())); }); - Assert.ThrowsAny(() => { stream.Write(oneByteBuffer, 2, 0); }); - Assert.ThrowsAny(() => { stream.WriteAsync(oneByteBuffer, 2, 0); }); - Assert.ThrowsAny(() => { stream.WriteAsync(oneByteBuffer, 2, 0, default); }); - Assert.ThrowsAny(() => { stream.EndWrite(stream.BeginWrite(oneByteBuffer, 2, 0, iar => { }, new object())); }); // Invalid count - AssertExtensions.Throws(ReadWriteCountName, () => { stream.Write(oneByteBuffer, 0, -1); }); - AssertExtensions.Throws(ReadWriteCountName, () => { stream.WriteAsync(oneByteBuffer, 0, -1); }); - AssertExtensions.Throws(ReadWriteCountName, () => { stream.WriteAsync(oneByteBuffer, 0, -1, default); }); - AssertExtensions.Throws(ReadWriteCountName, () => { stream.EndWrite(stream.BeginWrite(oneByteBuffer, 0, -1, iar => { }, new object())); }); - Assert.ThrowsAny(() => { stream.Write(oneByteBuffer, 0, 2); }); - Assert.ThrowsAny(() => { stream.WriteAsync(oneByteBuffer, 0, 2); }); - Assert.ThrowsAny(() => { stream.WriteAsync(oneByteBuffer, 0, 2, default); }); - Assert.ThrowsAny(() => { stream.EndWrite(stream.BeginWrite(oneByteBuffer, 0, 2, iar => { }, new object())); }); + foreach (int count in new[] { -1, 2 }) + { + AssertExtensions.Throws(ReadWriteCountName, () => { stream.Write(oneByteBuffer, 0, count); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.WriteAsync(oneByteBuffer, 0, count); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.WriteAsync(oneByteBuffer, 0, count, default); }); + AssertExtensions.Throws(ReadWriteCountName, () => { stream.EndWrite(stream.BeginWrite(oneByteBuffer, 0, count, iar => { }, new object())); }); + } // Invalid offset + count - foreach ((int invalidOffset, int invalidCount) in new[] { (1, 1) }) + foreach ((int invalidOffset, int invalidCount) in new[] { (1, 1), (2, 0), (int.MaxValue, int.MaxValue) }) { Assert.ThrowsAny(() => { stream.Write(oneByteBuffer, invalidOffset, invalidCount); }); Assert.ThrowsAny(() => { stream.WriteAsync(oneByteBuffer, invalidOffset, invalidCount); }); @@ -430,10 +419,11 @@ protected async Task ValidateMisuseExceptionsAsync(Stream stream) Assert.Equal(CanTimeout, stream.CanTimeout); if (stream.CanTimeout) { - Assert.Throws(() => stream.ReadTimeout = 0); - Assert.Throws(() => stream.ReadTimeout = -2); - Assert.Throws(() => stream.WriteTimeout = 0); - Assert.Throws(() => stream.WriteTimeout = -2); + foreach (int timeout in new[] { 0, -2 }) + { + Assert.Throws(() => stream.ReadTimeout = timeout); + Assert.Throws(() => stream.WriteTimeout = timeout); + } } else {