add test timeout to autobahn conformance tests (#129)

This commit is contained in:
Andrew Stanton-Nurse 2016-11-02 14:02:48 -07:00 committed by GitHub
parent 68839d76e3
commit b3f755dff3
3 changed files with 42 additions and 14 deletions

View File

@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
Spec = baseSpec; Spec = baseSpec;
} }
public async Task<AutobahnResult> Run() public async Task<AutobahnResult> Run(CancellationToken cancellationToken)
{ {
var specFile = Path.GetTempFileName(); var specFile = Path.GetTempFileName();
try try
@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
// Run the test (write something to the console so people know this will take a while...) // Run the test (write something to the console so people know this will take a while...)
_logger.LogInformation("Now launching Autobahn Test Suite. This will take a while."); _logger.LogInformation("Now launching Autobahn Test Suite. This will take a while.");
var exitCode = await Wstest.Default.ExecAsync("-m fuzzingclient -s " + specFile); var exitCode = await Wstest.Default.ExecAsync("-m fuzzingclient -s " + specFile, cancellationToken);
if (exitCode != 0) if (exitCode != 0)
{ {
throw new Exception("wstest failed"); throw new Exception("wstest failed");
@ -57,6 +57,8 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
} }
} }
cancellationToken.ThrowIfCancellationRequested();
// Parse the output. // Parse the output.
var outputFile = Path.Combine(Directory.GetCurrentDirectory(), Spec.OutputDirectory, "index.json"); var outputFile = Path.Combine(Directory.GetCurrentDirectory(), Spec.OutputDirectory, "index.json");
using (var reader = new StreamReader(File.OpenRead(outputFile))) using (var reader = new StreamReader(File.OpenRead(outputFile)))
@ -84,7 +86,7 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
Assert.True(failures.Length == 0, "Autobahn results did not meet expectations:" + Environment.NewLine + failures.ToString()); Assert.True(failures.Length == 0, "Autobahn results did not meet expectations:" + Environment.NewLine + failures.ToString());
} }
public async Task DeployTestAndAddToSpec(ServerType server, bool ssl, string environment, Action<AutobahnExpectations> expectationConfig = null) public async Task DeployTestAndAddToSpec(ServerType server, bool ssl, string environment, CancellationToken cancellationToken, Action<AutobahnExpectations> expectationConfig = null)
{ {
var port = Interlocked.Increment(ref _nextPort); var port = Interlocked.Increment(ref _nextPort);
var baseUrl = ssl ? $"https://localhost:{port}" : $"http://localhost:{port}"; var baseUrl = ssl ? $"https://localhost:{port}" : $"http://localhost:{port}";
@ -104,6 +106,7 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
var deployer = ApplicationDeployerFactory.Create(parameters, logger); var deployer = ApplicationDeployerFactory.Create(parameters, logger);
var result = deployer.Deploy(); var result = deployer.Deploy();
_deployers.Add(deployer); _deployers.Add(deployer);
cancellationToken.ThrowIfCancellationRequested();
#if NET451 #if NET451
System.Net.ServicePointManager.ServerCertificateValidationCallback = (_, __, ___, ____) => true; System.Net.ServicePointManager.ServerCertificateValidationCallback = (_, __, ___, ____) => true;
@ -123,10 +126,13 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
// Make sure the server works // Make sure the server works
var resp = await RetryHelper.RetryRequest(() => var resp = await RetryHelper.RetryRequest(() =>
{ {
cancellationToken.ThrowIfCancellationRequested();
return client.GetAsync(result.ApplicationBaseUri); return client.GetAsync(result.ApplicationBaseUri);
}, logger, result.HostShutdownToken, retryCount: 5); }, logger, CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, result.HostShutdownToken).Token, retryCount: 5);
resp.EnsureSuccessStatusCode(); resp.EnsureSuccessStatusCode();
cancellationToken.ThrowIfCancellationRequested();
// Add to the current spec // Add to the current spec
var wsUrl = result.ApplicationBaseUri.Replace("https://", "wss://").Replace("http://", "ws://"); var wsUrl = result.ApplicationBaseUri.Replace("https://", "wss://").Replace("http://", "ws://");
Spec.WithServer(name, wsUrl); Spec.WithServer(name, wsUrl);
@ -134,6 +140,8 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
var expectations = new AutobahnExpectations(server, ssl, environment); var expectations = new AutobahnExpectations(server, ssl, environment);
expectationConfig?.Invoke(expectations); expectationConfig?.Invoke(expectations);
_expectations.Add(expectations); _expectations.Add(expectations);
cancellationToken.ThrowIfCancellationRequested();
} }
public void Dispose() public void Dispose()

View File

