From d5f10f58cef5697ccb1780ecdabb2455567ba616 Mon Sep 17 00:00:00 2001 From: yamachu Date: Tue, 26 Jul 2022 22:45:32 +0900 Subject: [PATCH 01/10] Rebase resolve-asset-path-by-locatefile onto main with reset runtime changes Squashed commit of the following: commit 8dd23f8b8510330f18771faf1c9ca26ee550176e Merge: ffe4a2a2330 3ac16299ebe Author: yamachu Date: Tue Jul 12 02:13:41 2022 +0900 Merge branch 'main' into resolve-asset-path-by-locatefile commit ffe4a2a233010f8727876287d529754365cb9f9f Merge: 357ca535049 32d0360b73b Author: yamachu Date: Tue Jul 5 01:50:45 2022 +0900 Merge branch 'main' into resolve-asset-path-by-locatefile commit 357ca53504982b0719ecce39af75348055fe7a5e Author: yamachu Date: Fri Jul 1 02:24:48 2022 +0900 If an absolute path is passed to configSrc, do not use locateFile to resolve the path, but fetch the path as is. commit cf45c0d44a943ce497c9d162c871136adf391501 Merge: 527ad985b35 85223ce6cb3 Author: yamachu Date: Fri Jul 1 01:16:11 2022 +0900 Merge branch 'main' into resolve-asset-path-by-locatefile commit 527ad985b350b94744c852da6b903a78c4ea72c1 Author: yamachu Date: Tue Jun 28 16:58:28 2022 +0900 Remove toAbsoluteUrl from test code commit c339a1a0a9aacab48affe787a606d6ab106aca1a Author: yamachu Date: Tue Jun 28 16:58:10 2022 +0900 Ported toAbsoluteUrl in the web environment to pre-module commit 3b4f3f19ad9c29cc20d4ddb7a06115297f69befb Author: yamachu Date: Tue Jun 28 14:18:16 2022 +0900 Remove unused variable commit 2cdd2c7c9e0d7df8641f88be70b517a31e8a5634 Author: yamachu Date: Tue Jun 28 14:14:54 2022 +0900 Unassign toAbsoluteUrl to use locateFile to correct script directory in Node and V8 environments commit e7a473afcf664a0358679d8ecb7777364ffdd8d6 Author: yamachu Date: Tue Jun 28 14:13:05 2022 +0900 Assign a locateFile to the Module that corrects the prefix Fix that prefix argument does not indicate the location where the script exists when dotnet.wasm is loaded commit d54b1436addd5e074ccdec6b94b4c36303c54c30 Author: yamachu Date: Tue Jun 28 14:05:06 2022 +0900 Remove flags that is only used in certain scenarios commit 71c1ff79e1d5e1fe7b58c2515404a85ef31c6386 Author: yamachu Date: Tue Jun 28 03:35:26 2022 +0900 Refactor: use already implemented attributes commit 86227f1ce580fbff3ccce9c499e6db45d4d84b4b Author: yamachu Date: Tue Jun 28 02:03:20 2022 +0900 Add notes commit bac891e143cdaadd6b0f1befb3a3003c9f39f758 Author: yamachu Date: Tue Jun 28 00:30:42 2022 +0900 test all RunHost The project format changes depending on the host, so projects with the same id cannot be used interchangeably. Therefore, the project is re-created so that the test id changes, and the cache is also discarded. commit f41fd42255c81a113ba61ed3de6976ef0bcd6e6b Author: yamachu Date: Tue Jun 28 00:29:53 2022 +0900 Modified runtime to get the path starting from dotnet.js in shell environment and use that path in test commit 3e2476cf6250637c8601d0fe112549f363b353d9 Author: yamachu Date: Tue Jun 28 00:25:02 2022 +0900 "--run" prefix is reserved, so change flag name commit ee820c5623a44f87c1095a747bfcb652fa76bacf Merge: 30768018631 c9f80fdde29 Author: yamachu Date: Mon Jun 27 09:43:29 2022 +0900 Merge branch 'main' into resolve-asset-path-by-locatefile commit 30768018631636ef5978087121c45b45f85c88a5 Merge: 838852557c4 cca6bb6be27 Author: yamachu Date: Thu Jun 9 21:38:08 2022 +0900 Merge branch 'main' into resolve-asset-path-by-locatefile commit 838852557c4988b5dcae2e639390c3ef5e3dc439 Author: yamachu Date: Thu May 26 03:34:56 2022 +0900 Also use locateFile to resolve configFile paths commit 97b29919e4bb7eaebf4c5cdb6b53bce3b459a0c3 Author: yamachu Date: Sat May 21 22:47:57 2022 +0900 Add Unit test to run WasmApp outside of AppBundle directory V8: Could not determine scriptDirectory (always empty string). You must explicitly specify the base path within locateFile. Chrome: Failed to load dotnet.wasm commit a1c3c7a3651f14266b9f4bf48e9d81775303de7b Author: yamachu Date: Wed May 18 00:57:26 2022 +0900 Use localeFile to resolve path for assets outside of remoteSources Use localeFile to resolve path for assets outside of remoteSources, so that we can run from a different path than locate that dotnet.js exists ref: #69259 --- src/mono/wasm/test-main.js | 9 ++- .../Wasm.Build.Tests/BuildTestBase.cs | 16 +++-- .../Wasm.Build.Tests/ConfigSrcTests.cs | 41 +++++++++++++ .../WasmRunOutOfAppBundleTests.cs | 60 +++++++++++++++++++ 4 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs create mode 100644 src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs diff --git a/src/mono/wasm/test-main.js b/src/mono/wasm/test-main.js index f781652f5062..af53aad9dd2f 100644 --- a/src/mono/wasm/test-main.js +++ b/src/mono/wasm/test-main.js @@ -166,6 +166,7 @@ function initRunArgs() { runArgs.enableGC = runArgs.enableGC === undefined ? true : runArgs.enableGC; runArgs.diagnosticTracing = runArgs.diagnosticTracing === undefined ? false : runArgs.diagnosticTracing; runArgs.debugging = runArgs.debugging === undefined ? false : runArgs.debugging; + runArgs.configSrc = runArgs.configSrc === undefined ? './mono-config.json' : runArgs.configSrc; // default'ing to true for tests, unless debugging runArgs.forwardConsole = runArgs.forwardConsole === undefined ? !runArgs.debugging : runArgs.forwardConsole; } @@ -217,6 +218,12 @@ function processQueryArguments(incomingArguments) { } else { console.warn("--fetch-random-delay only works on browser") } + } else if (currentArg.startsWith("--config-src=")) { + const arg = currentArg.substring("--config-src=".length); + runArgs.configSrc = arg; + } else if (currentArg == ("--deep-work-dir")) { + // PR: https://github.com/dotnet/runtime/pull/69441 + // NOP } else { break; } @@ -355,7 +362,7 @@ Promise.all([argsPromise, loadDotnetPromise]).then(async ([_, createDotnetRuntim return createDotnetRuntime(({ MONO, INTERNAL, BINDING, IMPORTS, EXPORTS, Module }) => ({ disableDotnet6Compatibility: true, config: null, - configSrc: "./mono-config.json", + configSrc: runArgs.configSrc, onConfigLoaded: (config) => { if (!Module.config) { const err = new Error("Could not find ./mono-config.json. Cancelling run"); diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs index 5fd05729ef3d..e47844c11da3 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs @@ -151,14 +151,22 @@ public BuildTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture bu envVars[kvp.Key] = kvp.Value; } + bool runDeepWorkDir = false; + if (extraXHarnessMonoArgs?.Contains("--deep-work-dir") ?? false) + { + runDeepWorkDir = true; + } + string bundleDir = Path.Combine(GetBinDir(baseDir: buildDir, config: buildArgs.Config, targetFramework: targetFramework), "AppBundle"); // Use wasm-console.log to get the xharness output for non-browser cases - (string testCommand, string extraXHarnessArgs, bool useWasmConsoleOutput) = host switch + (string testCommand, string extraXHarnessArgs, bool useWasmConsoleOutput) = (host, runDeepWorkDir) switch { - RunHost.V8 => ("wasm test", "--js-file=test-main.js --engine=V8 -v trace", true), - RunHost.NodeJS => ("wasm test", "--js-file=test-main.js --engine=NodeJS -v trace", true), - _ => ("wasm test-browser", $"-v trace -b {host} --web-server-use-cop", false) + (RunHost.V8, false) => ("wasm test", "--js-file=test-main.js --engine=V8 -v trace", true), + (RunHost.V8, true) => ("wasm test", "--js-file=AppBundle/test-main.js --engine=V8 -v trace", true), + (RunHost.NodeJS, false) => ("wasm test", "--js-file=test-main.js --engine=NodeJS -v trace", true), + (RunHost.NodeJS, true) => ("wasm test", "--js-file=AppBundle/test-main.js --engine=NodeJS -v trace", true), + _ => ("wasm test-browser", $"-v trace -b {host} --web-server-use-cop", false) }; string testLogPath = Path.Combine(_logPath, host.ToString()); diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs new file mode 100644 index 000000000000..df3d91e2bb50 --- /dev/null +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs @@ -0,0 +1,41 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.IO; +using Xunit; +using Xunit.Abstractions; + +#nullable enable + +namespace Wasm.Build.Tests +{ + public class ConfigSrcTests : BuildTestBase + { + public ConfigSrcTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) + {} + + // NOTE: port number determinizes dynamically, so could not generate absolute URI + [Theory] + [BuildAndRun(aot: false, host: RunHost.V8)] + [BuildAndRun(aot: true, host: RunHost.V8)] + [BuildAndRun(aot: false, host: RunHost.NodeJS)] + [BuildAndRun(aot: true, host: RunHost.NodeJS)] + public void ConfigSrcAbsolutePath(BuildArgs buildArgs, RunHost host, string id) + { + buildArgs = buildArgs with { ProjectName = $"configsrcabsolute_{buildArgs.Config}_{buildArgs.AOT}" }; + buildArgs = ExpandBuildArgs(buildArgs); + + BuildProject(buildArgs, + id: id, + new BuildProjectOptions( + InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"))); + + string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); + string bundleDir = Path.Combine(binDir, "AppBundle"); + string configSrc = Path.GetFullPath(Path.Combine(bundleDir, "mono-config.json")); + + RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: $"--config-src={configSrc}"); + } + } +} diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs new file mode 100644 index 000000000000..15669b639918 --- /dev/null +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -0,0 +1,60 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.IO; +using Xunit; +using Xunit.Abstractions; + +#nullable enable + +namespace Wasm.Build.Tests +{ + public class WasmRunOutOfAppBundleTests : BuildTestBase + { + public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) + {} + + [Theory] + [BuildAndRun(aot: false, host: RunHost.V8)] + [BuildAndRun(aot: true, host: RunHost.V8)] + [BuildAndRun(aot: false, host: RunHost.Chrome)] + [BuildAndRun(aot: true, host: RunHost.Chrome)] + [BuildAndRun(aot: false, host: RunHost.NodeJS)] + [BuildAndRun(aot: true, host: RunHost.NodeJS)] + public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) + { + buildArgs = buildArgs with { ProjectName = $"outofappbundle_{buildArgs.Config}_{buildArgs.AOT}" }; + buildArgs = ExpandBuildArgs(buildArgs); + + BuildProject(buildArgs, + id: id, + new BuildProjectOptions( + InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"), + UseCache: false)); + + string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); + string baseBundleDir = Path.Combine(binDir, "AppBundle"); + string tmpBundleDir = Path.Combine(binDir, "AppBundleTmp"); + string deepBundleDir = Path.Combine(baseBundleDir, "AppBundle"); + + Directory.Move(baseBundleDir, tmpBundleDir); + Directory.CreateDirectory(baseBundleDir); + + // Create $binDir/AppBundle/AppBundle + Directory.Move(tmpBundleDir, deepBundleDir); + + if (host == RunHost.Chrome) + { + string indexHtmlPath = Path.Combine(baseBundleDir, "index.html"); + if (!File.Exists(indexHtmlPath)) + { + var html = @""; + File.WriteAllText(indexHtmlPath, html); + } + } + + RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: "--deep-work-dir"); + } + } +} From 2db797485e4a885aae7572806090c42accc2c62f Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 00:11:14 +0900 Subject: [PATCH 02/10] apply suggestions that assign configSrc --- src/mono/wasm/test-main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/test-main.js b/src/mono/wasm/test-main.js index af53aad9dd2f..1d866849b694 100644 --- a/src/mono/wasm/test-main.js +++ b/src/mono/wasm/test-main.js @@ -362,7 +362,7 @@ Promise.all([argsPromise, loadDotnetPromise]).then(async ([_, createDotnetRuntim return createDotnetRuntime(({ MONO, INTERNAL, BINDING, IMPORTS, EXPORTS, Module }) => ({ disableDotnet6Compatibility: true, config: null, - configSrc: runArgs.configSrc, + configSrc: runArgs.configSrc || "./mono-config.json", onConfigLoaded: (config) => { if (!Module.config) { const err = new Error("Could not find ./mono-config.json. Cancelling run"); From 2952c7be1104094437d1919d42fbfa6b6433b51d Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 02:21:35 +0900 Subject: [PATCH 03/10] apply suggestions --- src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs index df3d91e2bb50..53219a1013b3 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs @@ -16,10 +16,7 @@ public ConfigSrcTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b // NOTE: port number determinizes dynamically, so could not generate absolute URI [Theory] - [BuildAndRun(aot: false, host: RunHost.V8)] - [BuildAndRun(aot: true, host: RunHost.V8)] - [BuildAndRun(aot: false, host: RunHost.NodeJS)] - [BuildAndRun(aot: true, host: RunHost.NodeJS)] + [BuildAndRun(host: RunHost.V8 | RunHost.NodeJS)] public void ConfigSrcAbsolutePath(BuildArgs buildArgs, RunHost host, string id) { buildArgs = buildArgs with { ProjectName = $"configsrcabsolute_{buildArgs.Config}_{buildArgs.AOT}" }; From 3922e055bc0867ce4798be3f3c365612e9645bcc Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 02:24:55 +0900 Subject: [PATCH 04/10] Add tests to BuildWasmAppsJobs --- eng/testing/scenarios/BuildWasmAppsJobsList.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eng/testing/scenarios/BuildWasmAppsJobsList.txt b/eng/testing/scenarios/BuildWasmAppsJobsList.txt index c44096b4b7b4..bbbca109e575 100644 --- a/eng/testing/scenarios/BuildWasmAppsJobsList.txt +++ b/eng/testing/scenarios/BuildWasmAppsJobsList.txt @@ -6,6 +6,7 @@ Wasm.Build.Tests.BlazorWasmBuildPublishTests Wasm.Build.Tests.BlazorWasmTests Wasm.Build.Tests.BuildPublishTests Wasm.Build.Tests.CleanTests +Wasm.Build.Tests.ConfigSrcTests Wasm.Build.Tests.InvariantGlobalizationTests Wasm.Build.Tests.LocalEMSDKTests Wasm.Build.Tests.MainWithArgsTests @@ -17,4 +18,5 @@ Wasm.Build.Tests.SatelliteAssembliesTests Wasm.Build.Tests.WasmBuildAppTest Wasm.Build.Tests.WasmNativeDefaultsTests Wasm.Build.Tests.WorkloadTests +Wasm.Build.Tests.WasmRunOutOfAppBundleTests Wasm.Build.Tests.WasmTemplateTests From d651c70257c361fd01abc765ffafbc66e29e3a2b Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 03:37:19 +0900 Subject: [PATCH 05/10] add jsRelativePath args instead of using extraXHarnessMonoArgs hack --- src/mono/wasm/test-main.js | 3 --- .../Wasm.Build.Tests/BuildTestBase.cs | 19 ++++++------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/mono/wasm/test-main.js b/src/mono/wasm/test-main.js index 1d866849b694..bf8821c6714d 100644 --- a/src/mono/wasm/test-main.js +++ b/src/mono/wasm/test-main.js @@ -221,9 +221,6 @@ function processQueryArguments(incomingArguments) { } else if (currentArg.startsWith("--config-src=")) { const arg = currentArg.substring("--config-src=".length); runArgs.configSrc = arg; - } else if (currentArg == ("--deep-work-dir")) { - // PR: https://github.com/dotnet/runtime/pull/69441 - // NOP } else { break; } diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs index e47844c11da3..6a66aa361217 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs @@ -134,7 +134,8 @@ public BuildTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture bu string? args = null, Dictionary? envVars = null, string targetFramework = DefaultTargetFramework, - string? extraXHarnessMonoArgs = null) + string? extraXHarnessMonoArgs = null, + string jsRelativePath = "test-main.js") { buildDir ??= _projectDir; envVars ??= new(); @@ -151,22 +152,14 @@ public BuildTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture bu envVars[kvp.Key] = kvp.Value; } - bool runDeepWorkDir = false; - if (extraXHarnessMonoArgs?.Contains("--deep-work-dir") ?? false) - { - runDeepWorkDir = true; - } - string bundleDir = Path.Combine(GetBinDir(baseDir: buildDir, config: buildArgs.Config, targetFramework: targetFramework), "AppBundle"); // Use wasm-console.log to get the xharness output for non-browser cases - (string testCommand, string extraXHarnessArgs, bool useWasmConsoleOutput) = (host, runDeepWorkDir) switch + (string testCommand, string extraXHarnessArgs, bool useWasmConsoleOutput) = host switch { - (RunHost.V8, false) => ("wasm test", "--js-file=test-main.js --engine=V8 -v trace", true), - (RunHost.V8, true) => ("wasm test", "--js-file=AppBundle/test-main.js --engine=V8 -v trace", true), - (RunHost.NodeJS, false) => ("wasm test", "--js-file=test-main.js --engine=NodeJS -v trace", true), - (RunHost.NodeJS, true) => ("wasm test", "--js-file=AppBundle/test-main.js --engine=NodeJS -v trace", true), - _ => ("wasm test-browser", $"-v trace -b {host} --web-server-use-cop", false) + RunHost.V8 => ("wasm test", $"--js-file={jsRelativePath} --engine=V8 -v trace", true), + RunHost.NodeJS => ("wasm test", $"--js-file={jsRelativePath} --engine=NodeJS -v trace", true), + _ => ("wasm test-browser", $"-v trace -b {host} --web-server-use-cop", false) }; string testLogPath = Path.Combine(_logPath, host.ToString()); From 2f1c9eb17e5e0a8060b47e0e63a4e58f6e009fb9 Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 03:57:19 +0900 Subject: [PATCH 06/10] Copy AppBundle directory and treat it as the test target. --- .../WasmRunOutOfAppBundleTests.cs | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 15669b639918..81678d16f8d4 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -15,12 +15,7 @@ public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestCl {} [Theory] - [BuildAndRun(aot: false, host: RunHost.V8)] - [BuildAndRun(aot: true, host: RunHost.V8)] - [BuildAndRun(aot: false, host: RunHost.Chrome)] - [BuildAndRun(aot: true, host: RunHost.Chrome)] - [BuildAndRun(aot: false, host: RunHost.NodeJS)] - [BuildAndRun(aot: true, host: RunHost.NodeJS)] + [BuildAndRun] public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) { buildArgs = buildArgs with { ProjectName = $"outofappbundle_{buildArgs.Config}_{buildArgs.AOT}" }; @@ -30,31 +25,59 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) id: id, new BuildProjectOptions( InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"), - UseCache: false)); + DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"))); string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); - string baseBundleDir = Path.Combine(binDir, "AppBundle"); - string tmpBundleDir = Path.Combine(binDir, "AppBundleTmp"); - string deepBundleDir = Path.Combine(baseBundleDir, "AppBundle"); - - Directory.Move(baseBundleDir, tmpBundleDir); - Directory.CreateDirectory(baseBundleDir); - - // Create $binDir/AppBundle/AppBundle - Directory.Move(tmpBundleDir, deepBundleDir); + string appBundleDir = Path.Combine(binDir, "AppBundle"); + string tmpBundleDirName = "AppBundleTmp"; + string tmpBundleDir = Path.Combine(binDir, tmpBundleDirName); if (host == RunHost.Chrome) { - string indexHtmlPath = Path.Combine(baseBundleDir, "index.html"); + Directory.Move(appBundleDir, tmpBundleDir); + Directory.CreateDirectory(appBundleDir); + // Create $binDir/AppBundle/AppBundle + Directory.Move(tmpBundleDir, Path.Combine(appBundleDir, "AppBundle")); + + string indexHtmlPath = Path.Combine(appBundleDir, "index.html"); if (!File.Exists(indexHtmlPath)) { - var html = @""; + var html = @""; File.WriteAllText(indexHtmlPath, html); } + } else { + CopyAllFiles(appBundleDir, tmpBundleDir); + } + + RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: $"../{tmpBundleDirName}/test-main.js"); + + // Restore AppBundle Dir + if (host == RunHost.Chrome) + { + Directory.Move(Path.Combine(appBundleDir, "AppBundle"), tmpBundleDir); + Directory.Delete(appBundleDir, true); + Directory.Move(tmpBundleDir, appBundleDir); + } else { + Directory.Delete(tmpBundleDir, true); + } + } + + private void CopyAllFiles(string srcDir, string destDir) + { + if (!Directory.Exists(destDir)) + { + Directory.CreateDirectory(destDir); } - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: "--deep-work-dir"); + foreach (var file in Directory.GetFiles(srcDir)) + { + File.Copy(file, Path.Combine(destDir, Path.GetFileName(file)), true); + } + + foreach (var directory in Directory.GetDirectories(srcDir)) + { + CopyAllFiles(directory, Path.Combine(destDir, Path.GetFileName(directory))); + } } } } From b6804be3856f3ce34ab728370f0af0647ff7f4a0 Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 12:13:57 +0900 Subject: [PATCH 07/10] convert to file scoped namespace style --- .../Wasm.Build.Tests/ConfigSrcTests.cs | 49 ++++---- .../WasmRunOutOfAppBundleTests.cs | 111 +++++++++--------- 2 files changed, 79 insertions(+), 81 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs index 53219a1013b3..9488225ccc62 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/ConfigSrcTests.cs @@ -7,32 +7,31 @@ #nullable enable -namespace Wasm.Build.Tests +namespace Wasm.Build.Tests; + +public class ConfigSrcTests : BuildTestBase { - public class ConfigSrcTests : BuildTestBase + public ConfigSrcTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) + {} + + // NOTE: port number determinizes dynamically, so could not generate absolute URI + [Theory] + [BuildAndRun(host: RunHost.V8 | RunHost.NodeJS)] + public void ConfigSrcAbsolutePath(BuildArgs buildArgs, RunHost host, string id) { - public ConfigSrcTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) - {} - - // NOTE: port number determinizes dynamically, so could not generate absolute URI - [Theory] - [BuildAndRun(host: RunHost.V8 | RunHost.NodeJS)] - public void ConfigSrcAbsolutePath(BuildArgs buildArgs, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"configsrcabsolute_{buildArgs.Config}_{buildArgs.AOT}" }; - buildArgs = ExpandBuildArgs(buildArgs); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"))); - - string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); - string bundleDir = Path.Combine(binDir, "AppBundle"); - string configSrc = Path.GetFullPath(Path.Combine(bundleDir, "mono-config.json")); - - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: $"--config-src={configSrc}"); - } + buildArgs = buildArgs with { ProjectName = $"configsrcabsolute_{buildArgs.Config}_{buildArgs.AOT}" }; + buildArgs = ExpandBuildArgs(buildArgs); + + BuildProject(buildArgs, + id: id, + new BuildProjectOptions( + InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"))); + + string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); + string bundleDir = Path.Combine(binDir, "AppBundle"); + string configSrc = Path.GetFullPath(Path.Combine(bundleDir, "mono-config.json")); + + RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: $"--config-src={configSrc}"); } } diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 81678d16f8d4..271a086c7fc7 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -7,77 +7,76 @@ #nullable enable -namespace Wasm.Build.Tests +namespace Wasm.Build.Tests; + +public class WasmRunOutOfAppBundleTests : BuildTestBase { - public class WasmRunOutOfAppBundleTests : BuildTestBase + public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) + {} + + [Theory] + [BuildAndRun] + public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) { - public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) - {} + buildArgs = buildArgs with { ProjectName = $"outofappbundle_{buildArgs.Config}_{buildArgs.AOT}" }; + buildArgs = ExpandBuildArgs(buildArgs); - [Theory] - [BuildAndRun] - public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"outofappbundle_{buildArgs.Config}_{buildArgs.AOT}" }; - buildArgs = ExpandBuildArgs(buildArgs); + BuildProject(buildArgs, + id: id, + new BuildProjectOptions( + InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"))); - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: !(buildArgs.AOT || buildArgs.Config == "Release"))); + string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); + string appBundleDir = Path.Combine(binDir, "AppBundle"); + string tmpBundleDirName = "AppBundleTmp"; + string tmpBundleDir = Path.Combine(binDir, tmpBundleDirName); - string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); - string appBundleDir = Path.Combine(binDir, "AppBundle"); - string tmpBundleDirName = "AppBundleTmp"; - string tmpBundleDir = Path.Combine(binDir, tmpBundleDirName); + if (host == RunHost.Chrome) + { + Directory.Move(appBundleDir, tmpBundleDir); + Directory.CreateDirectory(appBundleDir); + // Create $binDir/AppBundle/AppBundle + Directory.Move(tmpBundleDir, Path.Combine(appBundleDir, "AppBundle")); - if (host == RunHost.Chrome) + string indexHtmlPath = Path.Combine(appBundleDir, "index.html"); + if (!File.Exists(indexHtmlPath)) { - Directory.Move(appBundleDir, tmpBundleDir); - Directory.CreateDirectory(appBundleDir); - // Create $binDir/AppBundle/AppBundle - Directory.Move(tmpBundleDir, Path.Combine(appBundleDir, "AppBundle")); - - string indexHtmlPath = Path.Combine(appBundleDir, "index.html"); - if (!File.Exists(indexHtmlPath)) - { - var html = @""; - File.WriteAllText(indexHtmlPath, html); - } - } else { - CopyAllFiles(appBundleDir, tmpBundleDir); + var html = @""; + File.WriteAllText(indexHtmlPath, html); } + } else { + CopyAllFiles(appBundleDir, tmpBundleDir); + } - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: $"../{tmpBundleDirName}/test-main.js"); + RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: $"../{tmpBundleDirName}/test-main.js"); - // Restore AppBundle Dir - if (host == RunHost.Chrome) - { - Directory.Move(Path.Combine(appBundleDir, "AppBundle"), tmpBundleDir); - Directory.Delete(appBundleDir, true); - Directory.Move(tmpBundleDir, appBundleDir); - } else { - Directory.Delete(tmpBundleDir, true); - } + // Restore AppBundle Dir + if (host == RunHost.Chrome) + { + Directory.Move(Path.Combine(appBundleDir, "AppBundle"), tmpBundleDir); + Directory.Delete(appBundleDir, true); + Directory.Move(tmpBundleDir, appBundleDir); + } else { + Directory.Delete(tmpBundleDir, true); } + } - private void CopyAllFiles(string srcDir, string destDir) + private void CopyAllFiles(string srcDir, string destDir) + { + if (!Directory.Exists(destDir)) { - if (!Directory.Exists(destDir)) - { - Directory.CreateDirectory(destDir); - } + Directory.CreateDirectory(destDir); + } - foreach (var file in Directory.GetFiles(srcDir)) - { - File.Copy(file, Path.Combine(destDir, Path.GetFileName(file)), true); - } + foreach (var file in Directory.GetFiles(srcDir)) + { + File.Copy(file, Path.Combine(destDir, Path.GetFileName(file)), true); + } - foreach (var directory in Directory.GetDirectories(srcDir)) - { - CopyAllFiles(directory, Path.Combine(destDir, Path.GetFileName(directory))); - } + foreach (var directory in Directory.GetDirectories(srcDir)) + { + CopyAllFiles(directory, Path.Combine(destDir, Path.GetFileName(directory))); } } } From 5a94685f48b8db541032748531351ec9edc1999c Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 12:31:21 +0900 Subject: [PATCH 08/10] use tmp directory to avoid running overlap --- .../Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 271a086c7fc7..b7c2a71e7c1c 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -32,6 +32,8 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) string tmpBundleDirName = "AppBundleTmp"; string tmpBundleDir = Path.Combine(binDir, tmpBundleDirName); + string tmpDir = Path.Combine(Path.GetTempPath(), $"{id}-{buildArgs.ProjectName}"); + if (host == RunHost.Chrome) { Directory.Move(appBundleDir, tmpBundleDir); @@ -46,10 +48,10 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) File.WriteAllText(indexHtmlPath, html); } } else { - CopyAllFiles(appBundleDir, tmpBundleDir); + CopyAllFiles(appBundleDir, tmpDir); } - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: $"../{tmpBundleDirName}/test-main.js"); + RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: Path.Combine(tmpDir, "test-main.js")); // Restore AppBundle Dir if (host == RunHost.Chrome) @@ -58,7 +60,7 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) Directory.Delete(appBundleDir, true); Directory.Move(tmpBundleDir, appBundleDir); } else { - Directory.Delete(tmpBundleDir, true); + Directory.Delete(tmpDir, true); } } From 930c7013bdbf4c398f32eebda0663c7f612a83b3 Mon Sep 17 00:00:00 2001 From: yamachu Date: Wed, 27 Jul 2022 16:00:04 +0900 Subject: [PATCH 09/10] use Utils.DirectoryCopy --- .../WasmRunOutOfAppBundleTests.cs | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index b7c2a71e7c1c..690fd164ce98 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -48,7 +48,7 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) File.WriteAllText(indexHtmlPath, html); } } else { - CopyAllFiles(appBundleDir, tmpDir); + Utils.DirectoryCopy(appBundleDir, tmpDir); } RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: Path.Combine(tmpDir, "test-main.js")); @@ -63,22 +63,4 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) Directory.Delete(tmpDir, true); } } - - private void CopyAllFiles(string srcDir, string destDir) - { - if (!Directory.Exists(destDir)) - { - Directory.CreateDirectory(destDir); - } - - foreach (var file in Directory.GetFiles(srcDir)) - { - File.Copy(file, Path.Combine(destDir, Path.GetFileName(file)), true); - } - - foreach (var directory in Directory.GetDirectories(srcDir)) - { - CopyAllFiles(directory, Path.Combine(destDir, Path.GetFileName(directory))); - } - } } From eb07469f47f3fac81443a390e55b0f50859ce2ec Mon Sep 17 00:00:00 2001 From: yamachu Date: Thu, 28 Jul 2022 00:23:18 +0900 Subject: [PATCH 10/10] apply patch that allow configuring bundleDir see: https://github.com/dotnet/runtime/pull/69441#issuecomment-1196401080 --- .../Wasm.Build.Tests/BuildTestBase.cs | 3 +- .../WasmRunOutOfAppBundleTests.cs | 36 +++++++------------ 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs index 6a66aa361217..8dc05f1545cf 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs @@ -130,6 +130,7 @@ public BuildTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture bu string id, Action? test=null, string? buildDir = null, + string? bundleDir = null, int expectedExitCode = 0, string? args = null, Dictionary? envVars = null, @@ -152,7 +153,7 @@ public BuildTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture bu envVars[kvp.Key] = kvp.Value; } - string bundleDir = Path.Combine(GetBinDir(baseDir: buildDir, config: buildArgs.Config, targetFramework: targetFramework), "AppBundle"); + bundleDir ??= Path.Combine(GetBinDir(baseDir: buildDir, config: buildArgs.Config, targetFramework: targetFramework), "AppBundle"); // Use wasm-console.log to get the xharness output for non-browser cases (string testCommand, string extraXHarnessArgs, bool useWasmConsoleOutput) = host switch diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 690fd164ce98..befd7ae02981 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -29,38 +29,28 @@ public void RunOutOfAppBundle(BuildArgs buildArgs, RunHost host, string id) string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); string appBundleDir = Path.Combine(binDir, "AppBundle"); - string tmpBundleDirName = "AppBundleTmp"; - string tmpBundleDir = Path.Combine(binDir, tmpBundleDirName); + string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); - string tmpDir = Path.Combine(Path.GetTempPath(), $"{id}-{buildArgs.ProjectName}"); - - if (host == RunHost.Chrome) + if (host is RunHost.Chrome) { - Directory.Move(appBundleDir, tmpBundleDir); - Directory.CreateDirectory(appBundleDir); - // Create $binDir/AppBundle/AppBundle - Directory.Move(tmpBundleDir, Path.Combine(appBundleDir, "AppBundle")); - string indexHtmlPath = Path.Combine(appBundleDir, "index.html"); + // Delete the original one, so we don't use that by accident + if (File.Exists(indexHtmlPath)) + File.Delete(indexHtmlPath); + + indexHtmlPath = Path.Combine(outerDir, "index.html"); if (!File.Exists(indexHtmlPath)) { var html = @""; File.WriteAllText(indexHtmlPath, html); } - } else { - Utils.DirectoryCopy(appBundleDir, tmpDir); } - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, jsRelativePath: Path.Combine(tmpDir, "test-main.js")); - - // Restore AppBundle Dir - if (host == RunHost.Chrome) - { - Directory.Move(Path.Combine(appBundleDir, "AppBundle"), tmpBundleDir); - Directory.Delete(appBundleDir, true); - Directory.Move(tmpBundleDir, appBundleDir); - } else { - Directory.Delete(tmpDir, true); - } + RunAndTestWasmApp(buildArgs, + expectedExitCode: 42, + host: host, + id: id, + bundleDir: outerDir, + jsRelativePath: "./AppBundle/test-main.js"); } }