diff --git a/docs/workflow/building/libraries/webassembly-instructions.md b/docs/workflow/building/libraries/webassembly-instructions.md index fdc5dc31d22267..3ae2d2f808abfe 100644 --- a/docs/workflow/building/libraries/webassembly-instructions.md +++ b/docs/workflow/building/libraries/webassembly-instructions.md @@ -152,7 +152,7 @@ Submit a PR request with the updated version, wait for all checks to pass and fo { "dockerfile": "src/ubuntu/18.04/webassembly/Dockerfile", "simpleTags": [ - "ubuntu-18.04-webassembly-20200529220811-6a6da63" + "ubuntu-18.04-webassembly-20210707133424-12f133e" ], "digest": "sha256:1f2d920a70bd8d55bbb329e87c3bd732ef930d64ff288dab4af0aa700c25cfaf", "osType": "Linux", @@ -169,7 +169,7 @@ Copy the docker image tag and replace it in [platform-matrix.yml](https://github ``` container: - image: ubuntu-18.04-webassembly-20200409132031-f70ea41 + image: ubuntu-18.04-webassembly-20210707133424-12f133e registry: mcr ``` diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml index ad3dbd4db8bc0d..ade8c7aab981b6 100644 --- a/eng/pipelines/common/platform-matrix.yml +++ b/eng/pipelines/common/platform-matrix.yml @@ -279,7 +279,7 @@ jobs: targetRid: browser-wasm platform: Browser_wasm container: - image: ubuntu-18.04-webassembly-20210531091624-f5c7a43 + image: ubuntu-18.04-webassembly-20210707133424-12f133e registry: mcr jobParameters: runtimeFlavor: ${{ parameters.runtimeFlavor }} diff --git a/eng/pipelines/runtime-manual.yml b/eng/pipelines/runtime-manual.yml index 77f7b29cad8ac4..4da10d969f39bb 100644 --- a/eng/pipelines/runtime-manual.yml +++ b/eng/pipelines/runtime-manual.yml @@ -317,6 +317,7 @@ jobs: scenarios: - normal - wasmtestonbrowser + - wasmtestonnodejs condition: >- or( eq(variables['librariesContainsChange'], true), @@ -463,6 +464,47 @@ jobs: scenarios: - normal +# +# Build for Browser/wasm and test it on NodeJS +# +- template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/common/global-build-job.yml + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + buildConfig: Release + runtimeFlavor: mono + platforms: + - Browser_wasm + variables: + # map dependencies variables to local variables + - name: librariesContainsChange + value: $[ dependencies.evaluate_paths.outputs['SetPathVars_libraries.containsChange'] ] + - name: monoContainsChange + value: $[ dependencies.evaluate_paths.outputs['SetPathVars_mono.containsChange'] ] + jobParameters: + testGroup: innerloop + nameSuffix: AllSubsets_Mono + buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true + timeoutInMinutes: 180 + condition: >- + or( + eq(dependencies.evaluate_paths.outputs['SetPathVars_libraries.containsChange'], true), + eq(dependencies.evaluate_paths.outputs['SetPathVars_mono.containsChange'], true), + eq(dependencies.evaluate_paths.outputs['SetPathVars_installer.containsChange'], true), + eq(variables['isFullMatrix'], true)) + # extra steps, run tests + extraStepsTemplate: /eng/pipelines/libraries/helix.yml + extraStepsParameters: + creator: dotnet-bot + testRunNamePrefixSuffix: Mono_$(_BuildConfig) + scenarios: + - wasmtestonnodejs + condition: >- + or( + eq(variables['librariesContainsChange'], true), + eq(variables['monoContainsChange'], true), + eq(variables['isFullMatrix'], true)) + # # Build the whole product using Mono and run runtime tests # diff --git a/eng/testing/WasmRunnerAOTTemplate.sh b/eng/testing/WasmRunnerAOTTemplate.sh index 4aa271b960a537..160f103656664e 100644 --- a/eng/testing/WasmRunnerAOTTemplate.sh +++ b/eng/testing/WasmRunnerAOTTemplate.sh @@ -1,11 +1,15 @@ #!/usr/bin/env bash -EXECUTION_DIR=$(dirname $0) -SCENARIO=$3 +# SetCommands defined in eng\testing\tests.wasm.targets +[[SetCommands]] +[[SetCommandsEcho]] -cd $EXECUTION_DIR +EXECUTION_DIR=$(dirname $0) +if [[ -n "$3" ]]; then + SCENARIO=$3 +fi -if [ -z "$HELIX_WORKITEM_UPLOAD_ROOT" ]; then +if [[ -z "$HELIX_WORKITEM_UPLOAD_ROOT" ]]; then XHARNESS_OUT="$EXECUTION_DIR/xharness-output" else XHARNESS_OUT="$HELIX_WORKITEM_UPLOAD_ROOT/xharness-output" @@ -19,12 +23,47 @@ else HARNESS_RUNNER="dotnet xharness" fi -if [[ "$SCENARIO" == "WasmTestOnBrowser" ]]; then - XHARNESS_COMMAND="test-browser" -elif [ -z "$XHARNESS_COMMAND" ]; then - XHARNESS_COMMAND="test" +if [[ -z "$XHARNESS_COMMAND" ]]; then + if [[ "${SCENARIO,,}" == "wasmtestonbrowser" ]]; then + XHARNESS_COMMAND="test-browser" + else + XHARNESS_COMMAND="test" + fi +fi + +if [[ "${XHARNESS_COMMAND,,}" == "test" ]]; then + if [[ -z "$JS_ENGINE" ]]; then + if [[ "${SCENARIO,,}" == "wasmtestonnodejs" ]]; then + JS_ENGINE="--engine=NodeJS" + else + JS_ENGINE="--engine=V8" + fi + fi + + if [[ -z "$MAIN_JS" ]]; then + MAIN_JS="--js-file=test-main.js" + fi + + if [[ -z "$JS_ENGINE_ARGS" ]]; then + JS_ENGINE_ARGS="--engine-arg=--stack-trace-limit=1000" + fi +fi + +if [[ -z "$XHARNESS_ARGS" ]]; then + XHARNESS_ARGS="$JS_ENGINE $JS_ENGINE_ARGS $MAIN_JS" fi +echo EXECUTION_DIR=$EXECUTION_DIR +echo SCENARIO=$SCENARIO +echo XHARNESS_OUT=$XHARNESS_OUT +echo XHARNESS_CLI_PATH=$XHARNESS_CLI_PATH +echo HARNESS_RUNNER=$HARNESS_RUNNER +echo XHARNESS_COMMAND=$XHARNESS_COMMAND +echo MAIN_JS=$MAIN_JS +echo JS_ENGINE=$JS_ENGINE +echo JS_ENGINE_ARGS=$JS_ENGINE_ARGS +echo XHARNESS_ARGS=$XHARNESS_ARGS + function _buildAOTFunc() { local projectFile=$1 @@ -56,11 +95,23 @@ function _buildAOTFunc() return 0 } -# RunCommands defined in tests.mobile.targets -[[RunCommands]] +pushd $EXECUTION_DIR + +# ========================= BEGIN Test Execution ============================= +echo ----- start $(date) =============== To repro directly: ===================================================== +echo pushd $EXECUTION_DIR +# RunCommands defined in eng\testing\tests.wasm.targets +[[RunCommandsEcho]] +echo popd +echo =========================================================================================================== +pushd $EXECUTION_DIR +# RunCommands defined in eng\testing\tests.wasm.targets +[[RunCommands]] _exitCode=$? +popd +echo ----- end $(date) ----- exit code $_exitCode ---------------------------------------------------------- echo "XHarness artifacts: $XHARNESS_OUT" -exit $_exitCode +exit $_exitCode \ No newline at end of file diff --git a/eng/testing/WasmRunnerTemplate.cmd b/eng/testing/WasmRunnerTemplate.cmd index 603199341a2b08..2ba3baa0948e03 100644 --- a/eng/testing/WasmRunnerTemplate.cmd +++ b/eng/testing/WasmRunnerTemplate.cmd @@ -1,8 +1,14 @@ @echo off setlocal enabledelayedexpansion +:: SetCommands defined in eng\testing\tests.wasm.targets +[[SetCommands]] +[[SetCommandsEcho]] + set EXECUTION_DIR=%~dp0 -set SCENARIO=%3 +if [%3] NEQ [] ( + set SCENARIO=%3 +) if [%HELIX_WORKITEM_UPLOAD_ROOT%] == [] ( set "XHARNESS_OUT=%EXECUTION_DIR%xharness-output" @@ -18,22 +24,60 @@ if [%XHARNESS_CLI_PATH%] NEQ [] ( set HARNESS_RUNNER=dotnet.exe xharness ) -if [%SCENARIO%]==[WasmTestOnBrowser] ( - set XHARNESS_COMMAND=test-browser +if [%XHARNESS_COMMAND%] == [] ( + if /I [%SCENARIO%]==[wasmtestonbrowser] ( + set XHARNESS_COMMAND=test-browser + ) else ( + set XHARNESS_COMMAND=test + ) +) + +if /I [%XHARNESS_COMMAND%] == [test] ( + if [%JS_ENGINE%] == [] ( + if /I [%SCENARIO%] == [wasmtestonnodejs] ( + set "JS_ENGINE=--engine^=NodeJS" + ) else ( + set "JS_ENGINE=--engine^=V8" + ) + ) + if [%MAIN_JS%] == [] ( + set "MAIN_JS=--js-file^=test-main.js" + ) + + if [%JS_ENGINE_ARGS%] == [] ( + set "JS_ENGINE_ARGS=--engine-arg^=--stack-trace-limit^=1000" + ) ) else ( - if [%XHARNESS_COMMAND%] == [] ( - set XHARNESS_COMMAND=test + if [%BROWSER_PATH%] == [] ( + set "BROWSER_PATH=--browser-path^=%HELIX_CORRELATION_PAYLOAD%\chrome-win\chrome.exe" ) ) +if [%XHARNESS_ARGS%] == [] ( + set "XHARNESS_ARGS=%JS_ENGINE% %JS_ENGINE_ARGS% %BROWSER_PATH% %MAIN_JS%" +) + +echo EXECUTION_DIR=%EXECUTION_DIR% +echo SCENARIO=%SCENARIO% +echo XHARNESS_OUT=%XHARNESS_OUT% +echo XHARNESS_CLI_PATH=%XHARNESS_CLI_PATH% +echo HARNESS_RUNNER=%HARNESS_RUNNER% +echo XHARNESS_COMMAND=%XHARNESS_COMMAND% +echo MAIN_JS=%MAIN_JS% +echo JS_ENGINE=%JS_ENGINE% +echo JS_ENGINE_ARGS=%JS_ENGINE_ARGS% +echo XHARNESS_ARGS=%XHARNESS_ARGS% + :: ========================= BEGIN Test Execution ============================= echo ----- start %DATE% %TIME% =============== To repro directly: ===================================================== echo pushd %EXECUTION_DIR% +:: RunCommands defined in eng\testing\tests.wasm.targets [[RunCommandsEcho]] echo popd echo =========================================================================================================== pushd %EXECUTION_DIR% @echo on +:: RunCommands defined in eng\testing\tests.wasm.targets [[RunCommands]] set EXIT_CODE=%ERRORLEVEL% @echo off diff --git a/eng/testing/WasmRunnerTemplate.sh b/eng/testing/WasmRunnerTemplate.sh index 412c33724aa158..edd491603c27db 100644 --- a/eng/testing/WasmRunnerTemplate.sh +++ b/eng/testing/WasmRunnerTemplate.sh @@ -1,9 +1,13 @@ #!/usr/bin/env bash -EXECUTION_DIR=$(dirname $0) -SCENARIO=$3 +# SetCommands defined in eng\testing\tests.wasm.targets +[[SetCommands]] +[[SetCommandsEcho]] -cd $EXECUTION_DIR +EXECUTION_DIR=$(dirname $0) +if [[ -n "$3" ]]; then + SCENARIO=$3 +fi if [[ -z "$HELIX_WORKITEM_UPLOAD_ROOT" ]]; then XHARNESS_OUT="$EXECUTION_DIR/xharness-output" @@ -19,17 +23,64 @@ else HARNESS_RUNNER="dotnet xharness" fi -if [[ "$SCENARIO" == "WasmTestOnBrowser" ]]; then - XHARNESS_COMMAND="test-browser" -elif [[ -z "$XHARNESS_COMMAND" ]]; then - XHARNESS_COMMAND="test" +if [[ -z "$XHARNESS_COMMAND" ]]; then + if [[ "${SCENARIO,,}" == "wasmtestonbrowser" ]]; then + XHARNESS_COMMAND="test-browser" + else + XHARNESS_COMMAND="test" + fi fi -# RunCommands defined in tests.mobile.targets -[[RunCommands]] +if [[ "${XHARNESS_COMMAND,,}" == "test" ]]; then + if [[ -z "$JS_ENGINE" ]]; then + if [[ "${SCENARIO,,}" == "wasmtestonnodejs" ]]; then + JS_ENGINE="--engine=NodeJS" + else + JS_ENGINE="--engine=V8" + fi + fi + + if [[ -z "$MAIN_JS" ]]; then + MAIN_JS="--js-file=test-main.js" + fi + + if [[ -z "$JS_ENGINE_ARGS" ]]; then + JS_ENGINE_ARGS="--engine-arg=--stack-trace-limit=1000" + fi +fi +if [[ -z "$XHARNESS_ARGS" ]]; then + XHARNESS_ARGS="$JS_ENGINE $JS_ENGINE_ARGS $MAIN_JS" +fi + +echo EXECUTION_DIR=$EXECUTION_DIR +echo SCENARIO=$SCENARIO +echo XHARNESS_OUT=$XHARNESS_OUT +echo XHARNESS_CLI_PATH=$XHARNESS_CLI_PATH +echo HARNESS_RUNNER=$HARNESS_RUNNER +echo XHARNESS_COMMAND=$XHARNESS_COMMAND +echo MAIN_JS=$MAIN_JS +echo JS_ENGINE=$JS_ENGINE +echo JS_ENGINE_ARGS=$JS_ENGINE_ARGS +echo XHARNESS_ARGS=$XHARNESS_ARGS + + +pushd $EXECUTION_DIR + +# ========================= BEGIN Test Execution ============================= +echo ----- start $(date) =============== To repro directly: ===================================================== +echo pushd $EXECUTION_DIR +# RunCommands defined in eng\testing\tests.wasm.targets +[[RunCommandsEcho]] +echo popd +echo =========================================================================================================== +pushd $EXECUTION_DIR +# RunCommands defined in eng\testing\tests.wasm.targets +[[RunCommands]] _exitCode=$? +popd +echo ----- end $(date) ----- exit code $_exitCode ---------------------------------------------------------- echo "XHarness artifacts: $XHARNESS_OUT" -exit $_exitCode +exit $_exitCode \ No newline at end of file diff --git a/eng/testing/tests.targets b/eng/testing/tests.targets index 1d14775dadd90b..6706d6e6d64529 100644 --- a/eng/testing/tests.targets +++ b/eng/testing/tests.targets @@ -102,6 +102,7 @@ diff --git a/eng/testing/tests.wasm.targets b/eng/testing/tests.wasm.targets index ff38cc8686b995..273ab76ef90a3f 100644 --- a/eng/testing/tests.wasm.targets +++ b/eng/testing/tests.wasm.targets @@ -14,6 +14,7 @@ <_ShellCommandSeparator Condition="'$(OS)' == 'Windows_NT'">&& <_ShellCommandSeparator Condition="'$(OS)' != 'Windows_NT'">&& false + <_WasmMainJSFileName Condition="'$(WasmMainJSPath)' != ''">$([System.IO.Path]::GetFileName('$(WasmMainJSPath)')) @@ -22,15 +23,27 @@ local + + + + + + + + + + + + + - V8 - $(JSEngineArgs) --engine-arg=--stack-trace-limit=1000 - <_XHarnessArgs Condition="'$(OS)' != 'Windows_NT'">wasm $XHARNESS_COMMAND --app=. --output-directory=$XHARNESS_OUT <_XHarnessArgs Condition="'$(OS)' == 'Windows_NT'">wasm %XHARNESS_COMMAND% --app=. --output-directory=%XHARNESS_OUT% - <_XHarnessArgs Condition="'$(Scenario)' != 'WasmTestOnBrowser' and '$(Scenario)' != 'BuildWasmApps'">$(_XHarnessArgs) --engine=$(JSEngine) $(JSEngineArgs) --js-file=test-main.js - <_XHarnessArgs Condition="'$(BrowserHost)' == 'windows'">$(_XHarnessArgs) --browser=chrome --browser-path=%HELIX_CORRELATION_PAYLOAD%\chrome-win\chrome.exe <_XHarnessArgs Condition="'$(IsFunctionalTest)' == 'true'" >$(_XHarnessArgs) --expected-exit-code=$(ExpectedExitCode) <_XHarnessArgs Condition="'$(WasmXHarnessArgs)' != ''" >$(_XHarnessArgs) $(WasmXHarnessArgs) @@ -39,8 +52,8 @@ <_AppArgs Condition="'$(WasmTestAppArgs)' != ''">$(_AppArgs) $(WasmTestAppArgs) - $HARNESS_RUNNER $(_XHarnessArgs) %24WasmXHarnessArgs -- $(WasmXHarnessMonoArgs) %24WasmXHarnessMonoArgs $(_AppArgs) %24WasmTestAppArgs - %HARNESS_RUNNER% $(_XHarnessArgs) %WasmXHarnessArgs% -- $(WasmXHarnessMonoArgs) %WasmXHarnessMonoArgs% $(_AppArgs) %WasmTestAppArgs% + $HARNESS_RUNNER $(_XHarnessArgs) %24XHARNESS_ARGS %24WasmXHarnessArgs -- $(WasmXHarnessMonoArgs) %24WasmXHarnessMonoArgs $(_AppArgs) %24WasmTestAppArgs + %HARNESS_RUNNER% $(_XHarnessArgs) %XHARNESS_ARGS% %WasmXHarnessArgs% -- $(WasmXHarnessMonoArgs) %WasmXHarnessMonoArgs% $(_AppArgs) %WasmTestAppArgs% diff --git a/src/libraries/System.Data.Common/tests/System/Data/DataTableTest.cs b/src/libraries/System.Data.Common/tests/System/Data/DataTableTest.cs index 28cd4f7494b1d9..7538f21eac709d 100644 --- a/src/libraries/System.Data.Common/tests/System/Data/DataTableTest.cs +++ b/src/libraries/System.Data.Common/tests/System/Data/DataTableTest.cs @@ -3566,6 +3566,7 @@ public void Remote() } [Fact] + [ActiveIssue("https://github.com/dotnet/runtime/issues/62965", TestPlatforms.Browser)] // fails on NodeJS on windows public void Bug55978() { DataTable dt = new DataTable(); diff --git a/src/libraries/System.Private.Runtime.InteropServices.JavaScript/tests/System/Runtime/InteropServices/JavaScript/MarshalTests.cs b/src/libraries/System.Private.Runtime.InteropServices.JavaScript/tests/System/Runtime/InteropServices/JavaScript/MarshalTests.cs index b3139a60a93b27..f8955384981e0e 100644 --- a/src/libraries/System.Private.Runtime.InteropServices.JavaScript/tests/System/Runtime/InteropServices/JavaScript/MarshalTests.cs +++ b/src/libraries/System.Private.Runtime.InteropServices.JavaScript/tests/System/Runtime/InteropServices/JavaScript/MarshalTests.cs @@ -909,9 +909,10 @@ private static async Task MarshalTask(string helperMethodName, string help @"globalThis.__test_promise_resolved = false; " + @"globalThis.__test_promise_failed = false; " + $@"var t = App.call_test_method ('{helperMethodName}', [ {helperMethodArgs} ], 'i'); " + - "t.finally(result => { globalThis.__test_promise_completed = true; }); " + - "t.then(result => { globalThis.__test_promise_resolved = true; " + resolvedBody + " }); " + - "t.catch(e => { globalThis.__test_promise_failed = true; }); " + "t.then(result => { globalThis.__test_promise_resolved = true; " + resolvedBody + " })" + + " .catch(e => { globalThis.__test_promise_failed = true; })" + + " .finally(result => { globalThis.__test_promise_completed = true; }); " + + "" ); await Task.Delay(1); diff --git a/src/libraries/sendtohelixhelp.proj b/src/libraries/sendtohelixhelp.proj index 6fcbb9d4e59475..39e85a0a1a5f89 100644 --- a/src/libraries/sendtohelixhelp.proj +++ b/src/libraries/sendtohelixhelp.proj @@ -66,10 +66,13 @@ true + $(RepoRoot)src\mono\wasm\emsdk\ + $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src', 'mono', 'wasm', 'emsdk')) true true + true true true @@ -104,14 +107,18 @@ + + + + @@ -137,6 +144,13 @@ + + + + + + + @@ -153,6 +167,12 @@ true + + + true + true + + true @@ -363,7 +383,6 @@ - $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src', 'mono', 'wasm', 'emsdk')) $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src', 'mono', 'wasm', 'build')) $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'bin', 'NetCoreServer', '$(AspNetCoreAppCurrent)-$(Configuration)')) $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'bin', 'RemoteLoopServer', '$(AspNetCoreAppCurrent)-$(Configuration)')) @@ -399,7 +418,7 @@ - + @@ -430,13 +449,13 @@ - + - + @@ -445,6 +464,10 @@ + + + + @@ -517,10 +540,9 @@ dotnet exec %XHARNESS_CLI_PATH% %HELIX_WORKITEM_UPLOAD_ROOT%\xharness-output %XHARNESS_COMMAND% - --browser-path=%HELIX_CORRELATION_PAYLOAD%\chrome-win\chrome.exe - + <_RunOnlyWorkItem Include="$(TestArchiveRoot)runonly/**/*.Console.Sample.zip" /> @@ -562,19 +584,16 @@ - + - - $([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'src', 'mono', 'wasm', 'emsdk')) - + <_EmSdkFiles Include="$(EMSDK_PATH)\**\*" Exclude="$(EMSDK_PATH)\.git\**\*" /> - diff --git a/src/mono/wasm/debugger/DebuggerTestSuite/TestHarnessStartup.cs b/src/mono/wasm/debugger/DebuggerTestSuite/TestHarnessStartup.cs index e7be4958421bed..c8ac7709007118 100644 --- a/src/mono/wasm/debugger/DebuggerTestSuite/TestHarnessStartup.cs +++ b/src/mono/wasm/debugger/DebuggerTestSuite/TestHarnessStartup.cs @@ -114,9 +114,9 @@ public async Task LaunchAndServe(ProcessStartInfo psi, HttpContext context, Func proc.BeginErrorReadLine(); proc.BeginOutputReadLine(); - if (await Task.WhenAny(tcs.Task, Task.Delay(5000)) != tcs.Task) + if (await Task.WhenAny(tcs.Task, Task.Delay(20000)) != tcs.Task) { - Logger.LogError("Didnt get the con string after 5s."); + Logger.LogError("Didnt get the con string after 20s."); throw new Exception("node.js timedout"); } var line = await tcs.Task; diff --git a/src/tasks/installer.tasks/GenerateRunScript.cs b/src/tasks/installer.tasks/GenerateRunScript.cs index a2629768aa2027..142ac7c996fbd6 100644 --- a/src/tasks/installer.tasks/GenerateRunScript.cs +++ b/src/tasks/installer.tasks/GenerateRunScript.cs @@ -11,6 +11,9 @@ namespace Microsoft.DotNet.Build.Tasks { public class GenerateRunScript : Task { + [Required] + public string[] SetCommands { get; set; } + [Required] public string[] RunCommands { get; set; } @@ -60,6 +63,17 @@ private void WriteRunScript(string templateContent, string extension) bool isUnix = extension == ".sh"; string lineFeed = isUnix ? "\n" : "\r\n"; + var setCommandsBuilder = new StringBuilder(); + for (int i = 0; i < SetCommands.Length; i++) + { + setCommandsBuilder.Append(SetCommands[i]); + if (i < SetCommands.Length - 1) + { + setCommandsBuilder.Append(lineFeed); + } + } + templateContent = templateContent.Replace("[[SetCommands]]", setCommandsBuilder.ToString()); + var runCommandsBuilder = new StringBuilder(); for (int i = 0; i < RunCommands.Length; i++) { @@ -71,29 +85,22 @@ private void WriteRunScript(string templateContent, string extension) } templateContent = templateContent.Replace("[[RunCommands]]", runCommandsBuilder.ToString()); + + var setCommandEchoesBuilder = new StringBuilder(); + foreach (string setCommand in SetCommands) + { + setCommandEchoesBuilder.Append($"echo {SanitizeEcho(setCommand,isUnix)}{lineFeed}"); + } + templateContent = templateContent.Replace("[[SetCommandsEcho]]", setCommandEchoesBuilder.ToString()); + var runCommandEchoesBuilder = new StringBuilder(); foreach (string runCommand in RunCommands) { - // Escape backtick and question mark characters to avoid running commands instead of echo'ing them. - string sanitizedRunCommand = runCommand.Replace("`", "\\`") - .Replace("?", "\\") - .Replace("\r","") - .Replace("\n"," ") - .Replace("&", "^&") - .Replace(">", "^>"); - - if (isUnix) - { - // Remove parentheses and quotes from echo command before wrapping it in quotes to avoid errors on Linux. - sanitizedRunCommand = "\"" + sanitizedRunCommand.Replace("\"", "") - .Replace("(", "") - .Replace(")", "") + "\""; - } - - runCommandEchoesBuilder.Append($"echo {sanitizedRunCommand}{lineFeed}"); + runCommandEchoesBuilder.Append($"echo {SanitizeEcho(runCommand,isUnix)}{lineFeed}"); } templateContent = templateContent.Replace("[[RunCommandsEcho]]", runCommandEchoesBuilder.ToString()); + if (isUnix) { // Just in case any Windows EOLs have made it in by here, clean any up. @@ -109,5 +116,26 @@ private void WriteRunScript(string templateContent, string extension) Log.LogMessage($"Wrote {extension} run script to {OutputPath}"); } + + private static string SanitizeEcho(string command, bool isUnix){ + // Escape backtick and question mark characters to avoid running commands instead of echo'ing them. + string sanitizedRunCommand = command.Replace("`", "\\`") + .Replace("?", "\\") + .Replace("$", "") + .Replace("%", "") + .Replace("\r","") + .Replace("\n"," ") + .Replace("&", "^&") + .Replace(">", "^>"); + + if (isUnix) + { + // Remove parentheses and quotes from echo command before wrapping it in quotes to avoid errors on Linux. + sanitizedRunCommand = "\"" + sanitizedRunCommand.Replace("\"", "") + .Replace("(", "") + .Replace(")", "") + "\""; + } + return sanitizedRunCommand; + } } } \ No newline at end of file diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs index aebb02920310af..ec37a933562bd7 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/BuildTestBase.cs @@ -147,8 +147,9 @@ protected string RunAndTestWasmApp(BuildArgs buildArgs, string bundleDir = Path.Combine(GetBinDir(baseDir: buildDir, config: buildArgs.Config), "AppBundle"); (string testCommand, string extraXHarnessArgs) = host switch { - RunHost.V8 => ("wasm test", "--js-file=test-main.js --engine=V8 -v trace"), - _ => ("wasm test-browser", $"-v trace -b {host}") + RunHost.V8 => ("wasm test", "--js-file=test-main.js --engine=V8 -v trace"), + RunHost.NodeJS => ("wasm test", "--js-file=test-main.js --engine=NodeJS -v trace"), + _ => ("wasm test-browser", $"-v trace -b {host}") }; string testLogPath = Path.Combine(_logPath, host.ToString()); diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/RunHost.cs b/src/tests/BuildWasmApps/Wasm.Build.Tests/RunHost.cs index 0aa1ae14ea8120..137316ebb546c5 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/RunHost.cs +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/RunHost.cs @@ -13,7 +13,8 @@ public enum RunHost Chrome = 2, Safari = 4, Firefox = 8, + NodeJS = 16, - All = V8 | Chrome//| Firefox//Safari + All = V8 | NodeJS | Chrome//| Firefox//Safari } } diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.cmd b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.cmd index 95772327e6a258..5e70805c803e9b 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.cmd +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.cmd @@ -1,15 +1,19 @@ @echo off setlocal enabledelayedexpansion -set EXECUTION_DIR=%~dp0 -set SCENARIO=%3 +:: SetCommands defined in eng\testing\tests.wasm.targets +[[SetCommands]] +[[SetCommandsEcho]] -cd %EXECUTION_DIR% +set EXECUTION_DIR=%~dp0 +if [%3] NEQ [] ( + set SCENARIO=%3 +) if [%HELIX_WORKITEM_UPLOAD_ROOT%] == [] ( - set XHARNESS_OUT=%EXECUTION_DIR%xharness-output + set "XHARNESS_OUT=%EXECUTION_DIR%xharness-output" ) else ( - set XHARNESS_OUT=%HELIX_WORKITEM_UPLOAD_ROOT%\xharness-output + set "XHARNESS_OUT=%HELIX_WORKITEM_UPLOAD_ROOT%\xharness-output" ) if [%XHARNESS_CLI_PATH%] NEQ [] ( @@ -20,16 +24,63 @@ if [%XHARNESS_CLI_PATH%] NEQ [] ( set HARNESS_RUNNER=dotnet.exe xharness ) +if [%XHARNESS_COMMAND%] == [] ( + if /I [%SCENARIO%]==[wasmtestonbrowser] ( + set XHARNESS_COMMAND=test-browser + ) else ( + set XHARNESS_COMMAND=test + ) +) + +if /I [%XHARNESS_COMMAND%] == [test] ( + if [%JS_ENGINE%] == [] ( + if /I [%SCENARIO%] == [wasmtestonnodejs] ( + set "JS_ENGINE=--engine^=NodeJS" + ) else ( + set "JS_ENGINE=--engine^=V8" + ) + ) + + if [%MAIN_JS%] == [] ( + set "MAIN_JS=--js-file^=test-main.js" + ) + + if [%JS_ENGINE_ARGS%] == [] ( + set "JS_ENGINE_ARGS=--engine-arg^=--stack-trace-limit^=1000" + ) +) else ( + if [%BROWSER_PATH%] == [] ( + set "BROWSER_PATH=--browser-path^=%HELIX_CORRELATION_PAYLOAD%\chrome-win\chrome.exe" + ) +) + +if [%XHARNESS_ARGS%] == [] ( + set "XHARNESS_ARGS=%JS_ENGINE% %JS_ENGINE_ARGS% %BROWSER_PATH% %MAIN_JS%" +) + +echo EXECUTION_DIR=%EXECUTION_DIR% +echo SCENARIO=%SCENARIO% +echo XHARNESS_OUT=%XHARNESS_OUT% +echo XHARNESS_CLI_PATH=%XHARNESS_CLI_PATH% +echo HARNESS_RUNNER=%HARNESS_RUNNER% +echo XHARNESS_COMMAND=%XHARNESS_COMMAND% +echo MAIN_JS=%MAIN_JS% +echo JS_ENGINE=%JS_ENGINE% +echo JS_ENGINE_ARGS=%JS_ENGINE_ARGS% +echo XHARNESS_ARGS=%XHARNESS_ARGS% + set TEST_LOG_PATH=%XHARNESS_OUT%\logs :: ========================= BEGIN Test Execution ============================= echo ----- start %DATE% %TIME% =============== To repro directly: ===================================================== echo pushd %EXECUTION_DIR% +:: RunCommands defined in eng\testing\tests.wasm.targets [[RunCommandsEcho]] echo popd echo =========================================================================================================== pushd %EXECUTION_DIR% @echo on +:: RunCommands defined in eng\testing\tests.wasm.targets [[RunCommands]] set EXIT_CODE=%ERRORLEVEL% @echo off diff --git a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.sh b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.sh index 7965b10230178e..8a099b9c601363 100644 --- a/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.sh +++ b/src/tests/BuildWasmApps/Wasm.Build.Tests/data/RunScriptTemplate.sh @@ -1,8 +1,13 @@ #!/usr/bin/env bash -EXECUTION_DIR=$(dirname $0) +# SetCommands defined in eng\testing\tests.wasm.targets +[[SetCommands]] +[[SetCommandsEcho]] -cd $EXECUTION_DIR +EXECUTION_DIR=$(dirname $0) +if [[ -n "$3" ]]; then + SCENARIO=$3 +fi if [[ -z "$HELIX_WORKITEM_UPLOAD_ROOT" ]]; then XHARNESS_OUT="$EXECUTION_DIR/xharness-output" @@ -18,6 +23,47 @@ else HARNESS_RUNNER="dotnet xharness" fi +if [[ -z "$XHARNESS_COMMAND" ]]; then + if [[ "${SCENARIO,,}" == "wasmtestonbrowser" ]]; then + XHARNESS_COMMAND="test-browser" + else + XHARNESS_COMMAND="test" + fi +fi + +if [[ "${XHARNESS_COMMAND,,}" == "test" ]]; then + if [[ -z "$JS_ENGINE" ]]; then + if [[ "${SCENARIO,,}" == "wasmtestonnodejs" ]]; then + JS_ENGINE="--engine=NodeJS" + else + JS_ENGINE="--engine=V8" + fi + fi + + if [[ -z "$MAIN_JS" ]]; then + MAIN_JS="--js-file=test-main.js" + fi + + if [[ -z "$JS_ENGINE_ARGS" ]]; then + JS_ENGINE_ARGS="--engine-arg=--stack-trace-limit=1000" + fi +fi + +if [[ -z "$XHARNESS_ARGS" ]]; then + XHARNESS_ARGS="$JS_ENGINE $JS_ENGINE_ARGS $MAIN_JS" +fi + +echo EXECUTION_DIR=$EXECUTION_DIR +echo SCENARIO=$SCENARIO +echo XHARNESS_OUT=$XHARNESS_OUT +echo XHARNESS_CLI_PATH=$XHARNESS_CLI_PATH +echo HARNESS_RUNNER=$HARNESS_RUNNER +echo XHARNESS_COMMAND=$XHARNESS_COMMAND +echo MAIN_JS=$MAIN_JS +echo JS_ENGINE=$JS_ENGINE +echo JS_ENGINE_ARGS=$JS_ENGINE_ARGS +echo XHARNESS_ARGS=$XHARNESS_ARGS + function set_env_vars() { if [ "x$TEST_USING_WORKLOADS" = "xtrue" ]; then @@ -36,10 +82,22 @@ function set_env_vars() export TEST_LOG_PATH=${XHARNESS_OUT}/logs -[[RunCommands]] +pushd $EXECUTION_DIR +# ========================= BEGIN Test Execution ============================= +echo ----- start $(date) =============== To repro directly: ===================================================== +echo pushd $EXECUTION_DIR +# RunCommands defined in eng\testing\tests.wasm.targets +[[RunCommandsEcho]] +echo popd +echo =========================================================================================================== +pushd $EXECUTION_DIR +# RunCommands defined in eng\testing\tests.wasm.targets +[[RunCommands]] _exitCode=$? +popd +echo ----- end $(date) ----- exit code $_exitCode ---------------------------------------------------------- echo "XHarness artifacts: $XHARNESS_OUT" -exit $_exitCode +exit $_exitCode \ No newline at end of file