From 70483af8dda091c2008e7a45a78fb404d249fa76 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 27 Nov 2018 11:37:16 -0800 Subject: [PATCH 1/4] Create Hosting.sln to fix tests --- src/Hosting/Hosting.sln | 85 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/Hosting/Hosting.sln diff --git a/src/Hosting/Hosting.sln b/src/Hosting/Hosting.sln new file mode 100644 index 0000000000..492fe83c77 --- /dev/null +++ b/src/Hosting/Hosting.sln @@ -0,0 +1,85 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27428.2037 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting", "Hosting\src\Microsoft.AspNetCore.Hosting.csproj", "{254295FC-35AF-4A45-A6F4-FF93C1B7CD8D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Tests", "Hosting\test\Microsoft.AspNetCore.Hosting.Tests.csproj", "{B2A631BD-744E-42FB-BA79-8F22BB27DA65}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Abstractions", "Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj", "{91DCE47B-46A7-42D7-80F4-CCB0330B86A1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GenericWebHost", "samples\GenericWebHost\GenericWebHost.csproj", "{7351DDBC-71DF-4C40-A364-981710B80E29}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{3E9635DD-53A9-4098-B6F6-E5C3C8F7C600}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleStartups", "samples\SampleStartups\SampleStartups.csproj", "{3C3F4D2D-6676-4A0B-895D-348E7DD4152E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Server.Abstractions", "Server.Abstractions\src\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", "{7861E080-CFBF-476B-B770-AC863BB0967D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IntegrationTesting", "Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj", "{64329FE8-C414-48AD-AA87-7A2042EFB5ED}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.TestHost", "TestHost\src\Microsoft.AspNetCore.TestHost.csproj", "{E87CE941-9DF5-426F-B192-00471D54340D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.TestHost.Tests", "TestHost\test\Microsoft.AspNetCore.TestHost.Tests.csproj", "{29E8715C-C319-40BB-B097-678017D6A418}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.WindowsServices", "WindowsServices\src\Microsoft.AspNetCore.Hosting.WindowsServices.csproj", "{FA29445B-1BA7-448D-8ADF-56BF6D6633BB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {254295FC-35AF-4A45-A6F4-FF93C1B7CD8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {254295FC-35AF-4A45-A6F4-FF93C1B7CD8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {254295FC-35AF-4A45-A6F4-FF93C1B7CD8D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {254295FC-35AF-4A45-A6F4-FF93C1B7CD8D}.Release|Any CPU.Build.0 = Release|Any CPU + {B2A631BD-744E-42FB-BA79-8F22BB27DA65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B2A631BD-744E-42FB-BA79-8F22BB27DA65}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B2A631BD-744E-42FB-BA79-8F22BB27DA65}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B2A631BD-744E-42FB-BA79-8F22BB27DA65}.Release|Any CPU.Build.0 = Release|Any CPU + {91DCE47B-46A7-42D7-80F4-CCB0330B86A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91DCE47B-46A7-42D7-80F4-CCB0330B86A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91DCE47B-46A7-42D7-80F4-CCB0330B86A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91DCE47B-46A7-42D7-80F4-CCB0330B86A1}.Release|Any CPU.Build.0 = Release|Any CPU + {7351DDBC-71DF-4C40-A364-981710B80E29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7351DDBC-71DF-4C40-A364-981710B80E29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7351DDBC-71DF-4C40-A364-981710B80E29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7351DDBC-71DF-4C40-A364-981710B80E29}.Release|Any CPU.Build.0 = Release|Any CPU + {3C3F4D2D-6676-4A0B-895D-348E7DD4152E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C3F4D2D-6676-4A0B-895D-348E7DD4152E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C3F4D2D-6676-4A0B-895D-348E7DD4152E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C3F4D2D-6676-4A0B-895D-348E7DD4152E}.Release|Any CPU.Build.0 = Release|Any CPU + {7861E080-CFBF-476B-B770-AC863BB0967D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7861E080-CFBF-476B-B770-AC863BB0967D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7861E080-CFBF-476B-B770-AC863BB0967D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7861E080-CFBF-476B-B770-AC863BB0967D}.Release|Any CPU.Build.0 = Release|Any CPU + {64329FE8-C414-48AD-AA87-7A2042EFB5ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64329FE8-C414-48AD-AA87-7A2042EFB5ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64329FE8-C414-48AD-AA87-7A2042EFB5ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64329FE8-C414-48AD-AA87-7A2042EFB5ED}.Release|Any CPU.Build.0 = Release|Any CPU + {E87CE941-9DF5-426F-B192-00471D54340D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E87CE941-9DF5-426F-B192-00471D54340D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E87CE941-9DF5-426F-B192-00471D54340D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E87CE941-9DF5-426F-B192-00471D54340D}.Release|Any CPU.Build.0 = Release|Any CPU + {29E8715C-C319-40BB-B097-678017D6A418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29E8715C-C319-40BB-B097-678017D6A418}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29E8715C-C319-40BB-B097-678017D6A418}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29E8715C-C319-40BB-B097-678017D6A418}.Release|Any CPU.Build.0 = Release|Any CPU + {FA29445B-1BA7-448D-8ADF-56BF6D6633BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA29445B-1BA7-448D-8ADF-56BF6D6633BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA29445B-1BA7-448D-8ADF-56BF6D6633BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FA29445B-1BA7-448D-8ADF-56BF6D6633BB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7351DDBC-71DF-4C40-A364-981710B80E29} = {3E9635DD-53A9-4098-B6F6-E5C3C8F7C600} + {3C3F4D2D-6676-4A0B-895D-348E7DD4152E} = {3E9635DD-53A9-4098-B6F6-E5C3C8F7C600} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {16D3B34D-7F97-4B2B-8AD1-C18FEADBA4E8} + EndGlobalSection +EndGlobal From af8d67f353e54466664d90e1743aca59937d75a0 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 27 Nov 2018 12:56:46 -0800 Subject: [PATCH 2/4] Ensure static analysis gets the right package versions when patching a package --- eng/targets/Packaging.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/targets/Packaging.targets b/eng/targets/Packaging.targets index 69ad343564..244f2c3ab7 100644 --- a/eng/targets/Packaging.targets +++ b/eng/targets/Packaging.targets @@ -9,7 +9,7 @@ From 63b26d42d207bf75e71e30a7f82af74b6b4f003e Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 28 Nov 2018 11:00:11 -0800 Subject: [PATCH 3/4] Replace ManualResetEvent with TaskCompletionSource in TestHost tests --- .../TestHost/test/ClientHandlerTests.cs | 39 ++++++------- .../TestHost/test/HttpContextBuilderTests.cs | 57 +++++++++---------- src/Hosting/TestHost/test/Utilities.cs | 29 ++++++++++ 3 files changed, 74 insertions(+), 51 deletions(-) create mode 100644 src/Hosting/TestHost/test/Utilities.cs diff --git a/src/Hosting/TestHost/test/ClientHandlerTests.cs b/src/Hosting/TestHost/test/ClientHandlerTests.cs index 73f1c86d29..9317b4ac44 100644 --- a/src/Hosting/TestHost/test/ClientHandlerTests.cs +++ b/src/Hosting/TestHost/test/ClientHandlerTests.cs @@ -156,51 +156,50 @@ namespace Microsoft.AspNetCore.TestHost [Fact] public async Task HeadersAvailableBeforeBodyFinished() { - ManualResetEvent block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context => { context.Response.Headers["TestHeader"] = "TestValue"; await context.Response.WriteAsync("BodyStarted,"); - block.WaitOne(); + await block.Task; await context.Response.WriteAsync("BodyFinished"); })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); - block.Set(); + block.SetResult(0); Assert.Equal("BodyStarted,BodyFinished", await response.Content.ReadAsStringAsync()); } [Fact] public async Task FlushSendsHeaders() { - ManualResetEvent block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context => { context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); - block.WaitOne(); + await block.Task; await context.Response.WriteAsync("BodyFinished"); })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); - block.Set(); + block.SetResult(0); Assert.Equal("BodyFinished", await response.Content.ReadAsStringAsync()); } [Fact] public async Task ClientDisposalCloses() { - ManualResetEvent block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); - block.WaitOne(); - return Task.FromResult(0); + return block.Task; })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", @@ -210,21 +209,20 @@ namespace Microsoft.AspNetCore.TestHost Task readTask = responseStream.ReadAsync(new byte[100], 0, 100); Assert.False(readTask.IsCompleted); responseStream.Dispose(); - Assert.True(readTask.Wait(TimeSpan.FromSeconds(10)), "Finished"); - Assert.Equal(0, readTask.Result); - block.Set(); + var read = await readTask.WithTimeout(); + Assert.Equal(0, read); + block.SetResult(0); } [Fact] public async Task ClientCancellationAborts() { - ManualResetEvent block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); - block.WaitOne(); - return Task.FromResult(0); + return block.Task; })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", @@ -235,9 +233,8 @@ namespace Microsoft.AspNetCore.TestHost Task readTask = responseStream.ReadAsync(new byte[100], 0, 100, cts.Token); Assert.False(readTask.IsCompleted, "Not Completed"); cts.Cancel(); - var ex = Assert.Throws(() => readTask.Wait(TimeSpan.FromSeconds(10))); - Assert.IsAssignableFrom(ex.GetBaseException()); - block.Set(); + await Assert.ThrowsAsync(() => readTask.WithTimeout()); + block.SetResult(0); } [Fact] @@ -255,19 +252,19 @@ namespace Microsoft.AspNetCore.TestHost [Fact] public async Task ExceptionAfterFirstWriteIsReported() { - ManualResetEvent block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context => { context.Response.Headers["TestHeader"] = "TestValue"; await context.Response.WriteAsync("BodyStarted"); - block.WaitOne(); + await block.Task; throw new InvalidOperationException("Test Exception"); })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); - block.Set(); + block.SetResult(0); var ex = await Assert.ThrowsAsync(() => response.Content.ReadAsStringAsync()); Assert.IsType(ex.GetBaseException()); } diff --git a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs index 21539c8988..f04a2f16f9 100644 --- a/src/Hosting/TestHost/test/HttpContextBuilderTests.cs +++ b/src/Hosting/TestHost/test/HttpContextBuilderTests.cs @@ -102,18 +102,17 @@ namespace Microsoft.AspNetCore.TestHost [Fact] public async Task HeadersAvailableBeforeSyncBodyFinished() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { - app.Run(c => + app.Run(async c => { c.Response.Headers["TestHeader"] = "TestValue"; var bytes = Encoding.UTF8.GetBytes("BodyStarted" + Environment.NewLine); c.Response.Body.Write(bytes, 0, bytes.Length); - Assert.True(block.WaitOne(TimeSpan.FromSeconds(5))); + await block.Task; bytes = Encoding.UTF8.GetBytes("BodyFinished"); c.Response.Body.Write(bytes, 0, bytes.Length); - return Task.CompletedTask; }); }); var server = new TestServer(builder); @@ -122,21 +121,21 @@ namespace Microsoft.AspNetCore.TestHost Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); var reader = new StreamReader(context.Response.Body); Assert.Equal("BodyStarted", reader.ReadLine()); - block.Set(); + block.SetResult(0); Assert.Equal("BodyFinished", reader.ReadToEnd()); } [Fact] public async Task HeadersAvailableBeforeAsyncBodyFinished() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { app.Run(async c => { c.Response.Headers["TestHeader"] = "TestValue"; await c.Response.WriteAsync("BodyStarted" + Environment.NewLine); - Assert.True(block.WaitOne(TimeSpan.FromSeconds(5))); + await block.Task; await c.Response.WriteAsync("BodyFinished"); }); }); @@ -146,21 +145,21 @@ namespace Microsoft.AspNetCore.TestHost Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); var reader = new StreamReader(context.Response.Body); Assert.Equal("BodyStarted", await reader.ReadLineAsync()); - block.Set(); + block.SetResult(0); Assert.Equal("BodyFinished", await reader.ReadToEndAsync()); } [Fact] public async Task FlushSendsHeaders() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { app.Run(async c => { c.Response.Headers["TestHeader"] = "TestValue"; c.Response.Body.Flush(); - block.WaitOne(); + await block.Task; await c.Response.WriteAsync("BodyFinished"); }); }); @@ -168,21 +167,21 @@ namespace Microsoft.AspNetCore.TestHost var context = await server.SendAsync(c => { }); Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); - block.Set(); + block.SetResult(0); Assert.Equal("BodyFinished", new StreamReader(context.Response.Body).ReadToEnd()); } [Fact] public async Task ClientDisposalCloses() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { app.Run(async c => { c.Response.Headers["TestHeader"] = "TestValue"; c.Response.Body.Flush(); - block.WaitOne(); + await block.Task; await c.Response.WriteAsync("BodyFinished"); }); }); @@ -194,20 +193,20 @@ namespace Microsoft.AspNetCore.TestHost Task readTask = responseStream.ReadAsync(new byte[100], 0, 100); Assert.False(readTask.IsCompleted); responseStream.Dispose(); - Assert.True(readTask.Wait(TimeSpan.FromSeconds(10))); - Assert.Equal(0, readTask.Result); - block.Set(); + var read = await readTask.WithTimeout(); + Assert.Equal(0, read); + block.SetResult(0); } [Fact] - public void ClientCancellationAborts() + public async Task ClientCancellationAborts() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { app.Run(c => { - block.Set(); + block.SetResult(0); Assert.True(c.RequestAborted.WaitHandle.WaitOne(TimeSpan.FromSeconds(10))); c.RequestAborted.ThrowIfCancellationRequested(); return Task.CompletedTask; @@ -216,24 +215,23 @@ namespace Microsoft.AspNetCore.TestHost var server = new TestServer(builder); var cts = new CancellationTokenSource(); var contextTask = server.SendAsync(c => { }, cts.Token); - block.WaitOne(); + await block.Task; cts.Cancel(); - var ex = Assert.Throws(() => contextTask.Wait(TimeSpan.FromSeconds(10))); - Assert.IsAssignableFrom(ex.GetBaseException()); + await Assert.ThrowsAsync(() => contextTask.WithTimeout()); } [Fact] public async Task ClientCancellationAbortsReadAsync() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { app.Run(async c => { c.Response.Headers["TestHeader"] = "TestValue"; c.Response.Body.Flush(); - block.WaitOne(); + await block.Task; await c.Response.WriteAsync("BodyFinished"); }); }); @@ -246,9 +244,8 @@ namespace Microsoft.AspNetCore.TestHost var readTask = responseStream.ReadAsync(new byte[100], 0, 100, cts.Token); Assert.False(readTask.IsCompleted); cts.Cancel(); - var ex = Assert.Throws(() => readTask.Wait(TimeSpan.FromSeconds(10))); - Assert.IsAssignableFrom(ex.GetBaseException()); - block.Set(); + await Assert.ThrowsAsync(() => readTask.WithTimeout()); + block.SetResult(0); } [Fact] @@ -268,14 +265,14 @@ namespace Microsoft.AspNetCore.TestHost [Fact] public async Task ExceptionAfterFirstWriteIsReported() { - var block = new ManualResetEvent(false); + var block = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var builder = new WebHostBuilder().Configure(app => { app.Run(async c => { c.Response.Headers["TestHeader"] = "TestValue"; await c.Response.WriteAsync("BodyStarted"); - block.WaitOne(); + await block.Task; throw new InvalidOperationException("Test Exception"); }); }); @@ -284,7 +281,7 @@ namespace Microsoft.AspNetCore.TestHost Assert.Equal("TestValue", context.Response.Headers["TestHeader"]); Assert.Equal(11, context.Response.Body.Read(new byte[100], 0, 100)); - block.Set(); + block.SetResult(0); var ex = Assert.Throws(() => context.Response.Body.Read(new byte[100], 0, 100)); Assert.IsAssignableFrom(ex.InnerException); } diff --git a/src/Hosting/TestHost/test/Utilities.cs b/src/Hosting/TestHost/test/Utilities.cs new file mode 100644 index 0000000000..9160356355 --- /dev/null +++ b/src/Hosting/TestHost/test/Utilities.cs @@ -0,0 +1,29 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; + +namespace Microsoft.AspNetCore.TestHost +{ + internal static class Utilities + { + internal static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(15); + + internal static Task WithTimeout(this Task task) => task.WithTimeout(DefaultTimeout); + + internal static async Task WithTimeout(this Task task, TimeSpan timeout) + { + var completedTask = await Task.WhenAny(task, Task.Delay(timeout)); + + if (completedTask == task) + { + return await task; + } + else + { + throw new TimeoutException("The task has timed out."); + } + } + } +} From d9a953dfebf15012fa57fd81fb659a46ca78f8cc Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Fri, 30 Nov 2018 16:42:23 -0800 Subject: [PATCH 4/4] Autobahn test suite fix(#4302) --- .../Properties/launchSettings.json | 42 ------------------ .../AutobahnTestApp/AutobahnTestApp.csproj | 0 .../AutobahnTestApp/Program.cs | 0 .../AutobahnTestApp/README.md | 0 .../AutobahnTestApp/Startup.cs | 0 .../TestResources/testCert.pfx | Bin .../TestResources/testCert.txt | 0 .../scripts/RunAutobahnTests.ps1 | 0 .../scripts/autobahn.spec.json | 0 .../test/ConformanceTests/Helpers.cs | 19 +------- ...NetCore.WebSockets.ConformanceTests.csproj | 2 + 11 files changed, 4 insertions(+), 59 deletions(-) delete mode 100644 src/Middleware/WebSockets/test/AutobahnTestApp/Properties/launchSettings.json rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/AutobahnTestApp.csproj (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/Program.cs (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/README.md (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/Startup.cs (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/TestResources/testCert.pfx (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/TestResources/testCert.txt (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/scripts/RunAutobahnTests.ps1 (100%) rename src/Middleware/WebSockets/test/{ => ConformanceTests}/AutobahnTestApp/scripts/autobahn.spec.json (100%) diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/Properties/launchSettings.json b/src/Middleware/WebSockets/test/AutobahnTestApp/Properties/launchSettings.json deleted file mode 100644 index 85a2609ccc..0000000000 --- a/src/Middleware/WebSockets/test/AutobahnTestApp/Properties/launchSettings.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:6155/", - "sslPort": 44371 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "ManagedSockets" - } - }, - "AutobahnTestApp": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "ManagedSockets" - } - }, - "AutobahnTestApp (SSL)": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "https://localhost:5443", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "ManagedSockets" - } - }, - "WebListener": { - "commandName": "Project", - "commandLineArgs": "--server Microsoft.AspNetCore.Server.HttpSys", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "ManagedSockets" - } - } - } -} \ No newline at end of file diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/AutobahnTestApp.csproj b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/AutobahnTestApp.csproj similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/AutobahnTestApp.csproj rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/AutobahnTestApp.csproj diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/Program.cs b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/Program.cs similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/Program.cs rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/Program.cs diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/README.md b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/README.md similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/README.md rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/README.md diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/Startup.cs b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/Startup.cs similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/Startup.cs rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/Startup.cs diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/TestResources/testCert.pfx b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/TestResources/testCert.pfx similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/TestResources/testCert.pfx rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/TestResources/testCert.pfx diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/TestResources/testCert.txt b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/TestResources/testCert.txt similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/TestResources/testCert.txt rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/TestResources/testCert.txt diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/scripts/RunAutobahnTests.ps1 b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/scripts/RunAutobahnTests.ps1 similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/scripts/RunAutobahnTests.ps1 rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/scripts/RunAutobahnTests.ps1 diff --git a/src/Middleware/WebSockets/test/AutobahnTestApp/scripts/autobahn.spec.json b/src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/scripts/autobahn.spec.json similarity index 100% rename from src/Middleware/WebSockets/test/AutobahnTestApp/scripts/autobahn.spec.json rename to src/Middleware/WebSockets/test/ConformanceTests/AutobahnTestApp/scripts/autobahn.spec.json diff --git a/src/Middleware/WebSockets/test/ConformanceTests/Helpers.cs b/src/Middleware/WebSockets/test/ConformanceTests/Helpers.cs index 37f65ca082..7c35b17305 100644 --- a/src/Middleware/WebSockets/test/ConformanceTests/Helpers.cs +++ b/src/Middleware/WebSockets/test/ConformanceTests/Helpers.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; namespace Microsoft.AspNetCore.WebSockets.ConformanceTest @@ -7,22 +7,7 @@ namespace Microsoft.AspNetCore.WebSockets.ConformanceTest { public static string GetApplicationPath(string projectName) { - var applicationBasePath = AppContext.BaseDirectory; - - var directoryInfo = new DirectoryInfo(applicationBasePath); - do - { - var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, "WebSockets.sln")); - if (solutionFileInfo.Exists) - { - return Path.GetFullPath(Path.Combine(directoryInfo.FullName, "test", projectName)); - } - - directoryInfo = directoryInfo.Parent; - } - while (directoryInfo.Parent != null); - - throw new Exception($"Solution root could not be found using {applicationBasePath}"); + return Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, projectName)); } } } diff --git a/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj b/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj index 76281207ee..c768e3ba64 100644 --- a/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj +++ b/src/Middleware/WebSockets/test/ConformanceTests/Microsoft.AspNetCore.WebSockets.ConformanceTests.csproj @@ -3,6 +3,7 @@ netcoreapp2.1 $(TargetFrameworks);netcoreapp2.0 + $(DefaultItemExcludes);AutobahnTestApp\**\* @@ -10,6 +11,7 @@ +