Deal with blocking HttpSys tests (#11628)

This commit is contained in:
Chris Ross 2019-06-27 14:11:53 -07:00 committed by GitHub
parent 2e7c52d97c
commit 2745349822
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 16 deletions

View File

@ -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<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));
// Make sure the client is aborted
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => responseTask);
Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await disconnectCts.Task.WithTimeout();
Assert.Throws<IOException>(() =>
{
// 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<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));
// First write sends headers
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => responseTask);
await disconnectCts.Task.WithTimeout();
Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
await Assert.ThrowsAsync<IOException>(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<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => 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<int>(TaskCreationOptions.RunContinuationsAsynchronously);
context.DisconnectToken.Register(() => disconnectCts.SetResult(0));
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => 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<int>(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<IOException>(() =>
{
// 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<int>(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<IOException>(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<int>(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<int>(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++)
{

View File

@ -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");

View File

@ -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");
}))
{