From 8333d36a08733e2d53c2650750f3e4ded045eb12 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 26 Jun 2019 16:28:36 -0700 Subject: [PATCH 1/2] Deal with blocking HttpSys tests --- .../Listener/ResponseBodyTests.cs | 54 +++++++++++++++---- .../FunctionalTests/Listener/ServerTests.cs | 2 - .../test/FunctionalTests/ServerTests.cs | 2 +- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs index be87889ee75f..946cb55f2207 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ResponseBodyTests.cs @@ -239,10 +239,15 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeFirstWrite_ 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 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeFirstWriteA 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 @@ public async Task ResponseBody_ClientDisconnectsBeforeFirstWrite_WriteCompletesS 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 @@ public async Task ResponseBody_ClientDisconnectsBeforeFirstWriteAsync_WriteCompl 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 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeSecondWrite 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 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeSecondWrite 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 @@ public async Task ResponseBodyWriteExceptions_ClientDisconnectsBeforeSecondWrite 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 @@ public async Task ResponseBody_ClientDisconnectsBeforeSecondWrite_WriteCompletes 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 @@ public async Task ResponseBody_ClientDisconnectsBeforeSecondWriteAsync_WriteComp 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 bb14512fa88b..348f559e2ef3 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs @@ -38,7 +38,6 @@ public async Task Server_TokenRegisteredAfterClientDisconnects_CallCanceled() 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); @@ -71,7 +70,6 @@ public async Task Server_TokenRegisteredAfterResponseSent_Success() 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 701931e85a31..3e6734ab0491 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs @@ -227,7 +227,7 @@ public async Task Server_ClientDisconnects_CallCanceled() 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"); })) { From 5b9ba253f26eaeb3b1439d79020876632498bb0c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 27 Jun 2019 07:43:55 -0700 Subject: [PATCH 2/2] Reorder --- .../HttpSys/test/FunctionalTests/Listener/ServerTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs index 348f559e2ef3..0cdaeabd37fc 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerTests.cs @@ -38,9 +38,8 @@ public async Task Server_TokenRegisteredAfterClientDisconnects_CallCanceled() var ct = context.DisconnectToken; Assert.True(ct.CanBeCanceled, "CanBeCanceled"); ct.Register(() => canceled.SetResult(0)); - Assert.True(ct.IsCancellationRequested, "IsCancellationRequested"); - await canceled.Task.TimeoutAfter(interval); + Assert.True(ct.IsCancellationRequested, "IsCancellationRequested"); context.Dispose(); }