From ebd0e3cbaaf1513ae35992a216a06cd11fa54853 Mon Sep 17 00:00:00 2001 From: shreyas jejurkar Date: Wed, 20 Jan 2021 17:15:23 +0530 Subject: [PATCH 1/4] Implemented IAsyncDisposable for WebApplicationFactory 1. Other fix - Removed unwanted variable was added as part of https://github.com/dotnet/aspnetcore/pull/29404 Fixes https://github.com/dotnet/aspnetcore/issues/29455 --- .../Mvc.Testing/src/PublicAPI.Unshipped.txt | 2 + .../Mvc.Testing/src/WebApplicationFactory.cs | 40 ++++++++++++++++++- .../TestingInfrastructureInheritanceTests.cs | 17 +++++++- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt index 7dc5c58110bf..968d0938ce82 100644 --- a/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt +++ b/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt @@ -1 +1,3 @@ #nullable enable +Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory.DisposeAsync() -> System.Threading.Tasks.ValueTask +virtual Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory.DisposeAsyncCore() -> System.Threading.Tasks.ValueTask diff --git a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs index 151c0a045a88..0dd8fb7dfe17 100644 --- a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs +++ b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs @@ -8,13 +8,13 @@ using System.Net.Http; using System.Reflection; using System.Text.Json; -using System.Runtime.Serialization.Json; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting.Server; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyModel; using Microsoft.Extensions.Hosting; +using System.Threading.Tasks; namespace Microsoft.AspNetCore.Mvc.Testing { @@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.Mvc.Testing /// /// A type in the entry point assembly of the application. /// Typically the Startup or Program classes can be used. - public class WebApplicationFactory : IDisposable where TEntryPoint : class + public class WebApplicationFactory : IDisposable, IAsyncDisposable where TEntryPoint : class { private bool _disposed; private TestServer _server; @@ -530,6 +530,42 @@ protected virtual void Dispose(bool disposing) _disposed = true; } + /// + public async ValueTask DisposeAsync() + { + await DisposeAsyncCore(); + + Dispose(disposing: false); + GC.SuppressFinalize(this); + } + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources asynchronously + /// + protected virtual async ValueTask DisposeAsyncCore() + { + if (_disposed) + { + return; + } + + foreach (var client in _clients) + { + client.Dispose(); + } + + foreach (var factory in _derivedFactories) + { + await factory.DisposeAsync().ConfigureAwait(false); + } + + _server?.Dispose(); + await _host?.StopAsync(); + _host?.Dispose(); + + _disposed = true; + } + private class DelegatedWebApplicationFactory : WebApplicationFactory { private readonly Func _createServer; diff --git a/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureInheritanceTests.cs b/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureInheritanceTests.cs index c56f835ca701..0a4942123c39 100644 --- a/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureInheritanceTests.cs +++ b/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureInheritanceTests.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.AspNetCore.TestHost; @@ -80,6 +81,21 @@ public void TestingInfrastructure_GenericHost_HostShouldStopBeforeDispose() Assert.True(callbackCalled); } + [Fact] + public async Task TestingInfrastructure_GenericHost_HostDisposeAsync() + { + // Act + await using var factory = new CustomizedFactory(); + var callbackCalled = false; + + var lifetimeService = (IHostApplicationLifetime) factory.Services.GetService(typeof(IHostApplicationLifetime)); + lifetimeService.ApplicationStopped.Register(() => { callbackCalled = true; }); + await factory.DisposeAsync(); + + // Assert + Assert.True(callbackCalled); + } + private class CustomizedFactory : WebApplicationFactory where TEntryPoint : class { public bool GetTestAssembliesCalled { get; private set; } @@ -88,7 +104,6 @@ private class CustomizedFactory : WebApplicationFactory ConfigureWebHostCalled { get; private set; } = new List(); - public bool DisposeHostCalled { get; private set; } protected override void ConfigureWebHost(IWebHostBuilder builder) { From 5aa30a78ad9b1c1a0609d8c20c314dbcfc60a81a Mon Sep 17 00:00:00 2001 From: shreyas jejurkar Date: Wed, 20 Jan 2021 20:25:57 +0530 Subject: [PATCH 2/4] Addressed PR feedback. --- src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs index 0dd8fb7dfe17..0918fd9edaa2 100644 --- a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs +++ b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs @@ -523,7 +523,7 @@ protected virtual void Dispose(bool disposing) } _server?.Dispose(); - _host?.StopAsync().Wait(); + _host?.StopAsync().GetAwaiter().GetResult(); _host?.Dispose(); } @@ -561,7 +561,15 @@ protected virtual async ValueTask DisposeAsyncCore() _server?.Dispose(); await _host?.StopAsync(); - _host?.Dispose(); + + if (_host is IAsyncDisposable asyncDisposable) + { + await asyncDisposable.DisposeAsync(); + } + else + { + _host.Dispose(); + } _disposed = true; } From 39105bf969df85ffbfbffc8978486c7f76848410 Mon Sep 17 00:00:00 2001 From: shreyas jejurkar Date: Sat, 20 Feb 2021 12:31:38 +0530 Subject: [PATCH 3/4] Addressed PR feedback. 1. Removed DisposeAsyncCore method --- .../Mvc.Testing/src/WebApplicationFactory.cs | 40 +------------------ 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs index 0918fd9edaa2..412f37a3a510 100644 --- a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs +++ b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs @@ -531,47 +531,11 @@ protected virtual void Dispose(bool disposing) } /// - public async ValueTask DisposeAsync() + public ValueTask DisposeAsync() { - await DisposeAsyncCore(); - Dispose(disposing: false); GC.SuppressFinalize(this); - } - - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources asynchronously - /// - protected virtual async ValueTask DisposeAsyncCore() - { - if (_disposed) - { - return; - } - - foreach (var client in _clients) - { - client.Dispose(); - } - - foreach (var factory in _derivedFactories) - { - await factory.DisposeAsync().ConfigureAwait(false); - } - - _server?.Dispose(); - await _host?.StopAsync(); - - if (_host is IAsyncDisposable asyncDisposable) - { - await asyncDisposable.DisposeAsync(); - } - else - { - _host.Dispose(); - } - - _disposed = true; + return ValueTask.CompletedTask; } private class DelegatedWebApplicationFactory : WebApplicationFactory From 672e8ce25d3904c495144476a50275d910eabd08 Mon Sep 17 00:00:00 2001 From: shreyas jejurkar Date: Fri, 26 Feb 2021 14:25:44 +0530 Subject: [PATCH 4/4] Modified PublicAPI text file --- src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt index 968d0938ce82..5cebe89b2612 100644 --- a/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt +++ b/src/Mvc/Mvc.Testing/src/PublicAPI.Unshipped.txt @@ -1,3 +1,2 @@ #nullable enable Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory.DisposeAsync() -> System.Threading.Tasks.ValueTask -virtual Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory.DisposeAsyncCore() -> System.Threading.Tasks.ValueTask