diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs index be87889ee7..946cb55f22 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs @@ -239,10 +239,15 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var responseTask = SendRequestAsync(address, cts.Token); var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); - // First write sends headers + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + + // Make sure the client is aborted cts.Cancel(); await Assert.ThrowsAnyAsync(() => responseTask); - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); + await disconnectCts.Task.WithTimeout(); + Assert.Throws(() => { // It can take several tries before Write notices the disconnect. @@ -270,11 +275,14 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + // First write sends headers cts.Cancel(); await Assert.ThrowsAnyAsync(() => responseTask); + await disconnectCts.Task.WithTimeout(); - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); await Assert.ThrowsAsync(async () => { // It can take several tries before Write notices the disconnect. @@ -301,10 +309,14 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener server.Options.AllowSynchronousIO = true; var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); - // First write sends headers + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + cts.Cancel(); await Assert.ThrowsAnyAsync(() => responseTask); - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); + await disconnectCts.Task.WithTimeout(); + // It can take several tries before Write notices the disconnect. for (int i = 0; i < Utilities.WriteRetryLimit; i++) { @@ -324,10 +336,14 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var responseTask = SendRequestAsync(address, cts.Token); var context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); - // First write sends headers + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + cts.Cancel(); await Assert.ThrowsAnyAsync(() => responseTask); - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); + await disconnectCts.Task.WithTimeout(); + // It can take several tries before Write notices the disconnect. for (int i = 0; i < Utilities.WriteRetryLimit; i++) { @@ -350,6 +366,10 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead); context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + // First write sends headers context.AllowSynchronousIO = true; context.Response.Body.Write(new byte[10], 0, 10); @@ -357,9 +377,9 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var response = await responseTask; response.EnsureSuccessStatusCode(); response.Dispose(); + await disconnectCts.Task.WithTimeout(); } - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); Assert.Throws(() => { // It can take several tries before Write notices the disconnect. @@ -385,15 +405,19 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead); context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + // First write sends headers await context.Response.Body.WriteAsync(new byte[10], 0, 10); var response = await responseTask; response.EnsureSuccessStatusCode(); response.Dispose(); + await disconnectCts.Task.WithTimeout(); } - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); await Assert.ThrowsAsync(async () => { // It can take several tries before Write notices the disconnect. @@ -419,15 +443,19 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead); context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + // First write sends headers context.Response.Body.Write(new byte[10], 0, 10); var response = await responseTask; response.EnsureSuccessStatusCode(); response.Dispose(); + await disconnectCts.Task.WithTimeout(); } - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); // It can take several tries before Write notices the disconnect. for (int i = 0; i < Utilities.WriteRetryLimit; i++) { @@ -449,15 +477,19 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead); context = await server.AcceptAsync(Utilities.DefaultTimeout).Before(responseTask); + + var disconnectCts = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + context.DisconnectToken.Register(() => disconnectCts.SetResult(0)); + // First write sends headers await context.Response.Body.WriteAsync(new byte[10], 0, 10); var response = await responseTask; response.EnsureSuccessStatusCode(); response.Dispose(); + await disconnectCts.Task.WithTimeout(); } - Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5))); // It can take several tries before Write notices the disconnect. for (int i = 0; i < Utilities.WriteRetryLimit; i++) { diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs index bb14512fa8..0cdaeabd37 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs @@ -38,10 +38,8 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var ct = context.DisconnectToken; Assert.True(ct.CanBeCanceled, "CanBeCanceled"); ct.Register(() => canceled.SetResult(0)); - Assert.True(ct.WaitHandle.WaitOne(interval)); - Assert.True(ct.IsCancellationRequested, "IsCancellationRequested"); - await canceled.Task.TimeoutAfter(interval); + Assert.True(ct.IsCancellationRequested, "IsCancellationRequested"); context.Dispose(); } @@ -71,7 +69,6 @@ namespace Microsoft.AspNetCore.Server.HttpSys.Listener var ct = context.DisconnectToken; Assert.False(ct.CanBeCanceled, "CanBeCanceled"); ct.Register(() => canceled.SetResult(0)); - Assert.False(ct.WaitHandle.WaitOne(interval)); Assert.False(ct.IsCancellationRequested, "IsCancellationRequested"); Assert.False(canceled.Task.IsCompleted, "canceled"); diff --git a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs index 999e19de7b..b4ffb1ac22 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs @@ -193,7 +193,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys ct.Register(() => canceled.SetResult(0)); received.SetResult(0); await aborted.Task.TimeoutAfter(interval); - Assert.True(ct.WaitHandle.WaitOne(interval), "CT Wait"); + await canceled.Task.TimeoutAfter(interval); Assert.True(ct.IsCancellationRequested, "IsCancellationRequested"); })) {