diff --git a/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs b/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs index b76c887a445e60841b5e5b4a1b1d17dbeae870cf..645f0538f95f79fd0c1fcb07a37e827402616e54 100644 --- a/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs +++ b/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs @@ -24,39 +24,54 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests new TaskCompletionSource<FlushResult>(TaskCreationOptions.RunContinuationsAsynchronously), }; + var sync = new object(); var mockPipeWriter = new MockPipeWriter(pipeWriterFlushTcsArray); + var concurrentPipeWriter = new ConcurrentPipeWriter(mockPipeWriter, diagnosticPool, sync); - // No need to pass in a real sync object since all the calls in this test are passthrough. - var concurrentPipeWriter = new ConcurrentPipeWriter(mockPipeWriter, diagnosticPool, new object()); + ValueTask<FlushResult> flushTask; - var memory = concurrentPipeWriter.GetMemory(); - Assert.Equal(1, mockPipeWriter.GetMemoryCallCount); + lock (sync) + { + var memory = concurrentPipeWriter.GetMemory(); + Assert.Equal(1, mockPipeWriter.GetMemoryCallCount); - concurrentPipeWriter.Advance(memory.Length); - Assert.Equal(1, mockPipeWriter.AdvanceCallCount); + concurrentPipeWriter.Advance(memory.Length); + Assert.Equal(1, mockPipeWriter.AdvanceCallCount); - var flushTask0 = concurrentPipeWriter.FlushAsync(); - Assert.Equal(1, mockPipeWriter.FlushCallCount); + flushTask = concurrentPipeWriter.FlushAsync(); + Assert.Equal(1, mockPipeWriter.FlushCallCount); - pipeWriterFlushTcsArray[0].SetResult(default); + pipeWriterFlushTcsArray[0].SetResult(default); + } - await flushTask0.DefaultTimeout(); + await flushTask.DefaultTimeout(); - memory = concurrentPipeWriter.GetMemory(); - Assert.Equal(2, mockPipeWriter.GetMemoryCallCount); + lock (sync) + { + var memory = concurrentPipeWriter.GetMemory(); + Assert.Equal(2, mockPipeWriter.GetMemoryCallCount); - concurrentPipeWriter.Advance(memory.Length); - Assert.Equal(2, mockPipeWriter.AdvanceCallCount); + concurrentPipeWriter.Advance(memory.Length); + Assert.Equal(2, mockPipeWriter.AdvanceCallCount); - var flushTask1 = concurrentPipeWriter.FlushAsync(); - Assert.Equal(2, mockPipeWriter.FlushCallCount); + flushTask = concurrentPipeWriter.FlushAsync(); + Assert.Equal(2, mockPipeWriter.FlushCallCount); - pipeWriterFlushTcsArray[1].SetResult(default); + pipeWriterFlushTcsArray[1].SetResult(default); + } - await flushTask1.DefaultTimeout(); + await flushTask.DefaultTimeout(); var completeEx = new Exception(); - await concurrentPipeWriter.CompleteAsync(completeEx).DefaultTimeout(); + ValueTask completeTask; + + lock (sync) + { + completeTask = concurrentPipeWriter.CompleteAsync(completeEx); + } + + await completeTask.DefaultTimeout(); + Assert.Same(completeEx, mockPipeWriter.CompleteException); } }