From 3deadcfc767074093899765821172edcac10f76b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Fri, 18 Feb 2022 14:46:35 +0100 Subject: [PATCH] Improve PipeWriterTests.CompleteWithLargeWriteThrows (#65506) Allocate the buffer outside of the loop so we don't hit OOM issues. While looking at the test I noticed that it actually had a bug too: Nothing was asserting that we indeed throw an InvalidOperationException when the writer is completed. Adding `Assert.ThrowsAsync` revealed that the current loop iteration count was too low to hit the exception reliably within the 10ms delay so instead check for the execution time. Fixes https://github.com/dotnet/runtime/issues/64930 --- .../tests/PipeWriterTests.cs | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/libraries/System.IO.Pipelines/tests/PipeWriterTests.cs b/src/libraries/System.IO.Pipelines/tests/PipeWriterTests.cs index 8d94e720bf12c..d7edb408ec3a3 100644 --- a/src/libraries/System.IO.Pipelines/tests/PipeWriterTests.cs +++ b/src/libraries/System.IO.Pipelines/tests/PipeWriterTests.cs @@ -228,33 +228,35 @@ public async Task WritesUsingGetMemoryWorks() pipe.Reader.Complete(); } - [Fact] - [SkipOnPlatform(TestPlatforms.Browser, "allocates too much memory")] + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsThreadingSupported))] public async Task CompleteWithLargeWriteThrows() { + var completeDelay = TimeSpan.FromMilliseconds(10); + var testTimeout = TimeSpan.FromMilliseconds(10000); var pipe = new Pipe(); pipe.Reader.Complete(); var task = Task.Run(async () => { - await Task.Delay(10); + await Task.Delay(completeDelay); pipe.Writer.Complete(); }); - try + // Complete while writing + await Assert.ThrowsAsync(async () => { - for (int i = 0; i < 1000; i++) + var testStartTime = DateTime.UtcNow; + var buffer = new byte[10000000]; + ulong i = 0; + while (true) { - var buffer = new byte[10000000]; await pipe.Writer.WriteAsync(buffer); - } - } - catch (InvalidOperationException) - { - // Complete while writing - } - await task; + // abort test if we're executing for more than the testTimeout (check every 10000th iteration) + if (i++ % 10000 == 0 && DateTime.UtcNow - testStartTime > testTimeout) + break; + } + }); } [Fact]