From cd886802fe81853ffd4f22119b278cba2fee1ca4 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 10 Aug 2016 15:49:02 -0700 Subject: [PATCH] Fix race condition in new OnStarting and OnCompleted tests. --- .../ResponseTests.cs | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/ResponseTests.cs b/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/ResponseTests.cs index 8fcbe69d4e..002003ac36 100644 --- a/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/ResponseTests.cs +++ b/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/ResponseTests.cs @@ -19,6 +19,7 @@ using System; using System.IO; using System.Net; using System.Net.Http; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Features; using Xunit; @@ -135,21 +136,21 @@ namespace Microsoft.AspNetCore.Server.WebListener [Fact] public async Task Response_Empty_CallsOnStartingAndOnCompleted() { - var onStartingCalled = false; - var onCompletedCalled = false; + var onStartingCalled = new ManualResetEvent(false); + var onCompletedCalled = new ManualResetEvent(false); string address; using (Utilities.CreateHttpServer(out address, httpContext => { httpContext.Response.OnStarting(state => { - onStartingCalled = true; Assert.Same(state, httpContext); + onStartingCalled.Set(); return Task.FromResult(0); }, httpContext); httpContext.Response.OnCompleted(state => { - onCompletedCalled = true; Assert.Same(state, httpContext); + onCompletedCalled.Set(); return Task.FromResult(0); }, httpContext); return Task.FromResult(0); @@ -157,28 +158,29 @@ namespace Microsoft.AspNetCore.Server.WebListener { var response = await SendRequestAsync(address); Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.True(onStartingCalled); - Assert.True(onCompletedCalled); + Assert.True(onStartingCalled.WaitOne(0)); + // Fires after the response completes + Assert.True(onCompletedCalled.WaitOne(TimeSpan.FromSeconds(5))); } } [Fact] public async Task Response_OnStartingThrows_StillCallsOnCompleted() { - var onStartingCalled = false; - var onCompletedCalled = false; + var onStartingCalled = new ManualResetEvent(false); + var onCompletedCalled = new ManualResetEvent(false); string address; using (Utilities.CreateHttpServer(out address, httpContext => { httpContext.Response.OnStarting(state => { - onStartingCalled = true; + onStartingCalled.Set(); throw new Exception("Failed OnStarting"); }, httpContext); httpContext.Response.OnCompleted(state => { - onCompletedCalled = true; Assert.Same(state, httpContext); + onCompletedCalled.Set(); return Task.FromResult(0); }, httpContext); return Task.FromResult(0); @@ -186,28 +188,29 @@ namespace Microsoft.AspNetCore.Server.WebListener { var response = await SendRequestAsync(address); Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); - Assert.True(onStartingCalled); - Assert.True(onCompletedCalled); + Assert.True(onStartingCalled.WaitOne(0)); + // Fires after the response completes + Assert.True(onCompletedCalled.WaitOne(TimeSpan.FromSeconds(5))); } } [Fact] public async Task Response_OnStartingThrowsAfterWrite_WriteThrowsAndStillCallsOnCompleted() { - var onStartingCalled = false; - var onCompletedCalled = false; + var onStartingCalled = new ManualResetEvent(false); + var onCompletedCalled = new ManualResetEvent(false); string address; using (Utilities.CreateHttpServer(out address, httpContext => { httpContext.Response.OnStarting(state => { - onStartingCalled = true; + onStartingCalled.Set(); throw new InvalidTimeZoneException("Failed OnStarting"); }, httpContext); httpContext.Response.OnCompleted(state => { - onCompletedCalled = true; Assert.Same(state, httpContext); + onCompletedCalled.Set(); return Task.FromResult(0); }, httpContext); Assert.Throws(() => httpContext.Response.Body.Write(new byte[10], 0, 10)); @@ -216,8 +219,9 @@ namespace Microsoft.AspNetCore.Server.WebListener { var response = await SendRequestAsync(address); Assert.Equal(HttpStatusCode.OK, response.StatusCode); - Assert.True(onStartingCalled); - Assert.True(onCompletedCalled); + Assert.True(onStartingCalled.WaitOne(0)); + // Fires after the response completes + Assert.True(onCompletedCalled.WaitOne(TimeSpan.FromSeconds(5))); } }