From 0c1a6905b194dbbff19a358d62ac4df1d9e5636f Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 12 Mar 2021 23:11:33 -0800 Subject: [PATCH 01/53] Try splitting createbuildpublish from run --- .../AssemblyInfo.AssemblyFixtures.cs | 2 + .../BlazorServerTemplateTest.cs | 73 +--- .../BlazorTemplateTest.cs | 69 +++- .../BlazorWasmTemplateTest.cs | 311 ++++++++---------- .../BlazorTemplates.Tests/PriorityOrderer.cs | 42 +++ .../TestPriorityAttribute.cs | 12 + .../BrowserTesting/src/BrowserManager.cs | 2 +- 7 files changed, 273 insertions(+), 238 deletions(-) create mode 100644 src/ProjectTemplates/BlazorTemplates.Tests/PriorityOrderer.cs create mode 100644 src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs index 3eb30b095263..22f45f54f583 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs @@ -5,7 +5,9 @@ using ProjectTemplates.Tests.Infrastructure; using Templates.Test; using Templates.Test.Helpers; +using Xunit; [assembly: AssemblyFixture(typeof(ProjectFactoryFixture))] [assembly: AssemblyFixture(typeof(PlaywrightFixture))] +[assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index db28e7fd65ba..2b664c4aff48 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Linq; using System.Net; -using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNetCore.BrowserTesting; using Microsoft.AspNetCore.Testing; @@ -17,45 +16,32 @@ namespace Templates.Test { + [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorServerTemplateTest : BlazorTemplateTest { public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture fixture, ITestOutputHelper output) - : base(fixture) + : base(projectFactory, fixture, output) { - ProjectFactory = projectFactory; ; - Output = output; - BrowserContextInfo = new ContextInformation(CreateFactory(output)); } - public ProjectFactoryFixture ProjectFactory { get; set; } - public ITestOutputHelper Output { get; } - public ContextInformation BrowserContextInfo { get; } - public Project Project { get; private set; } + public override string ProjectType { get; } = "blazorserver"; + [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + public Task BlazorServerTemplate_CreateBuildPublish_NoAuth() + => CreateBuildPublishAsync("blazorservernoauth" + BrowserKind.Chromium.ToString()); + + [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))] + public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuthUseLocalDb(BrowserKind browserKind, bool useLocalDB) + => CreateBuildPublishAsync("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : "")); [Theory] [InlineData(BrowserKind.Chromium)] [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - Project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), Output); - var createResult = await Project.RunDotNetNewAsync("blazorserver"); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult)); - - var publishResult = await Project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", Project, publishResult)); - - // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release - // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build - // later, while the opposite is not true. - - var buildResult = await Project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult)); - await using var browser = Fixture.BrowserManager.IsAvailable(browserKind) ? await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : null; @@ -110,24 +96,8 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB) { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - Project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); - var createResult = await Project.RunDotNetNewAsync("blazorserver", auth: "Individual", useLocalDB: useLocalDB); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult)); - - var publishResult = await Project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", Project, publishResult)); - - // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release - // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build - // later, while the opposite is not true. - - var buildResult = await Project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult)); - var browser = !Fixture.BrowserManager.IsAvailable(browserKind) ? null : await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); @@ -210,28 +180,13 @@ private async Task TestBasicNavigation(IPage page) Assert.Equal(5, (await page.QuerySelectorAllAsync("p+table>tbody>tr")).Count()); } - [Theory] + [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] [InlineData("IndividualB2C", null)] [InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })] [InlineData("SingleOrg", null)] [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })] [InlineData("SingleOrg", new string[] { "--calls-graph" })] - public async Task BlazorServerTemplat_IdentityWeb_BuildAndPublish(string auth, string[] args) - { - Project = await ProjectFactory.GetOrCreateProject("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), Output); - - var createResult = await Project.RunDotNetNewAsync("blazorserver", auth: auth, args: args); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult)); - - var publishResult = await Project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", Project, publishResult)); - - // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release - // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build - // later, while the opposite is not true. - - var buildResult = await Project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", Project, buildResult)); - } + public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish(string auth, string[] args) + => CreateBuildPublishAsync("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), auth, args); } } diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 4057e99fec6a..bece483e6fcc 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -1,24 +1,38 @@ // 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.IO; using System.Runtime.InteropServices; +using System.Threading.Tasks; using Microsoft.AspNetCore.BrowserTesting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; using ProjectTemplates.Tests.Infrastructure; +using Templates.Test.Helpers; using Xunit; using Xunit.Abstractions; namespace Templates.Test { - public class BlazorTemplateTest + public abstract class BlazorTemplateTest { - public BlazorTemplateTest(PlaywrightFixture browserFixture) + public const int BUILDCREATEPUBLISH_PRIORITY = -1000; + + public BlazorTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture browserFixture, ITestOutputHelper output) { Fixture = browserFixture; + ProjectFactory = projectFactory; + Output = output; + BrowserContextInfo = new ContextInformation(CreateFactory(output)); } public PlaywrightFixture Fixture { get; } + public ProjectFactoryFixture ProjectFactory { get; set; } + public ITestOutputHelper Output { get; } + public Project Project { get; protected set; } + public ContextInformation BrowserContextInfo { get; } + public abstract string ProjectType { get; } public static ILoggerFactory CreateFactory(ITestOutputHelper output) @@ -46,6 +60,57 @@ void LogMessage(WriteContext ctx) } } + protected async Task CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false) + { + // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 + Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); + + Project = await ProjectFactory.GetOrCreateProject(projectName, Output); + if (targetFramework != null) + { + Project.TargetFramework = targetFramework; + } + + var createResult = await Project.RunDotNetNewAsync(ProjectType, auth: auth, args: args); + Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult)); + + var targetProject = Project; + if (serverProject) + { + targetProject = GetSubProject(Project, "Server", $"{Project.ProjectName}.Server"); + } + + var publishResult = await targetProject.RunDotNetPublishAsync(noRestore: !serverProject); + Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", targetProject, publishResult)); + + // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release + // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build + // later, while the opposite is not true. + + var buildResult = await targetProject.RunDotNetBuildAsync(); + Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", targetProject, buildResult)); + } + + + protected static Project GetSubProject(Project project, string projectDirectory, string projectName) + { + var subProjectDirectory = Path.Combine(project.TemplateOutputDir, projectDirectory); + if (!Directory.Exists(subProjectDirectory)) + { + throw new DirectoryNotFoundException($"Directory {subProjectDirectory} was not found."); + } + + var subProject = new Project + { + Output = project.Output, + DiagnosticsMessageSink = project.DiagnosticsMessageSink, + ProjectName = projectName, + TemplateOutputDir = subProjectDirectory, + }; + + return subProject; + } + public static bool TryValidateBrowserRequired(BrowserKind browserKind, bool isRequired, out string error) { error = !isRequired ? null : $"Browser '{browserKind}' is required but not configured on '{RuntimeInformation.OSDescription}'"; diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index b5e1deedfb1a..cb1ba28d64a1 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -24,44 +24,32 @@ namespace Templates.Test { + [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorWasmTemplateTest : BlazorTemplateTest { public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture browserFixture, ITestOutputHelper output) - : base(browserFixture) + : base(projectFactory, browserFixture, output) { - ProjectFactory = projectFactory; - Output = output; - BrowserContextInfo = new ContextInformation(CreateFactory(output)); } - public ProjectFactoryFixture ProjectFactory { get; set; } + public override string ProjectType { get; } = "blazorwasm"; - public ITestOutputHelper Output { get; } + [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() + { + await CreateBuildPublishAsync("blazorstandalone" + BrowserKind.Chromium.ToString()); - public ContextInformation BrowserContextInfo { get; } + // The service worker assets manifest isn't generated for non-PWA projects + var publishDir = Path.Combine(Project.TemplatePublishDir, "wwwroot"); + Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js"); + } [Theory] [InlineData(BrowserKind.Chromium)] public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind) { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, Output); - var createResult = await project.RunDotNetNewAsync("blazorwasm"); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - - var publishResult = await project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult)); - - // The service worker assets manifest isn't generated for non-PWA projects - var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot"); - Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js"); - - var buildResult = await project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult)); - await BuildAndRunTest(project.ProjectName, project, browserKind); var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); @@ -90,12 +78,13 @@ private async Task NavigateToPage(IBrowserContext browser, string listeni [Theory] [InlineData(BrowserKind.Chromium)] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); @@ -131,6 +120,43 @@ public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) } } + //[Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + //public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() + // => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); + + + //[Theory] + //[InlineData(BrowserKind.Chromium)] + //public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) + //{ + // var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); + + // var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); + + // await BuildAndRunTest(project.ProjectName, serverProject, browserKind); + + // using var aspNetProcess = serverProject.StartPublishedProjectAsync(); + + // Assert.False( + // aspNetProcess.Process.HasExited, + // ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); + + // await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); + // await AssertCompressionFormat(aspNetProcess, "br"); + + // if (Fixture.BrowserManager.IsAvailable(browserKind)) + // { + // await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + // var page = await browser.NewPageAsync(); + // await aspNetProcess.VisitInBrowserAsync(page); + // await TestBasicNavigation(project.ProjectName, page); + // } + // else + // { + // EnsureBrowserAvailable(browserKind); + // } + //} + private static async Task AssertCompressionFormat(AspNetProcess aspNetProcess, string expectedEncoding) { var response = await aspNetProcess.SendRequest(() => @@ -147,24 +173,16 @@ private static async Task AssertCompressionFormat(AspNetProcess aspNetProcess, s Assert.Equal(expectedEncoding, response.Content.Headers.ContentEncoding.Single()); } - [Theory] + [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + public Task BlazorWasmTemplate_CreateBuildPublish_StandalonePwa() + => CreateBuildPublishAsync("blazorstandalonepwa", args: new[] { "--pwa" }); + + [Theory, TestPriority(100)] [InlineData(BrowserKind.Chromium)] public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorstandalonepwa", Output); - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--pwa" }); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - - var publishResult = await project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult)); - - var buildResult = await project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult)); - await BuildAndRunTest(project.ProjectName, project, browserKind); ValidatePublishedServiceWorker(project); @@ -194,64 +212,56 @@ public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) } } - [Theory] - [InlineData(BrowserKind.Chromium)] - public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) - { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - - var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); - - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted", "--pwa" }); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - - var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); - - var publishResult = await serverProject.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult)); - - var buildResult = await serverProject.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult)); - - await BuildAndRunTest(project.ProjectName, serverProject, browserKind); - - ValidatePublishedServiceWorker(serverProject); - - string listeningUri = null; - if (Fixture.BrowserManager.IsAvailable(browserKind)) - { - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - IPage page = null; - using (var aspNetProcess = serverProject.StartPublishedProjectAsync()) - { - Assert.False( - aspNetProcess.Process.HasExited, - ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); - - await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - page = await browser.NewPageAsync(); - await aspNetProcess.VisitInBrowserAsync(page); - await TestBasicNavigation(project.ProjectName, page); - - // Note: we don't want to use aspNetProcess.ListeningUri because that isn't necessarily the HTTPS URI - listeningUri = new Uri(page.Url).GetLeftPart(UriPartial.Authority); - } - - // The PWA template supports offline use. By now, the browser should have cached everything it needs, - // so we can continue working even without the server. - // Since this is the hosted project, backend APIs won't work offline, so we need to skip "fetchdata" - await page.GoToAsync("about:blank"); - await browser.SetOfflineAsync(true); - await page.GoToAsync(listeningUri); - await TestBasicNavigation(project.ProjectName, page, skipFetchData: true); - await page.CloseAsync(); - } - else - { - EnsureBrowserAvailable(browserKind); - } - } + //[Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + //public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() + // => CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true); + + //[Theory, TestPriority(100)] + //[InlineData(BrowserKind.Chromium)] + //public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) + //{ + // var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); + + // var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); + + // await BuildAndRunTest(project.ProjectName, serverProject, browserKind); + + // ValidatePublishedServiceWorker(serverProject); + + // string listeningUri = null; + // if (Fixture.BrowserManager.IsAvailable(browserKind)) + // { + // await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + // IPage page = null; + // using (var aspNetProcess = serverProject.StartPublishedProjectAsync()) + // { + // Assert.False( + // aspNetProcess.Process.HasExited, + // ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); + + // await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); + // page = await browser.NewPageAsync(); + // await aspNetProcess.VisitInBrowserAsync(page); + // await TestBasicNavigation(project.ProjectName, page); + + // // Note: we don't want to use aspNetProcess.ListeningUri because that isn't necessarily the HTTPS URI + // listeningUri = new Uri(page.Url).GetLeftPart(UriPartial.Authority); + // } + + // // The PWA template supports offline use. By now, the browser should have cached everything it needs, + // // so we can continue working even without the server. + // // Since this is the hosted project, backend APIs won't work offline, so we need to skip "fetchdata" + // await page.GoToAsync("about:blank"); + // await browser.SetOfflineAsync(true); + // await page.GoToAsync(listeningUri); + // await TestBasicNavigation(project.ProjectName, page, skipFetchData: true); + // await page.CloseAsync(); + // } + // else + // { + // EnsureBrowserAvailable(browserKind); + // } + //} private void ValidatePublishedServiceWorker(Project project) { @@ -276,29 +286,26 @@ private void ValidatePublishedServiceWorker(Project project) Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal)); } - [ConditionalTheory] - [InlineData(BrowserKind.Chromium)] - // LocalDB doesn't work on non Windows platforms - [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] - [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30700")] - public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) - { - return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); - } - - [Theory] - [InlineData(BrowserKind.Chromium)] - [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] - public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind) - { - return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); - } + //[ConditionalTheory] + //[InlineData(BrowserKind.Chromium)] + //// LocalDB doesn't work on non Windows platforms + //[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] + //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30700")] + //public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) + //{ + // return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); + //} + + //[Theory] + //[InlineData(BrowserKind.Chromium)] + //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] + //public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind) + //{ + // return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); + //} private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb) { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), Output); var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" }); @@ -365,16 +372,10 @@ private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind bro } } - [Theory] - [InlineData(BrowserKind.Chromium, Skip = "https://github.com/dotnet/aspnetcore/issues/28596")] - public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind browserKind) - { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - - var project = await ProjectFactory.GetOrCreateProject("blazorstandaloneindividual" + browserKind, Output); - - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { + [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [InlineData(BrowserKind.Chromium)] + public Task BlazorWasmStandaloneTemplate_CreateBuildPublish_IndividualAuth(BrowserKind browserKind) + => CreateBuildPublishAsync("blazorstandaloneindividual" + browserKind, args: new[] { "-au", "Individual", "--authority", @@ -383,17 +384,11 @@ public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind "sample-client-id" }); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - - var publishResult = await project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult)); - - // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release - // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build - // later, while the opposite is not true. - - var buildResult = await project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult)); + [Theory] + [InlineData(BrowserKind.Chromium, Skip = "https://github.com/dotnet/aspnetcore/issues/28596")] + public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind browserKind) + { + var project = await ProjectFactory.GetOrCreateProject("blazorstandaloneindividual" + browserKind, Output); // We don't want to test the auth flow as we don't have the required settings to talk to a third-party IdP // but we want to make sure that we are able to run the app without errors. @@ -483,25 +478,8 @@ public TemplateInstance(string name, params string[] arguments) [Theory] [MemberData(nameof(TemplateData))] - public async Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_Works(TemplateInstance instance) - { - var project = await ProjectFactory.GetOrCreateProject(instance.Name, Output); - project.TargetFramework = "netstandard2.1"; - - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: instance.Arguments); - - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - - var publishResult = await project.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult)); - - // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release - // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build - // later, while the opposite is not true. - - var buildResult = await project.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult)); - } + public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_Works(TemplateInstance instance) + => CreateBuildPublishAsync(instance.Name, args: instance.Arguments, targetFramework: "netstandard2.1"); protected async Task BuildAndRunTest(string appName, Project project, BrowserKind browserKind, bool usesAuth = false) { @@ -611,25 +589,6 @@ private string ReadFile(string basePath, string path) return File.ReadAllText(Path.Combine(basePath, path)); } - private Project GetSubProject(Project project, string projectDirectory, string projectName) - { - var subProjectDirectory = Path.Combine(project.TemplateOutputDir, projectDirectory); - if (!Directory.Exists(subProjectDirectory)) - { - throw new DirectoryNotFoundException($"Directory {subProjectDirectory} was not found."); - } - - var subProject = new Project - { - Output = project.Output, - DiagnosticsMessageSink = project.DiagnosticsMessageSink, - ProjectName = projectName, - TemplateOutputDir = subProjectDirectory, - }; - - return subProject; - } - private void UpdatePublishedSettings(Project serverProject) { // Hijack here the config file to use the development key during publish. @@ -666,8 +625,8 @@ private void UpdatePublishedSettings(Project serverProject) { command = "dotnet-serve"; args = "--roll-forward LatestMajor " + args; // dotnet-serve targets net5.0 by default - } - + } + var serveProcess = ProcessEx.Run(Output, publishDir, command, args); var listeningUri = ResolveListeningUrl(serveProcess); return (serveProcess, listeningUri); diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/PriorityOrderer.cs b/src/ProjectTemplates/BlazorTemplates.Tests/PriorityOrderer.cs new file mode 100644 index 000000000000..e1ebea357e3e --- /dev/null +++ b/src/ProjectTemplates/BlazorTemplates.Tests/PriorityOrderer.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Linq; +using Xunit.Abstractions; +using Xunit.Sdk; + +namespace Templates.Test +{ + public class PriorityOrderer : ITestCaseOrderer + { + public IEnumerable OrderTestCases( + IEnumerable testCases) where TTestCase : ITestCase + { + string assemblyName = typeof(TestPriorityAttribute).AssemblyQualifiedName!; + var sortedMethods = new SortedDictionary>(); + foreach (TTestCase testCase in testCases) + { + int priority = testCase.TestMethod.Method + .GetCustomAttributes(assemblyName) + .FirstOrDefault() + ?.GetNamedArgument(nameof(TestPriorityAttribute.Priority)) ?? 0; + + GetOrCreate(sortedMethods, priority).Add(testCase); + } + + foreach (TTestCase testCase in + sortedMethods.Keys.SelectMany( + priority => sortedMethods[priority].OrderBy( + testCase => testCase.TestMethod.Method.Name))) + { + yield return testCase; + } + } + + private static TValue GetOrCreate( + IDictionary dictionary, TKey key) + where TKey : struct + where TValue : new() => + dictionary.TryGetValue(key, out TValue result) + ? result + : (dictionary[key] = new TValue()); + } +} diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs b/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs new file mode 100644 index 000000000000..d4f8c6cd730d --- /dev/null +++ b/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs @@ -0,0 +1,12 @@ +using System; + +namespace Templates.Test +{ + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class TestPriorityAttribute : Attribute + { + public int Priority { get; private set; } + public TestPriorityAttribute(int priority) => Priority = priority; + } + +} diff --git a/src/Shared/BrowserTesting/src/BrowserManager.cs b/src/Shared/BrowserTesting/src/BrowserManager.cs index 20f970736e27..8e3a98815d01 100644 --- a/src/Shared/BrowserTesting/src/BrowserManager.cs +++ b/src/Shared/BrowserTesting/src/BrowserManager.cs @@ -46,7 +46,7 @@ private async Task InitializeAsync() async Task InitializeCore() { - Playwright = await PlaywrightSharp.Playwright.CreateAsync(_loggerFactory/*, debug: "pw:api"*/); + Playwright = await PlaywrightSharp.Playwright.CreateAsync(/*_loggerFactory, debug: "pw:api"*/); foreach (var (browserName, options) in _browserManagerConfiguration.BrowserOptions) { if (!_launchBrowsers.ContainsKey(browserName)) From 3f8f8dffef579cf09747b4b8c46e26a383775f52 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Sat, 13 Mar 2021 01:56:52 -0800 Subject: [PATCH 02/53] Update BlazorWasmTemplateTest.cs --- .../BlazorWasmTemplateTest.cs | 155 ++++++------------ 1 file changed, 49 insertions(+), 106 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index fede6b34c4e5..07ad7a299342 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -46,7 +46,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() [Theory] [InlineData(BrowserKind.Chromium)] - [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] + //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, Output); @@ -79,7 +79,7 @@ private async Task NavigateToPage(IBrowserContext browser, string listeni [Theory] [InlineData(BrowserKind.Chromium)] - [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] + //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 @@ -121,42 +121,42 @@ public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) } } - //[Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] - //public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() - // => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); + [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() + => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); - //[Theory] - //[InlineData(BrowserKind.Chromium)] - //public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) - //{ - // var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); + [Theory] + [InlineData(BrowserKind.Chromium)] + public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) + { + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); - // var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); + var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); - // await BuildAndRunTest(project.ProjectName, serverProject, browserKind); + await BuildAndRunTest(project.ProjectName, serverProject, browserKind); - // using var aspNetProcess = serverProject.StartPublishedProjectAsync(); + using var aspNetProcess = serverProject.StartPublishedProjectAsync(); - // Assert.False( - // aspNetProcess.Process.HasExited, - // ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); + Assert.False( + aspNetProcess.Process.HasExited, + ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); - // await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - // await AssertCompressionFormat(aspNetProcess, "br"); + await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); + await AssertCompressionFormat(aspNetProcess, "br"); - // if (Fixture.BrowserManager.IsAvailable(browserKind)) - // { - // await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - // var page = await browser.NewPageAsync(); - // await aspNetProcess.VisitInBrowserAsync(page); - // await TestBasicNavigation(project.ProjectName, page); - // } - // else - // { - // EnsureBrowserAvailable(browserKind); - // } - //} + if (Fixture.BrowserManager.IsAvailable(browserKind)) + { + await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + var page = await browser.NewPageAsync(); + await aspNetProcess.VisitInBrowserAsync(page); + await TestBasicNavigation(project.ProjectName, page); + } + else + { + EnsureBrowserAvailable(browserKind); + } + } private static async Task AssertCompressionFormat(AspNetProcess aspNetProcess, string expectedEncoding) { @@ -214,77 +214,19 @@ public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) } } - //[Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] - //public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() - // => CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true); - - //[Theory, TestPriority(100)] - //[InlineData(BrowserKind.Chromium)] - //public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) - //{ - // var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); - - // var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); - - // await BuildAndRunTest(project.ProjectName, serverProject, browserKind); - - // ValidatePublishedServiceWorker(serverProject); - - // string listeningUri = null; - // if (Fixture.BrowserManager.IsAvailable(browserKind)) - // { - // await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - // IPage page = null; - // using (var aspNetProcess = serverProject.StartPublishedProjectAsync()) - // { - // Assert.False( - // aspNetProcess.Process.HasExited, - // ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); - - // await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - // page = await browser.NewPageAsync(); - // await aspNetProcess.VisitInBrowserAsync(page); - // await TestBasicNavigation(project.ProjectName, page); - - // // Note: we don't want to use aspNetProcess.ListeningUri because that isn't necessarily the HTTPS URI - // listeningUri = new Uri(page.Url).GetLeftPart(UriPartial.Authority); - // } - - // // The PWA template supports offline use. By now, the browser should have cached everything it needs, - // // so we can continue working even without the server. - // // Since this is the hosted project, backend APIs won't work offline, so we need to skip "fetchdata" - // await page.GoToAsync("about:blank"); - // await browser.SetOfflineAsync(true); - // await page.GoToAsync(listeningUri); - // await TestBasicNavigation(project.ProjectName, page, skipFetchData: true); - // await page.CloseAsync(); - // } - // else - // { - // EnsureBrowserAvailable(browserKind); - // } - //} - [Theory] + [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() + => CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true); + + [Theory, TestPriority(100)] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted", "--pwa" }); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); - var publishResult = await serverProject.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult)); - - var buildResult = await serverProject.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult)); - await BuildAndRunTest(project.ProjectName, serverProject, browserKind); ValidatePublishedServiceWorker(serverProject); @@ -323,6 +265,7 @@ public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) EnsureBrowserAvailable(browserKind); } } + private void ValidatePublishedServiceWorker(Project project) { @@ -347,23 +290,23 @@ private void ValidatePublishedServiceWorker(Project project) Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal)); } - //[ConditionalTheory] - //[InlineData(BrowserKind.Chromium)] + [ConditionalTheory] + [InlineData(BrowserKind.Chromium)] //// LocalDB doesn't work on non Windows platforms - //[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] + [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30700")] - //public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) - //{ - // return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); - //} + public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) + { + return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); + } - //[Theory] - //[InlineData(BrowserKind.Chromium)] + [Theory] + [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] - //public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind) - //{ - // return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); - //} + public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind) + { + return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); + } private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb) { From c4efe4bf345697f9e4a2d80c697fba7e0cee5895 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Sat, 13 Mar 2021 22:04:38 -0800 Subject: [PATCH 03/53] Update BlazorWasmTemplateTest.cs --- .../BlazorWasmTemplateTest.cs | 46 +------------------ 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 07ad7a299342..71a8897ffbf6 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -77,57 +77,13 @@ private async Task NavigateToPage(IBrowserContext browser, string listeni return page; } - [Theory] - [InlineData(BrowserKind.Chromium)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] - public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) - { - // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 - Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - - var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); - - var publishResult = await serverProject.RunDotNetPublishAsync(); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult)); - - var buildResult = await serverProject.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult)); - - await BuildAndRunTest(project.ProjectName, serverProject, browserKind); - - using var aspNetProcess = serverProject.StartPublishedProjectAsync(); - - Assert.False( - aspNetProcess.Process.HasExited, - ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", serverProject, aspNetProcess.Process)); - - await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - await AssertCompressionFormat(aspNetProcess, "br"); - - if (Fixture.BrowserManager.IsAvailable(browserKind)) - { - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - var page = await browser.NewPageAsync(); - await aspNetProcess.VisitInBrowserAsync(page); - await TestBasicNavigation(project.ProjectName, page); - } - else - { - EnsureBrowserAvailable(browserKind); - } - } - [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); - [Theory] [InlineData(BrowserKind.Chromium)] + //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); From d5a4c14485883a9da693d136d6bd7b5adf844ba8 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Sun, 14 Mar 2021 03:39:22 -0700 Subject: [PATCH 04/53] Update BlazorServerTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorServerTemplateTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index a5f77e6801dd..3e74523e053c 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -93,7 +93,7 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) [Theory] [MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))] - [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] + //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB) { Project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); From 78a474011f05719ddfe74be0da87fc0ce5c46b0b Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 15 Mar 2021 09:33:44 -0700 Subject: [PATCH 05/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 71a8897ffbf6..83798bc2a111 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -221,7 +221,6 @@ public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) EnsureBrowserAvailable(browserKind); } } - private void ValidatePublishedServiceWorker(Project project) { From 24967f8ad076e558f4fca404ae2cbfbacc5bc477 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 15 Mar 2021 12:14:55 -0700 Subject: [PATCH 06/53] Try stop sharing playwright instance, create one per test --- .../AssemblyInfo.AssemblyFixtures.cs | 2 +- .../BlazorServerTemplateTest.cs | 20 +++--- .../BlazorTemplateTest.cs | 64 ++++++++++++++++--- .../BlazorWasmTemplateTest.cs | 30 ++++----- 4 files changed, 82 insertions(+), 34 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs index 22f45f54f583..501ac0ac0498 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs @@ -8,6 +8,6 @@ using Xunit; [assembly: AssemblyFixture(typeof(ProjectFactoryFixture))] -[assembly: AssemblyFixture(typeof(PlaywrightFixture))] +//[assembly: AssemblyFixture(typeof(PlaywrightFixture))] [assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index 3e74523e053c..a35ddc775e6e 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -19,8 +19,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorServerTemplateTest : BlazorTemplateTest { - public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture fixture, ITestOutputHelper output) - : base(projectFactory, fixture, output) + public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) + : base(projectFactory, output) { } @@ -42,8 +42,8 @@ public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { Project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), Output); - await using var browser = Fixture.BrowserManager.IsAvailable(browserKind) ? - await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : + await using var browser = BrowserManager.IsAvailable(browserKind) ? + await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : null; using (var aspNetProcess = Project.StartBuiltProjectAsync()) @@ -54,7 +54,7 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); @@ -74,7 +74,7 @@ await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); @@ -98,9 +98,9 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi { Project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); - var browser = !Fixture.BrowserManager.IsAvailable(browserKind) ? + var browser = !BrowserManager.IsAvailable(browserKind) ? null : - await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); using (var aspNetProcess = Project.StartBuiltProjectAsync()) { @@ -109,7 +109,7 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); @@ -129,7 +129,7 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index bece483e6fcc..e5a0cb1d4176 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -2,39 +2,88 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNetCore.BrowserTesting; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; using ProjectTemplates.Tests.Infrastructure; using Templates.Test.Helpers; using Xunit; using Xunit.Abstractions; +using Xunit.Sdk; namespace Templates.Test { - public abstract class BlazorTemplateTest + public abstract class BlazorTemplateTest : IAsyncLifetime { public const int BUILDCREATEPUBLISH_PRIORITY = -1000; - public BlazorTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture browserFixture, ITestOutputHelper output) + public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) { - Fixture = browserFixture; ProjectFactory = projectFactory; Output = output; - BrowserContextInfo = new ContextInformation(CreateFactory(output)); } - public PlaywrightFixture Fixture { get; } + public async Task InitializeAsync() + { + var sink = new TestSink(); + sink.MessageLogged += LogBrowserManagerMessage; + var factory = new TestLoggerFactory(sink, enabled: true); + BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), factory); + BrowserContextInfo = new ContextInformation(CreateFactory(Output)); + } + + private static IConfiguration CreateConfiguration() + { + var basePath = Path.GetDirectoryName(typeof(BlazorTemplateTest).Assembly.Location); + var os = Environment.OSVersion.Platform switch + { + PlatformID.Win32NT => "win", + PlatformID.Unix => "linux", + PlatformID.MacOSX => "osx", + _ => null + }; + + var builder = new ConfigurationBuilder() + .AddJsonFile(Path.Combine(basePath, "playwrightSettings.json")) + .AddJsonFile(Path.Combine(basePath, $"playwrightSettings.{os}.json"), optional: true); + + if (_isCIEnvironment) + { + builder.AddJsonFile(Path.Combine(basePath, "playwrightSettings.ci.json"), optional: true) + .AddJsonFile(Path.Combine(basePath, $"playwrightSettings.ci.{os}.json"), optional: true); + } + + if (Debugger.IsAttached) + { + builder.AddJsonFile(Path.Combine(basePath, "playwrightSettings.debug.json"), optional: true); + } + + return builder.Build(); + } + + public Task DisposeAsync() => BrowserManager.DisposeAsync(); + public ProjectFactoryFixture ProjectFactory { get; set; } public ITestOutputHelper Output { get; } public Project Project { get; protected set; } - public ContextInformation BrowserContextInfo { get; } + public ContextInformation BrowserContextInfo { get; protected set; } + public BrowserManager BrowserManager { get; private set; } + public abstract string ProjectType { get; } + private static readonly bool _isCIEnvironment = + !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); + private void LogBrowserManagerMessage(WriteContext context) + { + Output.WriteLine(context.Message); + } + public static ILoggerFactory CreateFactory(ITestOutputHelper output) { var testSink = new TestSink(); @@ -91,7 +140,6 @@ protected async Task CreateBuildPublishAsync(string projectName, string auth = n Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", targetProject, buildResult)); } - protected static Project GetSubProject(Project project, string projectDirectory, string projectName) { var subProjectDirectory = Path.Combine(project.TemplateOutputDir, projectDirectory); @@ -122,7 +170,7 @@ protected void EnsureBrowserAvailable(BrowserKind browserKind) Assert.False( TryValidateBrowserRequired( browserKind, - isRequired: !Fixture.BrowserManager.IsExplicitlyDisabled(browserKind), + isRequired: !BrowserManager.IsExplicitlyDisabled(browserKind), out var errorMessage), errorMessage); } diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 83798bc2a111..0e4feabfa5a2 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -27,8 +27,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorWasmTemplateTest : BlazorTemplateTest { - public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, PlaywrightFixture browserFixture, ITestOutputHelper output) - : base(projectFactory, browserFixture, output) + public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) + : base(projectFactory, output) { } @@ -57,9 +57,9 @@ public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind) using (serveProcess) { Output.WriteLine($"Opening browser at {listeningUri}..."); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await NavigateToPage(browser, listeningUri); await TestBasicNavigation(project.ProjectName, page); } @@ -101,9 +101,9 @@ public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); await AssertCompressionFormat(aspNetProcess, "br"); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); await TestBasicNavigation(project.ProjectName, page); @@ -145,10 +145,10 @@ public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) ValidatePublishedServiceWorker(project); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); Output.WriteLine($"Opening browser at {listeningUri}..."); var page = await NavigateToPage(browser, listeningUri); using (serveProcess) @@ -188,9 +188,9 @@ public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) ValidatePublishedServiceWorker(serverProject); string listeningUri = null; - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); IPage page = null; using (var aspNetProcess = serverProject.StartPublishedProjectAsync()) { @@ -309,7 +309,7 @@ private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind bro UpdatePublishedSettings(serverProject); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { using var aspNetProcess = serverProject.StartPublishedProjectAsync(); @@ -319,7 +319,7 @@ private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind bro await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); await TestBasicNavigation(project.ProjectName, page, usesAuth: true); @@ -359,7 +359,7 @@ public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind using (serveProcess) { Output.WriteLine($"Opening browser at {listeningUri}..."); - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await NavigateToPage(browser, listeningUri); await TestBasicNavigation(project.ProjectName, page); await page.CloseAsync(); @@ -450,9 +450,9 @@ protected async Task BuildAndRunTest(string appName, Project project, BrowserKin ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); - if (Fixture.BrowserManager.IsAvailable(browserKind)) + if (BrowserManager.IsAvailable(browserKind)) { - await using var browser = await Fixture.BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); + await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); await TestBasicNavigation(appName, page, usesAuth); From 1da6a3f42346b9b1c55271d100799044e40b33ab Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 15 Mar 2021 16:45:11 -0700 Subject: [PATCH 07/53] Update BrowserManager.cs --- src/Shared/BrowserTesting/src/BrowserManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Shared/BrowserTesting/src/BrowserManager.cs b/src/Shared/BrowserTesting/src/BrowserManager.cs index 8e3a98815d01..12c9f168e3d1 100644 --- a/src/Shared/BrowserTesting/src/BrowserManager.cs +++ b/src/Shared/BrowserTesting/src/BrowserManager.cs @@ -46,7 +46,7 @@ private async Task InitializeAsync() async Task InitializeCore() { - Playwright = await PlaywrightSharp.Playwright.CreateAsync(/*_loggerFactory, debug: "pw:api"*/); + Playwright = await PlaywrightSharp.Playwright.CreateAsync( /*_loggerFactory, debug: "pw:api"*/); foreach (var (browserName, options) in _browserManagerConfiguration.BrowserOptions) { if (!_launchBrowsers.ContainsKey(browserName)) From a201a63f1ef6dc3a16e0671836983e3da7a16df7 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 16 Mar 2021 01:25:02 -0700 Subject: [PATCH 08/53] Update AssemblyInfo.AssemblyFixtures.cs --- .../BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs index 501ac0ac0498..750d1f1dc7bd 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs @@ -8,6 +8,6 @@ using Xunit; [assembly: AssemblyFixture(typeof(ProjectFactoryFixture))] -//[assembly: AssemblyFixture(typeof(PlaywrightFixture))] +// [assembly: AssemblyFixture(typeof(PlaywrightFixture))] [assembly: CollectionBehavior(DisableTestParallelization = true)] From 5c5d7944782c704ba30a9a0ff5bd45667586c55a Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 16 Mar 2021 09:21:38 -0700 Subject: [PATCH 09/53] Update AssemblyInfo.AssemblyFixtures.cs --- .../BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs index 750d1f1dc7bd..501ac0ac0498 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs @@ -8,6 +8,6 @@ using Xunit; [assembly: AssemblyFixture(typeof(ProjectFactoryFixture))] -// [assembly: AssemblyFixture(typeof(PlaywrightFixture))] +//[assembly: AssemblyFixture(typeof(PlaywrightFixture))] [assembly: CollectionBehavior(DisableTestParallelization = true)] From ccc0c10de7746d25a2a30385ddf4db9b5905392c Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 16 Mar 2021 10:08:11 -0700 Subject: [PATCH 10/53] Cleanup --- .../BlazorServerTemplateTest.cs | 32 +++++++------- .../BlazorTemplateTest.cs | 19 ++++---- .../BlazorWasmTemplateTest.cs | 44 ++++++++++++------- .../BrowserTesting/src/BrowserManager.cs | 2 +- 4 files changed, 53 insertions(+), 44 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index a35ddc775e6e..7e5356409ca4 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -40,17 +40,17 @@ public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuthUseLocalDb(Bro //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { - Project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), Output); + var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), Output); await using var browser = BrowserManager.IsAvailable(browserKind) ? await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : null; - using (var aspNetProcess = Project.StartBuiltProjectAsync()) + using (var aspNetProcess = project.StartBuiltProjectAsync()) { Assert.False( aspNetProcess.Process.HasExited, - ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process)); + ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); @@ -58,7 +58,7 @@ await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); - await TestBasicNavigation(page); + await TestBasicNavigation(project, page); await page.CloseAsync(); } else @@ -67,18 +67,18 @@ await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : } } - using (var aspNetProcess = Project.StartPublishedProjectAsync()) + using (var aspNetProcess = project.StartPublishedProjectAsync()) { Assert.False( aspNetProcess.Process.HasExited, - ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process)); + ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); - await TestBasicNavigation(page); + await TestBasicNavigation(project, page); await page.CloseAsync(); } else @@ -96,24 +96,24 @@ await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB) { - Project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); + var project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); var browser = !BrowserManager.IsAvailable(browserKind) ? null : await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - using (var aspNetProcess = Project.StartBuiltProjectAsync()) + using (var aspNetProcess = project.StartBuiltProjectAsync()) { Assert.False( aspNetProcess.Process.HasExited, - ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", Project, aspNetProcess.Process)); + ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); - await TestBasicNavigation(page); + await TestBasicNavigation(project, page); await page.CloseAsync(); } else @@ -122,18 +122,18 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi } } - using (var aspNetProcess = Project.StartPublishedProjectAsync()) + using (var aspNetProcess = project.StartPublishedProjectAsync()) { Assert.False( aspNetProcess.Process.HasExited, - ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", Project, aspNetProcess.Process)); + ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", project, aspNetProcess.Process)); await aspNetProcess.AssertStatusCode("/", HttpStatusCode.OK, "text/html"); if (BrowserManager.IsAvailable(browserKind)) { var page = await browser.NewPageAsync(); await aspNetProcess.VisitInBrowserAsync(page); - await TestBasicNavigation(page); + await TestBasicNavigation(project, page); await page.CloseAsync(); } else @@ -143,7 +143,7 @@ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKi } } - private async Task TestBasicNavigation(IPage page) + private async Task TestBasicNavigation(Project project, IPage page) { var socket = BrowserContextInfo.Pages[page].WebSockets.SingleOrDefault() ?? (await page.WaitForEventAsync(PageEvent.WebSocket)).WebSocket; @@ -158,7 +158,7 @@ private async Task TestBasicNavigation(IPage page) await page.WaitForSelectorAsync("ul"); // element gets project ID injected into it during template execution - Assert.Equal(Project.ProjectName.Trim(), (await page.GetTitleAsync()).Trim()); + Assert.Equal(project.ProjectName.Trim(), (await page.GetTitleAsync()).Trim()); // Initially displays the home page await page.WaitForSelectorAsync("h1 >> text=Hello, world!"); diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index e5a0cb1d4176..f810e6c01575 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -10,11 +10,9 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; -using ProjectTemplates.Tests.Infrastructure; using Templates.Test.Helpers; using Xunit; using Xunit.Abstractions; -using Xunit.Sdk; namespace Templates.Test { @@ -70,7 +68,6 @@ private static IConfiguration CreateConfiguration() public ProjectFactoryFixture ProjectFactory { get; set; } public ITestOutputHelper Output { get; } - public Project Project { get; protected set; } public ContextInformation BrowserContextInfo { get; protected set; } public BrowserManager BrowserManager { get; private set; } @@ -109,24 +106,24 @@ void LogMessage(WriteContext ctx) } } - protected async Task CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false) + protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false) { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - Project = await ProjectFactory.GetOrCreateProject(projectName, Output); + var project = await ProjectFactory.GetOrCreateProject(projectName, Output); if (targetFramework != null) { - Project.TargetFramework = targetFramework; + project.TargetFramework = targetFramework; } - var createResult = await Project.RunDotNetNewAsync(ProjectType, auth: auth, args: args); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", Project, createResult)); + var createResult = await project.RunDotNetNewAsync(ProjectType, auth: auth, args: args); + Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - var targetProject = Project; + var targetProject = project; if (serverProject) { - targetProject = GetSubProject(Project, "Server", $"{Project.ProjectName}.Server"); + targetProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); } var publishResult = await targetProject.RunDotNetPublishAsync(noRestore: !serverProject); @@ -138,6 +135,8 @@ protected async Task CreateBuildPublishAsync(string projectName, string auth = n var buildResult = await targetProject.RunDotNetBuildAsync(); Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", targetProject, buildResult)); + + return project; } protected static Project GetSubProject(Project project, string projectDirectory, string projectName) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 0e4feabfa5a2..bc9317f02169 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -17,7 +17,6 @@ using Microsoft.Extensions.CommandLineUtils; using Newtonsoft.Json.Linq; using PlaywrightSharp; -using ProjectTemplates.Tests.Infrastructure; using Templates.Test.Helpers; using Xunit; using Xunit.Abstractions; @@ -28,19 +27,17 @@ namespace Templates.Test public class BlazorWasmTemplateTest : BlazorTemplateTest { public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) - : base(projectFactory, output) - { - } + : base(projectFactory, output) { } public override string ProjectType { get; } = "blazorwasm"; [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() { - await CreateBuildPublishAsync("blazorstandalone" + BrowserKind.Chromium.ToString()); + var project = await CreateBuildPublishAsync("blazorstandalone" + BrowserKind.Chromium.ToString()); // The service worker assets manifest isn't generated for non-PWA projects - var publishDir = Path.Combine(Project.TemplatePublishDir, "wwwroot"); + var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot"); Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js"); } @@ -245,30 +242,36 @@ private void ValidatePublishedServiceWorker(Project project) Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal)); } + [ConditionalTheory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [InlineData(BrowserKind.Chromium)] + //// LocalDB doesn't work on non Windows platforms + [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] + public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthLocalDb(BrowserKind browserKind) + => CreateBuildPublishIndividualAuthProject(browserKind, useLocalDb: true); + [ConditionalTheory] [InlineData(BrowserKind.Chromium)] //// LocalDB doesn't work on non Windows platforms [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30700")] public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) - { - return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); - } + => BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); + + [ConditionalTheory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [InlineData(BrowserKind.Chromium)] + public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthNoLocalDb(BrowserKind browserKind) + => CreateBuildPublishIndividualAuthProject(browserKind, useLocalDb: false); [Theory] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind) - { - return BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); - } + => BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); - private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb) + private async Task CreateBuildPublishIndividualAuthProject(BrowserKind browserKind, bool useLocalDb) { - var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), Output); - - var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" }); - Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); + var project = await CreateBuildPublishAsync("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), + args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" }); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -304,6 +307,13 @@ private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind bro var dbUpdateResult = await serverProject.RunDotNetEfUpdateDatabaseAsync(); Assert.True(0 == dbUpdateResult.ExitCode, ErrorMessages.GetFailedProcessMessage("update database", serverProject, dbUpdateResult)); } + } + + private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb) + { + var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), Output); + + var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); await BuildAndRunTest(project.ProjectName, serverProject, browserKind, usesAuth: true); diff --git a/src/Shared/BrowserTesting/src/BrowserManager.cs b/src/Shared/BrowserTesting/src/BrowserManager.cs index 12c9f168e3d1..ede459195318 100644 --- a/src/Shared/BrowserTesting/src/BrowserManager.cs +++ b/src/Shared/BrowserTesting/src/BrowserManager.cs @@ -46,7 +46,7 @@ private async Task InitializeAsync() async Task InitializeCore() { - Playwright = await PlaywrightSharp.Playwright.CreateAsync( /*_loggerFactory, debug: "pw:api"*/); + Playwright = await PlaywrightSharp.Playwright.CreateAsync(_loggerFactory, debug: "pw:api"); foreach (var (browserName, options) in _browserManagerConfiguration.BrowserOptions) { if (!_launchBrowsers.ContainsKey(browserName)) From d08ece388567f3b9d408c8159557b1369573b8ad Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 13:39:25 -0700 Subject: [PATCH 11/53] Update BlazorTemplateTest.cs --- .../BlazorTemplateTest.cs | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index f810e6c01575..8ddab8dac99b 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -106,7 +106,7 @@ void LogMessage(WriteContext ctx) } } - protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false) + protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false) { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); @@ -120,21 +120,24 @@ protected async Task<Project> CreateBuildPublishAsync(string projectName, string var createResult = await project.RunDotNetNewAsync(ProjectType, auth: auth, args: args); Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); - var targetProject = project; - if (serverProject) + if (!onlyCreate) { - targetProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); - } + var targetProject = project; + if (serverProject) + { + targetProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); + } - var publishResult = await targetProject.RunDotNetPublishAsync(noRestore: !serverProject); - Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", targetProject, publishResult)); + var publishResult = await targetProject.RunDotNetPublishAsync(noRestore: !serverProject); + Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", targetProject, publishResult)); - // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release - // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build - // later, while the opposite is not true. + // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release + // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build + // later, while the opposite is not true. - var buildResult = await targetProject.RunDotNetBuildAsync(); - Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", targetProject, buildResult)); + var buildResult = await targetProject.RunDotNetBuildAsync(); + Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", targetProject, buildResult)); + } return project; } From 38a926ef22d075dde13f9e5ce4045b2f61add46f Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 13:59:23 -0700 Subject: [PATCH 12/53] Update BlazorWasmTemplateTest.cs --- .../BlazorWasmTemplateTest.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index bc9317f02169..51836001c36e 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -76,7 +76,23 @@ private async Task<IPage> NavigateToPage(IBrowserContext browser, string listeni [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() - => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); + { + // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 + Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); + + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); + var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); + Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); + + var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); + + var publishResult = await serverProject.RunDotNetPublishAsync(); + Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult)); + + var buildResult = await serverProject.RunDotNetBuildAsync(); + Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult)); + } + // => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); [Theory] [InlineData(BrowserKind.Chromium)] From e205d240ace00d631bf547c9494dfa582a834648 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 14:52:22 -0700 Subject: [PATCH 13/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 51836001c36e..1d740b8c1191 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -34,7 +34,7 @@ public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputH [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() { - var project = await CreateBuildPublishAsync("blazorstandalone" + BrowserKind.Chromium.ToString()); + var project = await CreateBuildPublishAsync("blazorstandalone" + BrowserKind.Chromium); // The service worker assets manifest isn't generated for non-PWA projects var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot"); @@ -80,7 +80,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + BrowserKind.Chromium, Output); var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); From e856f9e651924170726d399ea1db453fccffe2e2 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 15:24:03 -0700 Subject: [PATCH 14/53] Add logging --- .../BlazorServerTemplateTest.cs | 8 +-- .../BlazorTemplateTest.cs | 70 ++++++++++--------- .../BlazorWasmTemplateTest.cs | 26 +++---- 3 files changed, 53 insertions(+), 51 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index 7e5356409ca4..218691f27315 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -19,8 +19,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorServerTemplateTest : BlazorTemplateTest { - public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) - : base(projectFactory, output) + public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper TestOutputHelper) + : base(projectFactory, TestOutputHelper) { } @@ -40,7 +40,7 @@ public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuthUseLocalDb(Bro //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), Output); + var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), TestOutputHelper); await using var browser = BrowserManager.IsAvailable(browserKind) ? await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : @@ -96,7 +96,7 @@ await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB) { - var project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); + var project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), TestOutputHelper); var browser = !BrowserManager.IsAvailable(browserKind) ? null : diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index f810e6c01575..22ee9306c1f8 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -4,9 +4,11 @@ using System; using System.Diagnostics; using System.IO; +using System.Reflection; using System.Runtime.InteropServices; using System.Threading.Tasks; using Microsoft.AspNetCore.BrowserTesting; +using Microsoft.AspNetCore.Testing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Testing; @@ -16,23 +18,47 @@ namespace Templates.Test { - public abstract class BlazorTemplateTest : IAsyncLifetime + public abstract class BlazorTemplateTest : LoggedTest, IAsyncLifetime { public const int BUILDCREATEPUBLISH_PRIORITY = -1000; public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) + : base(output) { ProjectFactory = projectFactory; - Output = output; + } + + public override void Initialize(TestContext context, MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) + { + base.Initialize(context, methodInfo, testMethodArguments, testOutputHelper); + } public async Task InitializeAsync() { - var sink = new TestSink(); - sink.MessageLogged += LogBrowserManagerMessage; - var factory = new TestLoggerFactory(sink, enabled: true); + TestSink.MessageLogged += LogMessage; + var factory = new TestLoggerFactory(TestSink, enabled: true); + + void LogMessage(WriteContext ctx) + { + TestOutputHelper.WriteLine($"{MapLogLevel(ctx)}: [Browser]{ctx.Message}"); + + static string MapLogLevel(WriteContext obj) => obj.LogLevel switch + { + LogLevel.Trace => "trace", + LogLevel.Debug => "dbug", + LogLevel.Information => "info", + LogLevel.Warning => "warn", + LogLevel.Error => "error", + LogLevel.Critical => "crit", + LogLevel.None => "info", + _ => "info" + }; + } + + //new TestLoggerFactory(TestSink, enabled: true); + BrowserContextInfo = new ContextInformation(factory); BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), factory); - BrowserContextInfo = new ContextInformation(CreateFactory(Output)); } private static IConfiguration CreateConfiguration() @@ -67,10 +93,11 @@ private static IConfiguration CreateConfiguration() public Task DisposeAsync() => BrowserManager.DisposeAsync(); public ProjectFactoryFixture ProjectFactory { get; set; } - public ITestOutputHelper Output { get; } public ContextInformation BrowserContextInfo { get; protected set; } public BrowserManager BrowserManager { get; private set; } + public ILoggerFactory TestLoggerFactory { get; private set; } + public abstract string ProjectType { get; } private static readonly bool _isCIEnvironment = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); @@ -78,32 +105,7 @@ private static IConfiguration CreateConfiguration() private void LogBrowserManagerMessage(WriteContext context) { - Output.WriteLine(context.Message); - } - - public static ILoggerFactory CreateFactory(ITestOutputHelper output) - { - var testSink = new TestSink(); - testSink.MessageLogged += LogMessage; - var loggerFactory = new TestLoggerFactory(testSink, enabled: true); - return loggerFactory; - - void LogMessage(WriteContext ctx) - { - output.WriteLine($"{MapLogLevel(ctx)}: [Browser]{ctx.Message}"); - - static string MapLogLevel(WriteContext obj) => obj.LogLevel switch - { - LogLevel.Trace => "trace", - LogLevel.Debug => "dbug", - LogLevel.Information => "info", - LogLevel.Warning => "warn", - LogLevel.Error => "error", - LogLevel.Critical => "crit", - LogLevel.None => "info", - _ => "info" - }; - } + TestOutputHelper.WriteLine(context.Message); } protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false) @@ -111,7 +113,7 @@ protected async Task<Project> CreateBuildPublishAsync(string projectName, string // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject(projectName, Output); + var project = await ProjectFactory.GetOrCreateProject(projectName, TestOutputHelper); if (targetFramework != null) { project.TargetFramework = targetFramework; diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index bc9317f02169..4db13de5f4f1 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -26,8 +26,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorWasmTemplateTest : BlazorTemplateTest { - public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) - : base(projectFactory, output) { } + public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper TestOutputHelper) + : base(projectFactory, TestOutputHelper) { } public override string ProjectType { get; } = "blazorwasm"; @@ -46,14 +46,14 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, TestOutputHelper); await BuildAndRunTest(project.ProjectName, project, browserKind); var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); using (serveProcess) { - Output.WriteLine($"Opening browser at {listeningUri}..."); + TestOutputHelper.WriteLine($"Opening browser at {listeningUri}..."); if (BrowserManager.IsAvailable(browserKind)) { await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); @@ -83,7 +83,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, TestOutputHelper); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -136,7 +136,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_StandalonePwa() [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorstandalonepwa", Output); + var project = await ProjectFactory.GetOrCreateProject("blazorstandalonepwa", TestOutputHelper); await BuildAndRunTest(project.ProjectName, project, browserKind); @@ -146,7 +146,7 @@ public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) { var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - Output.WriteLine($"Opening browser at {listeningUri}..."); + TestOutputHelper.WriteLine($"Opening browser at {listeningUri}..."); var page = await NavigateToPage(browser, listeningUri); using (serveProcess) { @@ -176,7 +176,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", TestOutputHelper); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -311,7 +311,7 @@ private async Task CreateBuildPublishIndividualAuthProject(BrowserKind browserKi private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb) { - var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), TestOutputHelper); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -357,7 +357,7 @@ public Task BlazorWasmStandaloneTemplate_CreateBuildPublish_IndividualAuth(Brows [InlineData(BrowserKind.Chromium, Skip = "https://github.com/dotnet/aspnetcore/issues/28596")] public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorstandaloneindividual" + browserKind, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorstandaloneindividual" + browserKind, TestOutputHelper); // We don't want to test the auth flow as we don't have the required settings to talk to a third-party IdP // but we want to make sure that we are able to run the app without errors. @@ -368,7 +368,7 @@ public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); using (serveProcess) { - Output.WriteLine($"Opening browser at {listeningUri}..."); + TestOutputHelper.WriteLine($"Opening browser at {listeningUri}..."); await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await NavigateToPage(browser, listeningUri); await TestBasicNavigation(project.ProjectName, page); @@ -583,7 +583,7 @@ private void UpdatePublishedSettings(Project serverProject) { var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot"); - Output.WriteLine("Running dotnet serve on published output..."); + TestOutputHelper.WriteLine("Running dotnet serve on published TestOutputHelper..."); var developmentCertificate = DevelopmentCertificate.Create(project.TemplateOutputDir); var args = $"-S --pfx \"{developmentCertificate.CertificatePath}\" --pfx-pwd \"{developmentCertificate.CertificatePassword}\" --port 0"; var command = DotNetMuxer.MuxerPathOrDefault(); @@ -597,7 +597,7 @@ private void UpdatePublishedSettings(Project serverProject) args = "--roll-forward LatestMajor " + args; // dotnet-serve targets net5.0 by default } - var serveProcess = ProcessEx.Run(Output, publishDir, command, args); + var serveProcess = ProcessEx.Run(TestOutputHelper, publishDir, command, args); var listeningUri = ResolveListeningUrl(serveProcess); return (serveProcess, listeningUri); } From 778d568b69af54565eae765d85aa8a9a311786d6 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:01:37 -0700 Subject: [PATCH 15/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index e004f1dbae9a..c20eda144d69 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -75,12 +75,12 @@ private async Task<IPage> NavigateToPage(IBrowserContext browser, string listeni } [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] - public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() + public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + BrowserKind.Chromium, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + BrowserKind.Chromium, TestOutputHelper); var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); @@ -99,7 +99,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_Hosted() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Test`Helper); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); From 9b300b2c860ab79fea41a4a17fea30d052837487 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 17:04:13 -0700 Subject: [PATCH 16/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index c20eda144d69..aa966aa4d663 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -99,7 +99,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Test`Helper); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, TestOutputHelper); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); From c0aae25fd22e4904f539f2425ac14d3549c45da7 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 20:32:08 -0700 Subject: [PATCH 17/53] Update BlazorTemplateTest.cs --- .../BlazorTemplateTest.cs | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 8ff5a88d4bd7..7bb3725af552 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -18,7 +18,7 @@ namespace Templates.Test { - public abstract class BlazorTemplateTest : LoggedTest, IAsyncLifetime + public abstract class BlazorTemplateTest : LoggedTestBase, IAsyncLifetime { public const int BUILDCREATEPUBLISH_PRIORITY = -1000; @@ -28,16 +28,19 @@ public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelpe ProjectFactory = projectFactory; } - public override void Initialize(TestContext context, MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) - { - base.Initialize(context, methodInfo, testMethodArguments, testOutputHelper); + public ProjectFactoryFixture ProjectFactory { get; set; } + public ContextInformation BrowserContextInfo { get; protected set; } + public BrowserManager BrowserManager { get; private set; } - } + public abstract string ProjectType { get; } + private static readonly bool _isCIEnvironment = + !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); public async Task InitializeAsync() { - TestSink.MessageLogged += LogMessage; - var factory = new TestLoggerFactory(TestSink, enabled: true); + var testSink = new TestSink(); + testSink.MessageLogged += LogMessage; + var factory = new TestLoggerFactory(testSink, enabled: true); void LogMessage(WriteContext ctx) { @@ -56,11 +59,12 @@ void LogMessage(WriteContext ctx) }; } - //new TestLoggerFactory(TestSink, enabled: true); - BrowserContextInfo = new ContextInformation(factory); BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), factory); + BrowserContextInfo = new ContextInformation(factory); } + public Task DisposeAsync() => BrowserManager.DisposeAsync(); + private static IConfiguration CreateConfiguration() { var basePath = Path.GetDirectoryName(typeof(BlazorTemplateTest).Assembly.Location); @@ -90,19 +94,6 @@ private static IConfiguration CreateConfiguration() return builder.Build(); } - public Task DisposeAsync() => BrowserManager.DisposeAsync(); - - public ProjectFactoryFixture ProjectFactory { get; set; } - public ContextInformation BrowserContextInfo { get; protected set; } - public BrowserManager BrowserManager { get; private set; } - - public ILoggerFactory TestLoggerFactory { get; private set; } - - public abstract string ProjectType { get; } - private static readonly bool _isCIEnvironment = - !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); - - private void LogBrowserManagerMessage(WriteContext context) { TestOutputHelper.WriteLine(context.Message); From 9cbac954d8f8a1a5489df29b901c191f31bd257d Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 16 Mar 2021 23:48:00 -0700 Subject: [PATCH 18/53] Update AssemblyInfo.AssemblyFixtures.cs --- .../BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs index 501ac0ac0498..e3d87ba98ee3 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs @@ -8,6 +8,5 @@ using Xunit; [assembly: AssemblyFixture(typeof(ProjectFactoryFixture))] -//[assembly: AssemblyFixture(typeof(PlaywrightFixture<BlazorServerTemplateTest>))] [assembly: CollectionBehavior(DisableTestParallelization = true)] From 488f2458040a9c630c439d77744a0efa2a3f71a7 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Wed, 17 Mar 2021 02:18:52 -0700 Subject: [PATCH 19/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index aa966aa4d663..ade0d819d06f 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -125,6 +125,8 @@ public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { EnsureBrowserAvailable(browserKind); } + + Assert.True(1 == 0); } private static async Task AssertCompressionFormat(AspNetProcess aspNetProcess, string expectedEncoding) @@ -286,6 +288,9 @@ public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(Browser private async Task CreateBuildPublishIndividualAuthProject(BrowserKind browserKind, bool useLocalDb) { + // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 + Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); + var project = await CreateBuildPublishAsync("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" }); From 861afce2b81df74ecf3f850c0f63ac7aed5d5f4d Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 12:57:36 -0700 Subject: [PATCH 20/53] Update BlazorTemplateTest.cs --- .../BlazorTemplateTest.cs | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 7bb3725af552..4d0df1c607a3 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -38,29 +38,8 @@ public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelpe public async Task InitializeAsync() { - var testSink = new TestSink(); - testSink.MessageLogged += LogMessage; - var factory = new TestLoggerFactory(testSink, enabled: true); - - void LogMessage(WriteContext ctx) - { - TestOutputHelper.WriteLine($"{MapLogLevel(ctx)}: [Browser]{ctx.Message}"); - - static string MapLogLevel(WriteContext obj) => obj.LogLevel switch - { - LogLevel.Trace => "trace", - LogLevel.Debug => "dbug", - LogLevel.Information => "info", - LogLevel.Warning => "warn", - LogLevel.Error => "error", - LogLevel.Critical => "crit", - LogLevel.None => "info", - _ => "info" - }; - } - - BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), factory); - BrowserContextInfo = new ContextInformation(factory); + BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); + BrowserContextInfo = new ContextInformation(LoggerFactory); } public Task DisposeAsync() => BrowserManager.DisposeAsync(); From 1569cb27478966686d5f15e5f83b224b7e603faa Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 14:56:06 -0700 Subject: [PATCH 21/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 4d0df1c607a3..70a98359ee86 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -18,7 +18,7 @@ namespace Templates.Test { - public abstract class BlazorTemplateTest : LoggedTestBase, IAsyncLifetime + public abstract class BlazorTemplateTest : LoggedTest, IAsyncLifetime { public const int BUILDCREATEPUBLISH_PRIORITY = -1000; @@ -36,12 +36,15 @@ public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelpe private static readonly bool _isCIEnvironment = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); - public async Task InitializeAsync() + public override async Task InitializeAsync(TestContext context, MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) { + await base.InitializeAsync(context, methodInfo, testMethodArguments, testOutputHelper); BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); BrowserContextInfo = new ContextInformation(LoggerFactory); } + public async Task InitializeAsync() => Task.CompletedTask; + public Task DisposeAsync() => BrowserManager.DisposeAsync(); private static IConfiguration CreateConfiguration() From 0e6f858eace7e35c0dfbe9444d7f5dddd0d58e8b Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 15:47:58 -0700 Subject: [PATCH 22/53] Update LoggedTestBase.cs --- src/Testing/src/LoggedTest/LoggedTestBase.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Testing/src/LoggedTest/LoggedTestBase.cs b/src/Testing/src/LoggedTest/LoggedTestBase.cs index 362904b3e38a..c04617908657 100644 --- a/src/Testing/src/LoggedTest/LoggedTestBase.cs +++ b/src/Testing/src/LoggedTest/LoggedTestBase.cs @@ -95,6 +95,12 @@ public virtual void Initialize(TestContext context, MethodInfo methodInfo, objec _initializationException = ExceptionDispatchInfo.Capture(e); } } + + public virtual Task InitializeAsync(TestContext context, MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) + { + Initialize(context, methodInfo, testMethodArguments, testOutputHelper); + return Task.CompletedTask; + } public virtual void Dispose() { @@ -110,12 +116,11 @@ public virtual void Dispose() _testLog.Dispose(); } - Task ITestMethodLifecycle.OnTestStartAsync(TestContext context, CancellationToken cancellationToken) + async Task ITestMethodLifecycle.OnTestStartAsync(TestContext context, CancellationToken cancellationToken) { Context = context; - - Initialize(context, context.TestMethod, context.MethodArguments, context.Output); + await InitializeAsync(context, context.TestMethod, context.MethodArguments, context.Output); return Task.CompletedTask; } From f2d395b8c405d389ef87a8debc30bc0048599101 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 16:46:03 -0700 Subject: [PATCH 23/53] Update LoggedTestBase.cs --- src/Testing/src/LoggedTest/LoggedTestBase.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Testing/src/LoggedTest/LoggedTestBase.cs b/src/Testing/src/LoggedTest/LoggedTestBase.cs index c04617908657..26c5b029f54d 100644 --- a/src/Testing/src/LoggedTest/LoggedTestBase.cs +++ b/src/Testing/src/LoggedTest/LoggedTestBase.cs @@ -116,12 +116,11 @@ public virtual void Dispose() _testLog.Dispose(); } - async Task ITestMethodLifecycle.OnTestStartAsync(TestContext context, CancellationToken cancellationToken) + Task ITestMethodLifecycle.OnTestStartAsync(TestContext context, CancellationToken cancellationToken) { Context = context; - await InitializeAsync(context, context.TestMethod, context.MethodArguments, context.Output); - return Task.CompletedTask; + return InitializeAsync(context, context.TestMethod, context.MethodArguments, context.Output); } Task ITestMethodLifecycle.OnTestEndAsync(TestContext context, Exception exception, CancellationToken cancellationToken) From 54d171e48cef8fdd132891e7bb9b1bcb338f679a Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 18:23:37 -0700 Subject: [PATCH 24/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 70a98359ee86..730bcaa6a764 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -43,7 +43,7 @@ public override async Task InitializeAsync(TestContext context, MethodInfo metho BrowserContextInfo = new ContextInformation(LoggerFactory); } - public async Task InitializeAsync() => Task.CompletedTask; + public Task InitializeAsync() => Task.CompletedTask; public Task DisposeAsync() => BrowserManager.DisposeAsync(); From e204476ea106abce3560e58ceeadca946aca8757 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 20:43:29 -0700 Subject: [PATCH 25/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 730bcaa6a764..b992cec6cb3b 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -32,6 +32,19 @@ public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelpe public ContextInformation BrowserContextInfo { get; protected set; } public BrowserManager BrowserManager { get; private set; } + private ITestOutputHelper _output; + public ITestOutputHelper Output + { + get + { + if (_output == null) + { + _output = new TestOutputLogger(Logger); + } + return _output; + } + } + public abstract string ProjectType { get; } private static readonly bool _isCIEnvironment = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); @@ -86,7 +99,7 @@ protected async Task<Project> CreateBuildPublishAsync(string projectName, string // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject(projectName, TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject(projectName, Output); if (targetFramework != null) { project.TargetFramework = targetFramework; From d31198fc393a660936595294599a0c1415cfc50c Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 20:44:52 -0700 Subject: [PATCH 26/53] Update BlazorServerTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorServerTemplateTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index ae5ab078eba5..c3629f3ca625 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -19,8 +19,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorServerTemplateTest : BlazorTemplateTest { - public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper TestOutputHelper) - : base(projectFactory, TestOutputHelper) + public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper testOutputHelper) + : base(projectFactory, testOutputHelper) { } @@ -40,7 +40,7 @@ public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuthUseLocalDb(Bro //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind.ToString(), TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind, Output); await using var browser = BrowserManager.IsAvailable(browserKind) ? await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : @@ -97,7 +97,7 @@ await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")] public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB) { - var project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""), Output); var browser = !BrowserManager.IsAvailable(browserKind) ? null : From 8b17ff6fa0d57be68fc1d5bfe5ed318104943e81 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Thu, 18 Mar 2021 20:49:07 -0700 Subject: [PATCH 27/53] Use correct logger --- .../BlazorWasmTemplateTest.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 1ceb810745c6..1978e83642d3 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -26,8 +26,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorWasmTemplateTest : BlazorTemplateTest { - public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper TestOutputHelper) - : base(projectFactory, TestOutputHelper) { } + public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper testOutputHelper) + : base(projectFactory, testOutputHelper) { } public override string ProjectType { get; } = "blazorwasm"; @@ -46,14 +46,14 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, Output); await BuildAndRunTest(project.ProjectName, project, browserKind); var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); using (serveProcess) { - TestOutputHelper.WriteLine($"Opening browser at {listeningUri}..."); + Output.WriteLine($"Opening browser at {listeningUri}..."); if (BrowserManager.IsAvailable(browserKind)) { await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); @@ -80,7 +80,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + BrowserKind.Chromium, TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + BrowserKind.Chromium, Output); var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); @@ -99,7 +99,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -154,7 +154,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_StandalonePwa() [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorstandalonepwa", TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorstandalonepwa", Output); await BuildAndRunTest(project.ProjectName, project, browserKind); @@ -164,7 +164,7 @@ public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) { var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); - TestOutputHelper.WriteLine($"Opening browser at {listeningUri}..."); + Output.WriteLine($"Opening browser at {listeningUri}..."); var page = await NavigateToPage(browser, listeningUri); using (serveProcess) { @@ -194,7 +194,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -333,7 +333,7 @@ private async Task CreateBuildPublishIndividualAuthProject(BrowserKind browserKi private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb) { - var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""), Output); var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server"); @@ -379,7 +379,7 @@ public Task BlazorWasmStandaloneTemplate_CreateBuildPublish_IndividualAuth(Brows [InlineData(BrowserKind.Chromium, Skip = "https://github.com/dotnet/aspnetcore/issues/28596")] public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind browserKind) { - var project = await ProjectFactory.GetOrCreateProject("blazorstandaloneindividual" + browserKind, TestOutputHelper); + var project = await ProjectFactory.GetOrCreateProject("blazorstandaloneindividual" + browserKind, Output); // We don't want to test the auth flow as we don't have the required settings to talk to a third-party IdP // but we want to make sure that we are able to run the app without errors. @@ -390,7 +390,7 @@ public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind var (serveProcess, listeningUri) = RunPublishedStandaloneBlazorProject(project); using (serveProcess) { - TestOutputHelper.WriteLine($"Opening browser at {listeningUri}..."); + Output.WriteLine($"Opening browser at {listeningUri}..."); await using var browser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo); var page = await NavigateToPage(browser, listeningUri); await TestBasicNavigation(project.ProjectName, page); @@ -605,7 +605,7 @@ private void UpdatePublishedSettings(Project serverProject) { var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot"); - TestOutputHelper.WriteLine("Running dotnet serve on published TestOutputHelper..."); + Output.WriteLine("Running dotnet serve on published output..."); var developmentCertificate = DevelopmentCertificate.Create(project.TemplateOutputDir); var args = $"-S --pfx \"{developmentCertificate.CertificatePath}\" --pfx-pwd \"{developmentCertificate.CertificatePassword}\" --port 0"; var command = DotNetMuxer.MuxerPathOrDefault(); From 9ab5a85c0760d27cddaec78b77860bd5bb3946d8 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 00:22:03 -0700 Subject: [PATCH 28/53] Update BlazorTemplateTest.cs --- src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index b992cec6cb3b..402c0702e07b 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -92,6 +92,7 @@ private static IConfiguration CreateConfiguration() private void LogBrowserManagerMessage(WriteContext context) { TestOutputHelper.WriteLine(context.Message); + Output.WriteLine(context.Message); } protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false) From d4b6365ba41b14e9f384a14e718ec0ec6d6d705e Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:25:07 -0700 Subject: [PATCH 29/53] Update BlazorServerTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorServerTemplateTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index c3629f3ca625..cd7cd562cbae 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -19,8 +19,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorServerTemplateTest : BlazorTemplateTest { - public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper testOutputHelper) - : base(projectFactory, testOutputHelper) + public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory) + : base(projectFactory) { } From ad3f9740f40ee4177eec04722330ec3b166dfecf Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:25:29 -0700 Subject: [PATCH 30/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 402c0702e07b..28a64f939143 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -22,8 +22,7 @@ public abstract class BlazorTemplateTest : LoggedTest, IAsyncLifetime { public const int BUILDCREATEPUBLISH_PRIORITY = -1000; - public BlazorTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper output) - : base(output) + public BlazorTemplateTest(ProjectFactoryFixture projectFactory) { ProjectFactory = projectFactory; } From 9f47a47cf8a69e0b39d149e37527b503ee6a9bc2 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:25:48 -0700 Subject: [PATCH 31/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 1978e83642d3..2b63c2499ee1 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -26,8 +26,8 @@ namespace Templates.Test [TestCaseOrderer("Templates.Test.PriorityOrderer", "BlazorTemplates.Tests")] public class BlazorWasmTemplateTest : BlazorTemplateTest { - public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory, ITestOutputHelper testOutputHelper) - : base(projectFactory, testOutputHelper) { } + public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory) + : base(projectFactory) { } public override string ProjectType { get; } = "blazorwasm"; From 3dede5550690da611831e968671ca6ba2315b659 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:26:20 -0700 Subject: [PATCH 32/53] Update src/Testing/src/LoggedTest/LoggedTestBase.cs Co-authored-by: Javier Calvarro Nelson <jacalvar@microsoft.com> --- src/Testing/src/LoggedTest/LoggedTestBase.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Testing/src/LoggedTest/LoggedTestBase.cs b/src/Testing/src/LoggedTest/LoggedTestBase.cs index 26c5b029f54d..22bcd23057f7 100644 --- a/src/Testing/src/LoggedTest/LoggedTestBase.cs +++ b/src/Testing/src/LoggedTest/LoggedTestBase.cs @@ -99,9 +99,10 @@ public virtual void Initialize(TestContext context, MethodInfo methodInfo, objec public virtual Task InitializeAsync(TestContext context, MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) { Initialize(context, methodInfo, testMethodArguments, testOutputHelper); - return Task.CompletedTask; + return InitializeCoreAsync(context); } - + + protected virtual Task InitializeCoreAsync(TestContext context) => Task.CompletedTask; public virtual void Dispose() { if (_testLog == null) From 03c786f8209de330ba32e284a1abb795a2b528d9 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:27:18 -0700 Subject: [PATCH 33/53] Update LoggedTestBase.cs --- src/Testing/src/LoggedTest/LoggedTestBase.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Testing/src/LoggedTest/LoggedTestBase.cs b/src/Testing/src/LoggedTest/LoggedTestBase.cs index 22bcd23057f7..25f7f37dde72 100644 --- a/src/Testing/src/LoggedTest/LoggedTestBase.cs +++ b/src/Testing/src/LoggedTest/LoggedTestBase.cs @@ -103,6 +103,7 @@ public virtual Task InitializeAsync(TestContext context, MethodInfo methodInfo, } protected virtual Task InitializeCoreAsync(TestContext context) => Task.CompletedTask; + public virtual void Dispose() { if (_testLog == null) From d2c6bf8845c32abc57097f143484b32d7650acdc Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:28:09 -0700 Subject: [PATCH 34/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 28a64f939143..ae8973decfa6 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -48,11 +48,11 @@ public ITestOutputHelper Output private static readonly bool _isCIEnvironment = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); - public override async Task InitializeAsync(TestContext context, MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) + public override Task InitializeCoreAsync(TestContext context) { - await base.InitializeAsync(context, methodInfo, testMethodArguments, testOutputHelper); BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); BrowserContextInfo = new ContextInformation(LoggerFactory); + return Task.CompletedTask; } public Task InitializeAsync() => Task.CompletedTask; From e9d51248d3a038fde8f2d1147b4080fee458d377 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 13:37:59 -0700 Subject: [PATCH 35/53] Update MvcTemplateTest.cs --- src/ProjectTemplates/test/MvcTemplateTest.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ProjectTemplates/test/MvcTemplateTest.cs b/src/ProjectTemplates/test/MvcTemplateTest.cs index 1718059effa9..9fb394d7d68e 100644 --- a/src/ProjectTemplates/test/MvcTemplateTest.cs +++ b/src/ProjectTemplates/test/MvcTemplateTest.cs @@ -232,6 +232,9 @@ public async Task MvcTemplate_IndividualAuth(bool useLocalDB) await aspNetProcess.AssertPagesOk(pages); } + + // Look at logs + Assert.True(false); } [ConditionalFact(Skip = "https://github.com/dotnet/aspnetcore/issues/25103")] From 70a67c9dbae32cef67ad879d6e251858f976059d Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 14:43:32 -0700 Subject: [PATCH 36/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index ae8973decfa6..bfc2a91dca4e 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -48,7 +48,7 @@ public ITestOutputHelper Output private static readonly bool _isCIEnvironment = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); - public override Task InitializeCoreAsync(TestContext context) + protected override Task InitializeCoreAsync(TestContext context) { BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); BrowserContextInfo = new ContextInformation(LoggerFactory); From d6723c09935b6aba50317998f3646a30384b9a80 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 15:32:49 -0700 Subject: [PATCH 37/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index bfc2a91dca4e..9e9f59f3be1d 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -48,11 +48,10 @@ public ITestOutputHelper Output private static readonly bool _isCIEnvironment = !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ContinuousIntegrationBuild")); - protected override Task InitializeCoreAsync(TestContext context) + protected async override Task InitializeCoreAsync(TestContext context) { BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); BrowserContextInfo = new ContextInformation(LoggerFactory); - return Task.CompletedTask; } public Task InitializeAsync() => Task.CompletedTask; From 815ad0d4367a41af0becb97e97e9290715c2f3bb Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:31:42 -0700 Subject: [PATCH 38/53] Hook testsink to actually do something! --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 9e9f59f3be1d..4f9d12a49fa0 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -50,6 +50,7 @@ public ITestOutputHelper Output protected async override Task InitializeCoreAsync(TestContext context) { + TestSink.MessageLogged += LogMessage; BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); BrowserContextInfo = new ContextInformation(LoggerFactory); } @@ -87,9 +88,8 @@ private static IConfiguration CreateConfiguration() return builder.Build(); } - private void LogBrowserManagerMessage(WriteContext context) + private void LogMessage(WriteContext context) { - TestOutputHelper.WriteLine(context.Message); Output.WriteLine(context.Message); } From 26787511fb23efef992c87c0b3afbab8534f5fe8 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 19:00:07 -0700 Subject: [PATCH 39/53] Update BlazorTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorTemplateTest.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs index 4f9d12a49fa0..dee39da69f57 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs @@ -50,9 +50,9 @@ public ITestOutputHelper Output protected async override Task InitializeCoreAsync(TestContext context) { - TestSink.MessageLogged += LogMessage; BrowserManager = await BrowserManager.CreateAsync(CreateConfiguration(), LoggerFactory); BrowserContextInfo = new ContextInformation(LoggerFactory); + _output = new TestOutputLogger(Logger); } public Task InitializeAsync() => Task.CompletedTask; @@ -88,11 +88,6 @@ private static IConfiguration CreateConfiguration() return builder.Build(); } - private void LogMessage(WriteContext context) - { - Output.WriteLine(context.Message); - } - protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false) { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 From 968b57ea2c4ee0c10ea1b15e3d6157e30460bd5d Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:57:33 -0700 Subject: [PATCH 40/53] Pass output to project methods --- src/ProjectTemplates/Shared/Project.cs | 59 +++++++++++++++----------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/src/ProjectTemplates/Shared/Project.cs b/src/ProjectTemplates/Shared/Project.cs index bf2d1082587b..1cbd785e8167 100644 --- a/src/ProjectTemplates/Shared/Project.cs +++ b/src/ProjectTemplates/Shared/Project.cs @@ -55,8 +55,10 @@ internal async Task<ProcessResult> RunDotNetNewAsync( bool noHttps = false, string[] args = null, // Used to set special options in MSBuild - IDictionary<string, string> environmentVariables = null) + IDictionary<string, string> environmentVariables = null, + ITestOutputHelper output = null) { + output = output ?? Output; var hiveArg = $"--debug:custom-hive \"{TemplatePackageInstaller.CustomHivePath}\""; var argString = $"new {templateName} {hiveArg}"; environmentVariables ??= new Dictionary<string, string>(); @@ -100,48 +102,51 @@ internal async Task<ProcessResult> RunDotNetNewAsync( await DotNetNewLock.WaitAsync(); try { - Output.WriteLine("Acquired DotNetNewLock"); - using var execution = ProcessEx.Run(Output, AppContext.BaseDirectory, DotNetMuxer.MuxerPathOrDefault(), argString, environmentVariables); + output.WriteLine("Acquired DotNetNewLock"); + using var execution = ProcessEx.Run(output, AppContext.BaseDirectory, DotNetMuxer.MuxerPathOrDefault(), argString, environmentVariables); await execution.Exited; return new ProcessResult(execution); } finally { DotNetNewLock.Release(); - Output.WriteLine("Released DotNetNewLock"); + output.WriteLine("Released DotNetNewLock"); } } - internal async Task<ProcessResult> RunDotNetPublishAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, bool noRestore = true) + internal async Task<ProcessResult> RunDotNetPublishAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, bool noRestore = true, ITestOutputHelper output = null) { - Output.WriteLine("Publishing ASP.NET Core application..."); + output = output ?? Output; + output.WriteLine("Publishing ASP.NET Core application..."); // Avoid restoring as part of build or publish. These projects should have already restored as part of running dotnet new. Explicitly disabling restore // should avoid any global contention and we can execute a build or publish in a lock-free way var restoreArgs = noRestore ? "--no-restore" : null; - using var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"publish {restoreArgs} -c Release /bl {additionalArgs}", packageOptions); + using var result = ProcessEx.Run(output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"publish {restoreArgs} -c Release /bl {additionalArgs}", packageOptions); await result.Exited; CaptureBinLogOnFailure(result); return new ProcessResult(result); } - internal async Task<ProcessResult> RunDotNetBuildAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null) + internal async Task<ProcessResult> RunDotNetBuildAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, ITestOutputHelper output = null) { - Output.WriteLine("Building ASP.NET Core application..."); + output = output ?? Output; + output.WriteLine("Building ASP.NET Core application..."); // Avoid restoring as part of build or publish. These projects should have already restored as part of running dotnet new. Explicitly disabling restore // should avoid any global contention and we can execute a build or publish in a lock-free way - using var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"build --no-restore -c Debug /bl {additionalArgs}", packageOptions); + using var result = ProcessEx.Run(output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"build --no-restore -c Debug /bl {additionalArgs}", packageOptions); await result.Exited; CaptureBinLogOnFailure(result); return new ProcessResult(result); } - internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogger logger = null) + internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogger logger = null, ITestOutputHelper output = null) { + output = output ?? Output; var environment = new Dictionary<string, string> { ["ASPNETCORE_URLS"] = _urls, @@ -164,25 +169,26 @@ internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogg if (updated == original) { - Output.WriteLine("applicationUrl is not specified in launchSettings.json"); + output.WriteLine("applicationUrl is not specified in launchSettings.json"); } else { - Output.WriteLine("Updating applicationUrl in launchSettings.json"); + output.WriteLine("Updating applicationUrl in launchSettings.json"); File.WriteAllText(launchSettingsJson, updated); } } else { - Output.WriteLine("No launchSettings.json found to update."); + output.WriteLine("No launchSettings.json found to update."); } var projectDll = Path.Combine(TemplateBuildDir, $"{ProjectName}.dll"); - return new AspNetProcess(Output, TemplateOutputDir, projectDll, environment, published: false, hasListeningUri: hasListeningUri, logger: logger); + return new AspNetProcess(output, TemplateOutputDir, projectDll, environment, published: false, hasListeningUri: hasListeningUri, logger: logger); } - internal AspNetProcess StartPublishedProjectAsync(bool hasListeningUri = true, bool usePublishedAppHost = false) + internal AspNetProcess StartPublishedProjectAsync(bool hasListeningUri = true, bool usePublishedAppHost = false, ITestOutputHelper output = null) { + output = output ?? Output; var environment = new Dictionary<string, string> { ["ASPNETCORE_URLS"] = _urls, @@ -193,11 +199,12 @@ internal AspNetProcess StartPublishedProjectAsync(bool hasListeningUri = true, b }; var projectDll = Path.Combine(TemplatePublishDir, $"{ProjectName}.dll"); - return new AspNetProcess(Output, TemplatePublishDir, projectDll, environment, published: true, hasListeningUri: hasListeningUri, usePublishedAppHost: usePublishedAppHost); + return new AspNetProcess(output, TemplatePublishDir, projectDll, environment, published: true, hasListeningUri: hasListeningUri, usePublishedAppHost: usePublishedAppHost); } - internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrationName) + internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrationName, ITestOutputHelper output = null) { + output = output ?? Output; var args = $"--verbose --no-build migrations add {migrationName}"; // Only run one instance of 'dotnet new' at once, as a workaround for @@ -205,7 +212,7 @@ internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrat await DotNetNewLock.WaitAsync(); try { - Output.WriteLine("Acquired DotNetNewLock"); + output.WriteLine("Acquired DotNetNewLock"); var command = DotNetMuxer.MuxerPathOrDefault(); if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath"))) { @@ -216,19 +223,20 @@ internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrat command = "dotnet-ef"; } - using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args); + using var result = ProcessEx.Run(output, TemplateOutputDir, command, args); await result.Exited; return new ProcessResult(result); } finally { DotNetNewLock.Release(); - Output.WriteLine("Released DotNetNewLock"); + output.WriteLine("Released DotNetNewLock"); } } - internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync() + internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync(ITestOutputHelper output = null) { + output = output ?? Output; var assembly = typeof(ProjectFactoryFixture).Assembly; var args = "--verbose --no-build database update"; @@ -238,7 +246,7 @@ internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync() await DotNetNewLock.WaitAsync(); try { - Output.WriteLine("Acquired DotNetNewLock"); + output.WriteLine("Acquired DotNetNewLock"); var command = DotNetMuxer.MuxerPathOrDefault(); if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath"))) { @@ -249,14 +257,14 @@ internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync() command = "dotnet-ef"; } - using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args); + using var result = ProcessEx.Run(output, TemplateOutputDir, command, args); await result.Exited; return new ProcessResult(result); } finally { DotNetNewLock.Release(); - Output.WriteLine("Released DotNetNewLock"); + output.WriteLine("Released DotNetNewLock"); } } @@ -311,6 +319,7 @@ public string ReadFile(string path) internal async Task<ProcessEx> RunDotNetNewRawAsync(string arguments) { + output = output ?? Output; await DotNetNewLock.WaitAsync(); try { From e48461d8d8f84771d56c17af5046bdc035cbb326 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Fri, 19 Mar 2021 22:04:05 -0700 Subject: [PATCH 41/53] Fixup output helper in GetOrCreateProject --- src/ProjectTemplates/Shared/ProjectFactoryFixture.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs b/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs index 2f25714fd64b..fb64f0554dcf 100644 --- a/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs +++ b/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs @@ -26,6 +26,12 @@ public ProjectFactoryFixture(IMessageSink diagnosticsMessageSink) public async Task<Project> GetOrCreateProject(string projectKey, ITestOutputHelper output) { await TemplatePackageInstaller.EnsureTemplatingEngineInitializedAsync(output); + // Different tests may have different output helpers, so need to fix up the output to write to the correct log + if (_project.TryGetValue(projectKey, out var project)) + { + project.Output = output; + return project; + } return _projects.GetOrAdd( projectKey, (key, outputHelper) => From c0018198ad6756f4b073018f90f3cfa41d55be0a Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Sat, 20 Mar 2021 02:02:20 -0700 Subject: [PATCH 42/53] Update Project.cs --- src/ProjectTemplates/Shared/Project.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/Shared/Project.cs b/src/ProjectTemplates/Shared/Project.cs index c29ad84bce95..297e8ea32d0c 100644 --- a/src/ProjectTemplates/Shared/Project.cs +++ b/src/ProjectTemplates/Shared/Project.cs @@ -318,7 +318,7 @@ public string ReadFile(string path) return File.ReadAllText(Path.Combine(TemplateOutputDir, path)); } - internal async Task<ProcessEx> RunDotNetNewRawAsync(string arguments) + internal async Task<ProcessEx> RunDotNetNewRawAsync(string arguments, ITestOutputHelper output = null) { output = output ?? Output; await DotNetNewLock.WaitAsync(); From 5172e66f6bc4ca098fb8a1abb318277a4903105b Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Sat, 20 Mar 2021 02:03:07 -0700 Subject: [PATCH 43/53] Update ProjectFactoryFixture.cs --- src/ProjectTemplates/Shared/ProjectFactoryFixture.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs b/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs index fb64f0554dcf..52fbed63dd00 100644 --- a/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs +++ b/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs @@ -27,7 +27,7 @@ public async Task<Project> GetOrCreateProject(string projectKey, ITestOutputHelp { await TemplatePackageInstaller.EnsureTemplatingEngineInitializedAsync(output); // Different tests may have different output helpers, so need to fix up the output to write to the correct log - if (_project.TryGetValue(projectKey, out var project)) + if (_projects.TryGetValue(projectKey, out var project)) { project.Output = output; return project; From 69e6f313d106c20b66b5dcc8b9cb50edf1bbefad Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Sat, 20 Mar 2021 23:36:12 -0700 Subject: [PATCH 44/53] Update Project.cs --- src/ProjectTemplates/Shared/Project.cs | 61 +++++++++++--------------- 1 file changed, 26 insertions(+), 35 deletions(-) diff --git a/src/ProjectTemplates/Shared/Project.cs b/src/ProjectTemplates/Shared/Project.cs index 297e8ea32d0c..32910329d056 100644 --- a/src/ProjectTemplates/Shared/Project.cs +++ b/src/ProjectTemplates/Shared/Project.cs @@ -56,10 +56,8 @@ internal async Task<ProcessResult> RunDotNetNewAsync( bool noHttps = false, string[] args = null, // Used to set special options in MSBuild - IDictionary<string, string> environmentVariables = null, - ITestOutputHelper output = null) + IDictionary<string, string> environmentVariables = null) { - output = output ?? Output; var hiveArg = $"--debug:custom-hive \"{TemplatePackageInstaller.CustomHivePath}\""; var argString = $"new {templateName} {hiveArg}"; environmentVariables ??= new Dictionary<string, string>(); @@ -103,51 +101,48 @@ internal async Task<ProcessResult> RunDotNetNewAsync( await DotNetNewLock.WaitAsync(); try { - output.WriteLine("Acquired DotNetNewLock"); - using var execution = ProcessEx.Run(output, AppContext.BaseDirectory, DotNetMuxer.MuxerPathOrDefault(), argString, environmentVariables); + Output.WriteLine("Acquired DotNetNewLock"); + using var execution = ProcessEx.Run(Output, AppContext.BaseDirectory, DotNetMuxer.MuxerPathOrDefault(), argString, environmentVariables); await execution.Exited; return new ProcessResult(execution); } finally { DotNetNewLock.Release(); - output.WriteLine("Released DotNetNewLock"); + Output.WriteLine("Released DotNetNewLock"); } } - internal async Task<ProcessResult> RunDotNetPublishAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, bool noRestore = true, ITestOutputHelper output = null) + internal async Task<ProcessResult> RunDotNetPublishAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, bool noRestore = true) { - output = output ?? Output; - output.WriteLine("Publishing ASP.NET Core application..."); + Output.WriteLine("Publishing ASP.NET Core application..."); // Avoid restoring as part of build or publish. These projects should have already restored as part of running dotnet new. Explicitly disabling restore // should avoid any global contention and we can execute a build or publish in a lock-free way var restoreArgs = noRestore ? "--no-restore" : null; - using var result = ProcessEx.Run(output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"publish {restoreArgs} -c Release /bl {additionalArgs}", packageOptions); + using var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"publish {restoreArgs} -c Release /bl {additionalArgs}", packageOptions); await result.Exited; CaptureBinLogOnFailure(result); return new ProcessResult(result); } - internal async Task<ProcessResult> RunDotNetBuildAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, ITestOutputHelper output = null) + internal async Task<ProcessResult> RunDotNetBuildAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null) { - output = output ?? Output; - output.WriteLine("Building ASP.NET Core application..."); + Output.WriteLine("Building ASP.NET Core application..."); // Avoid restoring as part of build or publish. These projects should have already restored as part of running dotnet new. Explicitly disabling restore // should avoid any global contention and we can execute a build or publish in a lock-free way - using var result = ProcessEx.Run(output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"build --no-restore -c Debug /bl {additionalArgs}", packageOptions); + using var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"build --no-restore -c Debug /bl {additionalArgs}", packageOptions); await result.Exited; CaptureBinLogOnFailure(result); return new ProcessResult(result); } - internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogger logger = null, ITestOutputHelper output = null) + internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogger logger = null) { - output = output ?? Output; var environment = new Dictionary<string, string> { ["ASPNETCORE_URLS"] = _urls, @@ -170,26 +165,25 @@ internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogg if (updated == original) { - output.WriteLine("applicationUrl is not specified in launchSettings.json"); + Output.WriteLine("applicationUrl is not specified in launchSettings.json"); } else { - output.WriteLine("Updating applicationUrl in launchSettings.json"); + Output.WriteLine("Updating applicationUrl in launchSettings.json"); File.WriteAllText(launchSettingsJson, updated); } } else { - output.WriteLine("No launchSettings.json found to update."); + Output.WriteLine("No launchSettings.json found to update."); } var projectDll = Path.Combine(TemplateBuildDir, $"{ProjectName}.dll"); - return new AspNetProcess(DevCert, output, TemplateOutputDir, projectDll, environment, published: false, hasListeningUri: hasListeningUri, logger: logger); + return new AspNetProcess(DevCert, Output, TemplateOutputDir, projectDll, environment, published: false, hasListeningUri: hasListeningUri, logger: logger); } - internal AspNetProcess StartPublishedProjectAsync(bool hasListeningUri = true, bool usePublishedAppHost = false, ITestOutputHelper output = null) + internal AspNetProcess StartPublishedProjectAsync(bool hasListeningUri = true, bool usePublishedAppHost = false) { - output = output ?? Output; var environment = new Dictionary<string, string> { ["ASPNETCORE_URLS"] = _urls, @@ -200,12 +194,11 @@ internal AspNetProcess StartPublishedProjectAsync(bool hasListeningUri = true, b }; var projectDll = Path.Combine(TemplatePublishDir, $"{ProjectName}.dll"); - return new AspNetProcess(DevCert, output, TemplatePublishDir, projectDll, environment, published: true, hasListeningUri: hasListeningUri, usePublishedAppHost: usePublishedAppHost); + return new AspNetProcess(DevCert, Output, TemplatePublishDir, projectDll, environment, published: true, hasListeningUri: hasListeningUri, usePublishedAppHost: usePublishedAppHost); } - internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrationName, ITestOutputHelper output = null) + internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrationName) { - output = output ?? Output; var args = $"--verbose --no-build migrations add {migrationName}"; // Only run one instance of 'dotnet new' at once, as a workaround for @@ -213,7 +206,7 @@ internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrat await DotNetNewLock.WaitAsync(); try { - output.WriteLine("Acquired DotNetNewLock"); + Output.WriteLine("Acquired DotNetNewLock"); var command = DotNetMuxer.MuxerPathOrDefault(); if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath"))) { @@ -224,20 +217,19 @@ internal async Task<ProcessResult> RunDotNetEfCreateMigrationAsync(string migrat command = "dotnet-ef"; } - using var result = ProcessEx.Run(output, TemplateOutputDir, command, args); + using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args); await result.Exited; return new ProcessResult(result); } finally { DotNetNewLock.Release(); - output.WriteLine("Released DotNetNewLock"); + Output.WriteLine("Released DotNetNewLock"); } } - internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync(ITestOutputHelper output = null) + internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync() { - output = output ?? Output; var assembly = typeof(ProjectFactoryFixture).Assembly; var args = "--verbose --no-build database update"; @@ -247,7 +239,7 @@ internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync(ITestOutputHel await DotNetNewLock.WaitAsync(); try { - output.WriteLine("Acquired DotNetNewLock"); + Output.WriteLine("Acquired DotNetNewLock"); var command = DotNetMuxer.MuxerPathOrDefault(); if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath"))) { @@ -258,14 +250,14 @@ internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync(ITestOutputHel command = "dotnet-ef"; } - using var result = ProcessEx.Run(output, TemplateOutputDir, command, args); + using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args); await result.Exited; return new ProcessResult(result); } finally { DotNetNewLock.Release(); - output.WriteLine("Released DotNetNewLock"); + Output.WriteLine("Released DotNetNewLock"); } } @@ -318,9 +310,8 @@ public string ReadFile(string path) return File.ReadAllText(Path.Combine(TemplateOutputDir, path)); } - internal async Task<ProcessEx> RunDotNetNewRawAsync(string arguments, ITestOutputHelper output = null) + internal async Task<ProcessEx> RunDotNetNewRawAsync(string arguments) { - output = output ?? Output; await DotNetNewLock.WaitAsync(); try { From f3f83173cf185915ca99d7855c05cca67cdf1afb Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Sat, 20 Mar 2021 23:36:41 -0700 Subject: [PATCH 45/53] Update MvcTemplateTest.cs --- src/ProjectTemplates/test/MvcTemplateTest.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ProjectTemplates/test/MvcTemplateTest.cs b/src/ProjectTemplates/test/MvcTemplateTest.cs index 9fb394d7d68e..1718059effa9 100644 --- a/src/ProjectTemplates/test/MvcTemplateTest.cs +++ b/src/ProjectTemplates/test/MvcTemplateTest.cs @@ -232,9 +232,6 @@ public async Task MvcTemplate_IndividualAuth(bool useLocalDB) await aspNetProcess.AssertPagesOk(pages); } - - // Look at logs - Assert.True(false); } [ConditionalFact(Skip = "https://github.com/dotnet/aspnetcore/issues/25103")] From a05039550f637811c30e4c4a17dc58619b4c45ef Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Mon, 22 Mar 2021 10:09:09 -0700 Subject: [PATCH 46/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 2b63c2499ee1..b4357a72bab3 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -125,8 +125,6 @@ public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { EnsureBrowserAvailable(browserKind); } - - Assert.True(1 == 0); } private static async Task AssertCompressionFormat(AspNetProcess aspNetProcess, string expectedEncoding) From 495da512981778e5481a55ee99f5434e25072531 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Mon, 22 Mar 2021 10:15:42 -0700 Subject: [PATCH 47/53] Update BlazorServerTemplateTest.cs --- .../BlazorServerTemplateTest.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index cd7cd562cbae..9671dbce573f 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -26,18 +26,16 @@ public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory) public override string ProjectType { get; } = "blazorserver"; + // This test is required to run before BlazorServerTemplateWorks_NoAuth to create and build the project + // If this test is quarantined, BlazorServerTemplateWorks_NoAuth must be quarantined as well [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public Task BlazorServerTemplate_CreateBuildPublish_NoAuth() => CreateBuildPublishAsync("blazorservernoauth" + BrowserKind.Chromium.ToString()); - [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] - [MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))] - public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuthUseLocalDb(BrowserKind browserKind, bool useLocalDB) - => CreateBuildPublishAsync("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : "")); - + // This tests depends on BlazorServerTemplate_CreateBuildPublish_NoAuth running first [Theory] [InlineData(BrowserKind.Chromium)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] + // [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind, Output); @@ -88,9 +86,17 @@ await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) : } } + // This test is required to run before BlazorServerTemplateWorks_IndividualAuth to create and build the project + // If this test is quarantined, BlazorServerTemplateWorks_IndividualAuth must be quarantined as well + [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))] + public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuth(BrowserKind browserKind, bool useLocalDB) + => CreateBuildPublishAsync("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : "")); + public static IEnumerable<object[]> BlazorServerTemplateWorks_IndividualAuthData => BrowserManager.WithBrowsers(new[] { BrowserKind.Chromium }, true, false); + // This tests depends on BlazorServerTemplate_CreateBuildPublish_IndividualAuth running first [Theory] [MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] From 9e38af35ae39fb534c7141539b803a867fc51e96 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Mon, 22 Mar 2021 14:39:43 -0700 Subject: [PATCH 48/53] Update comments to clarify test dependencies --- .../BlazorWasmTemplateTest.cs | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index b4357a72bab3..8d20a51877eb 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -31,16 +31,20 @@ public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory) public override string ProjectType { get; } = "blazorwasm"; - [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] - public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone() + // This test is required to run before BlazorWasmStandaloneTemplate_Works to create and build the project + // If this test is quarantined, BlazorWasmStandaloneTemplate_Works must be quarantined as well + [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [InlineData(BrowserKind.Chromium)] + public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone(BrowserKind browserKind) { - var project = await CreateBuildPublishAsync("blazorstandalone" + BrowserKind.Chromium); + var project = await CreateBuildPublishAsync("blazorstandalone" + browserKind); // The service worker assets manifest isn't generated for non-PWA projects var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot"); Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js"); } + // This test depends on BlazorWasmTemplate_CreateBuildPublish_Standalone running first [Theory] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] @@ -74,7 +78,10 @@ private async Task<IPage> NavigateToPage(IBrowserContext browser, string listeni return page; } - [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + // This test is required to run before BlazorWasmHostedTemplate_Works to create and build the project + // If this test is quarantined, BlazorWasmHostedTemplate_Works must be quarantined as well + [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] + [InlineData(BrowserKind.Chromium)] public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 @@ -94,6 +101,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() } // => CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true); + // This test depends on BlazorWasmTemplate_CreateBuildPublish_Hosted running first [Theory] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] @@ -143,11 +151,14 @@ private static async Task AssertCompressionFormat(AspNetProcess aspNetProcess, s Assert.Equal(expectedEncoding, response.Content.Headers.ContentEncoding.Single()); } + // This test is required to run before BlazorWasmStandalonePwaTemplate_Works to create and build the project + // If this test is quarantined, BlazorWasmStandalonePwaTemplate_Works must be quarantined as well [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public Task BlazorWasmTemplate_CreateBuildPublish_StandalonePwa() => CreateBuildPublishAsync("blazorstandalonepwa", args: new[] { "--pwa" }); - [Theory, TestPriority(100)] + // This test depends on BlazorWasmTemplate_CreateBuildPublish_StandalonePwa running first + [Theory] [InlineData(BrowserKind.Chromium)] [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) @@ -183,11 +194,14 @@ public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind) } } + // This test is required to run before BlazorWasmHostedPwaTemplate_Works to create and build the project + // If this test is quarantined, BlazorWasmHostedPwaTemplate_Works must be quarantined as well [Fact, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() => CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true); - [Theory, TestPriority(100)] + // This test depends on BlazorWasmTemplate_CreateBuildPublish_HostedPwa running first + [Theory, TestPriority] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) @@ -258,6 +272,8 @@ private void ValidatePublishedServiceWorker(Project project) Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal)); } + // This test is required to run before BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB to create and build the project + // If this test is quarantined, BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB must be quarantined as well [ConditionalTheory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] [InlineData(BrowserKind.Chromium)] //// LocalDB doesn't work on non Windows platforms @@ -265,6 +281,7 @@ private void ValidatePublishedServiceWorker(Project project) public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthLocalDb(BrowserKind browserKind) => CreateBuildPublishIndividualAuthProject(browserKind, useLocalDb: true); + // This test depends on BlazorWasmTemplate_CreateBuildPublish_IndividualAuthLocalDb running first [ConditionalTheory] [InlineData(BrowserKind.Chromium)] //// LocalDB doesn't work on non Windows platforms @@ -273,11 +290,14 @@ public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthLocalDb(BrowserK public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) => BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); + // This test is required to run before BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB to create and build the project + // If this test is quarantined, BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB must be quarantined as well [ConditionalTheory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] [InlineData(BrowserKind.Chromium)] public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthNoLocalDb(BrowserKind browserKind) => CreateBuildPublishIndividualAuthProject(browserKind, useLocalDb: false); + // This test depends on BlazorWasmTemplate_CreateBuildPublish_IndividualAuthNoLocalDb running first [Theory] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] @@ -361,6 +381,8 @@ private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind bro } } + // This test is required to run before BlazorWasmStandaloneTemplate_IndividualAuth_Works to create and build the project + // If this test is quarantined, BlazorWasmStandaloneTemplate_IndividualAuth_Works must be quarantined as well [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] [InlineData(BrowserKind.Chromium)] public Task BlazorWasmStandaloneTemplate_CreateBuildPublish_IndividualAuth(BrowserKind browserKind) @@ -373,6 +395,7 @@ public Task BlazorWasmStandaloneTemplate_CreateBuildPublish_IndividualAuth(Brows "sample-client-id" }); + // This test depends on BlazorWasmStandaloneTemplate_CreateBuildPublish_IndividualAuth running first [Theory] [InlineData(BrowserKind.Chromium, Skip = "https://github.com/dotnet/aspnetcore/issues/28596")] public async Task BlazorWasmStandaloneTemplate_IndividualAuth_Works(BrowserKind browserKind) From 4979b2325acccd174fbfb96ad20cf6ce676888b3 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Mon, 22 Mar 2021 16:07:59 -0700 Subject: [PATCH 49/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 8d20a51877eb..977e63597d04 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -201,7 +201,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() => CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true); // This test depends on BlazorWasmTemplate_CreateBuildPublish_HostedPwa running first - [Theory, TestPriority] + [Theory] [InlineData(BrowserKind.Chromium)] //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) From 36cdc1a87afe615f43281adcfd173e9ee49351c6 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Mon, 22 Mar 2021 16:08:25 -0700 Subject: [PATCH 50/53] Update TestPriorityAttribute.cs --- .../BlazorTemplates.Tests/TestPriorityAttribute.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs b/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs index d4f8c6cd730d..2ee0775515b8 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/TestPriorityAttribute.cs @@ -8,5 +8,4 @@ public class TestPriorityAttribute : Attribute public int Priority { get; private set; } public TestPriorityAttribute(int priority) => Priority = priority; } - } From 17fb9683a6e8a4c509bf0032fe3811b16a8bb53b Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Mon, 22 Mar 2021 16:55:35 -0700 Subject: [PATCH 51/53] Update BlazorWasmTemplateTest.cs --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index 977e63597d04..dac1ab8d5a61 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -82,12 +82,12 @@ private async Task<IPage> NavigateToPage(IBrowserContext browser, string listeni // If this test is quarantined, BlazorWasmHostedTemplate_Works must be quarantined as well [Theory, TestPriority(BUILDCREATEPUBLISH_PRIORITY)] [InlineData(BrowserKind.Chromium)] - public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted() + public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted(BrowserKind browserKind) { // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278 Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true"); - var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + BrowserKind.Chromium, Output); + var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); var createResult = await project.RunDotNetNewAsync("blazorwasm", args: new[] { "--hosted" }); Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult)); From 18865ddee30a749120cb091edafaaa5b28bcf342 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 23 Mar 2021 01:05:36 -0700 Subject: [PATCH 52/53] Requarantine tests --- .../BlazorTemplates.Tests/BlazorServerTemplateTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs index 9671dbce573f..4c2a196a32c5 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs @@ -35,7 +35,7 @@ public Task BlazorServerTemplate_CreateBuildPublish_NoAuth() // This tests depends on BlazorServerTemplate_CreateBuildPublish_NoAuth running first [Theory] [InlineData(BrowserKind.Chromium)] - // [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30761")] public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorservernoauth" + browserKind, Output); @@ -99,7 +99,7 @@ public Task BlazorServerTemplate_CreateBuildPublish_IndividualAuth(BrowserKind b // This tests depends on BlazorServerTemplate_CreateBuildPublish_IndividualAuth running first [Theory] [MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30807")] [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")] public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB) { @@ -193,7 +193,7 @@ private async Task TestBasicNavigation(Project project, IPage page) [InlineData("SingleOrg", null)] [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })] [InlineData("SingleOrg", new string[] { "--calls-graph" })] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish(string auth, string[] args) => CreateBuildPublishAsync("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), auth, args); From a13c1f066205cc14a10bceb9a8ca0ccaa3f695c0 Mon Sep 17 00:00:00 2001 From: Hao Kung <HaoK@users.noreply.github.com> Date: Tue, 23 Mar 2021 01:06:53 -0700 Subject: [PATCH 53/53] Requarantine tests --- .../BlazorTemplates.Tests/BlazorWasmTemplateTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs index dac1ab8d5a61..356ac48bb551 100644 --- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs +++ b/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs @@ -47,7 +47,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Standalone(BrowserKind b // This test depends on BlazorWasmTemplate_CreateBuildPublish_Standalone running first [Theory] [InlineData(BrowserKind.Chromium)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorstandalone" + browserKind, Output); @@ -104,7 +104,7 @@ public async Task BlazorWasmTemplate_CreateBuildPublish_Hosted(BrowserKind brows // This test depends on BlazorWasmTemplate_CreateBuildPublish_Hosted running first [Theory] [InlineData(BrowserKind.Chromium)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorhosted" + browserKind, Output); @@ -203,7 +203,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_HostedPwa() // This test depends on BlazorWasmTemplate_CreateBuildPublish_HostedPwa running first [Theory] [InlineData(BrowserKind.Chromium)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30882")] public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind) { var project = await ProjectFactory.GetOrCreateProject("blazorhostedpwa", Output); @@ -286,7 +286,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthLocalDb(BrowserK [InlineData(BrowserKind.Chromium)] //// LocalDB doesn't work on non Windows platforms [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30700")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30700")] public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB(BrowserKind browserKind) => BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, true); @@ -300,7 +300,7 @@ public Task BlazorWasmTemplate_CreateBuildPublish_IndividualAuthNoLocalDb(Browse // This test depends on BlazorWasmTemplate_CreateBuildPublish_IndividualAuthNoLocalDb running first [Theory] [InlineData(BrowserKind.Chromium)] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30820")] [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")] public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind) => BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false); @@ -490,7 +490,7 @@ public TemplateInstance(string name, params string[] arguments) [Theory] [MemberData(nameof(TemplateData))] - //[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30880")] + [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/30880")] public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_Works(TemplateInstance instance) => CreateBuildPublishAsync(instance.Name, args: instance.Arguments, targetFramework: "netstandard2.1");