diff --git a/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs b/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs index b76c887a445e..645f0538f95f 100644 --- a/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs +++ b/src/Servers/Kestrel/Core/test/ConcurrentPipeWriterTests.cs @@ -24,39 +24,54 @@ public async Task PassthroughIfAllFlushesAreAwaited() new TaskCompletionSource(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 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); } }