@ -2,6 +2,7 @@
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
@ -30,7 +31,7 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
return null; return null;
} }
public Task<int> ExecAsync(string args) public async Task<int> ExecAsync(string args, CancellationToken cancellationToken)
{ {
var process = new Process() var process = new Process()
{ {
@ -44,11 +45,23 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest.Autobahn
}; };
var tcs = new TaskCompletionSource<int>(); var tcs = new TaskCompletionSource<int>();
process.Exited += (_, __) => tcs.TrySetResult(process.ExitCode); using (cancellationToken.Register(() => Cancel(process, tcs)))
{
process.Exited += (_, __) => tcs.TrySetResult(process.ExitCode);
process.Start(); process.Start();
return tcs.Task; return await tcs.Task;
}
}
private static void Cancel(Process process, TaskCompletionSource<int> tcs)
{
if (process != null && !process.HasExited)
{
process.Kill();
}
tcs.TrySetCanceled();
} }
} }
} }

View File

@ -3,6 +3,7 @@ using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Server.IntegrationTesting; using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Testing.xunit; using Microsoft.AspNetCore.Testing.xunit;
@ -39,20 +40,23 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest
var loggerFactory = new LoggerFactory(); // No logging by default! It's very loud... var loggerFactory = new LoggerFactory(); // No logging by default! It's very loud...
if(string.Equals(Environment.GetEnvironmentVariable("AUTOBAHN_SUITES_LOG"), "1", StringComparison.Ordinal)) if (string.Equals(Environment.GetEnvironmentVariable("AUTOBAHN_SUITES_LOG"), "1", StringComparison.Ordinal))
{ {
loggerFactory.AddConsole(); loggerFactory.AddConsole();
} }
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromMinutes(5)); // These tests generally complete in just over 1 minute.
AutobahnResult result; AutobahnResult result;
using (var tester = new AutobahnTester(loggerFactory, spec)) using (var tester = new AutobahnTester(loggerFactory, spec))
{ {
await tester.DeployTestAndAddToSpec(ServerType.Kestrel, ssl: false, environment: "ManagedSockets"); await tester.DeployTestAndAddToSpec(ServerType.Kestrel, ssl: false, environment: "ManagedSockets", cancellationToken: cts.Token);
// Windows-only IIS tests, and Kestrel SSL tests (due to: https://github.com/aspnet/WebSockets/issues/102) // Windows-only IIS tests, and Kestrel SSL tests (due to: https://github.com/aspnet/WebSockets/issues/102)
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{ {
await tester.DeployTestAndAddToSpec(ServerType.Kestrel, ssl: true, environment: "ManagedSockets"); await tester.DeployTestAndAddToSpec(ServerType.Kestrel, ssl: true, environment: "ManagedSockets", cancellationToken: cts.Token);
if (IsWindows8OrHigher()) if (IsWindows8OrHigher())
{ {
@ -60,12 +64,12 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest
{ {
// IIS Express tests are a bit flaky, some tests fail occasionally or get non-strict passes // IIS Express tests are a bit flaky, some tests fail occasionally or get non-strict passes
// https://github.com/aspnet/WebSockets/issues/100 // https://github.com/aspnet/WebSockets/issues/100
await tester.DeployTestAndAddToSpec(ServerType.IISExpress, ssl: false, environment: "ManagedSockets", expectationConfig: expect => expect await tester.DeployTestAndAddToSpec(ServerType.IISExpress, ssl: false, environment: "ManagedSockets", cancellationToken: cts.Token, expectationConfig: expect => expect
.OkOrFail(Enumerable.Range(1, 20).Select(i => $"5.{i}").ToArray()) // 5.* occasionally fail on IIS express .OkOrFail(Enumerable.Range(1, 20).Select(i => $"5.{i}").ToArray()) // 5.* occasionally fail on IIS express
.OkOrNonStrict("3.2", "3.3", "3.4", "4.1.3", "4.1.4", "4.1.5", "4.2.3", "4.2.4", "4.2.5", "5.15")); // These occasionally get non-strict results .OkOrNonStrict("3.2", "3.3", "3.4", "4.1.3", "4.1.4", "4.1.5", "4.2.3", "4.2.4", "4.2.5", "5.15")); // These occasionally get non-strict results
} }
await tester.DeployTestAndAddToSpec(ServerType.WebListener, ssl: false, environment: "ManagedSockets", expectationConfig: expect => expect await tester.DeployTestAndAddToSpec(ServerType.WebListener, ssl: false, environment: "ManagedSockets", cancellationToken: cts.Token, expectationConfig: expect => expect
.OkOrNonStrict("4.2.4")); .OkOrNonStrict("4.2.4"));
} }
} }
@ -73,9 +77,12 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest
// REQUIRES a build of WebListener that supports native WebSockets, which we don't have right now // REQUIRES a build of WebListener that supports native WebSockets, which we don't have right now
//await tester.DeployTestAndAddToSpec(ServerType.WebListener, ssl: false, environment: "NativeSockets"); //await tester.DeployTestAndAddToSpec(ServerType.WebListener, ssl: false, environment: "NativeSockets");
result = await tester.Run(); result = await tester.Run(cts.Token);
tester.Verify(result); tester.Verify(result);
} }
// If it hasn't been cancelled yet, cancel the token just to be sure
cts.Cancel();
} }
private bool IsWindows8OrHigher() private bool IsWindows8OrHigher()