From 8c91ed82151080a9bbc0bec7f15b7d455b0bbc29 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:54:28 +0000 Subject: [PATCH 001/104] `ConfigSrcTests`, `BuildPublishTests` ready. --- .../Blazor/AppsettingsTests.cs | 80 +- .../Blazor/BlazorBuildOptions.cs | 25 - .../Blazor/BlazorWasmProjectProvider.cs | 32 - .../Blazor/BlazorWasmTestBase.cs | 69 +- .../Blazor/BuildPublishTests.cs | 372 ++-- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 178 +- .../Blazor/IcuShardingTests.cs | 170 +- .../wasm/Wasm.Build.Tests/Blazor/IcuTests.cs | 224 +- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 100 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 284 +-- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 96 +- .../Blazor/NoopNativeRebuildTest.cs | 82 +- .../Blazor/SimpleMultiThreadedTests.cs | 104 +- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 128 +- .../Blazor/WorkloadRequiredTests.cs | 294 +-- .../Wasm.Build.Tests/BuildProjectOptions.cs | 40 +- .../Wasm.Build.Tests/BuildPublishTests.cs | 241 +- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 125 +- .../Common/AssertBundleOptions.cs | 21 + .../Common/AssertBundleOptionsBase.cs | 29 - .../AssertTestMainJsAppBundleOptions.cs | 41 - .../Common/AssertWasmSdkBundleOptions.cs | 37 - .../Common/BuildAndRunAttribute.cs | 17 +- .../Wasm.Build.Tests/Common/BuildPaths.cs | 2 +- .../Wasm.Build.Tests/Common/BuildProduct.cs | 13 + .../Common/HelperExtensions.cs | 43 - .../Common/NativeFilesType.cs | 9 + .../Wasm.Build.Tests/Common/ProjectInfo.cs | 13 + .../wasm/Wasm.Build.Tests/Common/RunHost.cs | 19 - .../RunOptions.cs} | 17 +- .../wasm/Wasm.Build.Tests/Common/RunResult.cs | 13 + .../Common/SharedBuildPerTestClassFixture.cs | 8 +- .../wasm/Wasm.Build.Tests/Common/Template.cs | 12 + .../wasm/Wasm.Build.Tests/ConfigSrcTests.cs | 26 +- .../wasm/Wasm.Build.Tests/DebugLevelTests.cs | 194 +- .../HostRunner/BrowserHostRunner.cs | 5 +- .../HostRunner/IHostRunner.cs | 3 +- .../HostRunner/V8HostRunner.cs | 43 - .../HybridGlobalizationTests.cs | 80 +- .../wasm/Wasm.Build.Tests/IcuShardingTests.cs | 60 +- .../Wasm.Build.Tests/IcuShardingTests2.cs | 8 +- src/mono/wasm/Wasm.Build.Tests/IcuTests.cs | 100 +- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 181 +- .../InvariantGlobalizationTests.cs | 87 +- .../InvariantTimezoneTests.cs | 77 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 142 +- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 186 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 302 +-- .../FlagsChangeRebuildTest.cs | 64 +- .../NativeRebuildTestsBase.cs | 169 +- .../NoopNativeRebuildTest.cs | 26 +- .../OptimizationFlagChangeTests.cs | 74 +- .../ReferenceNewAssemblyRebuildTest.cs | 74 +- .../SimpleSourceChangeRebuildTest.cs | 68 +- .../PInvokeTableGeneratorTests.cs | 1952 ++++++++--------- .../Wasm.Build.Tests/ProjectProviderBase.cs | 174 +- src/mono/wasm/Wasm.Build.Tests/README.md | 4 +- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 67 +- .../SatelliteAssembliesTests.cs | 403 ++-- .../Templates/NativeBuildTests.cs | 163 +- .../Templates/WasmTemplateTests.cs | 546 +++-- .../Templates/WasmTemplateTestsBase.cs | 121 +- .../TestAppScenarios/AppTestBase.cs | 37 +- .../TestMainJsProjectProvider.cs | 119 - .../Wasm.Build.Tests/TestMainJsTestBase.cs | 152 +- .../wasm/Wasm.Build.Tests/WasmBuildAppTest.cs | 342 ++- .../WasmNativeDefaultsTests.cs | 452 ++-- .../WasmRunOutOfAppBundleTests.cs | 78 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 188 +- .../WasmSdkBasedProjectProvider.cs | 93 +- 70 files changed, 4652 insertions(+), 5146 deletions(-) delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorBuildOptions.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmProjectProvider.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptionsBase.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/AssertTestMainJsAppBundleOptions.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/AssertWasmSdkBundleOptions.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/BuildProduct.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/NativeFilesType.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/RunHost.cs rename src/mono/wasm/Wasm.Build.Tests/{Blazor/BlazorRunOptions.cs => Common/RunOptions.cs} (64%) create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/RunResult.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/Template.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/HostRunner/V8HostRunner.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/TestMainJsProjectProvider.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs index db0607d226a8c3..3749fd7926a347 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs @@ -18,44 +18,44 @@ public AppsettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture _enablePerTestCleanup = true; } - [Fact] - public async Task FileInVfs() - { - string id = $"blazor_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - - string projectDirectory = Path.GetDirectoryName(projectFile)!; - - File.WriteAllText(Path.Combine(projectDirectory, "wwwroot", "appsettings.json"), $"{{ \"Id\": \"{id}\" }}"); - - string programPath = Path.Combine(projectDirectory, "Program.cs"); - string programContent = File.ReadAllText(programPath); - programContent = programContent.Replace("var builder", - """ - System.Console.WriteLine($"appSettings Exists '{File.Exists("/appsettings.json")}'"); - System.Console.WriteLine($"appSettings Content '{File.ReadAllText("/appsettings.json")}'"); - var builder - """); - File.WriteAllText(programPath, programContent); - - BlazorBuild(new BlazorBuildOptions(id, "debug", NativeFilesType.FromRuntimePack)); - - bool existsChecked = false; - bool contentChecked = false; - - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() - { - Config = "debug", - OnConsoleMessage = (_, msg) => - { - if (msg.Text.Contains("appSettings Exists 'True'")) - existsChecked = true; - else if (msg.Text.Contains($"appSettings Content '{{ \"Id\": \"{id}\" }}'")) - contentChecked = true; - } - }); - - Assert.True(existsChecked, "File '/appsettings.json' wasn't found"); - Assert.True(contentChecked, "Content of '/appsettings.json' is not matched"); - } + // [Fact] + // public async Task FileInVfs() + // { + // string id = $"blazor_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + + // string projectDirectory = Path.GetDirectoryName(projectFile)!; + + // File.WriteAllText(Path.Combine(projectDirectory, "wwwroot", "appsettings.json"), $"{{ \"Id\": \"{id}\" }}"); + + // string programPath = Path.Combine(projectDirectory, "Program.cs"); + // string programContent = File.ReadAllText(programPath); + // programContent = programContent.Replace("var builder", + // """ + // System.Console.WriteLine($"appSettings Exists '{File.Exists("/appsettings.json")}'"); + // System.Console.WriteLine($"appSettings Content '{File.ReadAllText("/appsettings.json")}'"); + // var builder + // """); + // File.WriteAllText(programPath, programContent); + + // BlazorBuild(new BuildProjectOptions(id, "debug", NativeFilesType.FromRuntimePack)); + + // bool existsChecked = false; + // bool contentChecked = false; + + // await BlazorRunForBuildWithDotnetRun(new RunOptions() + // { + // Configuration = "debug", + // OnConsoleMessage = (_, msg) => + // { + // if (msg.Text.Contains("appSettings Exists 'True'")) + // existsChecked = true; + // else if (msg.Text.Contains($"appSettings Content '{{ \"Id\": \"{id}\" }}'")) + // contentChecked = true; + // } + // }); + + // Assert.True(existsChecked, "File '/appsettings.json' wasn't found"); + // Assert.True(contentChecked, "Content of '/appsettings.json' is not matched"); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorBuildOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorBuildOptions.cs deleted file mode 100644 index cebbcae891f383..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorBuildOptions.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -namespace Wasm.Build.Tests; - -public record BlazorBuildOptions -( - string Id, - string Config, - NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, - string TargetFramework = BuildTestBase.DefaultTargetFrameworkForBlazor, - string BootConfigFileName = "blazor.boot.json", - bool IsPublish = false, - bool WarnAsError = true, - bool ExpectSuccess = true, - bool ExpectRelinkDirWhenPublishing = false, - bool ExpectFingerprintOnDotnetJs = false, - RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, - GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, - string CustomIcuFile = "", - bool AssertAppBundle = true, - string? BinFrameworkDir = null -); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmProjectProvider.cs deleted file mode 100644 index f715ece03bd553..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmProjectProvider.cs +++ /dev/null @@ -1,32 +0,0 @@ -// 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.Abstractions; - -#nullable enable - -namespace Wasm.Build.Tests; - -public class BlazorWasmProjectProvider : WasmSdkBasedProjectProvider -{ - public BlazorWasmProjectProvider(ITestOutputHelper _testOutput, string defaultTargetFramework, string? _projectDir = null) - : base(_testOutput, defaultTargetFramework, _projectDir) - { } - - public void AssertBundle(BlazorBuildOptions options) - => AssertBundle(new AssertWasmSdkBundleOptions( - Config: options.Config, - BootConfigFileName: options.BootConfigFileName, - IsPublish: options.IsPublish, - TargetFramework: options.TargetFramework, - BinFrameworkDir: options.BinFrameworkDir ?? FindBinFrameworkDir(options.Config, options.IsPublish, options.TargetFramework), - GlobalizationMode: options.GlobalizationMode, - CustomIcuFile: options.CustomIcuFile, - ExpectFingerprintOnDotnetJs: options.ExpectFingerprintOnDotnetJs, - ExpectedFileType: options.ExpectedFileType, - RuntimeType: options.RuntimeType, - AssertIcuAssets: true, - AssertSymbolsFile: false // FIXME: not supported yet - )); -} diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 75769e5da3cbc8..ffb08a24d8216b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -17,11 +17,11 @@ namespace Wasm.Build.Tests; public abstract class BlazorWasmTestBase : WasmTemplateTestsBase { - protected readonly BlazorWasmProjectProvider _provider; + protected readonly WasmSdkBasedProjectProvider _provider; protected BlazorWasmTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(output, buildContext, new BlazorWasmProjectProvider(output, DefaultTargetFrameworkForBlazor)) + : base(output, buildContext, new WasmSdkBasedProjectProvider(output, DefaultTargetFrameworkForBlazor)) { - _provider = GetProvider(); + _provider = GetProvider(); } public void InitBlazorWasmProjectDir(string id, string targetFramework = DefaultTargetFrameworkForBlazor) @@ -54,12 +54,17 @@ public string CreateBlazorWasmTemplateProject(string id) return Path.Combine(_projectDir!, $"{id}.csproj"); } - protected (CommandResult, string) BlazorBuild(BlazorBuildOptions options, params string[] extraArgs) + protected (CommandResult, string) BlazorBuild(BuildProjectOptions options, params string[] extraArgs) { if (options.WarnAsError) extraArgs = extraArgs.Append("/warnaserror").ToArray(); - (CommandResult res, string logPath) = BlazorBuildInternal(options.Id, options.Config, publish: false, setWasmDevel: false, expectSuccess: options.ExpectSuccess, extraArgs); + (CommandResult res, string logPath) = BlazorBuildInternal( + options.Id, + options.Configuration, + setWasmDevel: false, + expectSuccess: options.ExpectSuccess, + extraArgs: extraArgs); if (options.ExpectSuccess && options.AssertAppBundle) { @@ -69,17 +74,17 @@ public string CreateBlazorWasmTemplateProject(string id) return (res, logPath); } - protected (CommandResult, string) BlazorPublish(BlazorBuildOptions options, params string[] extraArgs) + protected (CommandResult, string) BlazorPublish(BuildProjectOptions options, params string[] extraArgs) { if (options.WarnAsError) extraArgs = extraArgs.Append("/warnaserror").ToArray(); - (CommandResult res, string logPath) = BlazorBuildInternal(options.Id, options.Config, publish: true, setWasmDevel: false, expectSuccess: options.ExpectSuccess, extraArgs); + (CommandResult res, string logPath) = BlazorBuildInternal(options.Id, options.Configuration, publish: true, setWasmDevel: false, expectSuccess: options.ExpectSuccess, extraArgs); if (options.ExpectSuccess && options.AssertAppBundle) { // Because we do relink in Release publish by default - if (options.Config == "Release") + if (options.Configuration == "Release") options = options with { ExpectedFileType = NativeFilesType.Relinked }; AssertBundle(res.Output, options with { IsPublish = true }); @@ -99,9 +104,13 @@ public string CreateBlazorWasmTemplateProject(string id) try { return BuildProjectWithoutAssert( - id, - config, - new BuildProjectOptions(CreateProject: false, UseCache: false, Publish: publish, ExpectSuccess: expectSuccess), + new BuildProjectOptions( + id, + config, + GetBlazorBinFrameworkDir(config, forPublish: publish), + UseCache: false, + IsPublish: publish, + ExpectSuccess: expectSuccess), extraArgs.Concat(new[] { "-p:BlazorEnableCompression=false", @@ -116,22 +125,22 @@ public string CreateBlazorWasmTemplateProject(string id) } } - public void AssertBundle(string buildOutput, BlazorBuildOptions blazorBuildOptions) + public void AssertBundle(string buildOutput, BuildProjectOptions buildOptions) { if (IsUsingWorkloads) { // In no-workload case, the path would be from a restored nuget - ProjectProviderBase.AssertRuntimePackPath(buildOutput, blazorBuildOptions.TargetFramework ?? DefaultTargetFramework, blazorBuildOptions.RuntimeType); + ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? DefaultTargetFramework, buildOptions.RuntimeType); } - _provider.AssertBundle(blazorBuildOptions); + _provider.AssertBundle(buildOptions); - if (!blazorBuildOptions.IsPublish) + if (!buildOptions.IsPublish) return; // Publish specific checks - if (blazorBuildOptions.ExpectedFileType == NativeFilesType.AOT) + if (buildOptions.ExpectedFileType == NativeFilesType.AOT) { // check for this too, so we know the format is correct for the negative // test for jsinterop.webassembly.dll @@ -141,9 +150,9 @@ public void AssertBundle(string buildOutput, BlazorBuildOptions blazorBuildOptio Assert.DoesNotContain("Microsoft.JSInterop.WebAssembly.dll -> Microsoft.JSInterop.WebAssembly.dll.bc", buildOutput); } - string objBuildDir = Path.Combine(_projectDir!, "obj", blazorBuildOptions.Config, blazorBuildOptions.TargetFramework!, "wasm", "for-build"); + string objBuildDir = Path.Combine(_projectDir!, "obj", buildOptions.Configuration, buildOptions.TargetFramework!, "wasm", "for-build"); // Check that we linked only for publish - if (blazorBuildOptions.ExpectRelinkDirWhenPublishing) + if (buildOptions.ExpectRelinkDirWhenPublishing) Assert.True(Directory.Exists(objBuildDir), $"Could not find expected {objBuildDir}, which gets created when relinking during Build. This is likely a test authoring error"); else Assert.False(File.Exists(Path.Combine(objBuildDir, "emcc-link.rsp")), $"Found unexpected `emcc-link.rsp` in {objBuildDir}, which gets created when relinking during Build."); @@ -165,20 +174,20 @@ protected string CreateProjectWithNativeReference(string id) // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public Task BlazorRunForBuildWithDotnetRun(BlazorRunOptions runOptions) - => BlazorRunTest(runOptions with { Host = BlazorRunHost.DotnetRun }); + public Task BlazorRunForBuildWithDotnetRun(RunOptions runOptions) + => BlazorRunTest(runOptions with { Host = RunHost.DotnetRun }); - public Task BlazorRunForPublishWithWebServer(BlazorRunOptions runOptions) - => BlazorRunTest(runOptions with { Host = BlazorRunHost.WebServer }); + public Task BlazorRunForPublishWithWebServer(RunOptions runOptions) + => BlazorRunTest(runOptions with { Host = RunHost.WebServer }); - public Task BlazorRunTest(BlazorRunOptions runOptions) => runOptions.Host switch + public Task BlazorRunTest(RunOptions runOptions) => runOptions.Host switch { - BlazorRunHost.DotnetRun => - BlazorRunTest($"run -c {runOptions.Config} --no-build", _projectDir!, runOptions), + RunHost.DotnetRun => + BlazorRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions), - BlazorRunHost.WebServer => + RunHost.WebServer => BlazorRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", - Path.GetFullPath(Path.Combine(FindBlazorBinFrameworkDir(runOptions.Config, forPublish: true), "..")), + Path.GetFullPath(Path.Combine(GetBlazorBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")), runOptions), _ => throw new NotImplementedException(runOptions.Host.ToString()) @@ -186,7 +195,7 @@ public Task BlazorRunForPublishWithWebServer(BlazorRunOptions runOptions) public async Task BlazorRunTest(string runArgs, string workingDirectory, - BlazorRunOptions runOptions) + RunOptions runOptions) { if (!string.IsNullOrEmpty(runOptions.ExtraArgs)) runArgs += $" {runOptions.ExtraArgs}"; @@ -247,6 +256,6 @@ void OnErrorMessage(string msg) } } - public string FindBlazorBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFrameworkForBlazor, string? projectDir = null) - => _provider.FindBinFrameworkDir(config: config, forPublish: forPublish, framework: framework, projectDir: projectDir); + public string GetBlazorBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFrameworkForBlazor, string? projectDir = null) + => _provider.GetBinFrameworkDir(config: config, forPublish: forPublish, framework: framework, projectDir: projectDir); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 5877b0f6a06dd4..09c6a4c06ef906 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -23,190 +23,190 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur _enablePerTestCleanup = true; } - [Theory, TestCategory("no-workload")] - [InlineData("Debug")] - [InlineData("Release")] - public async Task DefaultTemplate_WithoutWorkload(string config) - { - string id = $"blz_no_workload_{config}_{GetRandomId()}_{s_unicodeChars}"; - CreateBlazorWasmTemplateProject(id); - - BlazorBuild(new BlazorBuildOptions(id, config)); - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - - BlazorPublish(new BlazorBuildOptions(id, config)); - await BlazorRunForPublishWithWebServer(new BlazorRunOptions() { Config = config }); - } - - - public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) - { - var data = new TheoryData(); - if (!isAot) - { - // AOT does not support managed debugging, is disabled by design - data.Add("Debug", false); - data.Add("Debug", true); - } - - // [ActiveIssue("https://github.com/dotnet/runtime/issues/103625", TestPlatforms.Windows)] - // when running locally the path might be longer than 260 chars and these tests can fail with AOT - data.Add("Release", false); // Release relinks by default - data.Add("Release", true); - return data; - } - - [Theory] - [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] - public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) - { - string id = testUnicode ? - $"blz_no_aot_{config}_{GetRandomId()}_{s_unicodeChars}" : - $"blz_no_aot_{config}_{GetRandomId()}"; - CreateBlazorWasmTemplateProject(id); - - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); - if (config == "Release") - { - // relinking in publish for Release config - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); - } - else - { - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack, ExpectRelinkDirWhenPublishing: true)); - } - } - - [Theory] - [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] - public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) - { - string id = testUnicode ? - $"blz_aot_{config}_{GetRandomId()}_{s_unicodeChars}" : - $"blz_aot_{config}_{GetRandomId()}"; - CreateBlazorWasmTemplateProject(id); - - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.AOT), "-p:RunAOTCompilation=true"); - } - - [Theory] - [InlineData("Debug", false)] - [InlineData("Release", false)] - [InlineData("Debug", true)] - [InlineData("Release", true)] - public void DefaultTemplate_CheckFingerprinting(string config, bool expectFingerprintOnDotnetJs) - { - string id = $"blz_checkfingerprinting_{config}_{GetRandomId()}"; - - CreateBlazorWasmTemplateProject(id); - - var options = new BlazorBuildOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true, ExpectFingerprintOnDotnetJs: expectFingerprintOnDotnetJs); - var finterprintingArg = expectFingerprintOnDotnetJs ? "/p:WasmFingerprintDotnetJs=true" : string.Empty; - - BlazorBuild(options, "/p:WasmBuildNative=true", finterprintingArg); - BlazorPublish(options, "/p:WasmBuildNative=true", finterprintingArg); - } - - // Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure - // how to pick which one to check, for the test - //[Theory] - //[InlineData("Debug")] - //[InlineData("Release")] - //public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) - //{ - //string id = $"blz_aot_pub_{config}"; - //CreateBlazorWasmTemplateProject(id); - - //// No relinking, no AOT - //BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack); - - //// AOT=true only for the publish command line, similar to what - //// would happen when setting it in Publish dialog for VS - //BlazorPublish(new BlazorBuildOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); - - //// publish again, no AOT - //BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.Relinked); - //} - - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void DefaultTemplate_WithResources_Publish(string config) - { - string[] cultures = ["ja-JP", "es-ES"]; - string id = $"blz_resources_{config}_{GetRandomId()}"; - CreateBlazorWasmTemplateProject(id); - - // Ensure we have the source data we rely on - string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); - foreach (string culture in cultures) - Assert.True(File.Exists(Path.Combine(resxSourcePath, $"words.{culture}.resx"))); - - Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir!, "resx")); - - // Build and assert resource dlls - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); - AssertResourcesDlls(FindBlazorBinFrameworkDir(config, false)); - - // Publish and assert resource dlls - if (config == "Release") - { - // relinking in publish for Release config - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true, IsPublish: true)); - } - else - { - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack, ExpectRelinkDirWhenPublishing: true, IsPublish: true)); - } - - AssertResourcesDlls(FindBlazorBinFrameworkDir(config, true)); - - void AssertResourcesDlls(string basePath) - { - foreach (string culture in cultures) - { - string? resourceAssemblyPath = Directory.EnumerateFiles(Path.Combine(basePath, culture), $"*{ProjectProviderBase.WasmAssemblyExtension}").SingleOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith($"{id}.resources")); - Assert.True(resourceAssemblyPath != null && File.Exists(resourceAssemblyPath), $"Expects to have a resource assembly at {resourceAssemblyPath}"); - } - } - } - - [Theory] - [InlineData("", true)] // Default case - [InlineData("false", false)] // the other case - public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) - { - string config = "Release"; - string id = $"blz_WasmStripILAfterAOT_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - string projectDirectory = Path.GetDirectoryName(projectFile)!; - - string extraProperties = "true"; - if (!string.IsNullOrEmpty(stripILAfterAOT)) - extraProperties += $"{stripILAfterAOT}"; - AddItemsPropertiesToProject(projectFile, extraProperties); - - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.AOT, AssertAppBundle : false)); - await BlazorRunForPublishWithWebServer(new BlazorRunOptions() { Config = config }); - - string frameworkDir = Path.Combine(projectDirectory, "bin", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); - string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); - - WasmTemplateTests.TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); - } - - [Theory] - [InlineData("Debug")] - public void BlazorWasm_CannotAOT_InDebug(string config) - { - string id = $"blazorwasm_{config}_aot_{GetRandomId()}"; - CreateBlazorWasmTemplateProject(id); - AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), - extraItems: null, - extraProperties: "true"); - - (CommandResult res, _) = BlazorPublish(new BlazorBuildOptions(id, config, ExpectSuccess: false)); - Assert.Contains("AOT is not supported in debug configuration", res.Output); - } + // [Theory, TestCategory("no-workload")] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task DefaultTemplate_WithoutWorkload(string config) + // { + // string id = $"blz_no_workload_{config}_{GetRandomId()}_{s_unicodeChars}"; + // CreateBlazorWasmTemplateProject(id); + + // BlazorBuild(new BuildProjectOptions(id, config)); + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + + // BlazorPublish(new BuildProjectOptions(id, config)); + // await BlazorRunForPublishWithWebServer(new RunOptions() { Configuration = config }); + // } + + + // public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) + // { + // var data = new TheoryData(); + // if (!isAot) + // { + // // AOT does not support managed debugging, is disabled by design + // data.Add("Debug", false); + // data.Add("Debug", true); + // } + + // // [ActiveIssue("https://github.com/dotnet/runtime/issues/103625", TestPlatforms.Windows)] + // // when running locally the path might be longer than 260 chars and these tests can fail with AOT + // data.Add("Release", false); // Release relinks by default + // data.Add("Release", true); + // return data; + // } + + // [Theory] + // [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] + // public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) + // { + // string id = testUnicode ? + // $"blz_no_aot_{config}_{GetRandomId()}_{s_unicodeChars}" : + // $"blz_no_aot_{config}_{GetRandomId()}"; + // CreateBlazorWasmTemplateProject(id); + + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + // if (config == "Release") + // { + // // relinking in publish for Release config + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); + // } + // else + // { + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack, ExpectRelinkDirWhenPublishing: true)); + // } + // } + + // [Theory] + // [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] + // public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) + // { + // string id = testUnicode ? + // $"blz_aot_{config}_{GetRandomId()}_{s_unicodeChars}" : + // $"blz_aot_{config}_{GetRandomId()}"; + // CreateBlazorWasmTemplateProject(id); + + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT), "-p:RunAOTCompilation=true"); + // } + + // [Theory] + // [InlineData("Debug", false)] + // [InlineData("Release", false)] + // [InlineData("Debug", true)] + // [InlineData("Release", true)] + // public void DefaultTemplate_CheckFingerprinting(string config, bool expectFingerprintOnDotnetJs) + // { + // string id = $"blz_checkfingerprinting_{config}_{GetRandomId()}"; + + // CreateBlazorWasmTemplateProject(id); + + // var options = new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true, ExpectFingerprintOnDotnetJs: expectFingerprintOnDotnetJs); + // var finterprintingArg = expectFingerprintOnDotnetJs ? "/p:WasmFingerprintDotnetJs=true" : string.Empty; + + // BlazorBuild(options, "/p:WasmBuildNative=true", finterprintingArg); + // BlazorPublish(options, "/p:WasmBuildNative=true", finterprintingArg); + // } + + // // Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure + // // how to pick which one to check, for the test + // //[Theory] + // //[InlineData("Debug")] + // //[InlineData("Release")] + // //public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) + // //{ + // //string id = $"blz_aot_pub_{config}"; + // //CreateBlazorWasmTemplateProject(id); + + // //// No relinking, no AOT + // //BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack); + + // //// AOT=true only for the publish command line, similar to what + // //// would happen when setting it in Publish dialog for VS + // //BlazorPublish(new BuildProjectOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); + + // //// publish again, no AOT + // //BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked); + // //} + + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void DefaultTemplate_WithResources_Publish(string config) + // { + // string[] cultures = ["ja-JP", "es-ES"]; + // string id = $"blz_resources_{config}_{GetRandomId()}"; + // CreateBlazorWasmTemplateProject(id); + + // // Ensure we have the source data we rely on + // string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); + // foreach (string culture in cultures) + // Assert.True(File.Exists(Path.Combine(resxSourcePath, $"words.{culture}.resx"))); + + // Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir!, "resx")); + + // // Build and assert resource dlls + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + // AssertResourcesDlls(GetBlazorBinFrameworkDir(config, false)); + + // // Publish and assert resource dlls + // if (config == "Release") + // { + // // relinking in publish for Release config + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true, IsPublish: true)); + // } + // else + // { + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack, ExpectRelinkDirWhenPublishing: true, IsPublish: true)); + // } + + // AssertResourcesDlls(GetBlazorBinFrameworkDir(config, true)); + + // void AssertResourcesDlls(string basePath) + // { + // foreach (string culture in cultures) + // { + // string? resourceAssemblyPath = Directory.EnumerateFiles(Path.Combine(basePath, culture), $"*{ProjectProviderBase.WasmAssemblyExtension}").SingleOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith($"{id}.resources")); + // Assert.True(resourceAssemblyPath != null && File.Exists(resourceAssemblyPath), $"Expects to have a resource assembly at {resourceAssemblyPath}"); + // } + // } + // } + + // [Theory] + // [InlineData("", true)] // Default case + // [InlineData("false", false)] // the other case + // public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) + // { + // string config = "Release"; + // string id = $"blz_WasmStripILAfterAOT_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // string projectDirectory = Path.GetDirectoryName(projectFile)!; + + // string extraProperties = "true"; + // if (!string.IsNullOrEmpty(stripILAfterAOT)) + // extraProperties += $"{stripILAfterAOT}"; + // AddItemsPropertiesToProject(projectFile, extraProperties); + + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, AssertAppBundle : false)); + // await BlazorRunForPublishWithWebServer(new RunOptions() { Configuration = config }); + + // string frameworkDir = Path.Combine(projectDirectory, "bin", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); + // string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); + + // WasmTemplateTests.TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); + // } + + // [Theory] + // [InlineData("Debug")] + // public void BlazorWasm_CannotAOT_InDebug(string config) + // { + // string id = $"blazorwasm_{config}_aot_{GetRandomId()}"; + // CreateBlazorWasmTemplateProject(id); + // AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), + // extraItems: null, + // extraProperties: "true"); + + // (CommandResult res, _) = BlazorPublish(new BuildProjectOptions(id, config, ExpectSuccess: false)); + // Assert.Contains("AOT is not supported in debug configuration", res.Output); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index 122aa274962373..30972c1904368e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -20,93 +20,93 @@ public CleanTests(ITestOutputHelper output, SharedBuildPerTestClassFixture build { } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void Blazor_BuildThenClean_NativeRelinking(string config) - { - string id = GetRandomId(); - - InitBlazorWasmProjectDir(id); - string projectFile = CreateBlazorWasmTemplateProject(id); - - string extraProperties = @"<_WasmDevel>true - true"; - - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); - - string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); - Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); - - string logPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-clean.binlog"); - using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); - cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") - .EnsureSuccessful(); - - AssertEmptyOrNonExistentDirectory(relinkDir); - } - - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void Blazor_BuildNoNative_ThenBuildNative_ThenClean(string config) - => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: false); - - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) - => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: true); - - private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) - { - string id = GetRandomId(); - - InitBlazorWasmProjectDir(id); - string projectFile = CreateBlazorWasmTemplateProject(id); - - string extraProperties = @"<_WasmDevel>true"; - - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - bool relink = firstBuildNative; - BlazorBuildInternal(id, config, publish: false, - extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); - - string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); - if (relink) - Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); - - relink = !firstBuildNative; - BlazorBuildInternal(id, config, publish: false, - extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); - - if (relink) - Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); - - string logPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-clean.binlog"); - using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); - cmd.WithEnvironmentVariable("NUGET_PACKAGES", _projectDir!) - .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") - .EnsureSuccessful(); - - AssertEmptyOrNonExistentDirectory(relinkDir); - } - private void AssertEmptyOrNonExistentDirectory(string dirPath) - { - _testOutput.WriteLine($"dirPath: {dirPath}"); - if (!Directory.Exists(dirPath)) - return; - - var files = Directory.GetFileSystemEntries(dirPath); - if (files.Length == 0) - return; - - string found = string.Join(',', files.Select(p => Path.GetFileName(p))); - throw new XunitException($"Expected dir {dirPath} to be empty, but found: {found}"); - } + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void Blazor_BuildThenClean_NativeRelinking(string config) + // { + // string id = GetRandomId(); + + // InitBlazorWasmProjectDir(id); + // string projectFile = CreateBlazorWasmTemplateProject(id); + + // string extraProperties = @"<_WasmDevel>true + // true"; + + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); + + // string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + // Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); + + // string logPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-clean.binlog"); + // using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) + // .WithWorkingDirectory(_projectDir!); + // cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + // .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") + // .EnsureSuccessful(); + + // AssertEmptyOrNonExistentDirectory(relinkDir); + // } + + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void Blazor_BuildNoNative_ThenBuildNative_ThenClean(string config) + // => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: false); + + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) + // => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: true); + + // private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) + // { + // string id = GetRandomId(); + + // InitBlazorWasmProjectDir(id); + // string projectFile = CreateBlazorWasmTemplateProject(id); + + // string extraProperties = @"<_WasmDevel>true"; + + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + + // bool relink = firstBuildNative; + // BlazorBuildInternal(id, config, publish: false, + // extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); + + // string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + // if (relink) + // Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); + + // relink = !firstBuildNative; + // BlazorBuildInternal(id, config, publish: false, + // extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); + + // if (relink) + // Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); + + // string logPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-clean.binlog"); + // using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) + // .WithWorkingDirectory(_projectDir!); + // cmd.WithEnvironmentVariable("NUGET_PACKAGES", _projectDir!) + // .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") + // .EnsureSuccessful(); + + // AssertEmptyOrNonExistentDirectory(relinkDir); + // } + // private void AssertEmptyOrNonExistentDirectory(string dirPath) + // { + // _testOutput.WriteLine($"dirPath: {dirPath}"); + // if (!Directory.Exists(dirPath)) + // return; + + // var files = Directory.GetFileSystemEntries(dirPath); + // if (files.Length == 0) + // return; + + // string found = string.Join(',', files.Select(p => Path.GetFileName(p))); + // throw new XunitException($"Expected dir {dirPath} to be empty, but found: {found}"); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs index 9a6ba4e09ae8df..03cec1e19cf246 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs @@ -19,94 +19,94 @@ public class IcuShardingTests : BlazorWasmTestBase public IcuShardingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - [Theory] - [InlineData("Debug", "icudt.dat")] - [InlineData("Release", "icudt.dat")] - [InlineData("Debug", "icudt_CJK.dat")] - [InlineData("Release", "icudt_CJK.dat")] - public async Task CustomIcuFileFromRuntimePack(string config, string fileName) - { - string id = $"blz_customFromRuntimePack_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - var buildOptions = new BlazorBuildOptions( - id, - config, - WarnAsError: true, - GlobalizationMode: GlobalizationMode.Custom, - CustomIcuFile: fileName - ); - AddItemsPropertiesToProject( - projectFile, - extraProperties: - $"{fileName}"); + // [Theory] + // [InlineData("Debug", "icudt.dat")] + // [InlineData("Release", "icudt.dat")] + // [InlineData("Debug", "icudt_CJK.dat")] + // [InlineData("Release", "icudt_CJK.dat")] + // public async Task CustomIcuFileFromRuntimePack(string config, string fileName) + // { + // string id = $"blz_customFromRuntimePack_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // var buildOptions = new BuildProjectOptions( + // id, + // config, + // WarnAsError: true, + // GlobalizationMode: GlobalizationMode.Custom, + // CustomIcuFile: fileName + // ); + // AddItemsPropertiesToProject( + // projectFile, + // extraProperties: + // $"{fileName}"); - (CommandResult res, string logPath) = BlazorBuild(buildOptions); - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } + // (CommandResult res, string logPath) = BlazorBuild(buildOptions); + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } - [Theory] - [InlineData("Debug", "incorrectName.dat", false)] - [InlineData("Release", "incorrectName.dat", false)] - [InlineData("Debug", "icudtNonExisting.dat", true)] - [InlineData("Release", "icudtNonExisting.dat", true)] - public void NonExistingCustomFileAssertError(string config, string fileName, bool isFilenameCorrect) - { - string id = $"blz_invalidCustomIcu_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - AddItemsPropertiesToProject( - projectFile, - extraProperties: - $"{fileName}"); + // [Theory] + // [InlineData("Debug", "incorrectName.dat", false)] + // [InlineData("Release", "incorrectName.dat", false)] + // [InlineData("Debug", "icudtNonExisting.dat", true)] + // [InlineData("Release", "icudtNonExisting.dat", true)] + // public void NonExistingCustomFileAssertError(string config, string fileName, bool isFilenameCorrect) + // { + // string id = $"blz_invalidCustomIcu_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // AddItemsPropertiesToProject( + // projectFile, + // extraProperties: + // $"{fileName}"); - try - { - (CommandResult res, string logPath) = BlazorBuild( - new BlazorBuildOptions( - id, - config, - WarnAsError: false, - GlobalizationMode: GlobalizationMode.Custom, - CustomIcuFile: fileName - )); - } - catch (XunitException ex) - { - if (isFilenameCorrect) - { - Assert.Contains($"Could not find $(BlazorIcuDataFileName)={fileName}, or when used as a path relative to the runtime pack", ex.Message); - } - else - { - Assert.Contains("File name in $(BlazorIcuDataFileName) has to start with 'icudt'", ex.Message); - } - } - catch (Exception) - { - throw new Exception("Unexpected exception in test scenario."); - } - // we expect build error, so there is not point in running the app - } + // try + // { + // (CommandResult res, string logPath) = BlazorBuild( + // new BuildProjectOptions( + // id, + // config, + // WarnAsError: false, + // GlobalizationMode: GlobalizationMode.Custom, + // CustomIcuFile: fileName + // )); + // } + // catch (XunitException ex) + // { + // if (isFilenameCorrect) + // { + // Assert.Contains($"Could not find $(BlazorIcuDataFileName)={fileName}, or when used as a path relative to the runtime pack", ex.Message); + // } + // else + // { + // Assert.Contains("File name in $(BlazorIcuDataFileName) has to start with 'icudt'", ex.Message); + // } + // } + // catch (Exception) + // { + // throw new Exception("Unexpected exception in test scenario."); + // } + // // we expect build error, so there is not point in running the app + // } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task CustomFileNotFromRuntimePackAbsolutePath(string config) - { - string id = $"blz_invalidCustomIcu_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - AddItemsPropertiesToProject( - projectFile, - extraProperties: - $"{IcuTestsBase.CustomIcuPath}"); + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task CustomFileNotFromRuntimePackAbsolutePath(string config) + // { + // string id = $"blz_invalidCustomIcu_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // AddItemsPropertiesToProject( + // projectFile, + // extraProperties: + // $"{IcuTestsBase.CustomIcuPath}"); - (CommandResult res, string logPath) = BlazorBuild( - new BlazorBuildOptions( - id, - config, - WarnAsError: false, - GlobalizationMode: GlobalizationMode.Custom, - CustomIcuFile: IcuTestsBase.CustomIcuPath - )); - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } + // (CommandResult res, string logPath) = BlazorBuild( + // new BuildProjectOptions( + // id, + // config, + // WarnAsError: false, + // GlobalizationMode: GlobalizationMode.Custom, + // CustomIcuFile: IcuTestsBase.CustomIcuPath + // )); + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs index 8d8914ee195f9a..4bdf2ca6111140 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs @@ -19,116 +19,116 @@ public class IcuTests : BlazorWasmTestBase public IcuTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - [Theory] - [InlineData("Debug", false)] - [InlineData("Debug", true)] - [InlineData("Debug", null)] - [InlineData("Release", false)] - [InlineData("Release", true)] - [InlineData("Release", null)] - public async Task HybridWithInvariant(string config, bool? invariant) - { - string id = $"blz_hybrid_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - string extraProperties = "true"; - if (invariant != null) - extraProperties += $"{invariant}"; - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - (CommandResult res, string logPath) = BlazorBuild( - new BlazorBuildOptions( - id, - config, - WarnAsError: false, - GlobalizationMode: invariant == true ? GlobalizationMode.Invariant : GlobalizationMode.Hybrid, - ExpectedFileType: invariant == true ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack - )); - - string warning = "$(HybridGlobalization) has no effect when $(InvariantGlobalization) is set to true."; - if (invariant == true) - { - Assert.Contains(warning, res.Output); - } - else - { - Assert.DoesNotContain(warning, res.Output); - } - - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } - - [Theory] - [InlineData("Debug", false)] - [InlineData("Debug", true)] - [InlineData("Debug", null)] - [InlineData("Release", false)] - [InlineData("Release", true)] - [InlineData("Release", null)] - public async Task HybridWithFullIcuFromRuntimePack(string config, bool? fullIcu) - { - string id = $"blz_hybrid_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - string extraProperties = "true"; - if (fullIcu != null) - extraProperties += $"{fullIcu}"; - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - (CommandResult res, string logPath) = BlazorBuild( - new BlazorBuildOptions( - id, - config, - WarnAsError: false, - GlobalizationMode: GlobalizationMode.Hybrid - )); - - string warning = "$(BlazorWebAssemblyLoadAllGlobalizationData) has no effect when $(HybridGlobalization) is set to true."; - if (fullIcu == true) - { - Assert.Contains(warning, res.Output); - } - else - { - Assert.DoesNotContain(warning, res.Output); - } - - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } - - [Theory] - [InlineData("Debug", false)] - [InlineData("Debug", true)] - [InlineData("Debug", null)] - [InlineData("Release", false)] - [InlineData("Release", true)] - [InlineData("Release", null)] - public async Task FullIcuFromRuntimePackWithInvariant(string config, bool? invariant) - { - string id = $"blz_hybrid_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - string extraProperties = "true"; - if (invariant != null) - extraProperties += $"{invariant}"; - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - (CommandResult res, string logPath) = BlazorBuild( - new BlazorBuildOptions( - id, - config, - WarnAsError: false, - GlobalizationMode: invariant == true ? GlobalizationMode.Invariant : GlobalizationMode.FullIcu, - ExpectedFileType: invariant == true ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack - )); - - string warning = "$(BlazorWebAssemblyLoadAllGlobalizationData) has no effect when $(InvariantGlobalization) is set to true."; - if (invariant == true) - { - Assert.Contains(warning, res.Output); - } - else - { - Assert.DoesNotContain(warning, res.Output); - } - - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } + // [Theory] + // [InlineData("Debug", false)] + // [InlineData("Debug", true)] + // [InlineData("Debug", null)] + // [InlineData("Release", false)] + // [InlineData("Release", true)] + // [InlineData("Release", null)] + // public async Task HybridWithInvariant(string config, bool? invariant) + // { + // string id = $"blz_hybrid_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // string extraProperties = "true"; + // if (invariant != null) + // extraProperties += $"{invariant}"; + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + + // (CommandResult res, string logPath) = BlazorBuild( + // new BuildProjectOptions( + // id, + // config, + // WarnAsError: false, + // GlobalizationMode: invariant == true ? GlobalizationMode.Invariant : GlobalizationMode.Hybrid, + // ExpectedFileType: invariant == true ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack + // )); + + // string warning = "$(HybridGlobalization) has no effect when $(InvariantGlobalization) is set to true."; + // if (invariant == true) + // { + // Assert.Contains(warning, res.Output); + // } + // else + // { + // Assert.DoesNotContain(warning, res.Output); + // } + + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } + + // [Theory] + // [InlineData("Debug", false)] + // [InlineData("Debug", true)] + // [InlineData("Debug", null)] + // [InlineData("Release", false)] + // [InlineData("Release", true)] + // [InlineData("Release", null)] + // public async Task HybridWithFullIcuFromRuntimePack(string config, bool? fullIcu) + // { + // string id = $"blz_hybrid_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // string extraProperties = "true"; + // if (fullIcu != null) + // extraProperties += $"{fullIcu}"; + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + + // (CommandResult res, string logPath) = BlazorBuild( + // new BuildProjectOptions( + // id, + // config, + // WarnAsError: false, + // GlobalizationMode: GlobalizationMode.Hybrid + // )); + + // string warning = "$(BlazorWebAssemblyLoadAllGlobalizationData) has no effect when $(HybridGlobalization) is set to true."; + // if (fullIcu == true) + // { + // Assert.Contains(warning, res.Output); + // } + // else + // { + // Assert.DoesNotContain(warning, res.Output); + // } + + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } + + // [Theory] + // [InlineData("Debug", false)] + // [InlineData("Debug", true)] + // [InlineData("Debug", null)] + // [InlineData("Release", false)] + // [InlineData("Release", true)] + // [InlineData("Release", null)] + // public async Task FullIcuFromRuntimePackWithInvariant(string config, bool? invariant) + // { + // string id = $"blz_hybrid_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // string extraProperties = "true"; + // if (invariant != null) + // extraProperties += $"{invariant}"; + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + + // (CommandResult res, string logPath) = BlazorBuild( + // new BuildProjectOptions( + // id, + // config, + // WarnAsError: false, + // GlobalizationMode: invariant == true ? GlobalizationMode.Invariant : GlobalizationMode.FullIcu, + // ExpectedFileType: invariant == true ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack + // )); + + // string warning = "$(BlazorWebAssemblyLoadAllGlobalizationData) has no effect when $(InvariantGlobalization) is set to true."; + // if (invariant == true) + // { + // Assert.Contains(warning, res.Output); + // } + // else + // { + // Assert.DoesNotContain(warning, res.Output); + // } + + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index 25bd5c7f4d06bf..0785c73c4893b5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -17,62 +17,62 @@ public MiscTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildC _enablePerTestCleanup = true; } - [Theory] - [InlineData("Debug", true)] - [InlineData("Debug", false)] - [InlineData("Release", true)] - [InlineData("Release", false)] - [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] - public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRelink) - { - string id = $"blz_deploy_on_build_{config}_{nativeRelink}_{GetRandomId()}"; - string projectFile = CreateProjectWithNativeReference(id); - string extraProperties = config == "Debug" - ? ("-O1" + - "-O1") - : string.Empty; - if (!nativeRelink) - extraProperties += "true"; - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + // [Theory] + // [InlineData("Debug", true)] + // [InlineData("Debug", false)] + // [InlineData("Release", true)] + // [InlineData("Release", false)] + // [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] + // public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRelink) + // { + // string id = $"blz_deploy_on_build_{config}_{nativeRelink}_{GetRandomId()}"; + // string projectFile = CreateProjectWithNativeReference(id); + // string extraProperties = config == "Debug" + // ? ("-O1" + + // "-O1") + // : string.Empty; + // if (!nativeRelink) + // extraProperties += "true"; + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - // build with -p:DeployOnBuild=true, and that will trigger a publish - (CommandResult res, _) = BlazorBuild(new BlazorBuildOptions( - Id: id, - Config: config, - ExpectedFileType: nativeRelink ? NativeFilesType.Relinked : NativeFilesType.AOT, - ExpectRelinkDirWhenPublishing: false, - IsPublish: false), - "-p:DeployBuild=true"); + // // build with -p:DeployOnBuild=true, and that will trigger a publish + // (CommandResult res, _) = BlazorBuild(new BuildProjectOptions( + // Id: id, + // Configuration: config, + // ExpectedFileType: nativeRelink ? NativeFilesType.Relinked : NativeFilesType.AOT, + // ExpectRelinkDirWhenPublishing: false, + // IsPublish: false), + // "-p:DeployBuild=true"); - // double check relinking! - int index = res.Output.IndexOf("pinvoke.c -> pinvoke.o"); - Assert.NotEqual(-1, index); + // // double check relinking! + // int index = res.Output.IndexOf("pinvoke.c -> pinvoke.o"); + // Assert.NotEqual(-1, index); - // there should be only one instance of this string! - index = res.Output.IndexOf("pinvoke.c -> pinvoke.o", index + 1); - Assert.Equal(-1, index); - } + // // there should be only one instance of this string! + // index = res.Output.IndexOf("pinvoke.c -> pinvoke.o", index + 1); + // Assert.Equal(-1, index); + // } - [Theory] - [InlineData("Release")] - public void DefaultTemplate_AOT_InProjectFile(string config) - { - string id = $"blz_aot_prj_file_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); + // [Theory] + // [InlineData("Release")] + // public void DefaultTemplate_AOT_InProjectFile(string config) + // { + // string id = $"blz_aot_prj_file_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); - string extraProperties = config == "Debug" - ? ("-O1" + - "-O1") - : string.Empty; - AddItemsPropertiesToProject(projectFile, extraProperties: "true" + extraProperties); + // string extraProperties = config == "Debug" + // ? ("-O1" + + // "-O1") + // : string.Empty; + // AddItemsPropertiesToProject(projectFile, extraProperties: "true" + extraProperties); - // No relinking, no AOT - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); + // // No relinking, no AOT + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - // will aot - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true)); + // // will aot + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true)); - // build again - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); - } + // // build again + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index cdd0143cd2f084..24bbdfb2799ea1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -22,146 +22,146 @@ public MiscTests3(ITestOutputHelper output, SharedBuildPerTestClassFixture build _enablePerTestCleanup = true; } - [Theory] - [InlineData("Debug", /*build*/true, /*publish*/false)] - [InlineData("Debug", /*build*/false, /*publish*/true)] - [InlineData("Debug", /*build*/true, /*publish*/true)] - [InlineData("Release", /*build*/true, /*publish*/false)] - [InlineData("Release", /*build*/false, /*publish*/true)] - [InlineData("Release", /*build*/true, /*publish*/true)] - public async Task WithDllImportInMainAssembly(string config, bool build, bool publish) - { - // Based on https://github.com/dotnet/runtime/issues/59255 - string id = $"blz_dllimp_{config}_{s_unicodeChars}"; - if (build && publish) - id += "build_then_publish"; - else if (build) - id += "build"; - else - id += "publish"; - - string projectFile = CreateProjectWithNativeReference(id); - string nativeSource = @" - #include - - extern ""C"" { - int cpp_add(int a, int b) { - return a + b; - } - }"; - - File.WriteAllText(Path.Combine(_projectDir!, "mylib.cpp"), nativeSource); - - string myDllImportCs = @$" - using System.Runtime.InteropServices; - namespace {id}; - - public static class MyDllImports - {{ - [DllImport(""mylib"")] - public static extern int cpp_add(int a, int b); - }}"; - - File.WriteAllText(Path.Combine(_projectDir!, "Pages", "MyDllImport.cs"), myDllImportCs); - - AddItemsPropertiesToProject(projectFile, extraItems: @""); - BlazorAddRazorButton("cpp_add", """ - var result = MyDllImports.cpp_add(10, 12); - outputText = $"{result}"; - """); - - if (build) - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); - - if (publish) - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: build)); - - BlazorRunOptions runOptions = new() { Config = config, Test = TestDllImport }; - if (publish) - await BlazorRunForPublishWithWebServer(runOptions); - else - await BlazorRunForBuildWithDotnetRun(runOptions); - - async Task TestDllImport(IPage page) - { - await page.Locator("text=\"cpp_add\"").ClickAsync(); - var txt = await page.Locator("p[role='test']").InnerHTMLAsync(); - Assert.Equal("Output: 22", txt); - } - } - - [Fact] - public void BugRegression_60479_WithRazorClassLib() - { - string id = $"blz_razor_lib_top_{GetRandomId()}"; - InitBlazorWasmProjectDir(id); - - string wasmProjectDir = Path.Combine(_projectDir!, "wasm"); - string wasmProjectFile = Path.Combine(wasmProjectDir, "wasm.csproj"); - Directory.CreateDirectory(wasmProjectDir); - using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); - cmd.WithWorkingDirectory(wasmProjectDir) - .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - .ExecuteWithCapturedOutput("new blazorwasm") - .EnsureSuccessful(); - - string razorProjectDir = Path.Combine(_projectDir!, "RazorClassLibrary"); - Directory.CreateDirectory(razorProjectDir); - cmd.WithWorkingDirectory(razorProjectDir) - .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - .ExecuteWithCapturedOutput("new razorclasslib") - .EnsureSuccessful(); - - string razorClassLibraryFileNameWithoutExtension = "RazorClassLibrary"; - AddItemsPropertiesToProject(wasmProjectFile, extraItems: @$" - - - "); - - _projectDir = wasmProjectDir; - string config = "Release"; - // No relinking, no AOT - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); - - // will relink - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); - - // publish/wwwroot/_framework/blazor.boot.json - string frameworkDir = FindBlazorBinFrameworkDir(config, forPublish: true); - string bootJson = Path.Combine(frameworkDir, "blazor.boot.json"); - - Assert.True(File.Exists(bootJson), $"Could not find {bootJson}"); - var jdoc = JsonDocument.Parse(File.ReadAllText(bootJson)); - if (!jdoc.RootElement.TryGetProperty("resources", out JsonElement resValue) || - !resValue.TryGetProperty("lazyAssembly", out JsonElement lazyVal)) - { - throw new XunitException($"Could not find resources.lazyAssembly object in {bootJson}"); - } - - Assert.True(lazyVal.EnumerateObject().Select(jp => jp.Name).FirstOrDefault(f => f.StartsWith(razorClassLibraryFileNameWithoutExtension)) != null); - } - - private void BlazorAddRazorButton(string buttonText, string customCode, string methodName = "test", string razorPage = "Pages/Counter.razor") - { - string additionalCode = $$""" -

Output: @outputText

- - - @code { - private string outputText = string.Empty; - public void {{methodName}}() - { - {{customCode}} - } - } - """; - - // find blazor's Counter.razor - string counterRazorPath = Path.Combine(_projectDir!, razorPage); - if (!File.Exists(counterRazorPath)) - throw new FileNotFoundException($"Could not find {counterRazorPath}"); - - string oldContent = File.ReadAllText(counterRazorPath); - File.WriteAllText(counterRazorPath, oldContent + additionalCode); - } + // [Theory] + // [InlineData("Debug", /*build*/true, /*publish*/false)] + // [InlineData("Debug", /*build*/false, /*publish*/true)] + // [InlineData("Debug", /*build*/true, /*publish*/true)] + // [InlineData("Release", /*build*/true, /*publish*/false)] + // [InlineData("Release", /*build*/false, /*publish*/true)] + // [InlineData("Release", /*build*/true, /*publish*/true)] + // public async Task WithDllImportInMainAssembly(string config, bool build, bool publish) + // { + // // Based on https://github.com/dotnet/runtime/issues/59255 + // string id = $"blz_dllimp_{config}_{s_unicodeChars}"; + // if (build && publish) + // id += "build_then_publish"; + // else if (build) + // id += "build"; + // else + // id += "publish"; + + // string projectFile = CreateProjectWithNativeReference(id); + // string nativeSource = @" + // #include + + // extern ""C"" { + // int cpp_add(int a, int b) { + // return a + b; + // } + // }"; + + // File.WriteAllText(Path.Combine(_projectDir!, "mylib.cpp"), nativeSource); + + // string myDllImportCs = @$" + // using System.Runtime.InteropServices; + // namespace {id}; + + // public static class MyDllImports + // {{ + // [DllImport(""mylib"")] + // public static extern int cpp_add(int a, int b); + // }}"; + + // File.WriteAllText(Path.Combine(_projectDir!, "Pages", "MyDllImport.cs"), myDllImportCs); + + // AddItemsPropertiesToProject(projectFile, extraItems: @""); + // BlazorAddRazorButton("cpp_add", """ + // var result = MyDllImports.cpp_add(10, 12); + // outputText = $"{result}"; + // """); + + // if (build) + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); + + // if (publish) + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: build)); + + // RunOptions runOptions = new() { Configuration = config, Test = TestDllImport }; + // if (publish) + // await BlazorRunForPublishWithWebServer(runOptions); + // else + // await BlazorRunForBuildWithDotnetRun(runOptions); + + // async Task TestDllImport(IPage page) + // { + // await page.Locator("text=\"cpp_add\"").ClickAsync(); + // var txt = await page.Locator("p[role='test']").InnerHTMLAsync(); + // Assert.Equal("Output: 22", txt); + // } + // } + + // [Fact] + // public void BugRegression_60479_WithRazorClassLib() + // { + // string id = $"blz_razor_lib_top_{GetRandomId()}"; + // InitBlazorWasmProjectDir(id); + + // string wasmProjectDir = Path.Combine(_projectDir!, "wasm"); + // string wasmProjectFile = Path.Combine(wasmProjectDir, "wasm.csproj"); + // Directory.CreateDirectory(wasmProjectDir); + // using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); + // cmd.WithWorkingDirectory(wasmProjectDir) + // .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + // .ExecuteWithCapturedOutput("new blazorwasm") + // .EnsureSuccessful(); + + // string razorProjectDir = Path.Combine(_projectDir!, "RazorClassLibrary"); + // Directory.CreateDirectory(razorProjectDir); + // cmd.WithWorkingDirectory(razorProjectDir) + // .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + // .ExecuteWithCapturedOutput("new razorclasslib") + // .EnsureSuccessful(); + + // string razorClassLibraryFileNameWithoutExtension = "RazorClassLibrary"; + // AddItemsPropertiesToProject(wasmProjectFile, extraItems: @$" + // + // + // "); + + // _projectDir = wasmProjectDir; + // string config = "Release"; + // // No relinking, no AOT + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + + // // will relink + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); + + // // publish/wwwroot/_framework/blazor.boot.json + // string frameworkDir = GetBlazorBinFrameworkDir(config, forPublish: true); + // string bootJson = Path.Combine(frameworkDir, "blazor.boot.json"); + + // Assert.True(File.Exists(bootJson), $"Could not find {bootJson}"); + // var jdoc = JsonDocument.Parse(File.ReadAllText(bootJson)); + // if (!jdoc.RootElement.TryGetProperty("resources", out JsonElement resValue) || + // !resValue.TryGetProperty("lazyAssembly", out JsonElement lazyVal)) + // { + // throw new XunitException($"Could not find resources.lazyAssembly object in {bootJson}"); + // } + + // Assert.True(lazyVal.EnumerateObject().Select(jp => jp.Name).FirstOrDefault(f => f.StartsWith(razorClassLibraryFileNameWithoutExtension)) != null); + // } + + // private void BlazorAddRazorButton(string buttonText, string customCode, string methodName = "test", string razorPage = "Pages/Counter.razor") + // { + // string additionalCode = $$""" + //

Output: @outputText

+ // + + // @code { + // private string outputText = string.Empty; + // public void {{methodName}}() + // { + // {{customCode}} + // } + // } + // """; + + // // find blazor's Counter.razor + // string counterRazorPath = Path.Combine(_projectDir!, razorPage); + // if (!File.Exists(counterRazorPath)) + // throw new FileNotFoundException($"Could not find {counterRazorPath}"); + + // string oldContent = File.ReadAllText(counterRazorPath); + // File.WriteAllText(counterRazorPath, oldContent + additionalCode); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index fac71883e3f2ae..7327c53e6eda2d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -17,61 +17,61 @@ public NativeTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buil _enablePerTestCleanup = true; } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] - public void WithNativeReference_AOTInProjectFile(string config) - { - string id = $"blz_nativeref_aot_{config}_{GetRandomId()}"; - string projectFile = CreateProjectWithNativeReference(id); - string extraProperties = config == "Debug" - ? ("-O1" + - "-O1") - : string.Empty; - AddItemsPropertiesToProject(projectFile, extraProperties: "true" + extraProperties); + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] + // public void WithNativeReference_AOTInProjectFile(string config) + // { + // string id = $"blz_nativeref_aot_{config}_{GetRandomId()}"; + // string projectFile = CreateProjectWithNativeReference(id); + // string extraProperties = config == "Debug" + // ? ("-O1" + + // "-O1") + // : string.Empty; + // AddItemsPropertiesToProject(projectFile, extraProperties: "true" + extraProperties); - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true)); + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true)); - // will relink - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); - } + // // will relink + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); + // } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] - public void WithNativeReference_AOTOnCommandLine(string config) - { - string id = $"blz_nativeref_aot_{config}_{GetRandomId()}"; - string projectFile = CreateProjectWithNativeReference(id); - string extraProperties = config == "Debug" - ? ("-O1" + - "-O1") - : string.Empty; - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] + // public void WithNativeReference_AOTOnCommandLine(string config) + // { + // string id = $"blz_nativeref_aot_{config}_{GetRandomId()}"; + // string projectFile = CreateProjectWithNativeReference(id); + // string extraProperties = config == "Debug" + // ? ("-O1" + + // "-O1") + // : string.Empty; + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true), "-p:RunAOTCompilation=true"); + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true), "-p:RunAOTCompilation=true"); - // no aot! - BlazorPublish(new BlazorBuildOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); - } + // // no aot! + // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); + // } - [Theory] - [InlineData("Release")] - public void BlazorWasm_CannotAOT_WithNoTrimming(string config) - { - string id = $"blazorwasm_{config}_aot_{GetRandomId()}"; - CreateBlazorWasmTemplateProject(id); - AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), - extraItems: null, - extraProperties: "falsetrue"); + // [Theory] + // [InlineData("Release")] + // public void BlazorWasm_CannotAOT_WithNoTrimming(string config) + // { + // string id = $"blazorwasm_{config}_aot_{GetRandomId()}"; + // CreateBlazorWasmTemplateProject(id); + // AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), + // extraItems: null, + // extraProperties: "falsetrue"); - (CommandResult res, _) = BlazorPublish(new BlazorBuildOptions(id, config, ExpectSuccess: false)); - Assert.Contains("AOT is not supported without IL trimming", res.Output); - } + // (CommandResult res, _) = BlazorPublish(new BuildProjectOptions(id, config, ExpectSuccess: false)); + // Assert.Contains("AOT is not supported without IL trimming", res.Output); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 942d88643df473..5923f5b1f2cbc0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -18,59 +18,59 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi { } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void BlazorNoopRebuild(string config) - { - string id = $"blz_rebuild_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - AddItemsPropertiesToProject(projectFile, extraProperties: "true"); + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void BlazorNoopRebuild(string config) + // { + // string id = $"blz_rebuild_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // AddItemsPropertiesToProject(projectFile, extraProperties: "true"); - string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); + // string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); - File.Move(Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build.binlog"), - Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build-first.binlog")); + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); + // File.Move(Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build.binlog"), + // Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build-first.binlog")); - var pathsDict = _provider.GetFilesTable(true, objDir); - pathsDict.Remove("runtime-icall-table.h"); - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // var pathsDict = _provider.GetFilesTable(true, objDir); + // pathsDict.Remove("runtime-icall-table.h"); + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // build again - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked)); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // // build again + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - _provider.CompareStat(originalStat, newStat, pathsDict.Values); - } + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void BlazorOnlyLinkRebuild(string config) - { - string id = $"blz_relink_{config}_{GetRandomId()}"; - string projectFile = CreateBlazorWasmTemplateProject(id); - AddItemsPropertiesToProject(projectFile, extraProperties: "true"); + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void BlazorOnlyLinkRebuild(string config) + // { + // string id = $"blz_relink_{config}_{GetRandomId()}"; + // string projectFile = CreateBlazorWasmTemplateProject(id); + // AddItemsPropertiesToProject(projectFile, extraProperties: "true"); - string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); + // string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked), "-p:EmccLinkOptimizationFlag=-O2"); - File.Move(Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build.binlog"), - Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build-first.binlog")); + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked), "-p:EmccLinkOptimizationFlag=-O2"); + // File.Move(Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build.binlog"), + // Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build-first.binlog")); - var pathsDict = _provider.GetFilesTable(true, objDir); - pathsDict.Remove("runtime-icall-table.h"); - pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js", "emcc-link.rsp"); + // var pathsDict = _provider.GetFilesTable(true, objDir); + // pathsDict.Remove("runtime-icall-table.h"); + // pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js", "emcc-link.rsp"); - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // build again - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.Relinked), "-p:EmccLinkOptimizationFlag=-O1"); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // // build again + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked), "-p:EmccLinkOptimizationFlag=-O1"); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - _provider.CompareStat(originalStat, newStat, pathsDict.Values); - } + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 556d40d42a40ec..4232398e418910 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -30,67 +30,67 @@ public SimpleMultiThreadedTests(ITestOutputHelper output, SharedBuildPerTestClas // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); // AddItemsPropertiesToProject(projectFile, "true"); - // BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack, RuntimeType: RuntimeType.MultiThreaded)); + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack, RuntimeType: RuntimeType.MultiThreaded)); // // await BlazorRunForBuildWithDotnetRun(config); // await BlazorRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files --web-server-use-cors --web-server-use-cop --web-server-use-https --timeout=15:00:00", - // Path.GetFullPath(Path.Combine(FindBlazorBinFrameworkDir(config, forPublish: false), ".."))); + // Path.GetFullPath(Path.Combine(GetBlazorBinFrameworkDir(config, forPublish: false), ".."))); // } - [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] - [ActiveIssue("https://github.com/dotnet/runtime/issues/100373")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" - // [InlineData("Debug", false)] // ActiveIssue https://github.com/dotnet/runtime/issues/98758 - // [InlineData("Debug", true)] - [InlineData("Release", false)] - // [InlineData("Release", true)] - public async Task BlazorPublishRunTest(string config, bool aot) - { - string id = $"blazor_mt_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - AddItemsPropertiesToProject(projectFile, "true"); - // if (aot) - // AddItemsPropertiesToProject(projectFile, "true"); + // [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] + // [ActiveIssue("https://github.com/dotnet/runtime/issues/100373")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" + // // [InlineData("Debug", false)] // ActiveIssue https://github.com/dotnet/runtime/issues/98758 + // // [InlineData("Debug", true)] + // [InlineData("Release", false)] + // // [InlineData("Release", true)] + // public async Task BlazorPublishRunTest(string config, bool aot) + // { + // string id = $"blazor_mt_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + // AddItemsPropertiesToProject(projectFile, "true"); + // // if (aot) + // // AddItemsPropertiesToProject(projectFile, "true"); - File.WriteAllText( - Path.Combine(Path.GetDirectoryName(projectFile)!, "wwwroot", id + ".lib.module.js"), - """ - export function onRuntimeReady({ runtimeBuildInfo }) { - console.log('Runtime is ready: ' + JSON.stringify(runtimeBuildInfo)); - console.log(`WasmEnableThreads=${runtimeBuildInfo.wasmEnableThreads}`); - } - """ - ); + // File.WriteAllText( + // Path.Combine(Path.GetDirectoryName(projectFile)!, "wwwroot", id + ".lib.module.js"), + // """ + // export function onRuntimeReady({ runtimeBuildInfo }) { + // console.log('Runtime is ready: ' + JSON.stringify(runtimeBuildInfo)); + // console.log(`WasmEnableThreads=${runtimeBuildInfo.wasmEnableThreads}`); + // } + // """ + // ); - BlazorPublish(new BlazorBuildOptions( - id, - config, - aot ? NativeFilesType.AOT - : (config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack), - RuntimeType: RuntimeVariant.MultiThreaded)); + // BlazorPublish(new BuildProjectOptions( + // id, + // config, + // aot ? NativeFilesType.AOT + // : (config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack), + // RuntimeType: RuntimeVariant.MultiThreaded)); - bool hasEmittedWasmEnableThreads = false; - StringBuilder errorOutput = new(); - await BlazorRunForPublishWithWebServer( - runOptions: new BlazorRunOptions( - Config: config, - ExtraArgs: "--web-server-use-cors --web-server-use-cop", - OnConsoleMessage: (_, message) => - { - if (message.Text.Contains("WasmEnableThreads=true")) - hasEmittedWasmEnableThreads = true; + // bool hasEmittedWasmEnableThreads = false; + // StringBuilder errorOutput = new(); + // await BlazorRunForPublishWithWebServer( + // runOptions: new RunOptions( + // Configuration: config, + // ExtraArgs: "--web-server-use-cors --web-server-use-cop", + // OnConsoleMessage: (_, message) => + // { + // if (message.Text.Contains("WasmEnableThreads=true")) + // hasEmittedWasmEnableThreads = true; - if (message.Type == "error") - errorOutput.AppendLine(message.Text); - }, - OnErrorMessage: (message) => - { - errorOutput.AppendLine(message); - })); + // if (message.Type == "error") + // errorOutput.AppendLine(message.Text); + // }, + // OnErrorMessage: (message) => + // { + // errorOutput.AppendLine(message); + // })); - if (errorOutput.Length > 0) - throw new XunitException($"Errors found in browser console output:\n{errorOutput}"); + // if (errorOutput.Length > 0) + // throw new XunitException($"Errors found in browser console output:\n{errorOutput}"); - if (!hasEmittedWasmEnableThreads) - throw new XunitException($"The test didn't emit expected message 'WasmEnableThreads=true'"); - } + // if (!hasEmittedWasmEnableThreads) + // throw new XunitException($"The test didn't emit expected message 'WasmEnableThreads=true'"); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index 433d77699c1c76..2d527502d8d04a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -22,76 +22,76 @@ public SimpleRunTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b _enablePerTestCleanup = true; } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task BlazorBuildRunTest(string config) - { - string id = $"blazor_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task BlazorBuildRunTest(string config) + // { + // string id = $"blazor_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - BlazorBuild(new BlazorBuildOptions(id, config, NativeFilesType.FromRuntimePack)); - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } + // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } - [Theory] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] - public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) - { - string id = $"{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - string projectName = Path.GetFileNameWithoutExtension(projectFile); + // [Theory] + // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] + // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] + // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] + // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] + // public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) + // { + // string id = $"{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); - string extraPropertiesForDBP = ""; - if (appendRID) - extraPropertiesForDBP += "true"; - if (useArtifacts) - extraPropertiesForDBP += "true."; + // string extraPropertiesForDBP = ""; + // if (appendRID) + // extraPropertiesForDBP += "true"; + // if (useArtifacts) + // extraPropertiesForDBP += "true."; - string projectDirectory = Path.GetDirectoryName(projectFile)!; - if (!string.IsNullOrEmpty(extraPropertiesForDBP)) - AddItemsPropertiesToProject(Path.Combine(projectDirectory, "Directory.Build.props"), - extraPropertiesForDBP); + // string projectDirectory = Path.GetDirectoryName(projectFile)!; + // if (!string.IsNullOrEmpty(extraPropertiesForDBP)) + // AddItemsPropertiesToProject(Path.Combine(projectDirectory, "Directory.Build.props"), + // extraPropertiesForDBP); - var buildArgs = new BuildArgs(projectName, config, false, id, null); - buildArgs = ExpandBuildArgs(buildArgs); + // var buildArgs = new ProjectInfo(projectName, config, false, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); - BlazorBuildOptions buildOptions = new(id, config, NativeFilesType.FromRuntimePack); - if (useArtifacts) - { - buildOptions = buildOptions with - { - BinFrameworkDir = Path.Combine(projectDirectory, - "bin", - id, - config.ToLower(), - "wwwroot", - "_framework") - }; - } - BlazorBuild(buildOptions); - await BlazorRunForBuildWithDotnetRun(new BlazorRunOptions() { Config = config }); - } + // BuildProjectOptions buildOptions = new(id, config, NativeFilesType.FromRuntimePack); + // if (useArtifacts) + // { + // buildOptions = buildOptions with + // { + // BinFrameworkDir = Path.Combine(projectDirectory, + // "bin", + // id, + // config.ToLower(), + // "wwwroot", + // "_framework") + // }; + // } + // BlazorBuild(buildOptions); + // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); + // } - [Theory] - [InlineData("Debug", false)] - [InlineData("Release", false)] - [InlineData("Release", true)] - public async Task BlazorPublishRunTest(string config, bool aot) - { - string id = $"blazor_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - if (aot) - AddItemsPropertiesToProject(projectFile, "true"); + // [Theory] + // [InlineData("Debug", false)] + // [InlineData("Release", false)] + // [InlineData("Release", true)] + // public async Task BlazorPublishRunTest(string config, bool aot) + // { + // string id = $"blazor_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + // if (aot) + // AddItemsPropertiesToProject(projectFile, "true"); - BlazorPublish(new BlazorBuildOptions( - id, - config, - aot ? NativeFilesType.AOT - : (config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack))); - await BlazorRunForPublishWithWebServer(new BlazorRunOptions() { Config = config }); - } + // BlazorPublish(new BuildProjectOptions( + // id, + // config, + // aot ? NativeFilesType.AOT + // : (config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack))); + // await BlazorRunForPublishWithWebServer(new RunOptions() { Configuration = config }); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index a735e2af15e444..15c8c5ab1fd3f3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -51,151 +51,151 @@ public static TheoryData SettingDifferentFromValuesInRunti return data; } - [Theory, TestCategory("no-workload")] - [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] - public void WorkloadRequiredForBuild(string config, string extraProperties, bool workloadNeeded) - => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: false); - - [Theory, TestCategory("no-workload")] - [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] - public void WorkloadRequiredForPublish(string config, string extraProperties, bool workloadNeeded) - => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: true); - - public static TheoryData InvariantGlobalizationTestData(bool publish) - { - TheoryData data = new(); - foreach (string config in new[] { "Debug", "Release" }) - { - data.Add(config, /*invariant*/ true, /*publish*/ publish); - data.Add(config, /*invariant*/ false, /*publish*/ publish); - } - return data; - } - - [Theory, TestCategory("no-workload")] - [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] - [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ true)] - public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bool invariant, bool publish) - { - string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - - if (invariant) - AddItemsPropertiesToProject(projectFile, extraProperties: "true"); - - string counterPath = Path.Combine(Path.GetDirectoryName(projectFile)!, "Pages", "Counter.razor"); - string allText = File.ReadAllText(counterPath); - string ccText = "currentCount++;"; - if (allText.IndexOf(ccText) < 0) - throw new Exception("Counter.razor does not have the expected content. Test needs to be updated."); - - allText = allText.Replace(ccText, $"{ccText}{Environment.NewLine}TestInvariantCulture();"); - allText += s_invariantCultureMethodForBlazor; - File.WriteAllText(counterPath, allText); - _testOutput.WriteLine($"Updated counter.razor: {allText}"); - - CommandResult result; - GlobalizationMode mode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; - if (publish) - { - (result, _) = BlazorPublish( - new BlazorBuildOptions( - id, - config, - ExpectSuccess: true, - GlobalizationMode: mode)); - } - else - { - (result, _) = BlazorBuild( - new BlazorBuildOptions( - id, - config, - ExpectSuccess: true, - GlobalizationMode: mode)); - } - - StringBuilder sbOutput = new(); - await BlazorRunTest(new BlazorRunOptions() - { - Config = config, - Host = publish ? BlazorRunHost.WebServer : BlazorRunHost.DotnetRun, - OnConsoleMessage = (_, msg) => - { - sbOutput.AppendLine(msg.Text); - } - }); - - string output = sbOutput.ToString(); - if (invariant) - { - Assert.Contains("Could not create es-ES culture", output); - // For invariant, we get: - // Could not create es-ES culture: Argument_CultureNotSupportedInInvariantMode Arg_ParamName_Name, name - // Argument_CultureInvalidIdentifier, es-ES - // .. which is expected. - // - // Assert.Contains("es-ES is an invalid culture identifier.", output); - Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); - Assert.DoesNotContain($"es-ES: Is-LCID-InvariantCulture:", output); - } - else - { - Assert.DoesNotContain("Could not create es-ES culture", output); - Assert.DoesNotContain("invalid culture", output); - Assert.DoesNotContain("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); - Assert.Contains("es-ES: Is-LCID-InvariantCulture: False", output); - Assert.Contains("NativeName: espa\u00F1ol (Espa\u00F1a)", output); - - // ignoring the last line of the output which prints the current culture - } - } - - private void CheckWorkloadRequired(string config, string extraProperties, bool workloadNeeded, bool publish) - { - string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - AddItemsPropertiesToProject(projectFile, extraProperties, - atTheEnd: @" - - "); - - CommandResult result; - if (publish) - (result, _) = BlazorPublish(new BlazorBuildOptions(id, config, ExpectSuccess: false)); - else - (result, _) = BlazorBuild(new BlazorBuildOptions(id, config, ExpectSuccess: false)); - - if (workloadNeeded) - { - Assert.Contains("following workloads must be installed: wasm-tools", result.Output); - Assert.DoesNotContain("error : Stopping the build", result.Output); - } - else - { - Assert.DoesNotContain("following workloads must be installed: wasm-tools", result.Output); - Assert.Contains("error : Stopping the build", result.Output); - } - } - - private static string s_invariantCultureMethodForBlazor = """ - @code { - public int TestInvariantCulture() - { - // https://github.com/dotnet/runtime/blob/main/docs/design/features/globalization-invariant-mode.md#cultures-and-culture-data - try - { - System.Globalization.CultureInfo culture = new ("es-ES", false); - System.Console.WriteLine($"es-ES: Is-LCID-InvariantCulture: {culture.LCID == System.Globalization.CultureInfo.InvariantCulture.LCID}, NativeName: {culture.NativeName}"); - } - catch (System.Globalization.CultureNotFoundException cnfe) - { - System.Console.WriteLine($"Could not create es-ES culture: {cnfe.Message}"); - } - - System.Console.WriteLine($"CurrentCulture.NativeName: {System.Globalization.CultureInfo.CurrentCulture.NativeName}"); - return 42; - } - } - """; + // [Theory, TestCategory("no-workload")] + // [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] + // public void WorkloadRequiredForBuild(string config, string extraProperties, bool workloadNeeded) + // => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: false); + + // [Theory, TestCategory("no-workload")] + // [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] + // public void WorkloadRequiredForPublish(string config, string extraProperties, bool workloadNeeded) + // => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: true); + + // public static TheoryData InvariantGlobalizationTestData(bool publish) + // { + // TheoryData data = new(); + // foreach (string config in new[] { "Debug", "Release" }) + // { + // data.Add(config, /*invariant*/ true, /*publish*/ publish); + // data.Add(config, /*invariant*/ false, /*publish*/ publish); + // } + // return data; + // } + + // [Theory, TestCategory("no-workload")] + // [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] + // [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ true)] + // public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bool invariant, bool publish) + // { + // string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + + // if (invariant) + // AddItemsPropertiesToProject(projectFile, extraProperties: "true"); + + // string counterPath = Path.Combine(Path.GetDirectoryName(projectFile)!, "Pages", "Counter.razor"); + // string allText = File.ReadAllText(counterPath); + // string ccText = "currentCount++;"; + // if (allText.IndexOf(ccText) < 0) + // throw new Exception("Counter.razor does not have the expected content. Test needs to be updated."); + + // allText = allText.Replace(ccText, $"{ccText}{Environment.NewLine}TestInvariantCulture();"); + // allText += s_invariantCultureMethodForBlazor; + // File.WriteAllText(counterPath, allText); + // _testOutput.WriteLine($"Updated counter.razor: {allText}"); + + // CommandResult result; + // GlobalizationMode mode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; + // if (publish) + // { + // (result, _) = BlazorPublish( + // new BuildProjectOptions( + // id, + // config, + // ExpectSuccess: true, + // GlobalizationMode: mode)); + // } + // else + // { + // (result, _) = BlazorBuild( + // new BuildProjectOptions( + // id, + // config, + // ExpectSuccess: true, + // GlobalizationMode: mode)); + // } + + // StringBuilder sbOutput = new(); + // await BlazorRunTest(new RunOptions() + // { + // Configuration = config, + // Host = publish ? RunHost.WebServer : RunHost.DotnetRun, + // OnConsoleMessage = (_, msg) => + // { + // sbOutput.AppendLine(msg.Text); + // } + // }); + + // string output = sbOutput.ToString(); + // if (invariant) + // { + // Assert.Contains("Could not create es-ES culture", output); + // // For invariant, we get: + // // Could not create es-ES culture: Argument_CultureNotSupportedInInvariantMode Arg_ParamName_Name, name + // // Argument_CultureInvalidIdentifier, es-ES + // // .. which is expected. + // // + // // Assert.Contains("es-ES is an invalid culture identifier.", output); + // Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); + // Assert.DoesNotContain($"es-ES: Is-LCID-InvariantCulture:", output); + // } + // else + // { + // Assert.DoesNotContain("Could not create es-ES culture", output); + // Assert.DoesNotContain("invalid culture", output); + // Assert.DoesNotContain("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); + // Assert.Contains("es-ES: Is-LCID-InvariantCulture: False", output); + // Assert.Contains("NativeName: espa\u00F1ol (Espa\u00F1a)", output); + + // // ignoring the last line of the output which prints the current culture + // } + // } + + // private void CheckWorkloadRequired(string config, string extraProperties, bool workloadNeeded, bool publish) + // { + // string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); + // AddItemsPropertiesToProject(projectFile, extraProperties, + // atTheEnd: @" + // + // "); + + // CommandResult result; + // if (publish) + // (result, _) = BlazorPublish(new BuildProjectOptions(id, config, ExpectSuccess: false)); + // else + // (result, _) = BlazorBuild(new BuildProjectOptions(id, config, ExpectSuccess: false)); + + // if (workloadNeeded) + // { + // Assert.Contains("following workloads must be installed: wasm-tools", result.Output); + // Assert.DoesNotContain("error : Stopping the build", result.Output); + // } + // else + // { + // Assert.DoesNotContain("following workloads must be installed: wasm-tools", result.Output); + // Assert.Contains("error : Stopping the build", result.Output); + // } + // } + + // private static string s_invariantCultureMethodForBlazor = """ + // @code { + // public int TestInvariantCulture() + // { + // // https://github.com/dotnet/runtime/blob/main/docs/design/features/globalization-invariant-mode.md#cultures-and-culture-data + // try + // { + // System.Globalization.CultureInfo culture = new ("es-ES", false); + // System.Console.WriteLine($"es-ES: Is-LCID-InvariantCulture: {culture.LCID == System.Globalization.CultureInfo.InvariantCulture.LCID}, NativeName: {culture.NativeName}"); + // } + // catch (System.Globalization.CultureNotFoundException cnfe) + // { + // System.Console.WriteLine($"Could not create es-ES culture: {cnfe.Message}"); + // } + + // System.Console.WriteLine($"CurrentCulture.NativeName: {System.Globalization.CultureInfo.CurrentCulture.NativeName}"); + // return 42; + // } + // } + // """; } diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs index d0bd02a2289a57..6ba7eb8c410379 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs @@ -1,31 +1,33 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; #nullable enable namespace Wasm.Build.Tests; +// Attention: CreateProject that got remved was "true" by default, +// so each build expects to create the app, +// unless stated otherwise public record BuildProjectOptions ( - Action? InitProject = null, - bool? DotnetWasmFromRuntimePack = null, - GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, - string? CustomIcuFile = null, - bool UseCache = true, - bool ExpectSuccess = true, - bool AssertAppBundle = true, - bool CreateProject = true, - bool Publish = true, - bool BuildOnlyAfterPublish = true, - bool HasV8Script = true, - string? Verbosity = null, - string? Label = null, - string TargetFramework = BuildTestBase.DefaultTargetFramework, - string? MainJS = null, - bool IsBrowserProject = true, - IDictionary? ExtraBuildEnvironmentVariables = null, - string? BinFrameworkDir = null + string Configuration, + string Id, + string BinFrameworkDir, + NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, + string TargetFramework = BuildTestBase.DefaultTargetFramework, + GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, + bool IsPublish = true, + string CustomIcuFile = "", + bool UseCache = true, + bool ExpectSuccess = true, + bool AssertAppBundle = true, + bool BuildOnlyAfterPublish = true, + string Label = "", + bool WarnAsError = true, + RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, + IDictionary? ExtraBuildEnvironmentVariables = null, + string BootConfigFileName = "blazor.boot.json", + bool ExpectRelinkDirWhenPublishing = false ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 31807b6d54bb7b..85613e8a3c90f7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -4,7 +4,7 @@ using System; using System.IO; using System.Linq; -using Wasm.Build.NativeRebuild.Tests; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; @@ -14,7 +14,7 @@ namespace Wasm.Build.Tests { - public class BuildPublishTests : NativeRebuildTestsBase + public class BuildPublishTests : WasmTemplateTestsBase { public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -22,172 +22,157 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur } [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: true, config: "Debug")] - public void Wasm_CannotAOT_InDebug(BuildArgs buildArgs, RunHost _, string id) + [BuildAndRun(config: "Debug", aot: true)] + public void Wasm_CannotAOT_InDebug(string config, bool aot) { - string projectName = GetTestProjectPath(prefix: "no_aot_in_debug", config: buildArgs.Config); - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs); - (string projectDir, string buildOutput) = BuildProject(buildArgs, - id: id, + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "no_aot_in_debug"); + + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: true, - CreateProject: true, - Publish: true, - ExpectSuccess: false + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + ExpectSuccess: false )); - - Console.WriteLine($"buildOutput={buildOutput}"); - Assert.Contains("AOT is not supported in debug configuration", buildOutput); } [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: false, config: "Release")] - [BuildAndRun(host: RunHost.Chrome, aot: false, config: "Debug")] - public void BuildThenPublishNoAOT(BuildArgs buildArgs, RunHost host, string id) + [BuildAndRun(config: "Release")] + [BuildAndRun(config: "Debug")] + public async Task BuildThenPublishNoAOT(string config, bool aot) { - string projectName = GetTestProjectPath(prefix: "build_publish", config: buildArgs.Config); - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs); + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "build_publish"); + + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); - // no relinking for build - bool relinked = false; - BuildProject(buildArgs, - id: id, + bool isPublish = false; + BuildTemplateProject(info, new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: !relinked, - CreateProject: true, - Publish: false + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish )); - Run(); - - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) + if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); - _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); - - // relink by default for Release+publish - relinked = buildArgs.Config == "Release"; - BuildProject(buildArgs, - id: id, + isPublish = true; + BuildTemplateProject(info, new BuildProjectOptions( - DotnetWasmFromRuntimePack: !relinked, - CreateProject: false, - Publish: true, - UseCache: false)); - - Run(); - - void Run() => RunAndTestWasmApp( - buildArgs, buildDir: _projectDir, expectedExitCode: 42, - test: output => {}, - host: host, id: id); + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false + )); + + await RunPublishedBrowserApp(info.Configuration); } [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: true, config: "Release")] - public void BuildThenPublishWithAOT(BuildArgs buildArgs, RunHost host, string id) + [BuildAndRun(config: "Release", aot: true)] + public async Task BuildThenPublishWithAOT(string config, bool aot) { - bool testUnicode = true; - string projectName = GetTestProjectPath( - prefix: "build_publish", config: buildArgs.Config, appendUnicode: testUnicode); - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs); - - // no relinking for build - bool relinked = false; - (_, string output) = BuildProject(buildArgs, - id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: !relinked, - CreateProject: true, - Publish: false, - Label: "first_build")); - - BuildPaths paths = GetBuildPaths(buildArgs); - var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); - - string mainDll = $"{buildArgs.ProjectName}.dll"; - var firstBuildStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "build_publish"); + + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + bool isPublish = false; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + Label: "first_build" + )); + + BuildPaths paths = GetBuildPaths(info, forPublish: isPublish); + IDictionary pathsDict = + GetFilesTable(info, paths, unchanged: false); + + string mainDll = $"{info.ProjectName}.dll"; + var firstBuildStat = StatFiles(pathsDict); Assert.False(firstBuildStat["pinvoke.o"].Exists); Assert.False(firstBuildStat[$"{mainDll}.bc"].Exists); + + CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info, output); - CheckOutputForNativeBuild(expectAOT: false, expectRelinking: relinked, buildArgs, output, testUnicode); - - Run(expectAOT: false); - - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) + if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); - Dictionary publishStat = new(); // relink by default for Release+publish - (_, output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - DotnetWasmFromRuntimePack: false, - CreateProject: false, - Publish: true, - UseCache: false, - Label: "first_publish")); - - publishStat = (Dictionary)_provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + isPublish = true; + (_, output) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false, + Label: "first_publish" + )); + + // publish has different paths ("for-publish", not "for-build") + paths = GetBuildPaths(info, forPublish: isPublish); + pathsDict = GetFilesTable(info, paths, unchanged: false); + IDictionary publishStat = StatFiles(pathsDict); Assert.True(publishStat["pinvoke.o"].Exists); Assert.True(publishStat[$"{mainDll}.bc"].Exists); - CheckOutputForNativeBuild(expectAOT: true, expectRelinking: false, buildArgs, output, testUnicode); - _provider.CompareStat(firstBuildStat, publishStat, pathsDict.Values); - - Run(expectAOT: true); + CheckOutputForNativeBuild(expectAOT: true, expectRelinking: isPublish, info, output); + + // source maps are created for build but not for publish, make sure CompareStat won't expect them in publish: + pathsDict["dotnet.js.map"] = (pathsDict["dotnet.js.map"].fullPath, unchanged: false); + pathsDict["dotnet.runtime.js.map"] = (pathsDict["dotnet.runtime.js.map"].fullPath, unchanged: false); + CompareStat(firstBuildStat, publishStat, pathsDict); + await RunPublishedBrowserApp(info.Configuration); // second build - (_, output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: !relinked, - CreateProject: true, - Publish: false, - Label: "second_build")); - var secondBuildStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - + isPublish = false; + (_, output) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false, + Label: "second_build" + )); + var secondBuildStat = StatFiles(pathsDict); + // no relinking, or AOT - CheckOutputForNativeBuild(expectAOT: false, expectRelinking: false, buildArgs, output, testUnicode); + CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info, output); // no native files changed pathsDict.UpdateTo(unchanged: true); - _provider.CompareStat(publishStat, secondBuildStat, pathsDict.Values); - - void Run(bool expectAOT) => RunAndTestWasmApp( - buildArgs with { AOT = expectAOT }, - buildDir: _projectDir, expectedExitCode: 42, - host: host, id: id); + CompareStat(publishStat, secondBuildStat, pathsDict); } - void CheckOutputForNativeBuild(bool expectAOT, bool expectRelinking, BuildArgs buildArgs, string buildOutput, bool testUnicode) + void CheckOutputForNativeBuild(bool expectAOT, bool expectRelinking, ProjectInfo buildArgs, string buildOutput) { - if (testUnicode) - { - string projectNameCore = buildArgs.ProjectName.Replace(s_unicodeChars, ""); - TestUtils.AssertMatches(@$"{projectNameCore}\S+.dll -> {projectNameCore}\S+.dll.bc", buildOutput, contains: expectAOT); - TestUtils.AssertMatches(@$"{projectNameCore}\S+.dll.bc -> {projectNameCore}\S+.dll.o", buildOutput, contains: expectAOT); - } - else - { - TestUtils.AssertSubstring($"{buildArgs.ProjectName}.dll -> {buildArgs.ProjectName}.dll.bc", buildOutput, contains: expectAOT); - TestUtils.AssertSubstring($"{buildArgs.ProjectName}.dll.bc -> {buildArgs.ProjectName}.dll.o", buildOutput, contains: expectAOT); - } + string projectNameCore = buildArgs.ProjectName.Replace(s_unicodeChars, ""); + TestUtils.AssertMatches(@$"{projectNameCore}\S+.dll -> {projectNameCore}\S+.dll.bc", buildOutput, contains: expectAOT); + TestUtils.AssertMatches(@$"{projectNameCore}\S+.dll.bc -> {projectNameCore}\S+.dll.o", buildOutput, contains: expectAOT); TestUtils.AssertMatches("pinvoke.c -> pinvoke.o", buildOutput, contains: expectRelinking || expectAOT); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index b61f4b13cf9220..b8a69d9880130a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -48,11 +48,10 @@ public abstract class BuildTestBase : IClassFixture skip automatic icu testing with Node // on Linux sharding does not work because we rely on LANG env var to check locale and emcc is overwriting it - protected static RunHost s_hostsForOSLocaleSensitiveTests = RunHost.Chrome; // FIXME: use an envvar to override this protected static int s_defaultPerTestTimeoutMs = s_isWindows ? 30 * 60 * 1000 : 15 * 60 * 1000; public static BuildEnvironment s_buildEnv; @@ -113,41 +112,36 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, _providerOfBaseType = providerBase; } - public static IEnumerable> ConfigWithAOTData(bool aot, string? config = null, string? extraArgs = null) + public static IEnumerable> ConfigWithAOTData(bool aot, string? config = null) { - if (extraArgs == null) - extraArgs = string.Empty; - if (config == null) { return new IEnumerable[] { #if TEST_DEBUG_CONFIG_ALSO // list of each member data - for Debug+@aot - new object?[] { new BuildArgs("placeholder", "Debug", aot, "placeholder", extraArgs) }.AsEnumerable(), + new object?[] { "Debug", aot }.AsEnumerable(), #endif // list of each member data - for Release+@aot - new object?[] { new BuildArgs("placeholder", "Release", aot, "placeholder", extraArgs) }.AsEnumerable() + new object?[] { "Release", aot }.AsEnumerable() }.AsEnumerable(); } else { return new IEnumerable[] { - new object?[] { new BuildArgs("placeholder", config, aot, "placeholder", extraArgs) }.AsEnumerable() + new object?[] { config, aot }.AsEnumerable() }; } } public (CommandResult res, string logPath) BuildProjectWithoutAssert( - string id, - string config, - BuildProjectOptions buildProjectOptions, + BuildProjectOptions buildOptions, params string[] extraArgs) { - string buildType = buildProjectOptions.Publish ? "publish" : "build"; - string logFileSuffix = buildProjectOptions.Label == null ? string.Empty : buildProjectOptions.Label.Replace(' ', '_') + "-"; - string logFilePath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-{logFileSuffix}{buildType}.binlog"); + string buildType = buildOptions.IsPublish ? "publish" : "build"; + string logFileSuffix = buildOptions.Label == null ? string.Empty : buildOptions.Label.Replace(' ', '_') + "-"; + string logFilePath = Path.Combine(s_buildEnv.LogRootPath, buildOptions.Id, $"{buildOptions.Id}-{logFileSuffix}{buildType}.binlog"); _testOutput.WriteLine($"{Environment.NewLine}** -------- {buildType} -------- **{Environment.NewLine}"); _testOutput.WriteLine($"Binlog path: {logFilePath}"); @@ -156,23 +150,23 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, { buildType, $"-bl:{logFilePath}", - $"-p:Configuration={config}", + $"-p:Configuration={buildOptions.Configuration}", "-nr:false" }; commandLineArgs.AddRange(extraArgs); - if (buildProjectOptions.Publish && buildProjectOptions.BuildOnlyAfterPublish) + if (buildOptions.IsPublish && buildOptions.BuildOnlyAfterPublish) commandLineArgs.Append("-p:WasmBuildOnlyAfterPublish=true"); using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) .WithWorkingDirectory(_projectDir!); cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - .WithEnvironmentVariables(buildProjectOptions.ExtraBuildEnvironmentVariables); + .WithEnvironmentVariables(buildOptions.ExtraBuildEnvironmentVariables); if (UseWBTOverridePackTargets && s_buildEnv.IsWorkload) cmd.WithEnvironmentVariable("WBTOverrideRuntimePack", "true"); CommandResult res = cmd.ExecuteWithCapturedOutput(commandLineArgs.ToArray()); - if (buildProjectOptions.ExpectSuccess) + if (buildOptions.ExpectSuccess) res.EnsureSuccessful(); else if (res.ExitCode == 0) throw new XunitException($"Build should have failed, but it didn't. Process exited with exitCode : {res.ExitCode}"); @@ -198,15 +192,19 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, return (res, logFilePath); } - protected bool IsDotnetWasmFromRuntimePack(BuildArgs buildArgs) => - !(buildArgs.AOT || (buildArgs.Config == "Release" && IsUsingWorkloads)); + protected NativeFilesType GetExpectedFileType(ProjectInfo info, bool isPublish=false) => + !isPublish ? + NativeFilesType.FromRuntimePack : + info.AOT ? NativeFilesType.AOT : + (info.Configuration == "Debug" || !IsUsingWorkloads) ? + NativeFilesType.FromRuntimePack : + NativeFilesType.Relinked; - protected string RunAndTestWasmApp(BuildArgs buildArgs, - RunHost host, + protected string RunAndTestWasmApp(ProjectInfo buildArgs, string id, + string frameworkDir, Action? test = null, string? buildDir = null, - string? bundleDir = null, int expectedExitCode = 0, string? args = null, Dictionary? envVars = null, @@ -231,20 +229,18 @@ protected string RunAndTestWasmApp(BuildArgs buildArgs, envVars[kvp.Key] = kvp.Value; } - bundleDir ??= Path.Combine(GetBinDir(baseDir: buildDir, config: buildArgs.Config, targetFramework: targetFramework), "AppBundle"); - IHostRunner hostRunner = GetHostRunnerFromRunHost(host); - if (!hostRunner.CanRunWBT()) - throw new InvalidOperationException("Running tests with V8 on windows isn't supported"); + string bundleDir = Path.Combine(frameworkDir, ".."); + IHostRunner hostRunner = new BrowserHostRunner(); // Use wasm-console.log to get the xharness output for non-browser cases string testCommand = hostRunner.GetTestCommand(); - XHarnessArgsOptions options = new XHarnessArgsOptions(jsRelativePath, environmentLocale, host); + XHarnessArgsOptions options = new(jsRelativePath, environmentLocale); string xharnessArgs = s_isWindows ? hostRunner.GetXharnessArgsWindowsOS(options) : hostRunner.GetXharnessArgsOtherOS(options); bool useWasmConsoleOutput = hostRunner.UseWasmConsoleOutput(); extraXHarnessArgs += " " + xharnessArgs; - string testLogPath = Path.Combine(_logPath, host.ToString()); + string testLogPath = Path.Combine(_logPath, "chrome"); string output = RunWithXHarness( testCommand, testLogPath, @@ -390,38 +386,6 @@ protected void InitProjectDir(string dir, bool addNuGetSourceForLocalPackages = } } - protected const string SimpleProjectTemplate = - @$" - - {DefaultTargetFramework} - browser-wasm - Exe - true - test-main.js - ##EXTRA_PROPERTIES## - - - ##EXTRA_ITEMS## - - ##INSERT_AT_END## - "; - - protected static BuildArgs ExpandBuildArgs(BuildArgs buildArgs, string extraProperties = "", string extraItems = "", string insertAtEnd = "", string projectTemplate = SimpleProjectTemplate) - { - if (buildArgs.AOT) - { - extraProperties = $"{extraProperties}\ntrue"; - extraProperties += $"\n{s_isWindows}\n"; - } - - extraItems += ""; - - string projectContents = projectTemplate - .Replace("##EXTRA_PROPERTIES##", extraProperties) - .Replace("##EXTRA_ITEMS##", extraItems) - .Replace("##INSERT_AT_END##", insertAtEnd); - return buildArgs with { ProjectFileContents = projectContents }; - } protected static string GetNuGetConfigWithLocalPackagesPath(string templatePath, string localNuGetsPath) { @@ -432,19 +396,6 @@ protected static string GetNuGetConfigWithLocalPackagesPath(string templatePath, return contents.Replace(s_nugetInsertionTag, $@""); } - protected string GetBinDir(string config, string targetFramework = DefaultTargetFramework, string? baseDir = null) - { - var dir = baseDir ?? _projectDir; - Assert.NotNull(dir); - return Path.Combine(dir!, "bin", config, targetFramework, "browser-wasm"); - } - - protected string GetObjDir(string config, string targetFramework = DefaultTargetFramework, string? baseDir = null) - { - var dir = baseDir ?? _projectDir; - Assert.NotNull(dir); - return Path.Combine(dir!, "obj", config, targetFramework, "browser-wasm"); - } public static (int exitCode, string buildOutput) RunProcess(string path, ITestOutputHelper _testOutput, @@ -619,14 +570,6 @@ public void Dispose() public static string GetRandomId() => TestUtils.FixupSymbolName(Path.GetRandomFileName()); - internal BuildPaths GetBuildPaths(BuildArgs buildArgs, bool forPublish = true) - { - string objDir = GetObjDir(buildArgs.Config); - string bundleDir = Path.Combine(GetBinDir(baseDir: _projectDir, config: buildArgs.Config), "AppBundle"); - string wasmDir = Path.Combine(objDir, "wasm", forPublish ? "for-publish" : "for-build"); - - return new BuildPaths(wasmDir, objDir, GetBinDir(buildArgs.Config), bundleDir); - } protected static string GetSkiaSharpReferenceItems() => @" @@ -640,21 +583,5 @@ public static int Main() return 42; } }"; - - private static IHostRunner GetHostRunnerFromRunHost(RunHost host) => host switch - { - RunHost.V8 => new V8HostRunner(), - _ => new BrowserHostRunner(), - }; } - - public record BuildArgs(string ProjectName, - string Config, - bool AOT, - string Id, - string? ExtraBuildArgs, - string? ProjectFileContents=null); - public record BuildProduct(string ProjectDir, string LogFile, bool Result, string BuildOutput); - - public enum NativeFilesType { FromRuntimePack, Relinked, AOT }; } diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs new file mode 100644 index 00000000000000..f50432a4be7697 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +using System.IO; + +namespace Wasm.Build.Tests; + +public record AssertBundleOptions( + BuildProjectOptions BuildOptions, + bool ExpectSymbolsFile = true, + bool AssertIcuAssets = true, + bool AssertSymbolsFile = true, + bool ExpectFingerprintOnDotnetJs = false + ) +{ + public bool DotnetWasmFromRuntimePack => BuildOptions.ExpectedFileType == NativeFilesType.FromRuntimePack; + public bool AOT => BuildOptions.ExpectedFileType == NativeFilesType.AOT; + public string BundleDir => Path.Combine(BuildOptions.BinFrameworkDir, ".."); +} diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptionsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptionsBase.cs deleted file mode 100644 index bf5301a53c7628..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptionsBase.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -using System.IO; - -namespace Wasm.Build.Tests; - -public abstract record AssertBundleOptionsBase( - string Config, - bool IsPublish, - string TargetFramework, - string BinFrameworkDir, - string? CustomIcuFile, - string BundleDirName = "wwwroot", - GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, - string BootJsonFileName = "blazor.boot.json", - NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, - RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, - bool ExpectFingerprintOnDotnetJs = false, - bool ExpectSymbolsFile = true, - bool AssertIcuAssets = true, - bool AssertSymbolsFile = true) -{ - public bool DotnetWasmFromRuntimePack => ExpectedFileType == NativeFilesType.FromRuntimePack; - public bool AOT => ExpectedFileType == NativeFilesType.AOT; - public string BundleDir => Path.Combine(BinFrameworkDir, ".."); -} diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertTestMainJsAppBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertTestMainJsAppBundleOptions.cs deleted file mode 100644 index 2924281dbdc433..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Common/AssertTestMainJsAppBundleOptions.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -namespace Wasm.Build.Tests; - -public record AssertTestMainJsAppBundleOptions( - string Config, - bool IsPublish, - string TargetFramework, - string BinFrameworkDir, - string? CustomIcuFile, - string ProjectName, - string MainJS, - GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, - string BootJsonFileName = "blazor.boot.json", - NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, - RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, - bool ExpectFingerprintOnDotnetJs = false, - bool ExpectSymbolsFile = true, - bool AssertIcuAssets = true, - bool AssertSymbolsFile = true, - bool HasV8Script = false, - bool IsBrowserProject = true) - : AssertWasmSdkBundleOptions( - Config: Config, - IsPublish: IsPublish, - TargetFramework: TargetFramework, - BinFrameworkDir: BinFrameworkDir, - CustomIcuFile: CustomIcuFile, - GlobalizationMode: GlobalizationMode, - ExpectedFileType: ExpectedFileType, - RuntimeType: RuntimeType, - BootConfigFileName: BootJsonFileName, - ExpectFingerprintOnDotnetJs: ExpectFingerprintOnDotnetJs, - ExpectSymbolsFile: ExpectSymbolsFile, - AssertIcuAssets: AssertIcuAssets, - AssertSymbolsFile: AssertSymbolsFile) -{ -} diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertWasmSdkBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertWasmSdkBundleOptions.cs deleted file mode 100644 index e489c41f7b15d5..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Common/AssertWasmSdkBundleOptions.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -namespace Wasm.Build.Tests; - -// Identical to AssertBundleOptionsBase currently -public record AssertWasmSdkBundleOptions( - string Config, - bool IsPublish, - string TargetFramework, - string BinFrameworkDir, - string? CustomIcuFile, - GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, - string BootConfigFileName = "blazor.boot.json", - NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, - RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, - bool ExpectFingerprintOnDotnetJs = false, - bool ExpectSymbolsFile = true, - bool AssertIcuAssets = true, - bool AssertSymbolsFile = true) - : AssertBundleOptionsBase( - Config: Config, - IsPublish: IsPublish, - TargetFramework: TargetFramework, - BinFrameworkDir: BinFrameworkDir, - CustomIcuFile: CustomIcuFile, - GlobalizationMode: GlobalizationMode, - ExpectedFileType: ExpectedFileType, - RuntimeType: RuntimeType, - BootJsonFileName: BootConfigFileName, - ExpectFingerprintOnDotnetJs: ExpectFingerprintOnDotnetJs, - ExpectSymbolsFile: ExpectSymbolsFile, - AssertIcuAssets: AssertIcuAssets, - AssertSymbolsFile: AssertSymbolsFile) -{} diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs index 3ba21e075ce4a8..4ea7785758258b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs @@ -14,7 +14,7 @@ namespace Wasm.Build.Tests /// /// Example usage: /// [BuildAndRun(aot: true, parameters: new object[] { arg1, arg2 })] - /// public void Test(BuildArgs, arg1, arg2, RunHost, id) + /// public void Test(ProjectInfo, arg1, arg2, RunHost, id) /// [DataDiscoverer("Xunit.Sdk.DataDiscoverer", "xunit.core")] [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] @@ -22,23 +22,10 @@ public class BuildAndRunAttribute : DataAttribute { private readonly IEnumerable _data; - public BuildAndRunAttribute(BuildArgs buildArgs, RunHost host = RunHost.All, params object?[] parameters) - { - _data = new IEnumerable[] - { - new object?[] { buildArgs }.AsEnumerable(), - } - .AsEnumerable() - .Multiply(parameters) - .WithRunHosts(host) - .UnwrapItemsAsArrays().ToList(); - } - - public BuildAndRunAttribute(bool aot=false, RunHost host = RunHost.All, string? config=null, params object?[] parameters) + public BuildAndRunAttribute(bool aot=false, string? config=null, params object?[] parameters) { _data = BuildTestBase.ConfigWithAOTData(aot, config) .Multiply(parameters) - .WithRunHosts(host) .UnwrapItemsAsArrays().ToList(); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildPaths.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildPaths.cs index 1affeed9a37bb8..3f08f890eb383d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/BuildPaths.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildPaths.cs @@ -4,4 +4,4 @@ #nullable enable namespace Wasm.Build.Tests; -public record BuildPaths(string ObjWasmDir, string ObjDir, string BinDir, string BundleDir); +public record BuildPaths(string ObjWasmDir, string ObjDir, string BinDir, string BinFrameworkDir); diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildProduct.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildProduct.cs new file mode 100644 index 00000000000000..874e76ee5e0412 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildProduct.cs @@ -0,0 +1,13 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +namespace Wasm.Build.Tests; + +public record BuildProduct( + string ProjectDir, + string LogFile, + bool Result, + string BuildOutput +); diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/HelperExtensions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/HelperExtensions.cs index 35023c6174c2f9..130ddd5e81c4e8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/HelperExtensions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/HelperExtensions.cs @@ -61,49 +61,6 @@ public static class HelperExtensions public static IEnumerable> MultiplyWithSingleArgs(this IEnumerable> data, params object?[] arrayOfArgs) => data.SelectMany(row => arrayOfArgs.Select(argCol => row.Concat(new[] { argCol }))); - public static object?[] Enumerate(this RunHost host) - { - if (host == RunHost.None) - return Array.Empty(); - - var list = new List(); - foreach (var value in Enum.GetValues()) - { - if (value == RunHost.None) - continue; - - if (value == RunHost.V8 && OperatingSystem.IsWindows()) - { - // Don't run tests with V8 on windows - continue; - } - - // Ignore any combos like RunHost.All from Enum.GetValues - // by ignoring any @value that has more than 1 bit set - if (((int)value & ((int)value - 1)) != 0) - continue; - - if ((host & value) == value) - list.Add(value); - } - return list.ToArray(); - } - - public static IEnumerable> WithRunHosts(this IEnumerable> data, RunHost hosts) - { - IEnumerable hostsEnumerable = hosts.Enumerate(); - if (hosts == RunHost.None) - return data.Select(d => d.Append((object?) BuildTestBase.GetRandomId())); - - return data.SelectMany(d => - { - string runId = BuildTestBase.GetRandomId(); - return hostsEnumerable.Select(o => - d.Append((object?)o) - .Append((object?)runId)); - }); - } - public static void UpdateTo(this IDictionary dict, bool unchanged, params string[] filenames) { IEnumerable keys = filenames.Length == 0 ? dict.Keys.ToList() : filenames; diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/NativeFilesType.cs b/src/mono/wasm/Wasm.Build.Tests/Common/NativeFilesType.cs new file mode 100644 index 00000000000000..97095049741999 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/NativeFilesType.cs @@ -0,0 +1,9 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +namespace Wasm.Build.Tests; + +public enum NativeFilesType { FromRuntimePack, Relinked, AOT }; + diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs b/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs new file mode 100644 index 00000000000000..a2b7b04776e3a0 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs @@ -0,0 +1,13 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +namespace Wasm.Build.Tests; + +public record ProjectInfo( + string Configuration, + bool AOT, + string ProjectName, + string ProjectFilePath +); diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/RunHost.cs b/src/mono/wasm/Wasm.Build.Tests/Common/RunHost.cs deleted file mode 100644 index 0aa1ae14ea8120..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Common/RunHost.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; - -namespace Wasm.Build.Tests -{ - [Flags] - public enum RunHost - { - None = 0, - V8 = 1, - Chrome = 2, - Safari = 4, - Firefox = 8, - - All = V8 | Chrome//| Firefox//Safari - } -} diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/RunOptions.cs similarity index 64% rename from src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs rename to src/mono/wasm/Wasm.Build.Tests/Common/RunOptions.cs index c0e2a2e60cce0d..10cc3a10961c0c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/RunOptions.cs @@ -8,21 +8,24 @@ #nullable enable -namespace Wasm.Build.Tests.Blazor; -public record BlazorRunOptions +namespace Wasm.Build.Tests; +public record RunOptions ( - BlazorRunHost Host = BlazorRunHost.DotnetRun, + string Configuration, + RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, bool CheckCounter = true, Dictionary? ServerEnvironment = null, Func? Test = null, + string? TestScenario = null, + Dictionary? BrowserQueryString = null, Action? OnConsoleMessage = null, Action? OnServerMessage = null, Action? OnErrorMessage = null, - string Config = "Debug", - string? ExtraArgs = null, + string ExtraArgs = "", string BrowserPath = "", - string QueryString = "" + string QueryString = "", + int? ExpectedExitCode = 0 ); -public enum BlazorRunHost { DotnetRun, WebServer }; +public enum RunHost { DotnetRun, WebServer }; diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/RunResult.cs b/src/mono/wasm/Wasm.Build.Tests/Common/RunResult.cs new file mode 100644 index 00000000000000..b947d92143836e --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/RunResult.cs @@ -0,0 +1,13 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; + +namespace Wasm.Build.Tests; + +public record RunResult( + int ExitCode, + IReadOnlyCollection TestOutput, + IReadOnlyCollection ConsoleOutput, + IReadOnlyCollection ServerOutput +); \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs b/src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs index 019391f3efaade..413343bb05266c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs @@ -13,9 +13,9 @@ namespace Wasm.Build.Tests { public class SharedBuildPerTestClassFixture : IDisposable { - public Dictionary _buildPaths = new(); + public Dictionary _buildPaths = new(); - public void CacheBuild(BuildArgs buildArgs, BuildProduct product) + public void CacheBuild(ProjectInfo buildArgs, BuildProduct product) { if (product == null) throw new ArgumentNullException(nameof(product)); @@ -26,7 +26,7 @@ public void CacheBuild(BuildArgs buildArgs, BuildProduct product) public void RemoveFromCache(string buildPath, bool keepDir=true) { - BuildArgs? foundBuildArgs = _buildPaths.Where(kvp => kvp.Value.ProjectDir == buildPath).Select(kvp => kvp.Key).SingleOrDefault(); + ProjectInfo? foundBuildArgs = _buildPaths.Where(kvp => kvp.Value.ProjectDir == buildPath).Select(kvp => kvp.Key).SingleOrDefault(); if (foundBuildArgs is not null) _buildPaths.Remove(foundBuildArgs); @@ -34,7 +34,7 @@ public void RemoveFromCache(string buildPath, bool keepDir=true) RemoveDirectory(buildPath); } - public bool TryGetBuildFor(BuildArgs buildArgs, [NotNullWhen(true)] out BuildProduct? product) + public bool TryGetBuildFor(ProjectInfo buildArgs, [NotNullWhen(true)] out BuildProduct? product) => _buildPaths.TryGetValue(buildArgs, out product); public void Dispose() diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs b/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs new file mode 100644 index 00000000000000..ac9970a5fe5567 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +namespace Wasm.Build.Tests; + +public enum Template +{ + BlazorWasm, + WasmBrowser +} diff --git a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs index e971485b91ef44..233bac1334ee4c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs @@ -9,29 +9,13 @@ namespace Wasm.Build.Tests; -public class ConfigSrcTests : TestMainJsTestBase +public class ConfigSrcTests : WasmTemplateTestsBase { 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)] - 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: IsDotnetWasmFromRuntimePack(buildArgs))); - - string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); - string bundleDir = Path.Combine(binDir, "AppBundle"); - string configSrc = Path.GetFullPath(Path.Combine(bundleDir, "_framework", "blazor.boot.json")); - - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, extraXHarnessMonoArgs: $"--config-src=\"{configSrc}\""); - } + // INFO FOR REVIWER: + // This class can be deleted and will be after your approval. Justification: + // It is testing the --config-src argument, which was supposed to be passed to test-main.js + // but does not make sense in the current form of testing where we are using "dotnet new" templates } diff --git a/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs index 8fc90b9376ec59..2b6aaf3570faf7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs @@ -22,104 +22,102 @@ public DebugLevelTests(ITestOutputHelper output, SharedBuildPerTestClassFixture { } - private void AssertDebugLevel(string result, int value) - => Assert.Contains($"WasmDebugLevel: {value}", result); - - private BuildProjectOptions GetProjectOptions(bool isPublish = false) => - new BuildProjectOptions( - DotnetWasmFromRuntimePack: !isPublish, - CreateProject: false, - MainJS: "main.js", - HasV8Script: false, - Publish: isPublish, - AssertAppBundle: false, - UseCache: false - ); - - private string BuildPublishProject(string projectName, string config, bool isPublish = false, params string[] extraArgs) - { - var buildArgs = new BuildArgs(projectName, config, false, projectName, null); - buildArgs = ExpandBuildArgs(buildArgs); - (string _, string output) = BuildTemplateProject(buildArgs, - buildArgs.Id, - GetProjectOptions(isPublish), - extraArgs: extraArgs - ); - return output; - } - - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task BuildWithDefaultLevel(string configuration) - { - string testAssetName = "WasmBasicTestApp"; - string projectFile = $"{testAssetName}.csproj"; - CopyTestAsset(testAssetName, $"DebugLevelTests_BuildWithDefaultLevel_{configuration}", "App"); - BuildPublishProject(projectFile, configuration); - - string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); - AssertDebugLevel(result, -1); - } - - [Theory] - [InlineData("Debug", 1)] - [InlineData("Release", 1)] - [InlineData("Debug", 0)] - [InlineData("Release", 0)] - public async Task BuildWithExplicitValue(string configuration, int debugLevel) - { - string testAssetName = "WasmBasicTestApp"; - string projectFile = $"{testAssetName}.csproj"; - CopyTestAsset(testAssetName, $"DebugLevelTests_BuildWithExplicitValue_{configuration}", "App"); - BuildPublishProject(projectFile, configuration, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); - - string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); - AssertDebugLevel(result, debugLevel); - } - - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task PublishWithDefaultLevel(string configuration) - { - string testAssetName = "WasmBasicTestApp"; - string projectFile = $"{testAssetName}.csproj"; - CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithDefaultLevel_{configuration}", "App"); - BuildPublishProject(projectFile, configuration, isPublish: true); - - string result = await RunPublishedBrowserApp(configuration, testScenario: "DebugLevelTest"); - AssertDebugLevel(result, 0); - } - - [Theory] - [InlineData("Debug", 1)] - [InlineData("Release", 1)] - [InlineData("Debug", -1)] - [InlineData("Release", -1)] - public async Task PublishWithExplicitValue(string configuration, int debugLevel) - { - string testAssetName = "WasmBasicTestApp"; - string projectFile = $"{testAssetName}.csproj"; - CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithExplicitValue_{configuration}", "App"); - BuildPublishProject(projectFile, configuration, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); - - string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); - AssertDebugLevel(result, debugLevel); - } + // private void AssertDebugLevel(string result, int value) + // => Assert.Contains($"WasmDebugLevel: {value}", result); + + // private BuildProjectOptions GetProjectOptions(bool isPublish = false) => + // new BuildProjectOptions( + // DotnetWasmFromRuntimePack: !isPublish, + // CreateProject: false, + // Publish: isPublish, + // AssertAppBundle: false, + // UseCache: false + // ); + + // private string BuildPublishProject(string projectName, string config, bool isPublish = false, params string[] extraArgs) + // { + // var buildArgs = new ProjectInfo(projectName, config, false, projectName, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // (string _, string output) = BuildTemplateProject(buildArgs, + // buildArgs.Id, + // GetProjectOptions(isPublish), + // extraArgs: extraArgs + // ); + // return output; + // } + + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task BuildWithDefaultLevel(string configuration) + // { + // string testAssetName = "WasmBasicTestApp"; + // string projectFile = $"{testAssetName}.csproj"; + // CopyTestAsset(testAssetName, $"DebugLevelTests_BuildWithDefaultLevel_{configuration}", "App"); + // BuildPublishProject(projectFile, configuration); + + // string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); + // AssertDebugLevel(result, -1); + // } + + // [Theory] + // [InlineData("Debug", 1)] + // [InlineData("Release", 1)] + // [InlineData("Debug", 0)] + // [InlineData("Release", 0)] + // public async Task BuildWithExplicitValue(string configuration, int debugLevel) + // { + // string testAssetName = "WasmBasicTestApp"; + // string projectFile = $"{testAssetName}.csproj"; + // CopyTestAsset(testAssetName, $"DebugLevelTests_BuildWithExplicitValue_{configuration}", "App"); + // BuildPublishProject(projectFile, configuration, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); + + // string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); + // AssertDebugLevel(result, debugLevel); + // } + + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task PublishWithDefaultLevel(string configuration) + // { + // string testAssetName = "WasmBasicTestApp"; + // string projectFile = $"{testAssetName}.csproj"; + // CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithDefaultLevel_{configuration}", "App"); + // BuildPublishProject(projectFile, configuration, isPublish: true); + + // string result = await RunPublishedBrowserApp(configuration, testScenario: "DebugLevelTest"); + // AssertDebugLevel(result, 0); + // } + + // [Theory] + // [InlineData("Debug", 1)] + // [InlineData("Release", 1)] + // [InlineData("Debug", -1)] + // [InlineData("Release", -1)] + // public async Task PublishWithExplicitValue(string configuration, int debugLevel) + // { + // string testAssetName = "WasmBasicTestApp"; + // string projectFile = $"{testAssetName}.csproj"; + // CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithExplicitValue_{configuration}", "App"); + // BuildPublishProject(projectFile, configuration, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); + + // string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); + // AssertDebugLevel(result, debugLevel); + // } - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task PublishWithDefaultLevelAndPdbs(string configuration) - { - string testAssetName = "WasmBasicTestApp"; - string projectFile = $"{testAssetName}.csproj"; - CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithDefaultLevelAndPdbs_{configuration}", "App"); - BuildPublishProject(projectFile, configuration, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); - - var result = await RunPublishedBrowserApp(configuration, testScenario: "DebugLevelTest"); - AssertDebugLevel(result, -1); - } + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task PublishWithDefaultLevelAndPdbs(string configuration) + // { + // string testAssetName = "WasmBasicTestApp"; + // string projectFile = $"{testAssetName}.csproj"; + // CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithDefaultLevelAndPdbs_{configuration}", "App"); + // BuildPublishProject(projectFile, configuration, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); + + // var result = await RunPublishedBrowserApp(configuration, testScenario: "DebugLevelTest"); + // AssertDebugLevel(result, -1); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs b/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs index a27e9be8929082..228840b0d83046 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs @@ -34,8 +34,7 @@ private static string BinaryPathArg public string GetTestCommand() => "wasm test-browser"; - public string GetXharnessArgsWindowsOS(XHarnessArgsOptions options) => $"-v trace -b {options.host} --browser-arg=--lang={options.environmentLocale} --web-server-use-cop {BinaryPathArg}"; // Windows: chrome.exe --lang=locale - public string GetXharnessArgsOtherOS(XHarnessArgsOptions options) => $"-v trace -b {options.host} --locale={options.environmentLocale} --web-server-use-cop {BinaryPathArg}"; // Linux: LANGUAGE=locale ./chrome + public string GetXharnessArgsWindowsOS(XHarnessArgsOptions options) => $"-v trace -b Chrome --browser-arg=--lang={options.environmentLocale} --web-server-use-cop {BinaryPathArg}"; // Windows: chrome.exe --lang=locale + public string GetXharnessArgsOtherOS(XHarnessArgsOptions options) => $"-v trace -b Chrome --locale={options.environmentLocale} --web-server-use-cop {BinaryPathArg}"; // Linux: LANGUAGE=locale ./chrome public bool UseWasmConsoleOutput() => false; - public bool CanRunWBT() => true; } diff --git a/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs b/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs index 9e41c5fa76616a..20dfab3eebc6e8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs @@ -5,7 +5,7 @@ namespace Wasm.Build.Tests; -public record XHarnessArgsOptions(string jsRelativePath, string environmentLocale, RunHost host); +public record XHarnessArgsOptions(string jsRelativePath, string environmentLocale); interface IHostRunner { @@ -13,5 +13,4 @@ interface IHostRunner string GetXharnessArgsWindowsOS(XHarnessArgsOptions options); string GetXharnessArgsOtherOS(XHarnessArgsOptions options); bool UseWasmConsoleOutput(); - bool CanRunWBT(); } diff --git a/src/mono/wasm/Wasm.Build.Tests/HostRunner/V8HostRunner.cs b/src/mono/wasm/Wasm.Build.Tests/HostRunner/V8HostRunner.cs deleted file mode 100644 index 4153a7326c441d..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/HostRunner/V8HostRunner.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -namespace Wasm.Build.Tests; - -using System; -using System.IO; -using System.Runtime.InteropServices; - -public class V8HostRunner : IHostRunner -{ - private static string? s_binaryPathArg; - private static string BinaryPathArg - { - get - { - if (s_binaryPathArg is null) - { - if (!string.IsNullOrEmpty(EnvironmentVariables.V8PathForTests)) - { - if (!File.Exists(EnvironmentVariables.V8PathForTests)) - throw new Exception($"Cannot find V8_PATH_FOR_TESTS={EnvironmentVariables.V8PathForTests}"); - s_binaryPathArg += $" --js-engine-path=\"{EnvironmentVariables.V8PathForTests}\""; - } - else - { - s_binaryPathArg = ""; - } - } - return s_binaryPathArg; - } - } - - private string GetXharnessArgs(string jsRelativePath) => $"--js-file={jsRelativePath} --engine=V8 -v trace --engine-arg=--module {BinaryPathArg}"; - - public string GetTestCommand() => "wasm test"; - public string GetXharnessArgsWindowsOS(XHarnessArgsOptions options) => GetXharnessArgs(options.jsRelativePath); - public string GetXharnessArgsOtherOS(XHarnessArgsOptions options) => GetXharnessArgs(options.jsRelativePath); - public bool UseWasmConsoleOutput() => true; - public bool CanRunWBT() => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); -} diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 8d1a861dc213cc..b10a8350aa6e89 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -17,46 +17,44 @@ public HybridGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestClas { } - public static IEnumerable HybridGlobalizationTestData(bool aot, RunHost host) - => ConfigWithAOTData(aot) - .WithRunHosts(host) - .UnwrapItemsAsArrays(); - - [Theory] - [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void AOT_HybridGlobalizationTests(BuildArgs buildArgs, RunHost host, string id) - => TestHybridGlobalizationTests(buildArgs, host, id); - - [Theory] - [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void RelinkingWithoutAOT(BuildArgs buildArgs, RunHost host, string id) - => TestHybridGlobalizationTests(buildArgs, host, id, - extraProperties: "true", - dotnetWasmFromRuntimePack: false); - - private void TestHybridGlobalizationTests(BuildArgs buildArgs, RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) - { - string projectName = $"hybrid"; - extraProperties = $"{extraProperties}true"; - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - - if (dotnetWasmFromRuntimePack == null) - dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - - string programText = File.ReadAllText(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - GlobalizationMode: GlobalizationMode.Hybrid)); - - string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); - Assert.Contains("HybridGlobalization works, thrown exception as expected", output); - } + public static IEnumerable HybridGlobalizationTestData(bool aot) + => ConfigWithAOTData(aot).UnwrapItemsAsArrays(); + + // [Theory] + // [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void AOT_HybridGlobalizationTests(ProjectInfo buildArgs, RunHost host, string id) + // => TestHybridGlobalizationTests(buildArgs, host, id); + + // [Theory] + // [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void RelinkingWithoutAOT(ProjectInfo buildArgs, RunHost host, string id) + // => TestHybridGlobalizationTests(buildArgs, host, id, + // extraProperties: "true", + // dotnetWasmFromRuntimePack: false); + + // private void TestHybridGlobalizationTests(ProjectInfo buildArgs, RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) + // { + // string projectName = $"hybrid"; + // extraProperties = $"{extraProperties}true"; + + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); + + // if (dotnetWasmFromRuntimePack == null) + // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + + // string programText = File.ReadAllText(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, + // GlobalizationMode: GlobalizationMode.Hybrid)); + + // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("HybridGlobalization works, thrown exception as expected", output); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs index 02abd96db46c21..d6ea740a20faf9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs @@ -19,34 +19,34 @@ public class IcuShardingTests : IcuTestsBase public IcuShardingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - public static IEnumerable IcuExpectedAndMissingCustomShardTestData(string config) => - from templateType in templateTypes - from aot in boolOptions - from onlyPredefinedCultures in boolOptions - // isOnlyPredefinedCultures = true fails with wasmbrowser: https://github.com/dotnet/runtime/issues/108272 - where !(onlyPredefinedCultures && templateType == "wasmbrowser") - select new object[] { config, templateType, aot, CustomIcuPath, s_customIcuTestedLocales, onlyPredefinedCultures }; - - public static IEnumerable IcuExpectedAndMissingAutomaticShardTestData(string config) - { - var locales = new Dictionary - { - { "fr-FR", GetEfigsTestedLocales(SundayNames.French) }, - { "ja-JP", GetCjkTestedLocales(SundayNames.Japanese) }, - { "sk-SK", GetNocjkTestedLocales(SundayNames.Slovak) } - }; - return from aot in boolOptions - from locale in locales - select new object[] { config, "wasmbrowser", aot, locale.Key, locale.Value }; - } - - [Theory] - [MemberData(nameof(IcuExpectedAndMissingCustomShardTestData), parameters: new object[] { "Release" })] - public async Task CustomIcuShard(string config, string templateType, bool aot, string customIcuPath, string customLocales, bool onlyPredefinedCultures) => - await TestIcuShards(config, templateType, aot, customIcuPath, customLocales, GlobalizationMode.Custom, onlyPredefinedCultures); - - [Theory] - [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { "Release" })] - public async Task AutomaticShardSelectionDependingOnEnvLocale(string config, string templateType, bool aot, string environmentLocale, string testedLocales) => - await BuildAndRunIcuTest(config, templateType, aot, testedLocales, GlobalizationMode.Sharded, language: environmentLocale); +// public static IEnumerable IcuExpectedAndMissingCustomShardTestData(string config) => +// from templateType in templateTypes +// from aot in boolOptions +// from onlyPredefinedCultures in boolOptions +// // isOnlyPredefinedCultures = true fails with wasmbrowser: https://github.com/dotnet/runtime/issues/108272 +// where !(onlyPredefinedCultures && templateType == "wasmbrowser") +// select new object[] { config, templateType, aot, CustomIcuPath, s_customIcuTestedLocales, onlyPredefinedCultures }; + +// public static IEnumerable IcuExpectedAndMissingAutomaticShardTestData(string config) +// { +// var locales = new Dictionary +// { +// { "fr-FR", GetEfigsTestedLocales(SundayNames.French) }, +// { "ja-JP", GetCjkTestedLocales(SundayNames.Japanese) }, +// { "sk-SK", GetNocjkTestedLocales(SundayNames.Slovak) } +// }; +// return from aot in boolOptions +// from locale in locales +// select new object[] { config, "wasmbrowser", aot, locale.Key, locale.Value }; +// } + +// [Theory] +// [MemberData(nameof(IcuExpectedAndMissingCustomShardTestData), parameters: new object[] { "Release" })] +// public async Task CustomIcuShard(string config, string templateType, bool aot, string customIcuPath, string customLocales, bool onlyPredefinedCultures) => +// await TestIcuShards(config, templateType, aot, customIcuPath, customLocales, GlobalizationMode.Custom, onlyPredefinedCultures); + +// [Theory] +// [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { "Release" })] +// public async Task AutomaticShardSelectionDependingOnEnvLocale(string config, string templateType, bool aot, string environmentLocale, string testedLocales) => +// await BuildAndRunIcuTest(config, templateType, aot, testedLocales, GlobalizationMode.Sharded, language: environmentLocale); } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs index 8f7e8ad459332a..4afc09b29c3afd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs @@ -37,8 +37,8 @@ from locale in locales select new object[] { config, templateType, aot, locale.Key, locale.Value }; } - [Theory] - [MemberData(nameof(IcuExpectedAndMissingShardFromRuntimePackTestData), parameters: new object[] { "Release" })] - public async Task DefaultAvailableIcuShardsFromRuntimePack(string config, string templateType, bool aot, string shardName, string testedLocales) => - await TestIcuShards(config, templateType, aot, shardName, testedLocales, GlobalizationMode.Custom); + // [Theory] + // [MemberData(nameof(IcuExpectedAndMissingShardFromRuntimePackTestData), parameters: new object[] { "Release" })] + // public async Task DefaultAvailableIcuShardsFromRuntimePack(string config, string templateType, bool aot, string shardName, string testedLocales) => + // await TestIcuShards(config, templateType, aot, shardName, testedLocales, GlobalizationMode.Custom); } \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs index d3f808c87a5143..6ee351b688805a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs @@ -54,59 +54,59 @@ from customFile in customFiles } - [Theory] - [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { "Release" })] - public async Task FullIcuFromRuntimePackWithInvariant(string config, string templateType, bool aot, bool invariant, bool fullIcu, string testedLocales) => - await BuildAndRunIcuTest( - config, - templateType, - aot, - testedLocales, - globalizationMode: invariant ? GlobalizationMode.Invariant : fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Sharded, - extraProperties: - // https://github.com/dotnet/runtime/issues/94133: "wasmbrowser" should use WasmIncludeFullIcuData, not BlazorWebAssemblyLoadAllGlobalizationData - $"{invariant}{fullIcu}{aot}"); + // [Theory] + // [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { "Release" })] + // public async Task FullIcuFromRuntimePackWithInvariant(string config, string templateType, bool aot, bool invariant, bool fullIcu, string testedLocales) => + // await BuildAndRunIcuTest( + // config, + // templateType, + // aot, + // testedLocales, + // globalizationMode: invariant ? GlobalizationMode.Invariant : fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Sharded, + // extraProperties: + // // https://github.com/dotnet/runtime/issues/94133: "wasmbrowser" should use WasmIncludeFullIcuData, not BlazorWebAssemblyLoadAllGlobalizationData + // $"{invariant}{fullIcu}{aot}"); - [Theory] - [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { "Release" })] - public async Task FullIcuFromRuntimePackWithCustomIcu(string config, string templateType, bool aot, bool fullIcu) - { - bool isBrowser = templateType == "wasmbrowser"; - string customIcuProperty = isBrowser ? "BlazorIcuDataFileName" : "WasmIcuDataFileName"; - string fullIcuProperty = isBrowser ? "BlazorWebAssemblyLoadAllGlobalizationData" : "WasmIncludeFullIcuData"; - string extraProperties = $"<{customIcuProperty}>{CustomIcuPath}<{fullIcuProperty}>{fullIcu}{aot}"; + // [Theory] + // [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { "Release" })] + // public async Task FullIcuFromRuntimePackWithCustomIcu(string config, string templateType, bool aot, bool fullIcu) + // { + // bool isBrowser = templateType == "wasmbrowser"; + // string customIcuProperty = isBrowser ? "BlazorIcuDataFileName" : "WasmIcuDataFileName"; + // string fullIcuProperty = isBrowser ? "BlazorWebAssemblyLoadAllGlobalizationData" : "WasmIncludeFullIcuData"; + // string extraProperties = $"<{customIcuProperty}>{CustomIcuPath}<{fullIcuProperty}>{fullIcu}{aot}"; - string testedLocales = fullIcu ? s_fullIcuTestedLocales : s_customIcuTestedLocales; - GlobalizationMode globalizationMode = fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Custom; - string customIcuFile = fullIcu ? "" : CustomIcuPath; - string output = await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); - if (fullIcu) - Assert.Contains($"$({customIcuProperty}) has no effect when $({fullIcuProperty}) is set to true.", output); - } + // string testedLocales = fullIcu ? s_fullIcuTestedLocales : s_customIcuTestedLocales; + // GlobalizationMode globalizationMode = fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Custom; + // string customIcuFile = fullIcu ? "" : CustomIcuPath; + // string output = await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); + // if (fullIcu) + // Assert.Contains($"$({customIcuProperty}) has no effect when $({fullIcuProperty}) is set to true.", output); + // } - [Theory] - [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { "Release" })] - public void NonExistingCustomFileAssertError(string config, string templateType, string customIcu, bool isFilenameFormCorrect) - { - string customIcuProperty = "BlazorIcuDataFileName"; - string extraProperties = $"<{customIcuProperty}>{customIcu}"; + // [Theory] + // [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { "Release" })] + // public void NonExistingCustomFileAssertError(string config, string templateType, string customIcu, bool isFilenameFormCorrect) + // { + // string customIcuProperty = "BlazorIcuDataFileName"; + // string extraProperties = $"<{customIcuProperty}>{customIcu}"; - (BuildArgs buildArgs, string projectFile) = CreateIcuProject( - config, templateType, aot: false, "Array.Empty()", extraProperties); - string output = BuildIcuTest( - buildArgs, - GlobalizationMode.Custom, - customIcu, - expectSuccess: false, - assertAppBundle: false); + // (ProjectInfo buildArgs, string projectFile) = CreateIcuProject( + // config, templateType, aot: false, "Array.Empty()", extraProperties); + // string output = BuildIcuTest( + // buildArgs, + // GlobalizationMode.Custom, + // customIcu, + // expectSuccess: false, + // assertAppBundle: false); - if (isFilenameFormCorrect) - { - Assert.Contains($"Could not find $({customIcuProperty})={customIcu}, or when used as a path relative to the runtime pack", output); - } - else - { - Assert.Contains($"File name in $({customIcuProperty}) has to start with 'icudt'.", output); - } - } + // if (isFilenameFormCorrect) + // { + // Assert.Contains($"Could not find $({customIcuProperty})={customIcu}, or when used as a path relative to the runtime pack", output); + // } + // else + // { + // Assert.Contains($"File name in $({customIcuProperty}) has to start with 'icudt'.", output); + // } + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index 25a03ad781dcec..a62d3951324f4d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -106,97 +106,94 @@ protected string GetProgramText(string testedLocales, bool onlyPredefinedCulture public record Locale(string Code, string? SundayName); "; - protected async Task TestIcuShards(string config, string templateType, bool aot, string shardName, string testedLocales, GlobalizationMode globalizationMode, bool onlyPredefinedCultures=false) - { - string icuProperty = "BlazorIcuDataFileName"; // https://github.com/dotnet/runtime/issues/94133 - // by default, we remove resource strings from an app. ICU tests are checking exception messages contents -> resource string keys are not enough - string extraProperties = $"<{icuProperty}>{shardName}false{aot}"; - if (onlyPredefinedCultures) - extraProperties = $"{extraProperties}true"; - await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, onlyPredefinedCultures, icuFileName: shardName); - } - - protected (BuildArgs buildArgs, string projectFile) CreateIcuProject( - string config, - string templateType, - bool aot, - string testedLocales, - string extraProperties = "", - bool onlyPredefinedCultures=false) - { - string id = $"icu_{config}_{aot}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, templateType); - string projectDirectory = Path.GetDirectoryName(projectFile)!; - string projectName = Path.GetFileNameWithoutExtension(projectFile); - var buildArgs = new BuildArgs(projectName, config, aot, id, null); - buildArgs = ExpandBuildArgs(buildArgs); - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + // protected async Task TestIcuShards(string config, string templateType, bool aot, string shardName, string testedLocales, GlobalizationMode globalizationMode, bool onlyPredefinedCultures=false) + // { + // string icuProperty = "BlazorIcuDataFileName"; // https://github.com/dotnet/runtime/issues/94133 + // // by default, we remove resource strings from an app. ICU tests are checking exception messages contents -> resource string keys are not enough + // string extraProperties = $"<{icuProperty}>{shardName}false{aot}"; + // if (onlyPredefinedCultures) + // extraProperties = $"{extraProperties}true"; + // await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, onlyPredefinedCultures, icuFileName: shardName); + // } + + // protected (ProjectInfo buildArgs, string projectFile) CreateIcuProject( + // string config, + // string templateType, + // bool aot, + // string testedLocales, + // string extraProperties = "", + // bool onlyPredefinedCultures=false) + // { + // string id = $"icu_{config}_{aot}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, templateType); + // string projectDirectory = Path.GetDirectoryName(projectFile)!; + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + // var buildArgs = new ProjectInfo(projectName, config, aot, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - string programPath = Path.Combine(projectDirectory, "Program.cs"); - string programText = GetProgramText(testedLocales, onlyPredefinedCultures); - File.WriteAllText(programPath, programText); - _testOutput.WriteLine($"----- Program: -----{Environment.NewLine}{programText}{Environment.NewLine}-------"); - - string mainPath = Path.Combine("wwwroot", "main.js"); - var replacements = new Dictionary { - { "runMain", "runMainAndExit" }, - { ".create()", ".withConsoleForwarding().withElementOnExit().withExitCodeLogging().create()" } - }; - UpdateFile(mainPath, replacements); - RemoveContentsFromProjectFile(mainPath, ".create();", "await runMainAndExit();"); - return (buildArgs, projectFile); - } - - protected string BuildIcuTest( - BuildArgs buildArgs, - GlobalizationMode globalizationMode, - string icuFileName = "", - bool expectSuccess = true, - bool assertAppBundle = true) - { - bool dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - (string _, string buildOutput) = BuildTemplateProject(buildArgs, - id: buildArgs.Id, - new BuildProjectOptions( - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - CreateProject: false, - HasV8Script: false, - MainJS: "main.js", - Publish: true, - TargetFramework: BuildTestBase.DefaultTargetFramework, - UseCache: false, - IsBrowserProject: true, - GlobalizationMode: globalizationMode, - CustomIcuFile: icuFileName, - ExpectSuccess: expectSuccess, - AssertAppBundle: assertAppBundle - )); - return buildOutput; - } - - protected async Task BuildAndRunIcuTest( - string config, - string templateType, - bool aot, - string testedLocales, - GlobalizationMode globalizationMode, - string extraProperties = "", - bool onlyPredefinedCultures=false, - string language = "en-US", - string icuFileName = "") - { - try - { - (BuildArgs buildArgs, string projectFile) = CreateIcuProject( - config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); - string buildOutput = BuildIcuTest(buildArgs, globalizationMode, icuFileName); - string runOutput = await RunBuiltBrowserApp(buildArgs.Config, projectFile, language); - return $"{buildOutput}\n{runOutput}"; - } - catch(Exception ex) - { - Console.WriteLine($"Exception: {ex}; _testOutput={_testOutput}"); - throw; - } - } + // string programPath = Path.Combine(projectDirectory, "Program.cs"); + // string programText = GetProgramText(testedLocales, onlyPredefinedCultures); + // File.WriteAllText(programPath, programText); + // _testOutput.WriteLine($"----- Program: -----{Environment.NewLine}{programText}{Environment.NewLine}-------"); + + // string mainPath = Path.Combine("wwwroot", "main.js"); + // var replacements = new Dictionary { + // { "runMain", "runMainAndExit" }, + // { ".create()", ".withConsoleForwarding().withElementOnExit().withExitCodeLogging().create()" } + // }; + // UpdateFile(mainPath, replacements); + // RemoveContentsFromProjectFile(mainPath, ".create();", "await runMainAndExit();"); + // return (buildArgs, projectFile); + // } + + // protected string BuildIcuTest( + // ProjectInfo buildArgs, + // GlobalizationMode globalizationMode, + // string icuFileName = "", + // bool expectSuccess = true, + // bool assertAppBundle = true) + // { + // bool dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + // (string _, string buildOutput) = BuildTemplateProject(buildArgs, + // id: buildArgs.Id, + // new BuildProjectOptions( + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, + // CreateProject: false, + // Publish: true, + // TargetFramework: BuildTestBase.DefaultTargetFramework, + // UseCache: false, + // GlobalizationMode: globalizationMode, + // CustomIcuFile: icuFileName, + // ExpectSuccess: expectSuccess, + // AssertAppBundle: assertAppBundle + // )); + // return buildOutput; + // } + + // protected async Task BuildAndRunIcuTest( + // string config, + // string templateType, + // bool aot, + // string testedLocales, + // GlobalizationMode globalizationMode, + // string extraProperties = "", + // bool onlyPredefinedCultures=false, + // string language = "en-US", + // string icuFileName = "") + // { + // try + // { + // (ProjectInfo buildArgs, string projectFile) = CreateIcuProject( + // config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); + // string buildOutput = BuildIcuTest(buildArgs, globalizationMode, icuFileName); + // string runOutput = await RunBuiltBrowserApp(buildArgs.Configuration, projectFile, language); + // return $"{buildOutput}\n{runOutput}"; + // } + // catch(Exception ex) + // { + // Console.WriteLine($"Exception: {ex}; _testOutput={_testOutput}"); + // throw; + // } + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 212d2205987dd9..afea2759c89c6d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -17,63 +17,62 @@ public InvariantGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestC { } - public static IEnumerable InvariantGlobalizationTestData(bool aot, RunHost host) + public static IEnumerable InvariantGlobalizationTestData(bool aot) => ConfigWithAOTData(aot) .Multiply( new object?[] { null }, new object?[] { false }, new object?[] { true }) - .WithRunHosts(host) .UnwrapItemsAsArrays(); - // TODO: check that icu bits have been linked out - [Theory] - [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void AOT_InvariantGlobalization(BuildArgs buildArgs, bool? invariantGlobalization, RunHost host, string id) - => TestInvariantGlobalization(buildArgs, invariantGlobalization, host, id); + // // TODO: check that icu bits have been linked out + // [Theory] + // [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void AOT_InvariantGlobalization(ProjectInfo buildArgs, bool? invariantGlobalization, RunHost host, string id) + // => TestInvariantGlobalization(buildArgs, invariantGlobalization, host, id); - // TODO: What else should we use to verify a relinked build? - [Theory] - [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void RelinkingWithoutAOT(BuildArgs buildArgs, bool? invariantGlobalization, RunHost host, string id) - => TestInvariantGlobalization(buildArgs, invariantGlobalization, host, id, - extraProperties: "true", - dotnetWasmFromRuntimePack: false); + // // TODO: What else should we use to verify a relinked build? + // [Theory] + // [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void RelinkingWithoutAOT(ProjectInfo buildArgs, bool? invariantGlobalization, RunHost host, string id) + // => TestInvariantGlobalization(buildArgs, invariantGlobalization, host, id, + // extraProperties: "true", + // dotnetWasmFromRuntimePack: false); - private void TestInvariantGlobalization(BuildArgs buildArgs, bool? invariantGlobalization, - RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) - { - string projectName = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; - if (invariantGlobalization != null) - extraProperties = $"{extraProperties}{invariantGlobalization}"; + // private void TestInvariantGlobalization(ProjectInfo buildArgs, bool? invariantGlobalization, + // RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) + // { + // string projectName = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; + // if (invariantGlobalization != null) + // extraProperties = $"{extraProperties}{invariantGlobalization}"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraProperties); + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - if (dotnetWasmFromRuntimePack == null) - dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + // if (dotnetWasmFromRuntimePack == null) + // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs"), Path.Combine(_projectDir!, "Program.cs")), - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded)); + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs"), Path.Combine(_projectDir!, "Program.cs")), + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, + // GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded)); - if (invariantGlobalization == true) - { - string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Could not create es-ES culture", output); - Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); - } - else - { - string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, args: "nativename=\"espa\u00F1ol (Espa\u00F1a)\""); - Assert.Contains("es-ES: Is Invariant LCID: False", output); + // if (invariantGlobalization == true) + // { + // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Could not create es-ES culture", output); + // Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); + // } + // else + // { + // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, args: "nativename=\"espa\u00F1ol (Espa\u00F1a)\""); + // Assert.Contains("es-ES: Is Invariant LCID: False", output); - // ignoring the last line of the output which prints the current culture - } - } + // // ignoring the last line of the output which prints the current culture + // } + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 75a1af9cd3caff..93e1ab1b437cda 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -17,57 +17,56 @@ public InvariantTimezoneTests(ITestOutputHelper output, SharedBuildPerTestClassF { } - public static IEnumerable InvariantTimezoneTestData(bool aot, RunHost host) + public static IEnumerable InvariantTimezoneTestData(bool aot) => ConfigWithAOTData(aot) .Multiply( new object?[] { null }, new object?[] { false }, new object?[] { true }) - .WithRunHosts(host) .UnwrapItemsAsArrays(); - [Theory] - [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void AOT_InvariantTimezone(BuildArgs buildArgs, bool? invariantTimezone, RunHost host, string id) - => TestInvariantTimezone(buildArgs, invariantTimezone, host, id); + // [Theory] + // [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void AOT_InvariantTimezone(ProjectInfo buildArgs, bool? invariantTimezone, RunHost host, string id) + // => TestInvariantTimezone(buildArgs, invariantTimezone, host, id); - [Theory] - [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void RelinkingWithoutAOT(BuildArgs buildArgs, bool? invariantTimezone, RunHost host, string id) - => TestInvariantTimezone(buildArgs, invariantTimezone, host, id, - extraProperties: "true", - dotnetWasmFromRuntimePack: false); + // [Theory] + // [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void RelinkingWithoutAOT(ProjectInfo buildArgs, bool? invariantTimezone, RunHost host, string id) + // => TestInvariantTimezone(buildArgs, invariantTimezone, host, id, + // extraProperties: "true", + // dotnetWasmFromRuntimePack: false); - private void TestInvariantTimezone(BuildArgs buildArgs, bool? invariantTimezone, - RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) - { - string projectName = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; - if (invariantTimezone != null) - extraProperties = $"{extraProperties}{invariantTimezone}"; + // private void TestInvariantTimezone(ProjectInfo buildArgs, bool? invariantTimezone, + // RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) + // { + // string projectName = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; + // if (invariantTimezone != null) + // extraProperties = $"{extraProperties}{invariantTimezone}"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraProperties); + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - if (dotnetWasmFromRuntimePack == null) - dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + // if (dotnetWasmFromRuntimePack == null) + // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs"), Path.Combine(_projectDir!, "Program.cs")), - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs"), Path.Combine(_projectDir!, "Program.cs")), + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); - Assert.Contains("UTC BaseUtcOffset is 0", output); - if (invariantTimezone == true) - { - Assert.Contains("Could not find Asia/Tokyo", output); - } - else - { - Assert.Contains("Asia/Tokyo BaseUtcOffset is 09:00:00", output); - } - } + // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("UTC BaseUtcOffset is 0", output); + // if (invariantTimezone == true) + // { + // Assert.Contains("Could not find Asia/Tokyo", output); + // } + // else + // { + // Assert.Contains("Asia/Tokyo BaseUtcOffset is 09:00:00", output); + // } + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 5fb7887e962cfa..ef590a6c74befc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -18,88 +18,88 @@ public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur { } - public static IEnumerable MainWithArgsTestData(bool aot, RunHost host) + public static IEnumerable MainWithArgsTestData(bool aot) => ConfigWithAOTData(aot).Multiply( new object?[] { new object?[] { "abc", "foobar"} }, new object?[] { new object?[0] } - ).WithRunHosts(host).UnwrapItemsAsArrays(); + ).UnwrapItemsAsArrays(); - [Theory] - [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void AsyncMainWithArgs(BuildArgs buildArgs, string[] args, RunHost host, string id) - => TestMainWithArgs("async_main_with_args", @" - public class TestClass { - public static async System.Threading.Tasks.Task Main(string[] args) - { - ##CODE## - return await System.Threading.Tasks.Task.FromResult(42 + count); - } - }", - buildArgs, args, host, id); + // [Theory] + // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void AsyncMainWithArgs(ProjectInfo buildArgs, string[] args, RunHost host, string id) + // => TestMainWithArgs("async_main_with_args", @" + // public class TestClass { + // public static async System.Threading.Tasks.Task Main(string[] args) + // { + // ##CODE## + // return await System.Threading.Tasks.Task.FromResult(42 + count); + // } + // }", + // buildArgs, args, host, id); - [Theory] - [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void NonAsyncMainWithArgs(BuildArgs buildArgs, string[] args, RunHost host, string id) - => TestMainWithArgs("non_async_main_args", @" - public class TestClass { - public static int Main(string[] args) - { - ##CODE## - return 42 + count; - } - }", buildArgs, args, host, id); + // [Theory] + // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void NonAsyncMainWithArgs(ProjectInfo buildArgs, string[] args, RunHost host, string id) + // => TestMainWithArgs("non_async_main_args", @" + // public class TestClass { + // public static int Main(string[] args) + // { + // ##CODE## + // return 42 + count; + // } + // }", buildArgs, args, host, id); - void TestMainWithArgs(string projectNamePrefix, - string projectContents, - BuildArgs buildArgs, - string[] args, - RunHost host, - string id, - bool? dotnetWasmFromRuntimePack=null) - { - string projectName = $"{projectNamePrefix}_{buildArgs.Config}_{buildArgs.AOT}"; - string code = @" - int count = args == null ? 0 : args.Length; - System.Console.WriteLine($""args#: {args?.Length}""); - foreach (var arg in args ?? System.Array.Empty()) - System.Console.WriteLine($""arg: {arg}""); - "; - string programText = projectContents.Replace("##CODE##", code); + // void TestMainWithArgs(string projectNamePrefix, + // string projectContents, + // ProjectInfo buildArgs, + // string[] args, + // RunHost host, + // string id, + // bool? dotnetWasmFromRuntimePack=null) + // { + // string projectName = $"{projectNamePrefix}_{buildArgs.Configuration}_{buildArgs.AOT}"; + // string code = @" + // int count = args == null ? 0 : args.Length; + // System.Console.WriteLine($""args#: {args?.Length}""); + // foreach (var arg in args ?? System.Array.Empty()) + // System.Console.WriteLine($""arg: {arg}""); + // "; + // string programText = projectContents.Replace("##CODE##", code); - buildArgs = buildArgs with { ProjectName = projectName, ProjectFileContents = programText }; - buildArgs = ExpandBuildArgs(buildArgs); - if (dotnetWasmFromRuntimePack == null) - dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + // buildArgs = buildArgs with { ProjectName = projectName, ProjectFileContents = programText }; + // buildArgs = ExpandBuildArgs(buildArgs); + // if (dotnetWasmFromRuntimePack == null) + // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - _testOutput.WriteLine ($"-- args: {buildArgs}, name: {projectName}"); + // _testOutput.WriteLine ($"-- args: {buildArgs}, name: {projectName}"); - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - // Because we get extra "-verbosity", "Debug" from XHarness - int argsCount = args.Length; - bool isBrowser = host == RunHost.Chrome || host == RunHost.Firefox || host == RunHost.Safari; - if (isBrowser) - argsCount += 2; + // // Because we get extra "-verbosity", "Debug" from XHarness + // int argsCount = args.Length; + // bool isBrowser = host == RunHost.Chrome || host == RunHost.Firefox || host == RunHost.Safari; + // if (isBrowser) + // argsCount += 2; - RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42 + argsCount, args: string.Join(' ', args), - test: output => - { - Assert.Contains($"args#: {argsCount}", output); - foreach (var arg in args) - Assert.Contains($"arg: {arg}", output); + // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42 + argsCount, args: string.Join(' ', args), + // test: output => + // { + // Assert.Contains($"args#: {argsCount}", output); + // foreach (var arg in args) + // Assert.Contains($"arg: {arg}", output); - if (isBrowser) - { - Assert.Contains($"arg: -verbosity", output); - Assert.Contains($"arg: Debug", output); - } - }, host: host, id: id); - } + // if (isBrowser) + // { + // Assert.Contains($"arg: -verbosity", output); + // Assert.Contains($"arg: Debug", output); + // } + // }, host: host, id: id); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index f7c7483a949d3f..18e819b6af73f1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -19,98 +19,98 @@ public NativeBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture { } - [Theory] - [BuildAndRun] - public void SimpleNativeBuild(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"simple_native_build_{buildArgs.Config}_{buildArgs.AOT}"; - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraProperties: "true"); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: false)); - - RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, - test: output => { }, - host: host, id: id); - } - - [Theory] - [BuildAndRun(aot: true, host: RunHost.None)] - public void AOTNotSupportedWithNoTrimming(BuildArgs buildArgs, string id) - { - string projectName = $"mono_aot_cross_{buildArgs.Config}_{buildArgs.AOT}"; - - buildArgs = buildArgs with { ProjectName = projectName, ExtraBuildArgs = "-p:PublishTrimmed=false" }; - buildArgs = ExpandBuildArgs(buildArgs); - - (_, string output) = BuildProject( - buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: false, - ExpectSuccess: false)); - - Assert.Contains("AOT is not supported without IL trimming", output); - } - - [Theory] - [BuildAndRun(host: RunHost.None, aot: true)] - public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(BuildArgs buildArgs, string id) - { - string printFileTypeTarget = @" - - - - - - - - - "; - string projectName = $"bc_to_o_{buildArgs.Config}"; - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, insertAtEnd: printFileTypeTarget); - - (_, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: false)); - - if (!output.Contains("** wasm-dis exit code: 0")) - throw new XunitException($"Expected to successfully run wasm-dis on System.Private.CoreLib.dll.o ." - + " It might fail if it was incorrectly compiled to a bitcode file, instead of wasm."); - } - - [Theory] - [BuildAndRun(host: RunHost.None, aot: true)] - public void NativeBuildIsRequired(BuildArgs buildArgs, string id) - { - string projectName = $"native_build_{buildArgs.Config}_{buildArgs.AOT}"; - - buildArgs = buildArgs with { ProjectName = projectName, ExtraBuildArgs = "-p:WasmBuildNative=false -p:WasmSingleFileBundle=true" }; - buildArgs = ExpandBuildArgs(buildArgs); - - (_, string output) = BuildProject( - buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: false, - ExpectSuccess: false)); - - Assert.Contains("WasmBuildNative is required", output); - } + // [Theory] + // [BuildAndRun] + // public void SimpleNativeBuild(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"simple_native_build_{buildArgs.Configuration}_{buildArgs.AOT}"; + + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraProperties: "true"); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + // DotnetWasmFromRuntimePack: false)); + + // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, + // test: output => { }, + // host: host, id: id); + // } + + // [Theory] + // [BuildAndRun(aot: true)] + // public void AOTNotSupportedWithNoTrimming(ProjectInfo buildArgs, string id) + // { + // string projectName = $"mono_aot_cross_{buildArgs.Configuration}_{buildArgs.AOT}"; + + // buildArgs = buildArgs with { ProjectName = projectName, ExtraBuildArgs = "-p:PublishTrimmed=false" }; + // buildArgs = ExpandBuildArgs(buildArgs); + + // (_, string output) = BuildProject( + // buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + // DotnetWasmFromRuntimePack: false, + // ExpectSuccess: false)); + + // Assert.Contains("AOT is not supported without IL trimming", output); + // } + + // [Theory] + // [BuildAndRun(aot: true)] + // public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(ProjectInfo buildArgs, string id) + // { + // string printFileTypeTarget = @" + // + // + + // + // + + // + // + // "; + // string projectName = $"bc_to_o_{buildArgs.Configuration}"; + + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, insertAtEnd: printFileTypeTarget); + + // (_, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + // DotnetWasmFromRuntimePack: false)); + + // if (!output.Contains("** wasm-dis exit code: 0")) + // throw new XunitException($"Expected to successfully run wasm-dis on System.Private.CoreLib.dll.o ." + // + " It might fail if it was incorrectly compiled to a bitcode file, instead of wasm."); + // } + + // [Theory] + // [BuildAndRun(aot: true)] + // public void NativeBuildIsRequired(ProjectInfo buildArgs, string id) + // { + // string projectName = $"native_build_{buildArgs.Configuration}_{buildArgs.AOT}"; + + // buildArgs = buildArgs with { ProjectName = projectName, ExtraBuildArgs = "-p:WasmBuildNative=false -p:WasmSingleFileBundle=true" }; + // buildArgs = ExpandBuildArgs(buildArgs); + + // (_, string output) = BuildProject( + // buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + // DotnetWasmFromRuntimePack: false, + // ExpectSuccess: false)); + + // Assert.Contains("WasmBuildNative is required", output); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 8444f54308d5b9..9fe02a2db2b9f6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -17,156 +17,156 @@ public NativeLibraryTests(ITestOutputHelper output, SharedBuildPerTestClassFixtu { } - [Theory] - [BuildAndRun(aot: false)] - [BuildAndRun(aot: true)] - public void ProjectWithNativeReference(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"AppUsingNativeLib-a"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraItems: ""); - - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? _)) - { - InitPaths(id); - if (Directory.Exists(_projectDir)) - Directory.Delete(_projectDir, recursive: true); - - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); - } - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions(DotnetWasmFromRuntimePack: false)); - - string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - test: output => {}, - host: host, id: id); - - Assert.Contains("print_line: 100", output); - Assert.Contains("from pinvoke: 142", output); - } - - [Theory] - [BuildAndRun(aot: false)] - [BuildAndRun(aot: true)] - [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] - public void ProjectUsingSkiaSharp(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"AppUsingSkiaSharp"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: @$" - {GetSkiaSharpReferenceItems()} - - "); - - string programText = @" -using System; -using SkiaSharp; - -public class Test -{ - public static int Main() - { - using SKFileStream skfs = new SKFileStream(""mono.png""); - using SKImage img = SKImage.FromEncodedData(skfs); - - Console.WriteLine ($""Size: {skfs.Length} Height: {img.Height}, Width: {img.Width}""); - return 0; - } -}"; - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: false)); - - string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - test: output => {}, - host: host, id: id, - args: "mono.png"); - - Assert.Contains("Size: 26462 Height: 599, Width: 499", output); - } - - [Theory] - [BuildAndRun(aot: false, host: RunHost.Chrome)] - [BuildAndRun(aot: true, host: RunHost.Chrome)] - public void ProjectUsingBrowserNativeCrypto(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"AppUsingBrowserNativeCrypto"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs); - - string programText = @" -using System; -using System.Security.Cryptography; - -public class Test -{ - public static int Main() - { - using (SHA256 mySHA256 = SHA256.Create()) - { - byte[] data = { (byte)'H', (byte)'e', (byte)'l', (byte)'l', (byte)'o' }; - byte[] hashed = mySHA256.ComputeHash(data); - string asStr = string.Join(' ', hashed); - Console.WriteLine(""Hashed: "" + asStr); - return 0; - } - } -}"; - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: !buildArgs.AOT && buildArgs.Config != "Release")); - - string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - test: output => {}, - host: host, id: id); - - Assert.Contains( - "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105", - output); - - string cryptoInitMsg = "MONO_WASM: Initializing Crypto WebWorker"; - Assert.DoesNotContain(cryptoInitMsg, output); - } - - [Theory] - [BuildAndRun(aot: false)] - [BuildAndRun(aot: true)] - public void ProjectWithNativeLibrary(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"AppUsingNativeLibrary-a"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraItems: "\n"); - - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? _)) - { - InitPaths(id); - if (Directory.Exists(_projectDir)) - Directory.Delete(_projectDir, recursive: true); - - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); - } - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions(DotnetWasmFromRuntimePack: false)); - - string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - test: output => {}, - host: host, id: id); - - Assert.Contains("print_line: 100", output); - Assert.Contains("from pinvoke: 142", output); - } + // [Theory] + // [BuildAndRun(aot: false)] + // [BuildAndRun(aot: true)] + // public void ProjectWithNativeReference(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"AppUsingNativeLib-a"; + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraItems: ""); + + // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? _)) + // { + // InitPaths(id); + // if (Directory.Exists(_projectDir)) + // Directory.Delete(_projectDir, recursive: true); + + // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); + // } + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions(DotnetWasmFromRuntimePack: false)); + + // string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, + // test: output => {}, + // host: host, id: id); + + // Assert.Contains("print_line: 100", output); + // Assert.Contains("from pinvoke: 142", output); + // } + +// [Theory] +// [BuildAndRun(aot: false)] +// [BuildAndRun(aot: true)] +// [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] +// public void ProjectUsingSkiaSharp(ProjectInfo buildArgs, RunHost host, string id) +// { +// string projectName = $"AppUsingSkiaSharp"; +// buildArgs = buildArgs with { ProjectName = projectName }; +// buildArgs = ExpandBuildArgs(buildArgs, +// extraItems: @$" +// {GetSkiaSharpReferenceItems()} +// +// "); + +// string programText = @" +// using System; +// using SkiaSharp; + +// public class Test +// { +// public static int Main() +// { +// using SKFileStream skfs = new SKFileStream(""mono.png""); +// using SKImage img = SKImage.FromEncodedData(skfs); + +// Console.WriteLine ($""Size: {skfs.Length} Height: {img.Height}, Width: {img.Width}""); +// return 0; +// } +// }"; + +// BuildProject(buildArgs, +// id: id, +// new BuildProjectOptions( +// InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), +// DotnetWasmFromRuntimePack: false)); + +// string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, +// test: output => {}, +// host: host, id: id, +// args: "mono.png"); + +// Assert.Contains("Size: 26462 Height: 599, Width: 499", output); +// } + +// [Theory] +// [BuildAndRun(aot: false, )] +// [BuildAndRun(aot: true, )] +// public void ProjectUsingBrowserNativeCrypto(ProjectInfo buildArgs, RunHost host, string id) +// { +// string projectName = $"AppUsingBrowserNativeCrypto"; +// buildArgs = buildArgs with { ProjectName = projectName }; +// buildArgs = ExpandBuildArgs(buildArgs); + +// string programText = @" +// using System; +// using System.Security.Cryptography; + +// public class Test +// { +// public static int Main() +// { +// using (SHA256 mySHA256 = SHA256.Create()) +// { +// byte[] data = { (byte)'H', (byte)'e', (byte)'l', (byte)'l', (byte)'o' }; +// byte[] hashed = mySHA256.ComputeHash(data); +// string asStr = string.Join(' ', hashed); +// Console.WriteLine(""Hashed: "" + asStr); +// return 0; +// } +// } +// }"; + +// BuildProject(buildArgs, +// id: id, +// new BuildProjectOptions( +// InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), +// DotnetWasmFromRuntimePack: !buildArgs.AOT && buildArgs.Configuration != "Release")); + +// string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, +// test: output => {}, +// host: host, id: id); + +// Assert.Contains( +// "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105", +// output); + +// string cryptoInitMsg = "MONO_WASM: Initializing Crypto WebWorker"; +// Assert.DoesNotContain(cryptoInitMsg, output); +// } + + // [Theory] + // [BuildAndRun(aot: false)] + // [BuildAndRun(aot: true)] + // public void ProjectWithNativeLibrary(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"AppUsingNativeLibrary-a"; + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraItems: "\n"); + + // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? _)) + // { + // InitPaths(id); + // if (Directory.Exists(_projectDir)) + // Directory.Delete(_projectDir, recursive: true); + + // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); + // } + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions(DotnetWasmFromRuntimePack: false)); + + // string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, + // test: output => {}, + // host: host, id: id); + + // Assert.Contains("print_line: 100", output); + // Assert.Contains("from pinvoke: 142", output); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 9f18293b3c848e..54b572a04e8be4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -24,46 +24,46 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" }, new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" }, new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } - ).WithRunHosts(RunHost.Chrome).UnwrapItemsAsArrays(); + ).UnwrapItemsAsArrays(); - [Theory] - [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ false)] - [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] - public void ExtraEmccFlagsSetButNoRealChange(BuildArgs buildArgs, string extraCFlags, string extraLDFlags, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"rebuild_flags_{buildArgs.Config}" }; - (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: true, invariant: false, buildArgs, id); - var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); - if (extraLDFlags.Length > 0) - pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); + // [Theory] + // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ false)] + // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] + // public void ExtraEmccFlagsSetButNoRealChange(ProjectInfo buildArgs, string extraCFlags, string extraLDFlags, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"rebuild_flags_{buildArgs.Configuration}" }; + // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: true, invariant: false, buildArgs, id); + // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); + // if (extraLDFlags.Length > 0) + // pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // Rebuild + // // Rebuild - string mainAssembly = $"{buildArgs.ProjectName}.dll"; - string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; - string output = Rebuild(nativeRelink: true, invariant: false, buildArgs, id, extraBuildArgs: extraBuildArgs, verbosity: "normal"); + // string mainAssembly = $"{buildArgs.ProjectName}.dll"; + // string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; + // string output = Rebuild(nativeRelink: true, invariant: false, buildArgs, id, extraBuildArgs: extraBuildArgs, verbosity: "normal"); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - // cflags: pinvoke get's compiled, but doesn't overwrite pinvoke.o - // and thus doesn't cause relinking - TestUtils.AssertSubstring("pinvoke.c -> pinvoke.o", output, contains: extraCFlags.Length > 0); + // // cflags: pinvoke get's compiled, but doesn't overwrite pinvoke.o + // // and thus doesn't cause relinking + // TestUtils.AssertSubstring("pinvoke.c -> pinvoke.o", output, contains: extraCFlags.Length > 0); - // ldflags: link step args change, so it should trigger relink - TestUtils.AssertSubstring("Linking with emcc", output, contains: extraLDFlags.Length > 0); + // // ldflags: link step args change, so it should trigger relink + // TestUtils.AssertSubstring("Linking with emcc", output, contains: extraLDFlags.Length > 0); - if (buildArgs.AOT) - { - // ExtraEmccLDFlags does not affect .bc files - Assert.DoesNotContain("Compiling assembly bitcode files", output); - } + // if (buildArgs.AOT) + // { + // // ExtraEmccLDFlags does not affect .bc files + // Assert.DoesNotContain("Compiling assembly bitcode files", output); + // } - string runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, - contains: buildArgs.AOT); - } + // string runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, + // contains: buildArgs.AOT); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index 09fafe0df6939e..8debf135eb7e1e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -26,91 +26,90 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF _enablePerTestCleanup = true; } - public static IEnumerable NativeBuildData() - { - List data = new(); - // relinking - data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: false)); - data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: true)); - - // aot - data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: false)); - data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: true)); - - return data; - - IEnumerable GetData(bool aot, bool nativeRelinking, bool invariant) - => ConfigWithAOTData(aot) - .Multiply(new object[] { nativeRelinking, invariant }) - .WithRunHosts(RunHost.Chrome) - .UnwrapItemsAsArrays().ToList(); - } - - internal (BuildArgs BuildArgs, BuildPaths paths) FirstNativeBuild(string programText, bool nativeRelink, bool invariant, BuildArgs buildArgs, string id, string extraProperties="") - { - buildArgs = GenerateProjectContents(buildArgs, nativeRelink, invariant, extraProperties); - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: false, - GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, - CreateProject: true)); - - RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: RunHost.Chrome, id: id); - return (buildArgs, GetBuildPaths(buildArgs)); - } - - protected string Rebuild(bool nativeRelink, bool invariant, BuildArgs buildArgs, string id, string extraProperties="", string extraBuildArgs="", string? verbosity=null) - { - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); - - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); - - buildArgs = buildArgs with { ExtraBuildArgs = $"{buildArgs.ExtraBuildArgs} {extraBuildArgs}" }; - var newBuildArgs = GenerateProjectContents(buildArgs, nativeRelink, invariant, extraProperties); - - // key(buildArgs) being changed - _buildContext.RemoveFromCache(product.ProjectDir); - _buildContext.CacheBuild(newBuildArgs, product); - - if (buildArgs.ProjectFileContents != newBuildArgs.ProjectFileContents) - File.WriteAllText(Path.Combine(_projectDir!, $"{buildArgs.ProjectName}.csproj"), buildArgs.ProjectFileContents); - buildArgs = newBuildArgs; - - // artificial delay to have new enough timestamps - Thread.Sleep(5000); - - _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); - (_, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - DotnetWasmFromRuntimePack: false, - GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, - CreateProject: false, - UseCache: false, - Verbosity: verbosity)); - - return output; - } - - protected BuildArgs GenerateProjectContents(BuildArgs buildArgs, bool nativeRelink, bool invariant, string extraProperties) - { - StringBuilder propertiesBuilder = new(); - propertiesBuilder.Append("<_WasmDevel>true"); - if (nativeRelink) - propertiesBuilder.Append($"true"); - if (invariant) - propertiesBuilder.Append($"true"); - propertiesBuilder.Append(extraProperties); - - return ExpandBuildArgs(buildArgs, propertiesBuilder.ToString()); - } - - // appending UTF-8 char makes sure project build&publish under all types of paths is supported - protected string GetTestProjectPath(string prefix, string config, bool appendUnicode=true) => - appendUnicode ? $"{prefix}_{config}_{s_unicodeChars}" : $"{prefix}_{config}"; + // public static IEnumerable NativeBuildData() + // { + // List data = new(); + // // relinking + // data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: false)); + // data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: true)); + + // // aot + // data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: false)); + // data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: true)); + + // return data; + + // IEnumerable GetData(bool aot, bool nativeRelinking, bool invariant) + // => ConfigWithAOTData(aot) + // .Multiply(new object[] { nativeRelinking, invariant }) + // .UnwrapItemsAsArrays().ToList(); + // } + + // internal (ProjectInfo ProjectInfo, BuildPaths paths) FirstNativeBuild(string programText, bool nativeRelink, bool invariant, ProjectInfo buildArgs, string id, string extraProperties="") + // { + // buildArgs = GenerateProjectContents(buildArgs, nativeRelink, invariant, extraProperties); + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), + // DotnetWasmFromRuntimePack: false, + // GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, + // CreateProject: true)); + + // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, id: id); + // return (buildArgs, GetBuildPaths(buildArgs)); + // } + + // protected string Rebuild(bool nativeRelink, bool invariant, ProjectInfo buildArgs, string id, string extraProperties="", string extraBuildArgs="", string? verbosity=null) + // { + // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) + // throw new XunitException($"Test bug: could not get the build product in the cache"); + + // File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + + // buildArgs = buildArgs with { ExtraBuildArgs = $"{buildArgs.ExtraBuildArgs} {extraBuildArgs}" }; + // var newBuildArgs = GenerateProjectContents(buildArgs, nativeRelink, invariant, extraProperties); + + // // key(buildArgs) being changed + // _buildContext.RemoveFromCache(product.ProjectDir); + // _buildContext.CacheBuild(newBuildArgs, product); + + // if (buildArgs.ProjectFileContents != newBuildArgs.ProjectFileContents) + // File.WriteAllText(Path.Combine(_projectDir!, $"{buildArgs.ProjectName}.csproj"), buildArgs.ProjectFileContents); + // buildArgs = newBuildArgs; + + // // artificial delay to have new enough timestamps + // Thread.Sleep(5000); + + // _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); + // (_, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // DotnetWasmFromRuntimePack: false, + // GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, + // CreateProject: false, + // UseCache: false, + // Verbosity: verbosity)); + + // return output; + // } + + // protected ProjectInfo GenerateProjectContents(ProjectInfo buildArgs, bool nativeRelink, bool invariant, string extraProperties) + // { + // StringBuilder propertiesBuilder = new(); + // propertiesBuilder.Append("<_WasmDevel>true"); + // if (nativeRelink) + // propertiesBuilder.Append($"true"); + // if (invariant) + // propertiesBuilder.Append($"true"); + // propertiesBuilder.Append(extraProperties); + + // return ExpandBuildArgs(buildArgs, propertiesBuilder.ToString()); + // } + + // // appending UTF-8 char makes sure project build&publish under all types of paths is supported + // protected string GetTestProjectPath(string prefix, string config, bool appendUnicode=true) => + // appendUnicode ? $"{prefix}_{config}_{s_unicodeChars}" : $"{prefix}_{config}"; } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 2a378573a7a2a3..153952f70d0bab 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -17,21 +17,21 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi { } - [Theory] - [MemberData(nameof(NativeBuildData))] - public void NoOpRebuildForNativeBuilds(BuildArgs buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"rebuild_noop_{buildArgs.Config}" }; - (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: nativeRelink, invariant: invariant, buildArgs, id); + // [Theory] + // [MemberData(nameof(NativeBuildData))] + // public void NoOpRebuildForNativeBuilds(ProjectInfo buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"rebuild_noop_{buildArgs.Configuration}" }; + // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: nativeRelink, invariant: invariant, buildArgs, id); - var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - Rebuild(nativeRelink, invariant, buildArgs, id); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // Rebuild(nativeRelink, invariant, buildArgs, id); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - _provider.CompareStat(originalStat, newStat, pathsDict.Values); - RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - } + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 5286664e4cb634..7967ba1de45e5e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -24,48 +24,48 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC => ConfigWithAOTData(aot, config: "Release").Multiply( new object[] { /*cflags*/ "/p:EmccCompileOptimizationFlag=-O1", /*ldflags*/ "" }, new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccLinkOptimizationFlag=-O1" } - ).WithRunHosts(RunHost.Chrome).UnwrapItemsAsArrays(); + ).UnwrapItemsAsArrays(); - [Theory] - [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] - [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] - public void OptimizationFlagChange(BuildArgs buildArgs, string cflags, string ldflags, RunHost host, string id) - { - // force _WasmDevel=false, so we don't get -O0 - buildArgs = buildArgs with { ProjectName = $"rebuild_flags_{buildArgs.Config}", ExtraBuildArgs = "/p:_WasmDevel=false" }; - (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: true, invariant: false, buildArgs, id); + // [Theory] + // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] + // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] + // public void OptimizationFlagChange(ProjectInfo buildArgs, string cflags, string ldflags, RunHost host, string id) + // { + // // force _WasmDevel=false, so we don't get -O0 + // buildArgs = buildArgs with { ProjectName = $"rebuild_flags_{buildArgs.Configuration}", ExtraBuildArgs = "/p:_WasmDevel=false" }; + // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: true, invariant: false, buildArgs, id); - string mainAssembly = $"{buildArgs.ProjectName}.dll"; - var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); - pathsDict.UpdateTo(unchanged: true, mainAssembly, "icall-table.h", "pinvoke-table.h", "driver-gen.c"); - if (cflags.Length == 0) - pathsDict.UpdateTo(unchanged: true, "pinvoke.o", "corebindings.o", "driver.o", "runtime.o"); + // string mainAssembly = $"{buildArgs.ProjectName}.dll"; + // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); + // pathsDict.UpdateTo(unchanged: true, mainAssembly, "icall-table.h", "pinvoke-table.h", "driver-gen.c"); + // if (cflags.Length == 0) + // pathsDict.UpdateTo(unchanged: true, "pinvoke.o", "corebindings.o", "driver.o", "runtime.o"); - pathsDict.Remove(mainAssembly); - if (buildArgs.AOT) - { - // link optimization flag change affects .bc->.o files too, but - // it might result in only *some* files being *changed, - // so, don't check for those - // Link optimization flag is set to Compile optimization flag, if unset - // so, it affects .bc files too! - foreach (string key in pathsDict.Keys.ToArray()) - { - if (key.EndsWith(".dll.bc", StringComparison.Ordinal) || key.EndsWith(".dll.o", StringComparison.Ordinal)) - pathsDict.Remove(key); - } - } + // pathsDict.Remove(mainAssembly); + // if (buildArgs.AOT) + // { + // // link optimization flag change affects .bc->.o files too, but + // // it might result in only *some* files being *changed, + // // so, don't check for those + // // Link optimization flag is set to Compile optimization flag, if unset + // // so, it affects .bc files too! + // foreach (string key in pathsDict.Keys.ToArray()) + // { + // if (key.EndsWith(".dll.bc", StringComparison.Ordinal) || key.EndsWith(".dll.o", StringComparison.Ordinal)) + // pathsDict.Remove(key); + // } + // } - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // Rebuild + // // Rebuild - string output = Rebuild(nativeRelink: true, invariant: false, buildArgs, id, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // string output = Rebuild(nativeRelink: true, invariant: false, buildArgs, id, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - string runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, - contains: buildArgs.AOT); - } + // string runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, + // contains: buildArgs.AOT); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index e9b3198519fed2..7fe6d17f1abd32 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -19,42 +19,42 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT { } - [Theory] - [MemberData(nameof(NativeBuildData))] - public void ReferenceNewAssembly(BuildArgs buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"rebuild_tasks_{buildArgs.Config}" }; - (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink, invariant: invariant, buildArgs, id); - - var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); - pathsDict.UpdateTo(unchanged: true, "corebindings.o"); - pathsDict.UpdateTo(unchanged: true, "driver.o"); - if (!buildArgs.AOT) // relinking - pathsDict.UpdateTo(unchanged: true, "driver-gen.c"); - - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - string programText = - @$" - using System; - using System.Text.Json; - public class Test - {{ - public static int Main() - {{" + - @" string json = ""{ \""name\"": \""value\"" }"";" + - @" var jdoc = JsonDocument.Parse($""{json}"", new JsonDocumentOptions());" + - @$" Console.WriteLine($""json: {{jdoc}}""); - return 42; - }} - }}"; - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - - Rebuild(nativeRelink, invariant, buildArgs, id); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - _provider.CompareStat(originalStat, newStat, pathsDict.Values); - RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - } + // [Theory] + // [MemberData(nameof(NativeBuildData))] + // public void ReferenceNewAssembly(ProjectInfo buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"rebuild_tasks_{buildArgs.Configuration}" }; + // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink, invariant: invariant, buildArgs, id); + + // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); + // pathsDict.UpdateTo(unchanged: true, "corebindings.o"); + // pathsDict.UpdateTo(unchanged: true, "driver.o"); + // if (!buildArgs.AOT) // relinking + // pathsDict.UpdateTo(unchanged: true, "driver-gen.c"); + + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + + // string programText = + // @$" + // using System; + // using System.Text.Json; + // public class Test + // {{ + // public static int Main() + // {{" + + // @" string json = ""{ \""name\"": \""value\"" }"";" + + // @" var jdoc = JsonDocument.Parse($""{json}"", new JsonDocumentOptions());" + + // @$" Console.WriteLine($""json: {{jdoc}}""); + // return 42; + // }} + // }}"; + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); + + // Rebuild(nativeRelink, invariant, buildArgs, id); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 6e2c320cb3242f..305dd4347bd7e2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -18,39 +18,39 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes { } - [Theory] - [MemberData(nameof(NativeBuildData))] - public void SimpleStringChangeInSource(BuildArgs buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"rebuild_simple_{buildArgs.Config}" }; - (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink, invariant: invariant, buildArgs, id); - - string mainAssembly = $"{buildArgs.ProjectName}.dll"; - var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); - pathsDict.UpdateTo(unchanged: false, mainAssembly); - pathsDict.UpdateTo(unchanged: !buildArgs.AOT, "dotnet.native.wasm", "dotnet.native.js"); - - if (buildArgs.AOT) - pathsDict.UpdateTo(unchanged: false, $"{mainAssembly}.bc", $"{mainAssembly}.o"); - - var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // Changes - string mainResults55 = @" - public class TestClass { - public static int Main() - { - return 55; - } - }"; - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), mainResults55); - - // Rebuild - Rebuild(nativeRelink, invariant, buildArgs, id); - var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - _provider.CompareStat(originalStat, newStat, pathsDict.Values); - RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 55, host: host, id: id); - } + // [Theory] + // [MemberData(nameof(NativeBuildData))] + // public void SimpleStringChangeInSource(ProjectInfo buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"rebuild_simple_{buildArgs.Configuration}" }; + // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink, invariant: invariant, buildArgs, id); + + // string mainAssembly = $"{buildArgs.ProjectName}.dll"; + // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); + // pathsDict.UpdateTo(unchanged: false, mainAssembly); + // pathsDict.UpdateTo(unchanged: !buildArgs.AOT, "dotnet.native.wasm", "dotnet.native.js"); + + // if (buildArgs.AOT) + // pathsDict.UpdateTo(unchanged: false, $"{mainAssembly}.bc", $"{mainAssembly}.o"); + + // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + + // // Changes + // string mainResults55 = @" + // public class TestClass { + // public static int Main() + // { + // return 55; + // } + // }"; + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), mainResults55); + + // // Rebuild + // Rebuild(nativeRelink, invariant, buildArgs, id); + // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + + // _provider.CompareStat(originalStat, newStat, pathsDict.Values); + // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 55, host: host, id: id); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 0c99d38835e2c8..29b31b3a37f551 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -20,1010 +20,952 @@ public PInvokeTableGeneratorTests(ITestOutputHelper output, SharedBuildPerTestCl { } - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void NativeLibraryWithVariadicFunctions(BuildArgs buildArgs, RunHost host, string id) - { - string code = @" - using System; - using System.Runtime.InteropServices; - public class Test - { - public static int Main(string[] args) - { - Console.WriteLine($""Main running""); - if (args.Length > 2) - { - // We don't want to run this, because we can't call variadic functions - Console.WriteLine($""sum_three: {sum_three(7, 14, 21)}""); - Console.WriteLine($""sum_two: {sum_two(3, 6)}""); - Console.WriteLine($""sum_one: {sum_one(5)}""); - } - return 42; - } - - [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_one(int a); - [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_two(int a, int b); - [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_three(int a, int b, int c); - }"; - - (buildArgs, string output) = BuildForVariadicFunctionTests(code, - buildArgs with { ProjectName = $"variadic_{buildArgs.Config}_{id}" }, - id); - Assert.Matches("warning.*native function.*sum.*varargs", output); - Assert.Contains("System.Int32 sum_one(System.Int32)", output); - Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); - Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); - - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void DllImportWithFunctionPointersCompilesWithoutWarning(BuildArgs buildArgs, RunHost host, string id) - { - string code = - """ - using System; - using System.Runtime.InteropServices; - public class Test - { - public static int Main() - { - Console.WriteLine("Main running"); - return 42; - } - - [DllImport("variadic", EntryPoint="sum")] - public unsafe static extern int using_sum_one(delegate* unmanaged callback); - - [DllImport("variadic", EntryPoint="sum")] - public static extern int sum_one(int a, int b); - } - """; - - (buildArgs, string output) = BuildForVariadicFunctionTests(code, - buildArgs with { ProjectName = $"fnptr_{buildArgs.Config}_{id}" }, - id); - - Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); - Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(BuildArgs buildArgs, RunHost host, string id) - { - string code = @" - using System; - using System.Runtime.InteropServices; - public class Test - { - public static int Main() - { - Console.WriteLine($""Main running""); - return 42; - } - - [DllImport(""variadic"", EntryPoint=""sum"")] - public unsafe static extern int using_sum_one(delegate* unmanaged callback); - }"; - - (buildArgs, string output) = BuildForVariadicFunctionTests(code, - buildArgs with { ProjectName = $"fnptr_variadic_{buildArgs.Config}_{id}" }, - id); - - Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); - Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running", output); - } - - [Theory] - [BuildAndRun(host: RunHost.None)] - public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_NotConsideredBlittable - (BuildArgs buildArgs, string id) - { - (_, string output) = SingleProjectForDisabledRuntimeMarshallingTest( - withDisabledRuntimeMarshallingAttribute: false, - withAutoLayout: true, - expectSuccess: false, - buildArgs, - id - ); - - Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); - } - - [Theory] - [BuildAndRun(host: RunHost.None)] - public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_WithStructLayout_ConsideredBlittable - (BuildArgs buildArgs, string id) - { - (_, string output) = SingleProjectForDisabledRuntimeMarshallingTest( - withDisabledRuntimeMarshallingAttribute: false, - withAutoLayout: false, - expectSuccess: true, - buildArgs, - id - ); - - Assert.DoesNotMatch("error.*Parameter.*types.*pinvoke.*.*blittable", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMarshallingAttribute_ConsideredBlittable - (BuildArgs buildArgs, RunHost host, string id) - { - (buildArgs, _) = SingleProjectForDisabledRuntimeMarshallingTest( - withDisabledRuntimeMarshallingAttribute: true, - withAutoLayout: true, - expectSuccess: true, - buildArgs, - id - ); - - string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running 5", output); - } - - private (BuildArgs buildArgs ,string output) SingleProjectForDisabledRuntimeMarshallingTest( - bool withDisabledRuntimeMarshallingAttribute, bool withAutoLayout, - bool expectSuccess, BuildArgs buildArgs, string id - ) { - string code = - """ - using System; - using System.Runtime.CompilerServices; - using System.Runtime.InteropServices; - """ - + (withDisabledRuntimeMarshallingAttribute ? "[assembly: DisableRuntimeMarshalling]" : "") - + """ - public class Test - { - public static int Main() - { - var x = new S { Value = 5 }; - - Console.WriteLine("Main running " + x.Value); - return 42; - } - """ - + (withAutoLayout ? "\n[StructLayout(LayoutKind.Auto)]\n" : "") - + """ - public struct S { public int Value; public float Value2; } - - [UnmanagedCallersOnly] - public static void M(S myStruct) { } - } - """; - - buildArgs = ExpandBuildArgs( - buildArgs with { ProjectName = $"not_blittable_{buildArgs.Config}_{id}" }, - extraProperties: buildArgs.AOT - ? string.Empty - : "true" - ); - - (_, string output) = BuildProject( - buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - }, - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: false, - ExpectSuccess: expectSuccess - ) - ); - - return (buildArgs, output); - } - - public static IEnumerable SeparateAssemblyWithDisableMarshallingAttributeTestData(string config) - => ConfigWithAOTData(aot: false, config: config).Multiply( - new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ false, /*expectSuccess*/ false }, - new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ false, /*expectSuccess*/ false }, - new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ true, /*expectSuccess*/ true }, - new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ true, /*expectSuccess*/ true } - ).WithRunHosts(RunHost.Chrome).UnwrapItemsAsArrays(); - - [Theory] - [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Debug")] - [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Release")] - public void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly - (BuildArgs buildArgs, bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess, RunHost host, string id) - => SeparateAssembliesForDisableRuntimeMarshallingTest( - libraryHasAttribute: libraryHasAttribute, - appHasAttribute: appHasAttribute, - expectSuccess: expectSuccess, - buildArgs, - host, - id - ); - - private void SeparateAssembliesForDisableRuntimeMarshallingTest - (bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess, BuildArgs buildArgs, RunHost host, string id) - { - string code = - (libraryHasAttribute ? "[assembly: System.Runtime.CompilerServices.DisableRuntimeMarshalling]" : "") - + "public struct __NonBlittableTypeForAutomatedTests__ { } public struct S { public int Value; public __NonBlittableTypeForAutomatedTests__ NonBlittable; }"; - - var libraryBuildArgs = ExpandBuildArgs( - buildArgs with { ProjectName = $"blittable_different_library_{buildArgs.Config}_{id}" }, - extraProperties: "Library" - ); - - (string libraryDir, string output) = BuildProject( - libraryBuildArgs, - id: id + "_library", - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "S.cs"), code); - }, - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: false, - AssertAppBundle: false - ) - ); - - code = - """ - using System; - using System.Runtime.CompilerServices; - using System.Runtime.InteropServices; - - """ - + (appHasAttribute ? "[assembly: DisableRuntimeMarshalling]" : "") - + """ - - public class Test - { - public static int Main() - { - var x = new S { Value = 5 }; - - Console.WriteLine("Main running " + x.Value); - return 42; - } - - [UnmanagedCallersOnly] - public static void M(S myStruct) { } - } - """; - - buildArgs = ExpandBuildArgs( - buildArgs with { ProjectName = $"blittable_different_app_{buildArgs.Config}_{id}" }, - extraItems: $@"", - extraProperties: buildArgs.AOT - ? string.Empty - : "true" - ); - - _projectDir = null; - - (_, output) = BuildProject( - buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - }, - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: false, - ExpectSuccess: expectSuccess - ) - ); - - if (expectSuccess) - { - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running 5", output); - } - else - { - Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); - } - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void DllImportWithFunctionPointers_WarningsAsMessages(BuildArgs buildArgs, RunHost host, string id) - { - string code = - """ - using System; - using System.Runtime.InteropServices; - public class Test - { - public static int Main() - { - Console.WriteLine("Main running"); - return 42; - } - - [DllImport("someting")] - public unsafe static extern void SomeFunction1(delegate* unmanaged callback); - } - """; - - (buildArgs, string output) = BuildForVariadicFunctionTests( - code, - buildArgs with { ProjectName = $"fnptr_{buildArgs.Config}_{id}" }, - id, - verbosity: "normal", - extraProperties: "$(MSBuildWarningsAsMessage);WASM0001" - ); - - Assert.DoesNotContain("warning WASM0001", output); - - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running", output); - } - - [Theory] - [BuildAndRun(host: RunHost.None)] - public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(BuildArgs buildArgs, string id) - { - string code = - """ - using System; - using System.Runtime.InteropServices; - public class Test - { - public static int Main() - { - Console.WriteLine("Main running"); - return 42; - } - - [UnmanagedCallersOnly] - public unsafe static extern void SomeFunction1(delegate* unmanaged callback); - } - """; - - (_, string output) = BuildForVariadicFunctionTests( - code, - buildArgs with { ProjectName = $"cb_fnptr_{buildArgs.Config}" }, - id - ); - - Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void UnmanagedCallback_InFileType(BuildArgs buildArgs, RunHost host, string id) - { - string code = - """ - using System; - using System.Runtime.InteropServices; - public class Test - { - public static int Main() - { - Console.WriteLine("Main running"); - return 42; - } - } - - file class Foo - { - [UnmanagedCallersOnly] - public unsafe static extern void SomeFunction1(int i); - } - """; - - (buildArgs, string output) = BuildForVariadicFunctionTests( - code, - buildArgs with { ProjectName = $"cb_filetype_{buildArgs.Config}" }, - id - ); - - Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); - - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("Main running", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome)] - public void UnmanagedCallersOnly_Namespaced(BuildArgs buildArgs, RunHost host, string id) - { - string code = - """ - using System; - using System.Runtime.InteropServices; - - public class Test - { - public unsafe static int Main() - { - ((delegate* unmanaged)&A.Conflict.C)(); - ((delegate* unmanaged)&B.Conflict.C)(); - ((delegate* unmanaged)&A.Conflict.C\u733f)(); - ((delegate* unmanaged)&B.Conflict.C\u733f)(); - return 42; - } - } - - namespace A { - public class Conflict { - [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C")] - public static void C() { - Console.WriteLine("A.Conflict.C"); - } - - [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C\u733f")] - public static void C\u733f() { - Console.WriteLine("A.Conflict.C_\U0001F412"); - } - } - } - - namespace B { - public class Conflict { - [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C")] - public static void C() { - Console.WriteLine("B.Conflict.C"); - } - - [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C\u733f")] - public static void C\u733f() { - Console.WriteLine("B.Conflict.C_\U0001F412"); - } - } - } - """; - - (buildArgs, string output) = BuildForVariadicFunctionTests( - code, - buildArgs with { ProjectName = $"cb_namespace_{buildArgs.Config}" }, - id - ); - - Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); - - output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.Contains("A.Conflict.C", output); - Assert.Contains("B.Conflict.C", output); - if (OperatingSystem.IsWindows()) { - // Windows console unicode support is not great - Assert.Contains("A.Conflict.C_", output); - Assert.Contains("B.Conflict.C_", output); - } else { - Assert.Contains("A.Conflict.C_\U0001F412", output); - Assert.Contains("B.Conflict.C_\U0001F412", output); - } - } - - [Theory] - [BuildAndRun(host: RunHost.None)] - public void IcallWithOverloadedParametersAndEnum(BuildArgs buildArgs, string id) - { - // Build a library containing icalls with overloaded parameters. - - string code = - """ - using System; - using System.Runtime.CompilerServices; - - public static class Interop - { - public enum Numbers { A, B, C, D } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern void Square(Numbers x); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - internal static extern void Square(Numbers x, Numbers y); - - public static void Main() - { - // Noop - } - } - """; - - var libraryBuildArgs = ExpandBuildArgs( - buildArgs with { ProjectName = $"icall_enum_library_{buildArgs.Config}_{id}" } - ); - - (string libraryDir, string output) = BuildProject( - libraryBuildArgs, - id: id + "library", - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - }, - Publish: false, - DotnetWasmFromRuntimePack: false, - AssertAppBundle: false - ) - ); - - // Build a project with ManagedToNativeGenerator task reading icalls from the above library and runtime-icall-table.h bellow. - - string projectCode = - """ - - - - - pinvoke-table.h - wasm_m2n_invoke.g.h - runtime-icall-table.h - - - - - ###WasmPInvokeModule### - - - - - - - - """; - - string AddAssembly(string name) => $""; - - string icallTable = - """ - [ - { "klass":"Interop", "icalls": [{} ,{ "name": "Square(Numbers)", "func": "ves_abc", "handles": false } - ,{ "name": "Add(Numbers,Numbers)", "func": "ves_def", "handles": false } - ]} - ] - - """; - - string tasksDir = Path.Combine(s_buildEnv.WorkloadPacksDir, - "Microsoft.NET.Runtime.WebAssembly.Sdk", - s_buildEnv.GetRuntimePackVersion(DefaultTargetFramework), - "tasks", - BuildTestBase.TargetFrameworkForTasks); // not net472! - if (!Directory.Exists(tasksDir)) { - string? tasksDirParent = Path.GetDirectoryName (tasksDir); - if (!string.IsNullOrEmpty (tasksDirParent)) { - if (!Directory.Exists(tasksDirParent)) { - _testOutput.WriteLine($"Expected {tasksDirParent} to exist and contain TFM subdirectories"); - } - _testOutput.WriteLine($"runtime pack tasks dir {tasksDir} contains subdirectories:"); - foreach (string subdir in Directory.EnumerateDirectories(tasksDirParent)) { - _testOutput.WriteLine($" - {subdir}"); - } - } - throw new DirectoryNotFoundException($"Could not find tasks directory {tasksDir}"); - } - - string? taskPath = Directory.EnumerateFiles(tasksDir, "WasmAppBuilder.dll", SearchOption.AllDirectories) - .FirstOrDefault(); - if (string.IsNullOrEmpty(taskPath)) - throw new FileNotFoundException($"Could not find WasmAppBuilder.dll in {tasksDir}"); - - _testOutput.WriteLine ("Using WasmAppBuilder.dll from {0}", taskPath); - - projectCode = projectCode - .Replace("###WasmPInvokeModule###", AddAssembly("System.Private.CoreLib") + AddAssembly("System.Runtime") + AddAssembly(libraryBuildArgs.ProjectName)) - .Replace("###WasmAppBuilder###", taskPath); - - buildArgs = buildArgs with { ProjectName = $"icall_enum_{buildArgs.Config}_{id}", ProjectFileContents = projectCode }; - - _projectDir = null; - - (_, output) = BuildProject( - buildArgs, - id: id + "tasks", - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "runtime-icall-table.h"), icallTable); - }, - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: false, - UseCache: false, - AssertAppBundle: false - ) - ); - - Assert.DoesNotMatch(".*warning.*Numbers", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome, parameters: new object[] { "tr_TR.UTF-8" })] - public void BuildNativeInNonEnglishCulture(BuildArgs buildArgs, string culture, RunHost host, string id) - { - // Check that we can generate interp tables in non-english cultures - // Prompted by https://github.com/dotnet/runtime/issues/71149 - - string code = @" - using System; - using System.Runtime.InteropServices; - - Console.WriteLine($""square: {square(5)}""); - return 42; - - [DllImport(""simple"")] static extern int square(int x); - "; - - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: @$"", - extraProperties: buildArgs.AOT - ? string.Empty - : "true"); - - var extraEnvVars = new Dictionary { - { "LANG", culture }, - { "LC_ALL", culture }, - }; - - (_, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "simple.c"), - Path.Combine(_projectDir!, "simple.c")); - }, - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: false, - ExtraBuildEnvironmentVariables: extraEnvVars - )); - - output = RunAndTestWasmApp(buildArgs, - buildDir: _projectDir, - expectedExitCode: 42, - host: host, - id: id, - envVars: extraEnvVars); - Assert.Contains("square: 25", output); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome, parameters: new object[] { new object[] { - "with-hyphen", - "with#hash-and-hyphen", - "with.per.iod", - "with🚀unicode#" - } })] - - public void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(BuildArgs buildArgs, string[] libraryNames, RunHost host, string id) - { - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: @$"", - extraProperties: buildArgs.AOT - ? string.Empty - : "true"); - - int baseArg = 10; - (_, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => GenerateSourceFiles(_projectDir!, baseArg), - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: false - )); - - output = RunAndTestWasmApp(buildArgs, - buildDir: _projectDir, - expectedExitCode: 42, - host: host, - id: id); - - for (int i = 0; i < libraryNames.Length; i ++) - { - Assert.Contains($"square_{i}: {(i + baseArg) * (i + baseArg)}", output); - } - - void GenerateSourceFiles(string outputPath, int baseArg) - { - StringBuilder csBuilder = new($@" - using System; - using System.Runtime.InteropServices; - "); - - StringBuilder dllImportsBuilder = new(); - for (int i = 0; i < libraryNames.Length; i ++) - { - dllImportsBuilder.AppendLine($"[DllImport(\"{libraryNames[i]}\")] static extern int square_{i}(int x);"); - csBuilder.AppendLine($@"Console.WriteLine($""square_{i}: {{square_{i}({i + baseArg})}}"");"); - - string nativeCode = $@" - #include - - int square_{i}(int x) - {{ - return x * x; - }}"; - File.WriteAllText(Path.Combine(outputPath, $"{libraryNames[i]}.c"), nativeCode); - } - - csBuilder.AppendLine("return 42;"); - csBuilder.Append(dllImportsBuilder); - - File.WriteAllText(Path.Combine(outputPath, "Program.cs"), csBuilder.ToString()); - } - } - - private (BuildArgs, string) BuildForVariadicFunctionTests(string programText, BuildArgs buildArgs, string id, string? verbosity = null, string extraProperties = "") - { - extraProperties += "true<_WasmDevel>true"; - - string filename = "variadic.o"; - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: $"", - extraProperties: extraProperties); - - (_, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", filename), - Path.Combine(_projectDir!, filename)); - }, - Publish: buildArgs.AOT, - Verbosity: verbosity, - DotnetWasmFromRuntimePack: false)); - - return (buildArgs, output); - } - - private void EnsureComInteropCompiles(BuildArgs buildArgs, RunHost host, string id) - { - string programText = @" - using System; - using System.Runtime.CompilerServices; - using System.Runtime.InteropServices; - using System.Runtime.InteropServices.ComTypes; - - public class Test - { - public static int Main(string[] args) - { - var s = new STGMEDIUM(); - ReleaseStgMedium(ref s); - return 42; - } - - [DllImport(""ole32.dll"")] - internal static extern void ReleaseStgMedium(ref STGMEDIUM medium); - } - - "; - - buildArgs = ExpandBuildArgs(buildArgs); - - (string libraryDir, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - }, - Publish: buildArgs.AOT, - DotnetWasmFromRuntimePack: true)); - - Assert.Contains("Generated app bundle at " + libraryDir, output); - } - - private void EnsureWasmAbiRulesAreFollowed(BuildArgs buildArgs, RunHost host, string id) - { - string programText = @" - using System; - using System.Runtime.CompilerServices; - using System.Runtime.InteropServices; - - public struct SingleFloatStruct { - public float Value; - } - public struct SingleDoubleStruct { - public struct Nested1 { - // This field is private on purpose to ensure we treat visibility correctly - double Value; - } - public Nested1 Value; - } - public struct SingleI64Struct { - public Int64 Value; - } - public struct PairStruct { - public int A, B; - } - public unsafe struct MyFixedArray { - public fixed int elements[2]; - } - [System.Runtime.CompilerServices.InlineArray(2)] - public struct MyInlineArray { - public int element0; - } - - public class Test - { - public static unsafe int Main(string[] argv) - { - var i64_a = 0xFF00FF00FF00FF0L; - var i64_b = ~i64_a; - var resI = direct64(i64_a); - Console.WriteLine(""l (l)="" + resI); - - var sis = new SingleI64Struct { Value = i64_a }; - var resSI = indirect64(sis); - Console.WriteLine(""s (s)="" + resSI.Value); - - var resF = direct(3.14); - Console.WriteLine(""f (d)="" + resF); - - SingleDoubleStruct sds = default; - Unsafe.As(ref sds) = 3.14; - - resF = indirect_arg(sds); - Console.WriteLine(""f (s)="" + resF); - - var res = indirect(sds); - Console.WriteLine(""s (s)="" + res.Value); - - var pair = new PairStruct { A = 1, B = 2 }; - var paires = accept_and_return_pair(pair); - Console.WriteLine(""paires.B="" + paires.B); - - // This test is split into methods to simplify debugging issues with it - var ia = InlineArrayTest1(); - var iares = InlineArrayTest2(ia); - Console.WriteLine($""iares[0]={iares[0]} iares[1]={iares[1]}""); - - MyFixedArray fa = new (); - for (int i = 0; i < 2; i++) - fa.elements[i] = i; - var fares = accept_and_return_fixedarray(fa); - Console.WriteLine(""fares.elements[1]="" + fares.elements[1]); - - return (int)res.Value; - } - - public static unsafe MyInlineArray InlineArrayTest1 () { - MyInlineArray ia = new (); - for (int i = 0; i < 2; i++) - ia[i] = i; - return ia; - } - - public static unsafe MyInlineArray InlineArrayTest2 (MyInlineArray ia) { - return accept_and_return_inlinearray(ia); - } - - [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] - public static extern SingleFloatStruct indirect(SingleDoubleStruct arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] - public static extern float indirect_arg(SingleDoubleStruct arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] - public static extern float direct(double arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_i64_struct"")] - public static extern SingleI64Struct indirect64(SingleI64Struct arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_i64_struct"")] - public static extern Int64 direct64(Int64 arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_pair"")] - public static extern PairStruct accept_and_return_pair(PairStruct arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_fixedarray"")] - public static extern MyFixedArray accept_and_return_fixedarray(MyFixedArray arg); - - [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_inlinearray"")] - public static extern MyInlineArray accept_and_return_inlinearray(MyInlineArray arg); - }"; - - var extraProperties = "true<_WasmDevel>falsefalse"; - var extraItems = @""; - - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: extraItems, - extraProperties: extraProperties); - - (string libraryDir, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "wasm-abi.c"), - Path.Combine(_projectDir!, "wasm-abi.c")); - }, - Publish: buildArgs.AOT, - // Verbosity: "diagnostic", - DotnetWasmFromRuntimePack: false)); - - string objDir = Path.Combine(_projectDir!, "obj", buildArgs.Config!, "net9.0", "browser-wasm", "wasm", buildArgs.AOT ? "for-publish" : "for-build"); - - // Verify that the right signature was added for the pinvoke. We can't determine this by examining the m2n file - // FIXME: Not possible in in-process mode for some reason, even with verbosity at "diagnostic" - // Assert.Contains("Adding pinvoke signature FD for method 'Test.", output); - - string pinvokeTable = File.ReadAllText(Path.Combine(objDir, "pinvoke-table.h")); - // Verify that the invoke is in the pinvoke table. Under various circumstances we will silently skip it, - // for example if the module isn't found - Assert.Contains("\"accept_double_struct_and_return_float_struct\", accept_double_struct_and_return_float_struct", pinvokeTable); - // Verify the signature of the C function prototype. Wasm ABI specifies that the structs should both decompose into scalars. - Assert.Contains("float accept_double_struct_and_return_float_struct (double);", pinvokeTable); - Assert.Contains("int64_t accept_and_return_i64_struct (int64_t);", pinvokeTable); - - var runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 3, host: host, id: id); - Assert.Contains("l (l)=-1148435428713435121", runOutput); - Assert.Contains("s (s)=-1148435428713435121", runOutput); - Assert.Contains("f (d)=3.14", runOutput); - Assert.Contains("f (s)=3.14", runOutput); - Assert.Contains("s (s)=3.14", runOutput); - Assert.Contains("paires.B=4", runOutput); - Assert.Contains("iares[0]=32", runOutput); - Assert.Contains("iares[1]=2", runOutput); - Assert.Contains("fares.elements[1]=2", runOutput); - } - - [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: true)] - public void EnsureWasmAbiRulesAreFollowedInAOT(BuildArgs buildArgs, RunHost host, string id) => - EnsureWasmAbiRulesAreFollowed(buildArgs, host, id); - - [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: false)] - public void EnsureWasmAbiRulesAreFollowedInInterpreter(BuildArgs buildArgs, RunHost host, string id) => - EnsureWasmAbiRulesAreFollowed(buildArgs, host, id); - - [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: true)] - public void EnsureComInteropCompilesInAOT(BuildArgs buildArgs, RunHost host, string id) => - EnsureComInteropCompiles(buildArgs, host, id); - - [Theory] - [BuildAndRun(host: RunHost.Chrome, aot: false)] - public void UCOWithSpecialCharacters(BuildArgs buildArgs, RunHost host, string id) - { - var extraProperties = "true"; - var extraItems = @""; - - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: extraItems, - extraProperties: extraProperties); - - (string libraryDir, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "UnmanagedCallback.cs"), Path.Combine(_projectDir!, "Program.cs")); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "local.c"), Path.Combine(_projectDir!, "local.c")); - }, - Publish: true, - DotnetWasmFromRuntimePack: false)); - - var runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - Assert.DoesNotContain("Conflict.A.Managed8\u4F60Func(123) -> 123", runOutput); - Assert.Contains("ManagedFunc returned 42", runOutput); - } + // [Theory] + // [BuildAndRun()] + // public void NativeLibraryWithVariadicFunctions(ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = @" + // using System; + // using System.Runtime.InteropServices; + // public class Test + // { + // public static int Main(string[] args) + // { + // Console.WriteLine($""Main running""); + // if (args.Length > 2) + // { + // // We don't want to run this, because we can't call variadic functions + // Console.WriteLine($""sum_three: {sum_three(7, 14, 21)}""); + // Console.WriteLine($""sum_two: {sum_two(3, 6)}""); + // Console.WriteLine($""sum_one: {sum_one(5)}""); + // } + // return 42; + // } + + // [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_one(int a); + // [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_two(int a, int b); + // [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_three(int a, int b, int c); + // }"; + + // (buildArgs, string output) = BuildForVariadicFunctionTests(code, + // buildArgs with { ProjectName = $"variadic_{buildArgs.Configuration}_{id}" }, + // id); + // Assert.Matches("warning.*native function.*sum.*varargs", output); + // Assert.Contains("System.Int32 sum_one(System.Int32)", output); + // Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); + // Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); + + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void DllImportWithFunctionPointersCompilesWithoutWarning(ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = + // """ + // using System; + // using System.Runtime.InteropServices; + // public class Test + // { + // public static int Main() + // { + // Console.WriteLine("Main running"); + // return 42; + // } + + // [DllImport("variadic", EntryPoint="sum")] + // public unsafe static extern int using_sum_one(delegate* unmanaged callback); + + // [DllImport("variadic", EntryPoint="sum")] + // public static extern int sum_one(int a, int b); + // } + // """; + + // (buildArgs, string output) = BuildForVariadicFunctionTests(code, + // buildArgs with { ProjectName = $"fnptr_{buildArgs.Configuration}_{id}" }, + // id); + + // Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); + // Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); + + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = @" + // using System; + // using System.Runtime.InteropServices; + // public class Test + // { + // public static int Main() + // { + // Console.WriteLine($""Main running""); + // return 42; + // } + + // [DllImport(""variadic"", EntryPoint=""sum"")] + // public unsafe static extern int using_sum_one(delegate* unmanaged callback); + // }"; + + // (buildArgs, string output) = BuildForVariadicFunctionTests(code, + // buildArgs with { ProjectName = $"fnptr_variadic_{buildArgs.Configuration}_{id}" }, + // id); + + // Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); + // Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); + + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_NotConsideredBlittable + // (ProjectInfo buildArgs, string id) + // { + // (_, string output) = SingleProjectForDisabledRuntimeMarshallingTest( + // withDisabledRuntimeMarshallingAttribute: false, + // withAutoLayout: true, + // expectSuccess: false, + // buildArgs, + // id + // ); + + // Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_WithStructLayout_ConsideredBlittable + // (ProjectInfo buildArgs, string id) + // { + // (_, string output) = SingleProjectForDisabledRuntimeMarshallingTest( + // withDisabledRuntimeMarshallingAttribute: false, + // withAutoLayout: false, + // expectSuccess: true, + // buildArgs, + // id + // ); + + // Assert.DoesNotMatch("error.*Parameter.*types.*pinvoke.*.*blittable", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMarshallingAttribute_ConsideredBlittable + // (ProjectInfo buildArgs, RunHost host, string id) + // { + // (buildArgs, _) = SingleProjectForDisabledRuntimeMarshallingTest( + // withDisabledRuntimeMarshallingAttribute: true, + // withAutoLayout: true, + // expectSuccess: true, + // buildArgs, + // id + // ); + + // string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running 5", output); + // } + + // private (ProjectInfo buildArgs ,string output) SingleProjectForDisabledRuntimeMarshallingTest( + // bool withDisabledRuntimeMarshallingAttribute, bool withAutoLayout, + // bool expectSuccess, ProjectInfo buildArgs, string id + // ) { + // string code = + // """ + // using System; + // using System.Runtime.CompilerServices; + // using System.Runtime.InteropServices; + // """ + // + (withDisabledRuntimeMarshallingAttribute ? "[assembly: DisableRuntimeMarshalling]" : "") + // + """ + // public class Test + // { + // public static int Main() + // { + // var x = new S { Value = 5 }; + + // Console.WriteLine("Main running " + x.Value); + // return 42; + // } + // """ + // + (withAutoLayout ? "\n[StructLayout(LayoutKind.Auto)]\n" : "") + // + """ + // public struct S { public int Value; public float Value2; } + + // [UnmanagedCallersOnly] + // public static void M(S myStruct) { } + // } + // """; + + // buildArgs = ExpandBuildArgs( + // buildArgs with { ProjectName = $"not_blittable_{buildArgs.Configuration}_{id}" }, + // extraProperties: buildArgs.AOT + // ? string.Empty + // : "true" + // ); + + // (_, string output) = BuildProject( + // buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); + // }, + // Publish: buildArgs.AOT, + // DotnetWasmFromRuntimePack: false, + // ExpectSuccess: expectSuccess + // ) + // ); + + // return (buildArgs, output); + // } + + // public static IEnumerable SeparateAssemblyWithDisableMarshallingAttributeTestData(string config) + // => ConfigWithAOTData(aot: false, config: config).Multiply( + // new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ false, /*expectSuccess*/ false }, + // new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ false, /*expectSuccess*/ false }, + // new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ true, /*expectSuccess*/ true }, + // new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ true, /*expectSuccess*/ true } + // ).UnwrapItemsAsArrays(); + + // [Theory] + // [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Debug")] + // [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Release")] + // public void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly + // (ProjectInfo buildArgs, bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess, RunHost host, string id) + // => SeparateAssembliesForDisableRuntimeMarshallingTest( + // libraryHasAttribute: libraryHasAttribute, + // appHasAttribute: appHasAttribute, + // expectSuccess: expectSuccess, + // buildArgs, + // host, + // id + // ); + + // private void SeparateAssembliesForDisableRuntimeMarshallingTest + // (bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess, ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = + // (libraryHasAttribute ? "[assembly: System.Runtime.CompilerServices.DisableRuntimeMarshalling]" : "") + // + "public struct __NonBlittableTypeForAutomatedTests__ { } public struct S { public int Value; public __NonBlittableTypeForAutomatedTests__ NonBlittable; }"; + + // var libraryBuildArgs = ExpandBuildArgs( + // buildArgs with { ProjectName = $"blittable_different_library_{buildArgs.Configuration}_{id}" }, + // extraProperties: "Library" + // ); + + // (string libraryDir, string output) = BuildProject( + // libraryBuildArgs, + // id: id + "_library", + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "S.cs"), code); + // }, + // Publish: buildArgs.AOT, + // DotnetWasmFromRuntimePack: false, + // AssertAppBundle: false + // ) + // ); + + // code = + // """ + // using System; + // using System.Runtime.CompilerServices; + // using System.Runtime.InteropServices; + + // """ + // + (appHasAttribute ? "[assembly: DisableRuntimeMarshalling]" : "") + // + """ + + // public class Test + // { + // public static int Main() + // { + // var x = new S { Value = 5 }; + + // Console.WriteLine("Main running " + x.Value); + // return 42; + // } + + // [UnmanagedCallersOnly] + // public static void M(S myStruct) { } + // } + // """; + + // buildArgs = ExpandBuildArgs( + // buildArgs with { ProjectName = $"blittable_different_app_{buildArgs.Configuration}_{id}" }, + // extraItems: $@"", + // extraProperties: buildArgs.AOT + // ? string.Empty + // : "true" + // ); + + // _projectDir = null; + + // (_, output) = BuildProject( + // buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); + // }, + // Publish: buildArgs.AOT, + // DotnetWasmFromRuntimePack: false, + // ExpectSuccess: expectSuccess + // ) + // ); + + // if (expectSuccess) + // { + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running 5", output); + // } + // else + // { + // Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); + // } + // } + + // [Theory] + // [BuildAndRun()] + // public void DllImportWithFunctionPointers_WarningsAsMessages(ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = + // """ + // using System; + // using System.Runtime.InteropServices; + // public class Test + // { + // public static int Main() + // { + // Console.WriteLine("Main running"); + // return 42; + // } + + // [DllImport("someting")] + // public unsafe static extern void SomeFunction1(delegate* unmanaged callback); + // } + // """; + + // (buildArgs, string output) = BuildForVariadicFunctionTests( + // code, + // buildArgs with { ProjectName = $"fnptr_{buildArgs.Configuration}_{id}" }, + // id, + // verbosity: "normal", + // extraProperties: "$(MSBuildWarningsAsMessage);WASM0001" + // ); + + // Assert.DoesNotContain("warning WASM0001", output); + + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(ProjectInfo buildArgs, string id) + // { + // string code = + // """ + // using System; + // using System.Runtime.InteropServices; + // public class Test + // { + // public static int Main() + // { + // Console.WriteLine("Main running"); + // return 42; + // } + + // [UnmanagedCallersOnly] + // public unsafe static extern void SomeFunction1(delegate* unmanaged callback); + // } + // """; + + // (_, string output) = BuildForVariadicFunctionTests( + // code, + // buildArgs with { ProjectName = $"cb_fnptr_{buildArgs.Configuration}" }, + // id + // ); + + // Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void UnmanagedCallback_InFileType(ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = + // """ + // using System; + // using System.Runtime.InteropServices; + // public class Test + // { + // public static int Main() + // { + // Console.WriteLine("Main running"); + // return 42; + // } + // } + + // file class Foo + // { + // [UnmanagedCallersOnly] + // public unsafe static extern void SomeFunction1(int i); + // } + // """; + + // (buildArgs, string output) = BuildForVariadicFunctionTests( + // code, + // buildArgs with { ProjectName = $"cb_filetype_{buildArgs.Configuration}" }, + // id + // ); + + // Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); + + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("Main running", output); + // } + + // [Theory] + // [BuildAndRun()] + // public void UnmanagedCallersOnly_Namespaced(ProjectInfo buildArgs, RunHost host, string id) + // { + // string code = + // """ + // using System; + // using System.Runtime.InteropServices; + + // public class Test + // { + // public unsafe static int Main() + // { + // ((delegate* unmanaged)&A.Conflict.C)(); + // ((delegate* unmanaged)&B.Conflict.C)(); + // ((delegate* unmanaged)&A.Conflict.C\u733f)(); + // ((delegate* unmanaged)&B.Conflict.C\u733f)(); + // return 42; + // } + // } + + // namespace A { + // public class Conflict { + // [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C")] + // public static void C() { + // Console.WriteLine("A.Conflict.C"); + // } + + // [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C\u733f")] + // public static void C\u733f() { + // Console.WriteLine("A.Conflict.C_\U0001F412"); + // } + // } + // } + + // namespace B { + // public class Conflict { + // [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C")] + // public static void C() { + // Console.WriteLine("B.Conflict.C"); + // } + + // [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C\u733f")] + // public static void C\u733f() { + // Console.WriteLine("B.Conflict.C_\U0001F412"); + // } + // } + // } + // """; + + // (buildArgs, string output) = BuildForVariadicFunctionTests( + // code, + // buildArgs with { ProjectName = $"cb_namespace_{buildArgs.Configuration}" }, + // id + // ); + + // Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); + + // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.Contains("A.Conflict.C", output); + // Assert.Contains("B.Conflict.C", output); + // if (OperatingSystem.IsWindows()) { + // // Windows console unicode support is not great + // Assert.Contains("A.Conflict.C_", output); + // Assert.Contains("B.Conflict.C_", output); + // } else { + // Assert.Contains("A.Conflict.C_\U0001F412", output); + // Assert.Contains("B.Conflict.C_\U0001F412", output); + // } + // } + + // [Theory] + // [BuildAndRun()] + // public void IcallWithOverloadedParametersAndEnum(ProjectInfo buildArgs, string id) + // { + // // Build a library containing icalls with overloaded parameters. + + // string code = + // """ + // using System; + // using System.Runtime.CompilerServices; + + // public static class Interop + // { + // public enum Numbers { A, B, C, D } + + // [MethodImplAttribute(MethodImplOptions.InternalCall)] + // internal static extern void Square(Numbers x); + + // [MethodImplAttribute(MethodImplOptions.InternalCall)] + // internal static extern void Square(Numbers x, Numbers y); + + // public static void Main() + // { + // // Noop + // } + // } + // """; + + // var libraryBuildArgs = ExpandBuildArgs( + // buildArgs with { ProjectName = $"icall_enum_library_{buildArgs.Configuration}_{id}" } + // ); + + // (string libraryDir, string output) = BuildProject( + // libraryBuildArgs, + // id: id + "library", + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); + // }, + // Publish: false, + // DotnetWasmFromRuntimePack: false, + // AssertAppBundle: false + // ) + // ); + + // // Build a project with ManagedToNativeGenerator task reading icalls from the above library and runtime-icall-table.h bellow. + + // string projectCode = + // """ + // + // + // + // + // pinvoke-table.h + // wasm_m2n_invoke.g.h + // runtime-icall-table.h + // + + // + // + // ###WasmPInvokeModule### + // + + // + // + // + // + // + // """; + + // string AddAssembly(string name) => $""; + + // string icallTable = + // """ + // [ + // { "klass":"Interop", "icalls": [{} ,{ "name": "Square(Numbers)", "func": "ves_abc", "handles": false } + // ,{ "name": "Add(Numbers,Numbers)", "func": "ves_def", "handles": false } + // ]} + // ] + + // """; + + // string tasksDir = Path.Combine(s_buildEnv.WorkloadPacksDir, + // "Microsoft.NET.Runtime.WebAssembly.Sdk", + // s_buildEnv.GetRuntimePackVersion(DefaultTargetFramework), + // "tasks", + // BuildTestBase.TargetFrameworkForTasks); // not net472! + // if (!Directory.Exists(tasksDir)) { + // string? tasksDirParent = Path.GetDirectoryName (tasksDir); + // if (!string.IsNullOrEmpty (tasksDirParent)) { + // if (!Directory.Exists(tasksDirParent)) { + // _testOutput.WriteLine($"Expected {tasksDirParent} to exist and contain TFM subdirectories"); + // } + // _testOutput.WriteLine($"runtime pack tasks dir {tasksDir} contains subdirectories:"); + // foreach (string subdir in Directory.EnumerateDirectories(tasksDirParent)) { + // _testOutput.WriteLine($" - {subdir}"); + // } + // } + // throw new DirectoryNotFoundException($"Could not find tasks directory {tasksDir}"); + // } + + // string? taskPath = Directory.EnumerateFiles(tasksDir, "WasmAppBuilder.dll", SearchOption.AllDirectories) + // .FirstOrDefault(); + // if (string.IsNullOrEmpty(taskPath)) + // throw new FileNotFoundException($"Could not find WasmAppBuilder.dll in {tasksDir}"); + + // _testOutput.WriteLine ("Using WasmAppBuilder.dll from {0}", taskPath); + + // projectCode = projectCode + // .Replace("###WasmPInvokeModule###", AddAssembly("System.Private.CoreLib") + AddAssembly("System.Runtime") + AddAssembly(libraryBuildArgs.ProjectName)) + // .Replace("###WasmAppBuilder###", taskPath); + + // buildArgs = buildArgs with { ProjectName = $"icall_enum_{buildArgs.Configuration}_{id}", ProjectFileContents = projectCode }; + + // _projectDir = null; + + // (_, output) = BuildProject( + // buildArgs, + // id: id + "tasks", + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "runtime-icall-table.h"), icallTable); + // }, + // Publish: buildArgs.AOT, + // DotnetWasmFromRuntimePack: false, + // UseCache: false, + // AssertAppBundle: false + // ) + // ); + + // Assert.DoesNotMatch(".*warning.*Numbers", output); + // } + + // [Theory] + // [BuildAndRun(parameters: new object[] { "tr_TR.UTF-8" })] + // public void BuildNativeInNonEnglishCulture(ProjectInfo buildArgs, string culture, RunHost host, string id) + // { + // // Check that we can generate interp tables in non-english cultures + // // Prompted by https://github.com/dotnet/runtime/issues/71149 + + // string code = @" + // using System; + // using System.Runtime.InteropServices; + + // Console.WriteLine($""square: {square(5)}""); + // return 42; + + // [DllImport(""simple"")] static extern int square(int x); + // "; + + // buildArgs = ExpandBuildArgs(buildArgs, + // extraItems: @$"", + // extraProperties: buildArgs.AOT + // ? string.Empty + // : "true"); + + // var extraEnvVars = new Dictionary { + // { "LANG", culture }, + // { "LC_ALL", culture }, + // }; + + // (_, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "simple.c"), + // Path.Combine(_projectDir!, "simple.c")); + // }, + // Publish: buildArgs.AOT, + // DotnetWasmFromRuntimePack: false, + // ExtraBuildEnvironmentVariables: extraEnvVars + // )); + + // output = RunAndTestWasmApp(buildArgs, + // buildDir: _projectDir, + // expectedExitCode: 42, + // host: host, + // id: id, + // envVars: extraEnvVars); + // Assert.Contains("square: 25", output); + // } + + // [Theory] + // [BuildAndRun(parameters: new object[] { new object[] { + // "with-hyphen", + // "with#hash-and-hyphen", + // "with.per.iod", + // "with🚀unicode#" + // } })] + + // private (ProjectInfo, string) BuildForVariadicFunctionTests(string programText, ProjectInfo buildArgs, string id, string? verbosity = null, string extraProperties = "") + // { + // extraProperties += "true<_WasmDevel>true"; + + // string filename = "variadic.o"; + // buildArgs = ExpandBuildArgs(buildArgs, + // extraItems: $"", + // extraProperties: extraProperties); + + // (_, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", filename), + // Path.Combine(_projectDir!, filename)); + // }, + // Publish: buildArgs.AOT, + // Verbosity: verbosity, + // DotnetWasmFromRuntimePack: false)); + + // return (buildArgs, output); + // } + + // private void EnsureComInteropCompiles(ProjectInfo buildArgs, string id) + // { + // string programText = @" + // using System; + // using System.Runtime.CompilerServices; + // using System.Runtime.InteropServices; + // using System.Runtime.InteropServices.ComTypes; + + // public class Test + // { + // public static int Main(string[] args) + // { + // var s = new STGMEDIUM(); + // ReleaseStgMedium(ref s); + // return 42; + // } + + // [DllImport(""ole32.dll"")] + // internal static extern void ReleaseStgMedium(ref STGMEDIUM medium); + // } + + // "; + + // buildArgs = ExpandBuildArgs(buildArgs); + + // (string libraryDir, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); + // }, + // Publish: buildArgs.AOT, + // DotnetWasmFromRuntimePack: true)); + + // Assert.Contains("Generated app bundle at " + libraryDir, output); + // } + + // private void EnsureWasmAbiRulesAreFollowed(ProjectInfo buildArgs, RunHost host, string id) + // { + // string programText = @" + // using System; + // using System.Runtime.CompilerServices; + // using System.Runtime.InteropServices; + + // public struct SingleFloatStruct { + // public float Value; + // } + // public struct SingleDoubleStruct { + // public struct Nested1 { + // // This field is private on purpose to ensure we treat visibility correctly + // double Value; + // } + // public Nested1 Value; + // } + // public struct SingleI64Struct { + // public Int64 Value; + // } + // public struct PairStruct { + // public int A, B; + // } + // public unsafe struct MyFixedArray { + // public fixed int elements[2]; + // } + // [System.Runtime.CompilerServices.InlineArray(2)] + // public struct MyInlineArray { + // public int element0; + // } + + // public class Test + // { + // public static unsafe int Main(string[] argv) + // { + // var i64_a = 0xFF00FF00FF00FF0L; + // var i64_b = ~i64_a; + // var resI = direct64(i64_a); + // Console.WriteLine(""l (l)="" + resI); + + // var sis = new SingleI64Struct { Value = i64_a }; + // var resSI = indirect64(sis); + // Console.WriteLine(""s (s)="" + resSI.Value); + + // var resF = direct(3.14); + // Console.WriteLine(""f (d)="" + resF); + + // SingleDoubleStruct sds = default; + // Unsafe.As(ref sds) = 3.14; + + // resF = indirect_arg(sds); + // Console.WriteLine(""f (s)="" + resF); + + // var res = indirect(sds); + // Console.WriteLine(""s (s)="" + res.Value); + + // var pair = new PairStruct { A = 1, B = 2 }; + // var paires = accept_and_return_pair(pair); + // Console.WriteLine(""paires.B="" + paires.B); + + // // This test is split into methods to simplify debugging issues with it + // var ia = InlineArrayTest1(); + // var iares = InlineArrayTest2(ia); + // Console.WriteLine($""iares[0]={iares[0]} iares[1]={iares[1]}""); + + // MyFixedArray fa = new (); + // for (int i = 0; i < 2; i++) + // fa.elements[i] = i; + // var fares = accept_and_return_fixedarray(fa); + // Console.WriteLine(""fares.elements[1]="" + fares.elements[1]); + + // return (int)res.Value; + // } + + // public static unsafe MyInlineArray InlineArrayTest1 () { + // MyInlineArray ia = new (); + // for (int i = 0; i < 2; i++) + // ia[i] = i; + // return ia; + // } + + // public static unsafe MyInlineArray InlineArrayTest2 (MyInlineArray ia) { + // return accept_and_return_inlinearray(ia); + // } + + // [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] + // public static extern SingleFloatStruct indirect(SingleDoubleStruct arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] + // public static extern float indirect_arg(SingleDoubleStruct arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] + // public static extern float direct(double arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_i64_struct"")] + // public static extern SingleI64Struct indirect64(SingleI64Struct arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_i64_struct"")] + // public static extern Int64 direct64(Int64 arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_pair"")] + // public static extern PairStruct accept_and_return_pair(PairStruct arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_fixedarray"")] + // public static extern MyFixedArray accept_and_return_fixedarray(MyFixedArray arg); + + // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_inlinearray"")] + // public static extern MyInlineArray accept_and_return_inlinearray(MyInlineArray arg); + // }"; + + // var extraProperties = "true<_WasmDevel>falsefalse"; + // var extraItems = @""; + + // buildArgs = ExpandBuildArgs(buildArgs, + // extraItems: extraItems, + // extraProperties: extraProperties); + + // (string libraryDir, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "wasm-abi.c"), + // Path.Combine(_projectDir!, "wasm-abi.c")); + // }, + // Publish: buildArgs.AOT, + // // Verbosity: "diagnostic", + // DotnetWasmFromRuntimePack: false)); + + // string objDir = Path.Combine(_projectDir!, "obj", buildArgs.Configuration!, "net9.0", "browser-wasm", "wasm", buildArgs.AOT ? "for-publish" : "for-build"); + + // // Verify that the right signature was added for the pinvoke. We can't determine this by examining the m2n file + // // FIXME: Not possible in in-process mode for some reason, even with verbosity at "diagnostic" + // // Assert.Contains("Adding pinvoke signature FD for method 'Test.", output); + + // string pinvokeTable = File.ReadAllText(Path.Combine(objDir, "pinvoke-table.h")); + // // Verify that the invoke is in the pinvoke table. Under various circumstances we will silently skip it, + // // for example if the module isn't found + // Assert.Contains("\"accept_double_struct_and_return_float_struct\", accept_double_struct_and_return_float_struct", pinvokeTable); + // // Verify the signature of the C function prototype. Wasm ABI specifies that the structs should both decompose into scalars. + // Assert.Contains("float accept_double_struct_and_return_float_struct (double);", pinvokeTable); + // Assert.Contains("int64_t accept_and_return_i64_struct (int64_t);", pinvokeTable); + + // var runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 3, host: host, id: id); + // Assert.Contains("l (l)=-1148435428713435121", runOutput); + // Assert.Contains("s (s)=-1148435428713435121", runOutput); + // Assert.Contains("f (d)=3.14", runOutput); + // Assert.Contains("f (s)=3.14", runOutput); + // Assert.Contains("s (s)=3.14", runOutput); + // Assert.Contains("paires.B=4", runOutput); + // Assert.Contains("iares[0]=32", runOutput); + // Assert.Contains("iares[1]=2", runOutput); + // Assert.Contains("fares.elements[1]=2", runOutput); + // } + + // [Theory] + // [BuildAndRun(aot: true)] + // public void EnsureWasmAbiRulesAreFollowedInAOT(ProjectInfo buildArgs, RunHost host, string id) => + // EnsureWasmAbiRulesAreFollowed(buildArgs, host, id); + + // [Theory] + // [BuildAndRun(aot: false)] + // public void EnsureWasmAbiRulesAreFollowedInInterpreter(ProjectInfo buildArgs, RunHost host, string id) => + // EnsureWasmAbiRulesAreFollowed(buildArgs, host, id); + + // [Theory] + // [BuildAndRun(aot: true)] + // public void EnsureComInteropCompilesInAOT(ProjectInfo buildArgs, string id) => + // EnsureComInteropCompiles(buildArgs, id); + + // [Theory] + // [BuildAndRun(aot: false)] + // public void UCOWithSpecialCharacters(ProjectInfo buildArgs, RunHost host, string id) + // { + // var extraProperties = "true"; + // var extraItems = @""; + + // buildArgs = ExpandBuildArgs(buildArgs, + // extraItems: extraItems, + // extraProperties: extraProperties); + + // (string libraryDir, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "UnmanagedCallback.cs"), Path.Combine(_projectDir!, "Program.cs")); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "local.c"), Path.Combine(_projectDir!, "local.c")); + // }, + // Publish: true, + // DotnetWasmFromRuntimePack: false)); + + // var runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); + // Assert.DoesNotContain("Conflict.A.Managed8\u4F60Func(123) -> 123", runOutput); + // Assert.Contains("ManagedFunc returned 42", runOutput); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index 417bf4b8d2a51d..43b2e7c1ad06f1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -20,6 +20,7 @@ namespace Wasm.Build.Tests; // For projects using WasmAppBuilder +// ToDo: REMOVE, use WasmSdkBasedProjectProvider only public abstract class ProjectProviderBase(ITestOutputHelper _testOutput, string? _projectDir) { public static string WasmAssemblyExtension = BuildTestBase.s_buildEnv.UseWebcil ? ".wasm" : ".dll"; @@ -43,15 +44,15 @@ public abstract class ProjectProviderBase(ITestOutputHelper _testOutput, string? public bool IsFingerprintingEnabled => IsFingerprintingSupported && EnvironmentVariables.UseFingerprinting; // Returns the actual files on disk - public IReadOnlyDictionary AssertBasicBundle(AssertBundleOptionsBase assertOptions) + public IReadOnlyDictionary AssertBasicBundle(AssertBundleOptions assertOptions) { EnsureProjectDirIsSet(); - var dotnetFiles = FindAndAssertDotnetFiles(assertOptions); + var dotnetFiles = FindAndAssertDotnetFiles(assertOptions); // HERE, why binFrameworkDir empty? - TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, + TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, new[] { "System.Private.CoreLib.dll" }, expectToExist: IsFingerprintingEnabled ? false : !BuildTestBase.UseWebcil); - TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, + TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, new[] { "System.Private.CoreLib.wasm" }, expectToExist: IsFingerprintingEnabled ? false : BuildTestBase.UseWebcil); @@ -77,17 +78,17 @@ public IReadOnlyDictionary AssertBasicBundle(AssertBundl return dotnetFiles; } - public IReadOnlyDictionary FindAndAssertDotnetFiles(AssertBundleOptionsBase assertOptions) + public IReadOnlyDictionary FindAndAssertDotnetFiles(AssertBundleOptions assertOptions) { EnsureProjectDirIsSet(); - return FindAndAssertDotnetFiles(binFrameworkDir: assertOptions.BinFrameworkDir, + return FindAndAssertDotnetFiles(binFrameworkDir: assertOptions.BuildOptions.BinFrameworkDir, expectFingerprintOnDotnetJs: assertOptions.ExpectFingerprintOnDotnetJs, superSet: GetAllKnownDotnetFilesToFingerprintMap(assertOptions), expected: GetDotNetFilesExpectedSet(assertOptions)); } - protected abstract IReadOnlyDictionary GetAllKnownDotnetFilesToFingerprintMap(AssertBundleOptionsBase assertOptions); - protected abstract IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOptionsBase assertOptions); + protected abstract IReadOnlyDictionary GetAllKnownDotnetFilesToFingerprintMap(AssertBundleOptions assertOptions); + protected abstract IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOptions assertOptions); public IReadOnlyDictionary FindAndAssertDotnetFiles( string binFrameworkDir, @@ -201,34 +202,38 @@ private void AssertDotNetFilesSet( } } - public void CompareStat(IDictionary oldStat, IDictionary newStat, IEnumerable<(string fullpath, bool unchanged)> expected) + public void CompareStat(IDictionary oldStat, IDictionary newStat, IDictionary expected) { StringBuilder msg = new(); foreach (var expect in expected) { - string expectFilename = Path.GetFileName(expect.fullpath); - if (!oldStat.TryGetValue(expectFilename, out FileStat? oldFs)) + if (!oldStat.TryGetValue(expect.Key, out FileStat? oldFs)) { - msg.AppendLine($"Could not find an entry for {expectFilename} in old files"); + msg.AppendLine($"Could not find an entry for {expect.Key} in old files"); continue; } - if (!newStat.TryGetValue(expectFilename, out FileStat? newFs)) + if (!newStat.TryGetValue(expect.Key, out FileStat? newFs)) { - msg.AppendLine($"Could not find an entry for {expectFilename} in new files"); + msg.AppendLine($"Could not find an entry for {expect.Key} in new files"); continue; } - bool actualUnchanged = oldFs == newFs; - if (expect.unchanged && !actualUnchanged) + // files never existed existed => no change + // fingerprinting is enabled => can't compare paths + bool actualUnchanged = (!oldFs.Exists && !newFs.Exists) || + IsFingerprintingEnabled && (oldFs.Length == newFs.Length && oldFs.LastWriteTimeUtc == newFs.LastWriteTimeUtc) || + !IsFingerprintingEnabled && oldFs == newFs; + + if (expect.Value.unchanged && !actualUnchanged) { - msg.AppendLine($"[Expected unchanged file: {expectFilename}]{Environment.NewLine}" + + msg.AppendLine($"[Expected unchanged file: {expect.Key}]{Environment.NewLine}" + $" old: {oldFs}{Environment.NewLine}" + $" new: {newFs}"); } - else if (!expect.unchanged && actualUnchanged) + else if (!expect.Value.unchanged && actualUnchanged) { - msg.AppendLine($"[Expected changed file: {expectFilename}]{Environment.NewLine}" + + msg.AppendLine($"[Expected changed file: {expect.Key}]{Environment.NewLine}" + $" {newFs}"); } } @@ -237,33 +242,27 @@ public void CompareStat(IDictionary oldStat, IDictionary StatFiles(IEnumerable fullpaths) + public IDictionary StatFiles(IDictionary pathsDict) { Dictionary table = new(); - foreach (string file in fullpaths) + foreach (var fileInfo in pathsDict) { - if (File.Exists(file)) - table.Add(Path.GetFileName(file), new FileStat(FullPath: file, Exists: true, LastWriteTimeUtc: File.GetLastWriteTimeUtc(file), Length: new FileInfo(file).Length)); + string file = fileInfo.Value.fullPath; + string nameNoFingerprinting = fileInfo.Key; + bool exists = File.Exists(file); + if (exists) + { + table.Add(nameNoFingerprinting, new FileStat(FullPath: file, Exists: true, LastWriteTimeUtc: File.GetLastWriteTimeUtc(file), Length: new FileInfo(file).Length)); + } else - table.Add(Path.GetFileName(file), new FileStat(FullPath: file, Exists: false, LastWriteTimeUtc: DateTime.MinValue, Length: 0)); + { + table.Add(nameNoFingerprinting, new FileStat(FullPath: file, Exists: false, LastWriteTimeUtc: DateTime.MinValue, Length: 0)); + } } return table; } - public static string FindSubDirIgnoringCase(string parentDir, string dirName) - { - IEnumerable matchingDirs = Directory.EnumerateDirectories(parentDir, - dirName, - new EnumerationOptions { MatchCasing = MatchCasing.CaseInsensitive }); - - string? first = matchingDirs.FirstOrDefault(); - if (matchingDirs.Count() > 1) - throw new Exception($"Found multiple directories with names that differ only in case. {string.Join(", ", matchingDirs.ToArray())}"); - - return first ?? Path.Combine(parentDir, dirName); - } - public IDictionary GetFilesTable(bool unchanged, params string[] baseDirs) { var dict = new Dictionary(); @@ -276,11 +275,11 @@ public static string FindSubDirIgnoringCase(string parentDir, string dirName) return dict; } - public IDictionary GetFilesTable(BuildArgs buildArgs, BuildPaths paths, bool unchanged) + public IDictionary GetFilesTable(ProjectInfo projectInfo, BuildPaths paths, bool unchanged) { List files = new() { - Path.Combine(paths.BinDir, "publish", $"{buildArgs.ProjectName}.dll"), + Path.Combine(paths.BinDir, "publish", BundleDirName, "_framework", $"{projectInfo.ProjectName}.wasm"), Path.Combine(paths.ObjWasmDir, "driver.o"), Path.Combine(paths.ObjWasmDir, "runtime.o"), Path.Combine(paths.ObjWasmDir, "corebindings.o"), @@ -290,17 +289,17 @@ public static string FindSubDirIgnoringCase(string parentDir, string dirName) Path.Combine(paths.ObjWasmDir, "pinvoke-table.h"), Path.Combine(paths.ObjWasmDir, "driver-gen.c"), - Path.Combine(paths.BundleDir, "_framework", "dotnet.native.wasm"), - Path.Combine(paths.BundleDir, "_framework", "dotnet.native.js"), - Path.Combine(paths.BundleDir, "_framework", "dotnet.globalization.js"), + Path.Combine(paths.BinFrameworkDir, "dotnet.native.wasm"), + Path.Combine(paths.BinFrameworkDir, "dotnet.native.js"), + Path.Combine(paths.BinFrameworkDir, "dotnet.globalization.js"), }; - if (buildArgs.AOT) + if (projectInfo.AOT) { files.AddRange(new[] { - Path.Combine(paths.ObjWasmDir, $"{buildArgs.ProjectName}.dll.bc"), - Path.Combine(paths.ObjWasmDir, $"{buildArgs.ProjectName}.dll.o"), + Path.Combine(paths.ObjWasmDir, $"{projectInfo.ProjectName}.dll.bc"), + Path.Combine(paths.ObjWasmDir, $"{projectInfo.ProjectName}.dll.o"), Path.Combine(paths.ObjWasmDir, "System.Private.CoreLib.dll.bc"), Path.Combine(paths.ObjWasmDir, "System.Private.CoreLib.dll.o"), @@ -312,12 +311,38 @@ public static string FindSubDirIgnoringCase(string parentDir, string dirName) dict[Path.GetFileName(file)] = (file, unchanged); // those files do not change on re-link - dict["dotnet.js"]=(Path.Combine(paths.BundleDir, "_framework", "dotnet.js"), true); - dict["dotnet.js.map"]=(Path.Combine(paths.BundleDir, "_framework", "dotnet.js.map"), true); - dict["dotnet.runtime.js"]=(Path.Combine(paths.BundleDir, "_framework", "dotnet.runtime.js"), true); - dict["dotnet.runtime.js.map"]=(Path.Combine(paths.BundleDir, "_framework", "dotnet.runtime.js.map"), true); - dict["dotnet.globalization.js"]=(Path.Combine(paths.BundleDir, "_framework", "dotnet.globalization.js"), true); + dict["dotnet.js"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.js"), true); + dict["dotnet.js.map"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.js.map"), true); + dict["dotnet.runtime.js"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.runtime.js"), true); + dict["dotnet.runtime.js.map"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.runtime.js.map"), true); + dict["dotnet.globalization.js"]=(Path.Combine(paths.BinFrameworkDir, "dotnet.globalization.js"), true); + + if (IsFingerprintingEnabled) + { + string bootJsonPath = Path.Combine(paths.BinFrameworkDir, "blazor.boot.json"); + BootJsonData bootJson = GetBootJson(bootJsonPath); + var keysToUpdate = new List(); + var updates = new List<(string oldKey, string newKey, (string fullPath, bool unchanged) value)>(); + foreach (var expectedItem in dict) + { + string filename = Path.GetFileName(expectedItem.Value.fullPath); + var expectedFingerprintedItem = bootJson.resources.fingerprinting + .Where(kv => kv.Value == filename) + .SingleOrDefault().Key; + + if (string.IsNullOrEmpty(expectedFingerprintedItem)) + continue; + if (filename != expectedFingerprintedItem) + { + string newKey = Path.Combine( + Path.GetDirectoryName(expectedItem.Value.fullPath) ?? "", + expectedFingerprintedItem + ); + dict[filename] = (newKey, expectedItem.Value.unchanged); + } + } + } return dict; } @@ -337,23 +362,23 @@ public static void AssertRuntimePackPath(string buildOutput, string targetFramew throw new XunitException($"Runtime pack path doesn't match.{Environment.NewLine}Expected: '{expectedRuntimePackDir}'{Environment.NewLine}Actual: '{actualPath}'"); } - public static void AssertDotNetJsSymbols(AssertBundleOptionsBase assertOptions) + public static void AssertDotNetJsSymbols(AssertBundleOptions assertOptions) { - TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, new[] { "dotnet.native.js.symbols" }, expectToExist: assertOptions.ExpectSymbolsFile); + TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, new[] { "dotnet.native.js.symbols" }, expectToExist: assertOptions.ExpectSymbolsFile); - if (assertOptions.ExpectedFileType == NativeFilesType.FromRuntimePack) + if (assertOptions.BuildOptions.ExpectedFileType == NativeFilesType.FromRuntimePack) { TestUtils.AssertFile( - Path.Combine(BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.TargetFramework, assertOptions.RuntimeType), "dotnet.native.js.symbols"), - Path.Combine(assertOptions.BinFrameworkDir, "dotnet.native.js.symbols"), + Path.Combine(BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.BuildOptions.TargetFramework, assertOptions.BuildOptions.RuntimeType), "dotnet.native.js.symbols"), + Path.Combine(assertOptions.BuildOptions.BinFrameworkDir, "dotnet.native.js.symbols"), same: true); } } - public void AssertIcuAssets(AssertBundleOptionsBase assertOptions, BootJsonData bootJson) + public void AssertIcuAssets(AssertBundleOptions assertOptions, BootJsonData bootJson) { List expected = new(); - switch (assertOptions.GlobalizationMode) + switch (assertOptions.BuildOptions.GlobalizationMode) { case GlobalizationMode.Invariant: break; @@ -365,11 +390,11 @@ public void AssertIcuAssets(AssertBundleOptionsBase assertOptions, BootJsonData expected.Add("segmentation-rules.json"); break; case GlobalizationMode.Custom: - if (string.IsNullOrEmpty(assertOptions.CustomIcuFile)) + if (string.IsNullOrEmpty(assertOptions.BuildOptions.CustomIcuFile)) throw new ArgumentException("WasmBuildTest is invalid, value for Custom globalization mode is required when GlobalizationMode=Custom."); // predefined ICU name can be identical with the icu files from runtime pack - expected.Add(Path.GetFileName(assertOptions.CustomIcuFile)); + expected.Add(Path.GetFileName(assertOptions.BuildOptions.CustomIcuFile)); break; case GlobalizationMode.Sharded: // icu shard chosen based on the locale @@ -378,12 +403,12 @@ public void AssertIcuAssets(AssertBundleOptionsBase assertOptions, BootJsonData expected.Add("icudt_no_CJK.dat"); break; default: - throw new NotImplementedException($"Unknown {nameof(assertOptions.GlobalizationMode)} = {assertOptions.GlobalizationMode}"); + throw new NotImplementedException($"Unknown {nameof(assertOptions.BuildOptions.GlobalizationMode)} = {assertOptions.BuildOptions.GlobalizationMode}"); } - IEnumerable actual = Directory.EnumerateFiles(assertOptions.BinFrameworkDir, "icudt*dat"); - if (assertOptions.GlobalizationMode == GlobalizationMode.Hybrid) - actual = actual.Union(Directory.EnumerateFiles(assertOptions.BinFrameworkDir, "segmentation-rules*json")); + IEnumerable actual = Directory.EnumerateFiles(assertOptions.BuildOptions.BinFrameworkDir, "icudt*dat"); + if (assertOptions.BuildOptions.GlobalizationMode == GlobalizationMode.Hybrid) + actual = actual.Union(Directory.EnumerateFiles(assertOptions.BuildOptions.BinFrameworkDir, "segmentation-rules*json")); if (IsFingerprintingEnabled) { @@ -401,24 +426,27 @@ public void AssertIcuAssets(AssertBundleOptionsBase assertOptions, BootJsonData } AssertFileNames(expected, actual); - if (assertOptions.GlobalizationMode is GlobalizationMode.Custom) + if (assertOptions.BuildOptions.GlobalizationMode is GlobalizationMode.Custom) { - string srcPath = assertOptions.CustomIcuFile!; - string runtimePackDir = BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.TargetFramework, assertOptions.RuntimeType); + string srcPath = assertOptions.BuildOptions.CustomIcuFile!; + string runtimePackDir = BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.BuildOptions.TargetFramework, assertOptions.BuildOptions.RuntimeType); if (!Path.IsPathRooted(srcPath)) - srcPath = Path.Combine(runtimePackDir, assertOptions.CustomIcuFile!); + srcPath = Path.Combine(runtimePackDir, assertOptions.BuildOptions.CustomIcuFile!); TestUtils.AssertSameFile(srcPath, actual.Single()); } } - public BootJsonData AssertBootJson(AssertBundleOptionsBase options) + private BootJsonData GetBootJson(string bootJsonPath) { - EnsureProjectDirIsSet(); - string binFrameworkDir = options.BinFrameworkDir; - string bootJsonPath = Path.Combine(binFrameworkDir, options.BootJsonFileName); Assert.True(File.Exists(bootJsonPath), $"Expected to find {bootJsonPath}"); + return ParseBootData(bootJsonPath); + } - BootJsonData bootJson = ParseBootData(bootJsonPath); + public BootJsonData AssertBootJson(AssertBundleOptions options) + { + EnsureProjectDirIsSet(); + string bootJsonPath = Path.Combine(options.BuildOptions.BinFrameworkDir, options.BuildOptions.BootConfigFileName); + BootJsonData bootJson = GetBootJson(bootJsonPath); string spcExpectedFilename = $"System.Private.CoreLib{WasmAssemblyExtension}"; if (IsFingerprintingEnabled) @@ -519,7 +547,7 @@ private void AssertFileNames(IEnumerable expected, IEnumerable a Assert.Equal(expected, actualFileNames); } - public virtual string FindBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) + public virtual string GetBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) { throw new NotImplementedException(); } diff --git a/src/mono/wasm/Wasm.Build.Tests/README.md b/src/mono/wasm/Wasm.Build.Tests/README.md index 19fcaa84cf3c3a..de0c2b9540dffe 100644 --- a/src/mono/wasm/Wasm.Build.Tests/README.md +++ b/src/mono/wasm/Wasm.Build.Tests/README.md @@ -32,9 +32,9 @@ Most of the tests are structured on the idea that for a given case (or combination of options), we want to: 1. build once -2. run the same build with different hosts, eg. V8, Chrome, Firefox etc. +2. run the same build with different hosts, eg. Chrome, Firefox etc. -For this, the builds get cached using `BuildArgs` as the key. +For this, the builds get cached using `ProjectInfo` as the key. ## notes: diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index 0a316a4b601c75..f7c272e32782bd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -23,51 +23,50 @@ public RebuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bui public static IEnumerable NonNativeDebugRebuildData() => ConfigWithAOTData(aot: false, config: "Debug") - .WithRunHosts(RunHost.Chrome) .UnwrapItemsAsArrays().ToList(); - [Theory] - [MemberData(nameof(NonNativeDebugRebuildData))] - public async Task NoOpRebuild(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"rebuild_{buildArgs.Config}_{buildArgs.AOT}"; + // [Theory] + // [MemberData(nameof(NonNativeDebugRebuildData))] + // public async Task NoOpRebuild(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"rebuild_{buildArgs.Configuration}_{buildArgs.AOT}"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs); + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs); - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: true, - CreateProject: true)); + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), + // DotnetWasmFromRuntimePack: true, + // CreateProject: true)); - Run(); + // Run(); - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); + // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) + // throw new XunitException($"Test bug: could not get the build product in the cache"); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + // File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); - // artificial delay to have new enough timestamps - await Task.Delay(5000); + // // artificial delay to have new enough timestamps + // await Task.Delay(5000); - _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); + // _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); - // no-op Rebuild - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - DotnetWasmFromRuntimePack: true, - CreateProject: false, - UseCache: false)); + // // no-op Rebuild + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // DotnetWasmFromRuntimePack: true, + // CreateProject: false, + // UseCache: false)); - Run(); + // Run(); - void Run() => RunAndTestWasmApp( - buildArgs, buildDir: _projectDir, expectedExitCode: 42, - test: output => {}, - host: host, id: id); - } + // void Run() => RunAndTestWasmApp( + // buildArgs, buildDir: _projectDir, expectedExitCode: 42, + // test: output => {}, + // host: host, id: id); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index 0f2a4dc1365525..ecb59aaad77c61 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -19,207 +19,206 @@ public SatelliteAssembliesTests(ITestOutputHelper output, SharedBuildPerTestClas { } - public static IEnumerable SatelliteAssemblyTestData(bool aot, bool relinking, RunHost host) - => ConfigWithAOTData(aot) - .Multiply( - new object?[] { relinking, "es-ES" }, - new object?[] { relinking, null }, - new object?[] { relinking, "ja-JP" }) - .WithRunHosts(host) - .UnwrapItemsAsArrays(); - - [Theory] - [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false, RunHost.All })] - [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true, RunHost.All })] - [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false, RunHost.All })] - public void ResourcesFromMainAssembly(BuildArgs buildArgs, - bool nativeRelink, - string? argCulture, - RunHost host, - string id) - { - string projectName = $"sat_asm_from_main_asm"; - // Release+publish defaults to native relinking - bool dotnetWasmFromRuntimePack = !nativeRelink && !buildArgs.AOT && buildArgs.Config != "Release"; - - string extraProperties = (nativeRelink ? $"true" : string.Empty) - // make ASSERTIONS=1 so that we test with it - + $"-O0 -sASSERTIONS=1" - + $"-O1"; - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, - projectTemplate: s_resourcesProjectTemplate, - extraProperties: extraProperties); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); - CreateProgramForCultureTest(_projectDir!, $"{projectName}.resx.words", "TestClass"); - }, - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - - RunAndTestWasmApp( - buildArgs, expectedExitCode: 42, - args: argCulture, - host: host, id: id, - // check that downloading assets doesn't have timing race conditions - extraXHarnessMonoArgs: host is RunHost.Chrome ? "--fetch-random-delay=200" : string.Empty); - } - - [Theory] - [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false, RunHost.All })] - [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true, RunHost.All })] - [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false, RunHost.All })] - public void ResourcesFromProjectReference(BuildArgs buildArgs, - bool nativeRelink, - string? argCulture, - RunHost host, - string id) - { - string projectName = $"SatelliteAssemblyFromProjectRef"; - bool dotnetWasmFromRuntimePack = !nativeRelink && !buildArgs.AOT; - - string extraProperties = $"{(nativeRelink ? "true" : "false")}" - // make ASSERTIONS=1 so that we test with it - + $"-O0 -sASSERTIONS=1" - + $"-O1"; - - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, - projectTemplate: s_resourcesProjectTemplate, - extraProperties: extraProperties, - extraItems: $""); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - InitProject: () => - { - string rootDir = _projectDir!; - _projectDir = Path.Combine(rootDir, projectName); - - Directory.CreateDirectory(_projectDir); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, projectName), rootDir); - - // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't - // affect the non-wasm library project - File.Move(Path.Combine(rootDir, "Directory.Build.props"), Path.Combine(_projectDir, "Directory.Build.props")); - File.Move(Path.Combine(rootDir, "Directory.Build.targets"), Path.Combine(_projectDir, "Directory.Build.targets")); - if (UseWBTOverridePackTargets) - File.Move(Path.Combine(rootDir, "WasmOverridePacks.targets"), Path.Combine(_projectDir, "WasmOverridePacks.targets")); - - CreateProgramForCultureTest(_projectDir, "LibraryWithResources.resx.words", "LibraryWithResources.Class1"); - - // The root D.B* should be empty - File.WriteAllText(Path.Combine(rootDir, "Directory.Build.props"), ""); - File.WriteAllText(Path.Combine(rootDir, "Directory.Build.targets"), ""); - })); - - RunAndTestWasmApp(buildArgs, - expectedExitCode: 42, - args: argCulture, - host: host, id: id); - } - -#pragma warning disable xUnit1026 - [Theory] - [BuildAndRun(host: RunHost.None, aot: true)] - public void CheckThatSatelliteAssembliesAreNotAOTed(BuildArgs buildArgs, string id) - { - string projectName = $"check_sat_asm_not_aot"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, - projectTemplate: s_resourcesProjectTemplate, - extraProperties: $@" - -O1 - -O1 - false", // -O0 can cause aot-instances.dll to blow up, and fail to compile, and it is not really needed here - extraItems: $""); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => CreateProgramForCultureTest(_projectDir!, $"{projectName}.words", "TestClass"), - DotnetWasmFromRuntimePack: false)); - - var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) - .Select(path => Path.GetFileName(path)) - .ToArray(); - - // sanity check, in case we change file extensions - Assert.Contains($"{projectName}.dll.bc", bitCodeFileNames); - - Assert.Empty(bitCodeFileNames.Where(file => file.EndsWith(".resources.dll.bc"))); - } -#pragma warning restore xUnit1026 - - private void CreateProgramForCultureTest(string dir, string resourceName, string typeName) - => File.WriteAllText(Path.Combine(dir, "Program.cs"), - s_cultureResourceTestProgram - .Replace("##RESOURCE_NAME##", resourceName) - .Replace("##TYPE_NAME##", typeName)); - - private const string s_resourcesProjectTemplate = - @$" - - {DefaultTargetFramework} - browser-wasm - Exe - true - test-main.js - ##EXTRA_PROPERTIES## - - - ##EXTRA_ITEMS## - - ##INSERT_AT_END## - "; - - private static string s_cultureResourceTestProgram = @" -using System; -using System.Runtime.CompilerServices; -using System.Globalization; -using System.Resources; -using System.Threading; - -namespace ResourcesTest -{ - public class TestClass - { - public static int Main(string[] args) - { - string expected; - if (args.Length == 1) - { - string cultureToTest = args[0]; - var newCulture = new CultureInfo(cultureToTest); - Thread.CurrentThread.CurrentCulture = newCulture; - Thread.CurrentThread.CurrentUICulture = newCulture; - - if (cultureToTest == ""es-ES"") - expected = ""hola""; - else if (cultureToTest == ""ja-JP"") - expected = ""\u3053\u3093\u306B\u3061\u306F""; - else - throw new Exception(""Cannot determine the expected output for {cultureToTest}""); - - } else { - expected = ""hello""; - } - - var currentCultureName = Thread.CurrentThread.CurrentCulture.Name; - - var rm = new ResourceManager(""##RESOURCE_NAME##"", typeof(##TYPE_NAME##).Assembly); - Console.WriteLine($""For '{currentCultureName}' got: {rm.GetString(""hello"")}""); - - return rm.GetString(""hello"") == expected ? 42 : -1; - } - } -}"; + // public static IEnumerable SatelliteAssemblyTestData(bool aot, bool relinking) + // => ConfigWithAOTData(aot) + // .Multiply( + // new object?[] { relinking, "es-ES" }, + // new object?[] { relinking, null }, + // new object?[] { relinking, "ja-JP" }) + // .UnwrapItemsAsArrays(); + + // [Theory] + // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false, RunHost.All })] + // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true, RunHost.All })] + // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false, RunHost.All })] + // public void ResourcesFromMainAssembly(ProjectInfo buildArgs, + // bool nativeRelink, + // string? argCulture, + // RunHost host, + // string id) + // { + // string projectName = $"sat_asm_from_main_asm"; + // // Release+publish defaults to native relinking + // bool dotnetWasmFromRuntimePack = !nativeRelink && !buildArgs.AOT && buildArgs.Configuration != "Release"; + + // string extraProperties = (nativeRelink ? $"true" : string.Empty) + // // make ASSERTIONS=1 so that we test with it + // + $"-O0 -sASSERTIONS=1" + // + $"-O1"; + + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, + // projectTemplate: s_resourcesProjectTemplate, + // extraProperties: extraProperties); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); + // CreateProgramForCultureTest(_projectDir!, $"{projectName}.resx.words", "TestClass"); + // }, + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); + + // RunAndTestWasmApp( + // buildArgs, expectedExitCode: 42, + // args: argCulture, + // host: host, id: id, + // // check that downloading assets doesn't have timing race conditions + // extraXHarnessMonoArgs: host is RunHost.Chrome ? "--fetch-random-delay=200" : string.Empty); + // } + + // [Theory] + // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false, RunHost.All })] + // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true, RunHost.All })] + // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false, RunHost.All })] + // public void ResourcesFromProjectReference(ProjectInfo buildArgs, + // bool nativeRelink, + // string? argCulture, + // RunHost host, + // string id) + // { + // string projectName = $"SatelliteAssemblyFromProjectRef"; + // bool dotnetWasmFromRuntimePack = !nativeRelink && !buildArgs.AOT; + + // string extraProperties = $"{(nativeRelink ? "true" : "false")}" + // // make ASSERTIONS=1 so that we test with it + // + $"-O0 -sASSERTIONS=1" + // + $"-O1"; + + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, + // projectTemplate: s_resourcesProjectTemplate, + // extraProperties: extraProperties, + // extraItems: $""); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, + // InitProject: () => + // { + // string rootDir = _projectDir!; + // _projectDir = Path.Combine(rootDir, projectName); + + // Directory.CreateDirectory(_projectDir); + // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, projectName), rootDir); + + // // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't + // // affect the non-wasm library project + // File.Move(Path.Combine(rootDir, "Directory.Build.props"), Path.Combine(_projectDir, "Directory.Build.props")); + // File.Move(Path.Combine(rootDir, "Directory.Build.targets"), Path.Combine(_projectDir, "Directory.Build.targets")); + // if (UseWBTOverridePackTargets) + // File.Move(Path.Combine(rootDir, "WasmOverridePacks.targets"), Path.Combine(_projectDir, "WasmOverridePacks.targets")); + + // CreateProgramForCultureTest(_projectDir, "LibraryWithResources.resx.words", "LibraryWithResources.Class1"); + + // // The root D.B* should be empty + // File.WriteAllText(Path.Combine(rootDir, "Directory.Build.props"), ""); + // File.WriteAllText(Path.Combine(rootDir, "Directory.Build.targets"), ""); + // })); + + // RunAndTestWasmApp(buildArgs, + // expectedExitCode: 42, + // args: argCulture, + // host: host, id: id); + // } + +// #pragma warning disable xUnit1026 +// [Theory] +// [BuildAndRun(aot: true)] +// public void CheckThatSatelliteAssembliesAreNotAOTed(ProjectInfo buildArgs, string id) +// { +// string projectName = $"check_sat_asm_not_aot"; +// buildArgs = buildArgs with { ProjectName = projectName }; +// buildArgs = ExpandBuildArgs(buildArgs, +// projectTemplate: s_resourcesProjectTemplate, +// extraProperties: $@" +// -O1 +// -O1 +// false", // -O0 can cause aot-instances.dll to blow up, and fail to compile, and it is not really needed here +// extraItems: $""); + +// BuildProject(buildArgs, +// id: id, +// new BuildProjectOptions( +// InitProject: () => CreateProgramForCultureTest(_projectDir!, $"{projectName}.words", "TestClass"), +// DotnetWasmFromRuntimePack: false)); + +// var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) +// .Select(path => Path.GetFileName(path)) +// .ToArray(); + +// // sanity check, in case we change file extensions +// Assert.Contains($"{projectName}.dll.bc", bitCodeFileNames); + +// Assert.Empty(bitCodeFileNames.Where(file => file.EndsWith(".resources.dll.bc"))); +// } +// #pragma warning restore xUnit1026 + +// private void CreateProgramForCultureTest(string dir, string resourceName, string typeName) +// => File.WriteAllText(Path.Combine(dir, "Program.cs"), +// s_cultureResourceTestProgram +// .Replace("##RESOURCE_NAME##", resourceName) +// .Replace("##TYPE_NAME##", typeName)); + +// private const string s_resourcesProjectTemplate = +// @$" +// +// {DefaultTargetFramework} +// browser-wasm +// Exe +// true +// test-main.js +// ##EXTRA_PROPERTIES## +// +// +// ##EXTRA_ITEMS## +// +// ##INSERT_AT_END## +// "; + +// private static string s_cultureResourceTestProgram = @" +// using System; +// using System.Runtime.CompilerServices; +// using System.Globalization; +// using System.Resources; +// using System.Threading; + +// namespace ResourcesTest +// { +// public class TestClass +// { +// public static int Main(string[] args) +// { +// string expected; +// if (args.Length == 1) +// { +// string cultureToTest = args[0]; +// var newCulture = new CultureInfo(cultureToTest); +// Thread.CurrentThread.CurrentCulture = newCulture; +// Thread.CurrentThread.CurrentUICulture = newCulture; + +// if (cultureToTest == ""es-ES"") +// expected = ""hola""; +// else if (cultureToTest == ""ja-JP"") +// expected = ""\u3053\u3093\u306B\u3061\u306F""; +// else +// throw new Exception(""Cannot determine the expected output for {cultureToTest}""); + +// } else { +// expected = ""hello""; +// } + +// var currentCultureName = Thread.CurrentThread.CurrentCulture.Name; + +// var rm = new ResourceManager(""##RESOURCE_NAME##"", typeof(##TYPE_NAME##).Assembly); +// Console.WriteLine($""For '{currentCultureName}' got: {rm.GetString(""hello"")}""); + +// return rm.GetString(""hello"") == expected ? 42 : -1; +// } +// } +// }"; } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index e76e1112e6b638..65739f8a32bf5f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -18,88 +18,85 @@ public NativeBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture { } - [Theory] - [InlineData(true)] - [InlineData(false)] - public void BuildWithUndefinedNativeSymbol(bool allowUndefined) - { - string id = $"UndefinedNativeSymbol_{(allowUndefined ? "allowed" : "disabled")}_{GetRandomId()}"; - - string code = @" - using System; - using System.Runtime.InteropServices; - - call(); - return 42; - - [DllImport(""undefined_xyz"")] static extern void call(); - "; - - string projectPath = CreateWasmTemplateProject(id); - - AddItemsPropertiesToProject( - projectPath, - extraItems: @$"", - extraProperties: allowUndefined ? $"true" : null - ); - - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); - - using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); - CommandResult result = cmd.WithWorkingDirectory(_projectDir!) - .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - .ExecuteWithCapturedOutput("build", "-c Release"); - - if (allowUndefined) - { - Assert.True(result.ExitCode == 0, "Expected build to succeed"); - } - else - { - Assert.False(result.ExitCode == 0, "Expected build to fail"); - Assert.Contains("undefined symbol: sgfg", result.Output); - Assert.Contains("Use '-p:WasmAllowUndefinedSymbols=true' to allow undefined symbols", result.Output); - } - } - - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config) - { - string id = $"dllimport_incompatible_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, template: "wasmbrowser"); - string projectName = Path.GetFileNameWithoutExtension(projectFile); - - string nativeSourceFilename = "incompatible_type.c"; - string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}"; - File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode); - - AddItemsPropertiesToProject( - projectFile, - extraItems: "" - ); - - UpdateBrowserMainJs(); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs"), - Path.Combine(_projectDir!, "Program.cs"), - overwrite: true); - - var buildArgs = new BuildArgs(projectName, config, false, id, null); - buildArgs = ExpandBuildArgs(buildArgs); - BuildTemplateProject(buildArgs, id: id, new BuildProjectOptions( - AssertAppBundle: false, - CreateProject: false, - HasV8Script: false, - MainJS: "main.mjs", - Publish: false, - TargetFramework: DefaultTargetFramework, - IsBrowserProject: true) - ); - string runOutput = await RunBuiltBrowserApp(config, projectFile); - - Assert.Contains("call_needing_marhsal_ilgen got called", runOutput); - } + // [Theory] + // [InlineData(true)] + // [InlineData(false)] + // public void BuildWithUndefinedNativeSymbol(bool allowUndefined) + // { + // string id = $"UndefinedNativeSymbol_{(allowUndefined ? "allowed" : "disabled")}_{GetRandomId()}"; + + // string code = @" + // using System; + // using System.Runtime.InteropServices; + + // call(); + // return 42; + + // [DllImport(""undefined_xyz"")] static extern void call(); + // "; + + // string projectPath = CreateWasmTemplateProject(id); + + // AddItemsPropertiesToProject( + // projectPath, + // extraItems: @$"", + // extraProperties: allowUndefined ? $"true" : null + // ); + + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); + + // using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); + // CommandResult result = cmd.WithWorkingDirectory(_projectDir!) + // .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + // .ExecuteWithCapturedOutput("build", "-c Release"); + + // if (allowUndefined) + // { + // Assert.True(result.ExitCode == 0, "Expected build to succeed"); + // } + // else + // { + // Assert.False(result.ExitCode == 0, "Expected build to fail"); + // Assert.Contains("undefined symbol: sgfg", result.Output); + // Assert.Contains("Use '-p:WasmAllowUndefinedSymbols=true' to allow undefined symbols", result.Output); + // } + // } + + // [Theory] + // [InlineData("Debug")] + // [InlineData("Release")] + // public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config) + // { + // string id = $"dllimport_incompatible_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, template: "wasmbrowser"); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + + // string nativeSourceFilename = "incompatible_type.c"; + // string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}"; + // File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode); + + // AddItemsPropertiesToProject( + // projectFile, + // extraItems: "" + // ); + + // UpdateBrowserMainJs(); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs"), + // Path.Combine(_projectDir!, "Program.cs"), + // overwrite: true); + + // var buildArgs = new ProjectInfo(projectName, config, false, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // BuildTemplateProject(buildArgs, id: id, new BuildProjectOptions( + // AssertAppBundle: false, + // CreateProject: false, + // Publish: false, + // TargetFramework: DefaultTargetFramework) + // ); + // string runOutput = await RunBuiltBrowserApp(config, projectFile); + + // Assert.Contains("call_needing_marhsal_ilgen got called", runOutput); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 89107e11d1868e..d5aad6f6f29444 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -22,255 +22,251 @@ public WasmTemplateTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur { } - private BuildProjectOptions _basePublishProjectOptions = new BuildProjectOptions( - DotnetWasmFromRuntimePack: false, - CreateProject: false, - HasV8Script: false, - MainJS: "main.js", - Publish: true - ); - private BuildProjectOptions _baseBuildProjectOptions = new BuildProjectOptions( - DotnetWasmFromRuntimePack: true, - CreateProject: false, - HasV8Script: false, - MainJS: "main.js", - Publish: false - ); - - [Theory, TestCategory("no-fingerprinting")] - [InlineData("Debug")] - [InlineData("Release")] - public void BrowserBuildThenPublish(string config) - { - string id = $"browser_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - string projectName = Path.GetFileNameWithoutExtension(projectFile); - - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - - var buildArgs = new BuildArgs(projectName, config, false, id, null); - - AddItemsPropertiesToProject(projectFile, - atTheEnd: - """ - - - <_LinkedOutFile Include="$(IntermediateOutputPath)\linked\*.dll" /> - - - - """ - ); - - buildArgs = ExpandBuildArgs(buildArgs); - BuildTemplateProject(buildArgs, id: id, _baseBuildProjectOptions); - - if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); - - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); - - _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); - - bool expectRelinking = config == "Release"; - BuildTemplateProject(buildArgs, - id: id, - _basePublishProjectOptions with - { - UseCache = false, - DotnetWasmFromRuntimePack = !expectRelinking, - } - ); - } - - public static TheoryData TestDataForAppBundleDir() - { - var data = new TheoryData(); - AddTestData(runOutsideProjectDirectory: false); - AddTestData(runOutsideProjectDirectory: true); - - void AddTestData(bool runOutsideProjectDirectory) - { - // FIXME: Disabled for `main` right now, till 7.0 gets the fix - data.Add(runOutsideProjectDirectory, string.Empty); - data.Add(runOutsideProjectDirectory, - $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); - data.Add(runOutsideProjectDirectory, - $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); - } - - return data; - } - - [Theory, TestCategory("no-fingerprinting")] - [MemberData(nameof(TestDataForAppBundleDir))] - [ActiveIssue("https://github.com/dotnet/runtime/issues/108107")] - public async Task RunWithDifferentAppBundleLocations(bool runOutsideProjectDirectory, string extraProperties) - => await BrowserRunTwiceWithAndThenWithoutBuildAsync("Release", extraProperties, runOutsideProjectDirectory); - - private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, string extraProperties = "", bool runOutsideProjectDirectory = false) - { - string id = $"browser_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - - if (!string.IsNullOrEmpty(extraProperties)) - AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir!; - - { - using var runCommand = new RunCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(workingDir); - - await using var runner = new BrowserRunner(_testOutput); - var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --project \"{projectFile}\" --forward-console"); - await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); - Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); - } - - { - using var runCommand = new RunCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(workingDir); - - await using var runner = new BrowserRunner(_testOutput); - var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{projectFile}\" --forward-console"); - await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); - Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); - } - } - - public static IEnumerable BrowserBuildAndRunTestData() - { - yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, DefaultRuntimeAssetsRelativePath }; - yield return new object?[] { "-f net9.0", "net9.0", DefaultRuntimeAssetsRelativePath }; - - if (EnvironmentVariables.WorkloadsTestPreviousVersions) - yield return new object?[] { "-f net8.0", "net8.0", DefaultRuntimeAssetsRelativePath }; - - // ActiveIssue("https://github.com/dotnet/runtime/issues/90979") - // yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, "./" }; - // yield return new object?[] { "-f net8.0", "net8.0", "./" }; - } - - [Theory] - [MemberData(nameof(BrowserBuildAndRunTestData))] - public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework, string runtimeAssetsRelativePath) - { - string config = "Debug"; - string id = $"browser_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "wasmbrowser", extraNewArgs, addFrameworkArg: extraNewArgs.Length == 0); - string projectName = Path.GetFileNameWithoutExtension(projectFile); - string extraProperties = runtimeAssetsRelativePath == DefaultRuntimeAssetsRelativePath ? - "" : - $"{runtimeAssetsRelativePath}"; - AddItemsPropertiesToProject(projectFile, extraProperties); - - if (targetFramework != "net8.0") - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath); - - using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); - cmd.Execute($"build -c {config} -bl:{Path.Combine(s_buildEnv.LogRootPath, $"{id}.binlog")} {(runtimeAssetsRelativePath != DefaultRuntimeAssetsRelativePath ? "-p:WasmRuntimeAssetsLocation=" + runtimeAssetsRelativePath : "")}") - .EnsureSuccessful(); - var buildArgs = new BuildArgs(projectName, config, false, id, null); - buildArgs = ExpandBuildArgs(buildArgs); - BuildTemplateProject(buildArgs, id: id, _baseBuildProjectOptions); - - string runOutput = await RunBuiltBrowserApp(config, projectFile); - Assert.Contains("Hello, Browser!", runOutput); - } - - [Theory] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] - public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) - { - string id = $"{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - string projectName = Path.GetFileNameWithoutExtension(projectFile); - string projectDirectory = Path.GetDirectoryName(projectFile)!; - - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - - string extraPropertiesForDBP = string.Empty; - string frameworkDir = FindBinFrameworkDir(config, forPublish: false); + // private BuildProjectOptions _basePublishProjectOptions = new BuildProjectOptions( + // DotnetWasmFromRuntimePack: false, + // CreateProject: false, + // Publish: true + // ); + // private BuildProjectOptions _baseBuildProjectOptions = new BuildProjectOptions( + // DotnetWasmFromRuntimePack: true, + // CreateProject: false, + // Publish: false + // ); + + // [Theory, TestCategory("no-fingerprinting")] + // [InlineData("Debug")] + // [InlineData("Release")] + // public void BrowserBuildThenPublish(string config) + // { + // string id = $"browser_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + + // UpdateBrowserProgramFile(); + // UpdateBrowserMainJs(); + + // var buildArgs = new ProjectInfo(projectName, config, false, id, null); + + // AddItemsPropertiesToProject(projectFile, + // atTheEnd: + // """ + // + // + // <_LinkedOutFile Include="$(IntermediateOutputPath)\linked\*.dll" /> + // + // + // + // """ + // ); + + // buildArgs = ExpandBuildArgs(buildArgs); + // BuildTemplateProject(buildArgs, id: id, _baseBuildProjectOptions); + + // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) + // throw new XunitException($"Test bug: could not get the build product in the cache"); + + // File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + + // _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); + + // bool expectRelinking = config == "Release"; + // BuildTemplateProject(buildArgs, + // id: id, + // _basePublishProjectOptions with + // { + // UseCache = false, + // DotnetWasmFromRuntimePack = !expectRelinking, + // } + // ); + // } + + // public static TheoryData TestDataForAppBundleDir() + // { + // var data = new TheoryData(); + // AddTestData(runOutsideProjectDirectory: false); + // AddTestData(runOutsideProjectDirectory: true); + + // void AddTestData(bool runOutsideProjectDirectory) + // { + // // FIXME: Disabled for `main` right now, till 7.0 gets the fix + // data.Add(runOutsideProjectDirectory, string.Empty); + // data.Add(runOutsideProjectDirectory, + // $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); + // data.Add(runOutsideProjectDirectory, + // $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); + // } + + // return data; + // } + + // [Theory, TestCategory("no-fingerprinting")] + // [MemberData(nameof(TestDataForAppBundleDir))] + // [ActiveIssue("https://github.com/dotnet/runtime/issues/108107")] + // public async Task RunWithDifferentAppBundleLocations(bool runOutsideProjectDirectory, string extraProperties) + // => await BrowserRunTwiceWithAndThenWithoutBuildAsync("Release", extraProperties, runOutsideProjectDirectory); + + // private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, string extraProperties = "", bool runOutsideProjectDirectory = false) + // { + // string id = $"browser_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); + + // UpdateBrowserProgramFile(); + // UpdateBrowserMainJs(); + + // if (!string.IsNullOrEmpty(extraProperties)) + // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); + + // string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir!; + + // { + // using var runCommand = new RunCommand(s_buildEnv, _testOutput) + // .WithWorkingDirectory(workingDir); + + // await using var runner = new BrowserRunner(_testOutput); + // var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --project \"{projectFile}\" --forward-console"); + // await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); + // Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); + // } + + // { + // using var runCommand = new RunCommand(s_buildEnv, _testOutput) + // .WithWorkingDirectory(workingDir); + + // await using var runner = new BrowserRunner(_testOutput); + // var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{projectFile}\" --forward-console"); + // await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); + // Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); + // } + // } + + // public static IEnumerable BrowserBuildAndRunTestData() + // { + // yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, DefaultRuntimeAssetsRelativePath }; + // yield return new object?[] { "-f net9.0", "net9.0", DefaultRuntimeAssetsRelativePath }; + + // if (EnvironmentVariables.WorkloadsTestPreviousVersions) + // yield return new object?[] { "-f net8.0", "net8.0", DefaultRuntimeAssetsRelativePath }; + + // // ActiveIssue("https://github.com/dotnet/runtime/issues/90979") + // // yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, "./" }; + // // yield return new object?[] { "-f net8.0", "net8.0", "./" }; + // } + + // [Theory] + // [MemberData(nameof(BrowserBuildAndRunTestData))] + // public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework, string runtimeAssetsRelativePath) + // { + // string config = "Debug"; + // string id = $"browser_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser", extraNewArgs, addFrameworkArg: extraNewArgs.Length == 0); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + // string extraProperties = runtimeAssetsRelativePath == DefaultRuntimeAssetsRelativePath ? + // "" : + // $"{runtimeAssetsRelativePath}"; + // AddItemsPropertiesToProject(projectFile, extraProperties); + + // if (targetFramework != "net8.0") + // UpdateBrowserProgramFile(); + // UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath); + + // using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) + // .WithWorkingDirectory(_projectDir!); + // cmd.Execute($"build -c {config} -bl:{Path.Combine(s_buildEnv.LogRootPath, $"{id}.binlog")} {(runtimeAssetsRelativePath != DefaultRuntimeAssetsRelativePath ? "-p:WasmRuntimeAssetsLocation=" + runtimeAssetsRelativePath : "")}") + // .EnsureSuccessful(); + // var buildArgs = new ProjectInfo(projectName, config, false, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // BuildTemplateProject(buildArgs, id: id, _baseBuildProjectOptions); + + // string runOutput = await RunBuiltBrowserApp(config, projectFile); + // Assert.Contains("Hello, Browser!", runOutput); + // } + + // [Theory] + // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] + // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] + // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] + // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] + // public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) + // { + // string id = $"{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + // string projectDirectory = Path.GetDirectoryName(projectFile)!; + + // UpdateBrowserProgramFile(); + // UpdateBrowserMainJs(); + + // string extraPropertiesForDBP = string.Empty; + // string frameworkDir = GetBinFrameworkDir(config, forPublish: false); - var buildOptions = _baseBuildProjectOptions with - { - BinFrameworkDir = frameworkDir - }; - if (useArtifacts) - { - extraPropertiesForDBP += "true."; - buildOptions = buildOptions with - { - // browser app does not allow appending RID - BinFrameworkDir = Path.Combine( - projectDirectory, - "bin", - id, - config.ToLower(), - "wwwroot", - "_framework") - }; - } - if (appendRID) - { - extraPropertiesForDBP += "true"; - } - // UseArtifactsOutput cannot be set in a project file, due to MSBuild ordering constraints. - string propsPath = Path.Combine(projectDirectory, "Directory.Build.props"); - AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); - - var buildArgs = new BuildArgs(projectName, config, false, id, null); - buildArgs = ExpandBuildArgs(buildArgs); - BuildTemplateProject(buildArgs, id: id, buildOptions); - - await RunBuiltBrowserApp(config, projectFile, extraArgs: "x y z"); - } - - [Theory] - [InlineData("", true)] // Default case - [InlineData("false", false)] // the other case - public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) - { - string config = "Release"; - string id = $"strip_{config}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - string projectName = Path.GetFileNameWithoutExtension(projectFile); - string projectDirectory = Path.GetDirectoryName(projectFile)!; - bool aot = true; - - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - - string extraProperties = "true"; - if (!string.IsNullOrEmpty(stripILAfterAOT)) - extraProperties += $"{stripILAfterAOT}"; - AddItemsPropertiesToProject(projectFile, extraProperties); - - var buildArgs = new BuildArgs(projectName, config, aot, id, null); - buildArgs = ExpandBuildArgs(buildArgs); - BuildTemplateProject(buildArgs, - id: id, - _basePublishProjectOptions with { - UseCache = false, - AssertAppBundle = false - }); - - await RunBuiltBrowserApp(config, projectFile); - string frameworkDir = FindBinFrameworkDir(config, forPublish: true); - string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); - TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); - } + // var buildOptions = _baseBuildProjectOptions with + // { + // BinFrameworkDir = frameworkDir + // }; + // if (useArtifacts) + // { + // extraPropertiesForDBP += "true."; + // buildOptions = buildOptions with + // { + // // browser app does not allow appending RID + // BinFrameworkDir = Path.Combine( + // projectDirectory, + // "bin", + // id, + // config.ToLower(), + // "wwwroot", + // "_framework") + // }; + // } + // if (appendRID) + // { + // extraPropertiesForDBP += "true"; + // } + // // UseArtifactsOutput cannot be set in a project file, due to MSBuild ordering constraints. + // string propsPath = Path.Combine(projectDirectory, "Directory.Build.props"); + // AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); + + // var buildArgs = new ProjectInfo(projectName, config, false, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // BuildTemplateProject(buildArgs, id: id, buildOptions); + + // await RunBuiltBrowserApp(config, projectFile, extraArgs: "x y z"); + // } + + // [Theory] + // [InlineData("", true)] // Default case + // [InlineData("false", false)] // the other case + // public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) + // { + // string config = "Release"; + // string id = $"strip_{config}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + // string projectDirectory = Path.GetDirectoryName(projectFile)!; + // bool aot = true; + + // UpdateBrowserProgramFile(); + // UpdateBrowserMainJs(); + + // string extraProperties = "true"; + // if (!string.IsNullOrEmpty(stripILAfterAOT)) + // extraProperties += $"{stripILAfterAOT}"; + // AddItemsPropertiesToProject(projectFile, extraProperties); + + // var buildArgs = new ProjectInfo(projectName, config, aot, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // BuildTemplateProject(buildArgs, + // id: id, + // _basePublishProjectOptions with { + // UseCache = false, + // AssertAppBundle = false + // }); + + // await RunBuiltBrowserApp(config, projectFile); + // string frameworkDir = GetBinFrameworkDir(config, forPublish: true); + // string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); + // TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); + // } internal static void TestWasmStripILAfterAOTOutput(string objBuildDir, string frameworkDir, bool expectILStripping, ITestOutputHelper testOutput) { @@ -325,32 +321,32 @@ internal static void TestWasmStripILAfterAOTOutput(string objBuildDir, string fr } } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) - { - string config = "Release"; - string shouldCopy = copyOutputSymbolsToPublishDirectory.ToString().ToLower(); - string id = $"publishpdb_{shouldCopy}_{GetRandomId()}"; - string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - string projectName = Path.GetFileNameWithoutExtension(projectFile); - var buildArgs = new BuildArgs(projectName, config, false, id, null); - buildArgs = ExpandBuildArgs(buildArgs); - AddItemsPropertiesToProject(projectFile, - extraProperties: $"{shouldCopy}"); - - BuildTemplateProject(buildArgs, buildArgs.Id, _basePublishProjectOptions); - string publishPath = FindBinFrameworkDir(config, forPublish: true); - AssertFile(".pdb"); - AssertFile(".pdb.gz"); - AssertFile(".pdb.br"); - - void AssertFile(string suffix) - { - var fileName = Directory.EnumerateFiles(publishPath, $"*{suffix}").FirstOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith(id)); - Assert.True(copyOutputSymbolsToPublishDirectory == (fileName != null && File.Exists(fileName)), $"The {fileName} file {(copyOutputSymbolsToPublishDirectory ? "should" : "shouldn't")} exist in publish folder"); - } - } + // [Theory] + // [InlineData(false)] + // [InlineData(true)] + // public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) + // { + // string config = "Release"; + // string shouldCopy = copyOutputSymbolsToPublishDirectory.ToString().ToLower(); + // string id = $"publishpdb_{shouldCopy}_{GetRandomId()}"; + // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); + // string projectName = Path.GetFileNameWithoutExtension(projectFile); + // var buildArgs = new ProjectInfo(projectName, config, false, id, null); + // buildArgs = ExpandBuildArgs(buildArgs); + // AddItemsPropertiesToProject(projectFile, + // extraProperties: $"{shouldCopy}"); + + // BuildTemplateProject(buildArgs, buildArgs.Id, _basePublishProjectOptions); + // string publishPath = GetBinFrameworkDir(config, forPublish: true); + // AssertFile(".pdb"); + // AssertFile(".pdb.gz"); + // AssertFile(".pdb.br"); + + // void AssertFile(string suffix) + // { + // var fileName = Directory.EnumerateFiles(publishPath, $"*{suffix}").FirstOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith(id)); + // Assert.True(copyOutputSymbolsToPublishDirectory == (fileName != null && File.Exists(fileName)), $"The {fileName} file {(copyOutputSymbolsToPublishDirectory ? "should" : "shouldn't")} exist in publish folder"); + // } + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 6b668222cc2f75..b251307e1a26ad 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -31,72 +31,77 @@ public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFi { "partial class StopwatchSample", $"return 42;{Environment.NewLine}partial class StopwatchSample" } }; - public string CreateWasmTemplateProject(string id, string template = "wasmbrowser", string extraArgs = "", bool runAnalyzers = true, bool addFrameworkArg = false, string? extraProperties = null) + public ProjectInfo CreateWasmTemplateProject( + Template template, + string config, + bool aot, + string idPrefix = "wbt", + bool appendUnicodeToPath = true, + string extraArgs = "", + bool runAnalyzers = true, + bool addFrameworkArg = false, + string extraProperties = "") { - InitPaths(id); + string projectName = appendUnicodeToPath ? + $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : + $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; + InitPaths(projectName); InitProjectDir(_projectDir, addNuGetSourceForLocalPackages: true); - File.WriteAllText(Path.Combine(_projectDir, "Directory.Build.props"), ""); - File.WriteAllText(Path.Combine(_projectDir, "Directory.Build.targets"), - """ - - - - - - - - """); - if (UseWBTOverridePackTargets) - File.Copy(BuildEnvironment.WasmOverridePacksTargetsPath, Path.Combine(_projectDir, Path.GetFileName(BuildEnvironment.WasmOverridePacksTargetsPath)), overwrite: true); - if (addFrameworkArg) extraArgs += $" -f {DefaultTargetFramework}"; + using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); CommandResult result = cmd.WithWorkingDirectory(_projectDir!) - .ExecuteWithCapturedOutput($"new {template} {extraArgs}") + .ExecuteWithCapturedOutput($"new {template.ToString().ToLower()} {extraArgs}") .EnsureSuccessful(); - string projectfile = Path.Combine(_projectDir!, $"{id}.csproj"); - - if (extraProperties == null) - extraProperties = string.Empty; + string projectFilePath = Path.Combine(_projectDir!, $"{projectName}.csproj"); + if (aot) + { + extraProperties += $"\ntrue"; + extraProperties += $"\n{s_isWindows}"; + } extraProperties += "true"; if (runAnalyzers) extraProperties += "true"; - AddItemsPropertiesToProject(projectfile, extraProperties); + AddItemsPropertiesToProject(projectFilePath, extraProperties); - return projectfile; + return new ProjectInfo(config, aot, projectName, projectFilePath); } public (string projectDir, string buildOutput) BuildTemplateProject( - BuildArgs buildArgs, - string id, - BuildProjectOptions buildProjectOptions, + ProjectInfo projectInfo, + BuildProjectOptions buildOptions, params string[] extraArgs) { - if (buildProjectOptions.ExtraBuildEnvironmentVariables is null) - buildProjectOptions = buildProjectOptions with { ExtraBuildEnvironmentVariables = new Dictionary() }; + if (buildOptions.ExtraBuildEnvironmentVariables is null) + buildOptions = buildOptions with { ExtraBuildEnvironmentVariables = new Dictionary() }; // TODO: reenable this when the SDK supports targetting net10.0 - //buildProjectOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; + //buildOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; - (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(id, buildArgs.Config, buildProjectOptions, extraArgs); - if (buildProjectOptions.UseCache) - _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir!, logFilePath, true, res.Output)); + (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(buildOptions, extraArgs); + + if (buildOptions.UseCache) + _buildContext.CacheBuild(projectInfo, new BuildProduct(_projectDir!, logFilePath, true, res.Output)); - if (buildProjectOptions.AssertAppBundle) + if (!buildOptions.ExpectSuccess) { - if (buildProjectOptions.IsBrowserProject) - { - _provider.AssertWasmSdkBundle(buildArgs, buildProjectOptions, res.Output); - } - else - { - _provider.AssertTestMainJsBundle(buildArgs, buildProjectOptions, res.Output); - } + res.EnsureFailed(); + return (_projectDir!, res.Output); + } + + if (string.IsNullOrEmpty(buildOptions.BinFrameworkDir)) + { + buildOptions = buildOptions with { BinFrameworkDir = GetBinFrameworkDir(buildOptions.Configuration, buildOptions.IsPublish) }; + } + + if (buildOptions.AssertAppBundle) + { + _provider.AssertWasmSdkBundle(buildOptions, res.Output); } return (_projectDir!, res.Output); } @@ -162,22 +167,6 @@ protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramewo File.WriteAllText(mainJsPath, updatedMainJsContent); } - protected void UpdateMainJsEnvironmentVariables(params (string key, string value)[] variables) - { - string mainJsPath = Path.Combine(_projectDir!, "main.mjs"); - string mainJsContent = File.ReadAllText(mainJsPath); - - StringBuilder js = new(); - foreach (var variable in variables) - { - js.Append($".withEnvironmentVariable(\"{variable.key}\", \"{variable.value}\")"); - } - - mainJsContent = StringReplaceWithAssert(mainJsContent, ".create()", js.ToString() + ".create()"); - - File.WriteAllText(mainJsPath, mainJsContent); - } - // ToDo: consolidate with BlazorRunTest protected async Task RunBuiltBrowserApp(string config, string projectFile, string language = "en-US", string extraArgs = "", string testScenario = "") => await RunBrowser( @@ -189,7 +178,7 @@ protected async Task RunBuiltBrowserApp(string config, string projectFil protected async Task RunPublishedBrowserApp(string config, string language = "en-US", string extraArgs = "", string testScenario = "") => await RunBrowser( command: $"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", - workingDirectory: Path.Combine(FindBinFrameworkDir(config, forPublish: true), ".."), + workingDirectory: Path.Combine(GetBinFrameworkDir(config, forPublish: true), ".."), language: language, testScenario: testScenario); @@ -206,6 +195,18 @@ private async Task RunBrowser(string command, string workingDirectory, s return string.Join("\n", runner.OutputLines); } - public string FindBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFramework, string? projectDir = null) => - _provider.FindBinFrameworkDir(config: config, forPublish: forPublish, framework: framework, projectDir: projectDir); + public string GetBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFramework, string? projectDir = null) => + _provider.GetBinFrameworkDir(config, forPublish, framework, projectDir); + + public BuildPaths GetBuildPaths(ProjectInfo info, bool forPublish) => + _provider.GetBuildPaths(info, forPublish); + + public IDictionary GetFilesTable(ProjectInfo info, BuildPaths paths, bool unchanged) => + _provider.GetFilesTable(info, paths, unchanged); + + public IDictionary StatFiles(IDictionary fullpaths) => + _provider.StatFiles(fullpaths); + + public void CompareStat(IDictionary oldStat, IDictionary newStat, IDictionary expected) => + _provider.CompareStat(oldStat, newStat, expected); } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs index 71411e7c4dadf6..1ffd16321109d9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs @@ -46,9 +46,9 @@ protected void BuildProject( string bootConfigFileName = "blazor.boot.json", params string[] extraArgs) { - (CommandResult result, _) = BlazorBuild(new BlazorBuildOptions( + (CommandResult result, _) = BlazorBuild(new BuildProjectOptions( Id: Id, - Config: configuration, + Configuration: configuration, BinFrameworkDir: binFrameworkDir, RuntimeType: runtimeType, AssertAppBundle: assertAppBundle, @@ -71,9 +71,10 @@ protected void PublishProject( string bootConfigFileName = "blazor.boot.json", params string[] extraArgs) { - (CommandResult result, _) = BlazorPublish(new BlazorBuildOptions( + (CommandResult result, _) = BlazorPublish(new BuildProjectOptions( Id: Id, - Config: configuration, + Configuration: configuration, + BinFrameworkDir: GetBinFrameworkDir(configuration, forPublish: true), RuntimeType: runtimeType, BootConfigFileName: bootConfigFileName, AssertAppBundle: assertAppBundle), extraArgs); @@ -81,12 +82,12 @@ protected void PublishProject( } protected Task RunSdkStyleAppForBuild(RunOptions options) - => RunSdkStyleApp(options, BlazorRunHost.DotnetRun); + => RunSdkStyleApp(options, RunHost.DotnetRun); protected Task RunSdkStyleAppForPublish(RunOptions options) - => RunSdkStyleApp(options, BlazorRunHost.WebServer); + => RunSdkStyleApp(options, RunHost.WebServer); - private async Task RunSdkStyleApp(RunOptions options, BlazorRunHost host = BlazorRunHost.DotnetRun) + private async Task RunSdkStyleApp(RunOptions options, RunHost host = RunHost.DotnetRun) { var query = options.BrowserQueryString ?? new Dictionary(); if (!string.IsNullOrEmpty(options.TestScenario)) @@ -99,9 +100,9 @@ private async Task RunSdkStyleApp(RunOptions options, BlazorRunHost h List serverOutput = new(); Regex exitRegex = new Regex("WASM EXIT (?[0-9]+)$"); - BlazorRunOptions blazorRunOptions = new( + RunOptions blazorRunOptions = new( CheckCounter: false, - Config: options.Configuration, + Configuration: options.Configuration, ServerEnvironment: options.ServerEnvironment, OnConsoleMessage: OnConsoleMessage, OnServerMessage: OnServerMessage, @@ -157,22 +158,4 @@ void OnTestOutput(string msg) return new(wasmExitCode, testOutput, consoleOutput, serverOutput); } - protected record RunOptions( - string Configuration, - string BrowserPath = "", - string? TestScenario = null, - Dictionary BrowserQueryString = null, - Dictionary ServerEnvironment = null, - Action OnConsoleMessage = null, - Action OnServerMessage = null, - int? ExpectedExitCode = 0, - string? ExtraArgs = null - ); - - protected record RunResult( - int ExitCode, - IReadOnlyCollection TestOutput, - IReadOnlyCollection ConsoleOutput, - IReadOnlyCollection ServerOutput - ); } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestMainJsProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/TestMainJsProjectProvider.cs deleted file mode 100644 index b14d52ac4f1824..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/TestMainJsProjectProvider.cs +++ /dev/null @@ -1,119 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -using System; -using System.Collections.Generic; -using System.IO; -using Xunit.Abstractions; - -namespace Wasm.Build.Tests; - -public class TestMainJsProjectProvider : ProjectProviderBase -{ - public TestMainJsProjectProvider(ITestOutputHelper _testOutput, string? _projectDir = null) - : base(_testOutput, _projectDir) - { } - protected override string BundleDirName { get { return "AppBundle"; } } - - // no fingerprinting - protected override IReadOnlyDictionary GetAllKnownDotnetFilesToFingerprintMap(AssertBundleOptionsBase assertOptions) - => new SortedDictionary() - { - { "dotnet.js", false }, - { "dotnet.js.map", false }, - { "dotnet.native.js", false }, - { "dotnet.native.js.symbols", false }, - { "dotnet.globalization.js", false }, - { "dotnet.native.wasm", false }, - { "dotnet.native.worker.mjs", false }, - { "dotnet.runtime.js", false }, - { "dotnet.runtime.js.map", false } - }; - - protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOptionsBase assertOptions) - { - SortedSet? res = new(); - if (assertOptions.RuntimeType is RuntimeVariant.SingleThreaded) - { - res.Add("dotnet.js"); - res.Add("dotnet.native.wasm"); - res.Add("dotnet.native.js"); - res.Add("dotnet.runtime.js"); - res.Add("dotnet.js.map"); - res.Add("dotnet.runtime.js.map"); - } - - if (assertOptions.RuntimeType is RuntimeVariant.MultiThreaded) - { - res.Add("dotnet.js"); - res.Add("dotnet.native.wasm"); - res.Add("dotnet.native.js"); - res.Add("dotnet.runtime.js"); - res.Add("dotnet.native.worker.mjs"); - - if (!assertOptions.IsPublish) - { - res.Add("dotnet.js.map"); - res.Add("dotnet.runtime.js.map"); - res.Add("dotnet.native.worker.mjs.map"); - } - } - - if (assertOptions.GlobalizationMode is GlobalizationMode.Hybrid) - res.Add("dotnet.globalization.js"); - - if (assertOptions.AssertSymbolsFile && assertOptions.ExpectSymbolsFile) - res.Add("dotnet.native.js.symbols"); - - return res ?? throw new ArgumentException($"Unknown runtime type: {assertOptions.RuntimeType}"); - } - - public void AssertBundle(AssertTestMainJsAppBundleOptions assertOptions) - { - AssertBasicBundle(assertOptions); - - TestUtils.AssertFilesExist(assertOptions.BundleDir, new[] { assertOptions.MainJS }); - if (assertOptions.IsBrowserProject) - TestUtils.AssertFilesExist(assertOptions.BundleDir, new[] { "index.html" }); - TestUtils.AssertFilesExist(assertOptions.BundleDir, new[] { "run-v8.sh" }, expectToExist: assertOptions.HasV8Script); - - string bundledMainAppAssembly = $"{assertOptions.ProjectName}{WasmAssemblyExtension}"; - TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, new[] { bundledMainAppAssembly }); - } - - public void AssertBundle(BuildArgs buildArgs, BuildProjectOptions buildProjectOptions) - { - string binFrameworkDir = buildProjectOptions.BinFrameworkDir - ?? FindBinFrameworkDir(buildArgs.Config, - buildProjectOptions.Publish, - buildProjectOptions.TargetFramework); - NativeFilesType expectedFileType = buildArgs.AOT - ? NativeFilesType.AOT - : buildProjectOptions.DotnetWasmFromRuntimePack == false - ? NativeFilesType.Relinked - : NativeFilesType.FromRuntimePack; - - var assertOptions = new AssertTestMainJsAppBundleOptions( - Config: buildArgs.Config, - IsPublish: buildProjectOptions.Publish, - TargetFramework: buildProjectOptions.TargetFramework!, - BinFrameworkDir: binFrameworkDir, - ProjectName: buildArgs.ProjectName, - MainJS: buildProjectOptions.MainJS ?? "test-main.js", - GlobalizationMode: buildProjectOptions.GlobalizationMode, - HasV8Script: buildProjectOptions.HasV8Script, - CustomIcuFile: buildProjectOptions.CustomIcuFile ?? string.Empty, - IsBrowserProject: buildProjectOptions.IsBrowserProject, - ExpectedFileType: expectedFileType, - ExpectSymbolsFile: !buildArgs.AOT); - AssertBundle(assertOptions); - } - - public override string FindBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) - { - EnsureProjectDirIsSet(); - return Path.Combine(projectDir ?? ProjectDir!, "bin", config, framework, "browser-wasm", BundleDirName, "_framework"); - } -} diff --git a/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs index e5940778c3b3e5..f27639f2eb8d86 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs @@ -13,84 +13,84 @@ namespace Wasm.Build.Tests; public abstract class TestMainJsTestBase : BuildTestBase { - protected TestMainJsProjectProvider _provider; + protected WasmSdkBasedProjectProvider _provider; protected TestMainJsTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(new TestMainJsProjectProvider(output), output, buildContext) + : base(new WasmSdkBasedProjectProvider(output, DefaultTargetFramework), output, buildContext) { - _provider = GetProvider(); + _provider = GetProvider(); } - public (string projectDir, string buildOutput) BuildProject(BuildArgs buildArgs, - string id, - BuildProjectOptions options) - { - string msgPrefix = options.Label != null ? $"[{options.Label}] " : string.Empty; - if (options.UseCache && _buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - { - _testOutput.WriteLine($"Using existing build found at {product.ProjectDir}, with build log at {product.LogFile}"); - - if (!product.Result) - throw new XunitException($"Found existing build at {product.ProjectDir}, but it had failed. Check build log at {product.LogFile}"); - _projectDir = product.ProjectDir; - - // use this test's id for the run logs - _logPath = Path.Combine(s_buildEnv.LogRootPath, id); - return (_projectDir, product.BuildOutput); - } - - if (options.CreateProject) - { - InitPaths(id); - InitProjectDir(_projectDir); - options.InitProject?.Invoke(); - - File.WriteAllText(Path.Combine(_projectDir, $"{buildArgs.ProjectName}.csproj"), buildArgs.ProjectFileContents); - File.Copy( - Path.Combine( - AppContext.BaseDirectory, - options.TargetFramework == "net7.0" - ? "data/test-main-7.0.js" - : "test-main.js" - ), - Path.Combine(_projectDir, "test-main.js") - ); - - File.WriteAllText(Path.Combine(_projectDir!, "index.html"), @""); - } - else if (_projectDir is null) - { - throw new Exception("_projectDir should be set, to use options.createProject=false"); - } - - if (options.ExtraBuildEnvironmentVariables is null) - options = options with { ExtraBuildEnvironmentVariables = new Dictionary() }; - - // TODO: reenable this when the SDK supports targetting net10.0 - //options.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; - - try - { - (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(id, - buildArgs.Config, - options, - string.Join(" ", buildArgs.ExtraBuildArgs)); - - if (options.ExpectSuccess && options.AssertAppBundle) - { - ProjectProviderBase.AssertRuntimePackPath(res.Output, options.TargetFramework ?? DefaultTargetFramework); - _provider.AssertBundle(buildArgs, options); - } - - if (options.UseCache) - _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir, logFilePath, true, res.Output)); - - return (_projectDir, res.Output); - } - catch (Exception ex) - { - if (options.UseCache) - _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir, /*logFilePath*/"unset-log-path", false, $"The build attempt resulted in exception: {ex}.")); - throw; - } - } + // public (string projectDir, string buildOutput) BuildProject(ProjectInfo buildArgs, + // string id, + // BuildProjectOptions options) + // { + // string msgPrefix = options.Label != null ? $"[{options.Label}] " : string.Empty; + // if (options.UseCache && _buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) + // { + // _testOutput.WriteLine($"Using existing build found at {product.ProjectDir}, with build log at {product.LogFile}"); + + // if (!product.Result) + // throw new XunitException($"Found existing build at {product.ProjectDir}, but it had failed. Check build log at {product.LogFile}"); + // _projectDir = product.ProjectDir; + + // // use this test's id for the run logs + // _logPath = Path.Combine(s_buildEnv.LogRootPath, id); + // return (_projectDir, product.BuildOutput); + // } + + // if (options.CreateProject) + // { + // InitPaths(id); + // InitProjectDir(_projectDir); + // options.InitProject?.Invoke(); + + // File.WriteAllText(Path.Combine(_projectDir, $"{buildArgs.ProjectName}.csproj"), buildArgs.ProjectFileContents); + // File.Copy( + // Path.Combine( + // AppContext.BaseDirectory, + // options.TargetFramework == "net7.0" + // ? "data/test-main-7.0.js" + // : "test-main.js" + // ), + // Path.Combine(_projectDir, "test-main.js") + // ); + + // File.WriteAllText(Path.Combine(_projectDir!, "index.html"), @""); + // } + // else if (_projectDir is null) + // { + // throw new Exception("_projectDir should be set, to use options.createProject=false"); + // } + + // if (options.ExtraBuildEnvironmentVariables is null) + // options = options with { ExtraBuildEnvironmentVariables = new Dictionary() }; + + // // TODO: reenable this when the SDK supports targetting net10.0 + // //options.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; + + // try + // { + // (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(id, + // buildArgs.Configuration, + // options, + // string.Join(" ", buildArgs.ExtraBuildArgs)); + + // if (options.ExpectSuccess && options.AssertAppBundle) + // { + // ProjectProviderBase.AssertRuntimePackPath(res.Output, options.TargetFramework ?? DefaultTargetFramework); + // _provider.AssertWasmSdkBundle(options); + // } + + // if (options.UseCache) + // _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir, logFilePath, true, res.Output)); + + // return (_projectDir, res.Output); + // } + // catch (Exception ex) + // { + // if (options.UseCache) + // _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir, /*logFilePath*/"unset-log-path", false, $"The build attempt resulted in exception: {ex}.")); + // throw; + // } + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs index cfff7b40ba0ba9..58dfec18e2931b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs @@ -15,186 +15,184 @@ public class WasmBuildAppTest : WasmBuildAppBase public WasmBuildAppTest(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void TopLevelMain(BuildArgs buildArgs, RunHost host, string id) - => TestMain("top_level", - @"System.Console.WriteLine(""Hello, World!""); return await System.Threading.Tasks.Task.FromResult(42);", - buildArgs, host, id); - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void AsyncMain(BuildArgs buildArgs, RunHost host, string id) - => TestMain("async_main", @" - using System; - using System.Threading.Tasks; - - public class TestClass { - public static async Task Main() - { - Console.WriteLine(""Hello, World!""); - return await Task.FromResult(42); - } - }", buildArgs, host, id); - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void NonAsyncMain(BuildArgs buildArgs, RunHost host, string id) - => TestMain("non_async_main", @" - using System; - using System.Threading.Tasks; - - public class TestClass { - public static int Main() - { - Console.WriteLine(""Hello, World!""); - return 42; - } - }", buildArgs, host, id); - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void ExceptionFromMain(BuildArgs buildArgs, RunHost host, string id) - => TestMain("main_exception", """ - using System; - using System.Threading.Tasks; - - public class TestClass { - public static int Main() => throw new Exception("MessageFromMyException"); - } - """, buildArgs, host, id, expectedExitCode: 71, expectedOutput: "Error: MessageFromMyException"); - - private static string s_bug49588_ProgramCS = @" - using System; - public class TestClass { - public static int Main() - { - Console.WriteLine($""tc: {Environment.TickCount}, tc64: {Environment.TickCount64}""); - - // if this gets printed, then we didn't crash! - Console.WriteLine(""Hello, World!""); - return 42; - } - }"; - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void Bug49588_RegressionTest_AOT(BuildArgs buildArgs, RunHost host, string id) - => TestMain("bug49588_aot", s_bug49588_ProgramCS, buildArgs, host, id); - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void Bug49588_RegressionTest_NativeRelinking(BuildArgs buildArgs, RunHost host, string id) - => TestMain("bug49588_native_relinking", s_bug49588_ProgramCS, buildArgs, host, id, - extraProperties: "true", - dotnetWasmFromRuntimePack: false); - - [Theory] - [BuildAndRun] - public void PropertiesFromRuntimeConfigJson(BuildArgs buildArgs, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"runtime_config_{buildArgs.Config}_{buildArgs.AOT}" }; - buildArgs = ExpandBuildArgs(buildArgs); - - string programText = @" - using System; - using System.Runtime.CompilerServices; - - var config = AppContext.GetData(""test_runtimeconfig_json""); - Console.WriteLine ($""test_runtimeconfig_json: {(string)config}""); - return 42; - "; - - string runtimeConfigTemplateJson = @" - { - ""configProperties"": { - ""abc"": ""4"", - ""test_runtimeconfig_json"": ""25"" - } - }"; - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - File.WriteAllText(Path.Combine(_projectDir!, "runtimeconfig.template.json"), runtimeConfigTemplateJson); - }, - DotnetWasmFromRuntimePack: IsDotnetWasmFromRuntimePack(buildArgs))); - - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, - test: output => Assert.Contains("test_runtimeconfig_json: 25", output), host: host, id: id); - } - - [Theory] - [BuildAndRun] - public void PropertiesFromCsproj(BuildArgs buildArgs, RunHost host, string id) - { - buildArgs = buildArgs with { ProjectName = $"runtime_config_csproj_{buildArgs.Config}_{buildArgs.AOT}" }; - buildArgs = ExpandBuildArgs(buildArgs, extraProperties: "20"); - - string programText = @" - using System; - using System.Runtime.CompilerServices; - - var config = AppContext.GetData(""System.Threading.ThreadPool.MaxThreads""); - Console.WriteLine ($""System.Threading.ThreadPool.MaxThreads: {(string)config}""); - return 42; - "; - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => - { - File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - }, - DotnetWasmFromRuntimePack: IsDotnetWasmFromRuntimePack(buildArgs))); - - RunAndTestWasmApp(buildArgs, expectedExitCode: 42, - test: output => Assert.Contains("System.Threading.ThreadPool.MaxThreads: 20", output), host: host, id: id); - } + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void TopLevelMain(ProjectInfo buildArgs, RunHost host, string id) + // => TestMain("top_level", + // @"System.Console.WriteLine(""Hello, World!""); return await System.Threading.Tasks.Task.FromResult(42);", + // buildArgs, host, id); + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void AsyncMain(ProjectInfo buildArgs, RunHost host, string id) + // => TestMain("async_main", @" + // using System; + // using System.Threading.Tasks; + + // public class TestClass { + // public static async Task Main() + // { + // Console.WriteLine(""Hello, World!""); + // return await Task.FromResult(42); + // } + // }", buildArgs, host, id); + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void NonAsyncMain(ProjectInfo buildArgs, RunHost host, string id) + // => TestMain("non_async_main", @" + // using System; + // using System.Threading.Tasks; + + // public class TestClass { + // public static int Main() + // { + // Console.WriteLine(""Hello, World!""); + // return 42; + // } + // }", buildArgs, host, id); + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void ExceptionFromMain(ProjectInfo buildArgs, RunHost host, string id) + // => TestMain("main_exception", """ + // using System; + // using System.Threading.Tasks; + + // public class TestClass { + // public static int Main() => throw new Exception("MessageFromMyException"); + // } + // """, buildArgs, host, id, expectedExitCode: 71, expectedOutput: "Error: MessageFromMyException"); + + // private static string s_bug49588_ProgramCS = @" + // using System; + // public class TestClass { + // public static int Main() + // { + // Console.WriteLine($""tc: {Environment.TickCount}, tc64: {Environment.TickCount64}""); + + // // if this gets printed, then we didn't crash! + // Console.WriteLine(""Hello, World!""); + // return 42; + // } + // }"; + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void Bug49588_RegressionTest_AOT(ProjectInfo buildArgs, RunHost host, string id) + // => TestMain("bug49588_aot", s_bug49588_ProgramCS, buildArgs, host, id); + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void Bug49588_RegressionTest_NativeRelinking(ProjectInfo buildArgs, RunHost host, string id) + // => TestMain("bug49588_native_relinking", s_bug49588_ProgramCS, buildArgs, host, id, + // extraProperties: "true", + // dotnetWasmFromRuntimePack: false); + + // [Theory] + // [BuildAndRun] + // public void PropertiesFromRuntimeConfigJson(ProjectInfo buildArgs, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"runtime_config_{buildArgs.Configuration}_{buildArgs.AOT}" }; + // buildArgs = ExpandBuildArgs(buildArgs); + + // string programText = @" + // using System; + // using System.Runtime.CompilerServices; + + // var config = AppContext.GetData(""test_runtimeconfig_json""); + // Console.WriteLine ($""test_runtimeconfig_json: {(string)config}""); + // return 42; + // "; + + // string runtimeConfigTemplateJson = @" + // { + // ""configProperties"": { + // ""abc"": ""4"", + // ""test_runtimeconfig_json"": ""25"" + // } + // }"; + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); + // File.WriteAllText(Path.Combine(_projectDir!, "runtimeconfig.template.json"), runtimeConfigTemplateJson); + // }, + // DotnetWasmFromRuntimePack: IsDotnetWasmFromRuntimePack(buildArgs))); + + // RunAndTestWasmApp(buildArgs, expectedExitCode: 42, + // test: output => Assert.Contains("test_runtimeconfig_json: 25", output), host: host, id: id); + // } + + // [Theory] + // [BuildAndRun] + // public void PropertiesFromCsproj(ProjectInfo buildArgs, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"runtime_config_csproj_{buildArgs.Configuration}_{buildArgs.AOT}" }; + // buildArgs = ExpandBuildArgs(buildArgs, extraProperties: "20"); + + // string programText = @" + // using System; + // using System.Runtime.CompilerServices; + + // var config = AppContext.GetData(""System.Threading.ThreadPool.MaxThreads""); + // Console.WriteLine ($""System.Threading.ThreadPool.MaxThreads: {(string)config}""); + // return 42; + // "; + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => + // { + // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); + // }, + // DotnetWasmFromRuntimePack: IsDotnetWasmFromRuntimePack(buildArgs))); + + // RunAndTestWasmApp(buildArgs, expectedExitCode: 42, + // test: output => Assert.Contains("System.Threading.ThreadPool.MaxThreads: 20", output), host: host, id: id); + // } } public class WasmBuildAppBase : TestMainJsTestBase { - public static IEnumerable MainMethodTestData(bool aot, RunHost host) - => ConfigWithAOTData(aot) - .WithRunHosts(host) - .UnwrapItemsAsArrays(); + public static IEnumerable MainMethodTestData(bool aot) + => ConfigWithAOTData(aot).UnwrapItemsAsArrays(); public WasmBuildAppBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - protected void TestMain(string projectName, - string programText, - BuildArgs buildArgs, - RunHost host, - string id, - string extraProperties = "", - bool? dotnetWasmFromRuntimePack = null, - int expectedExitCode = 42, - string expectedOutput = "Hello, World!") - { - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - - if (dotnetWasmFromRuntimePack == null) - dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - - RunAndTestWasmApp(buildArgs, expectedExitCode: expectedExitCode, - test: output => Assert.Contains(expectedOutput, output), host: host, id: id); - } + // protected void TestMain(string projectName, + // string programText, + // ProjectInfo buildArgs, + // RunHost host, + // string id, + // string extraProperties = "", + // bool? dotnetWasmFromRuntimePack = null, + // int expectedExitCode = 42, + // string expectedOutput = "Hello, World!") + // { + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); + + // if (dotnetWasmFromRuntimePack == null) + // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), + // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); + + // RunAndTestWasmApp(buildArgs, expectedExitCode: expectedExitCode, + // test: output => Assert.Contains(expectedOutput, output), host: host, id: id); + // } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 0fd78da40da588..9b3d2a1fa94733 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -19,231 +19,231 @@ public WasmNativeDefaultsTests(ITestOutputHelper output, SharedBuildPerTestClass { } - public static TheoryData SettingDifferentFromValuesInRuntimePack(bool forPublish) - { - List<(string propertyName, bool defaultValueInRuntimePack)> defaults = new() - { - ("WasmEnableSIMD", true), - ("WasmEnableExceptionHandling", true), - ("InvariantTimezone", false), - ("InvariantGlobalization", false), - // ("WasmNativeStrip", true) -- tested separately because it has special handling in targets - }; - - TheoryData data = new(); - - string[] configs = new[] { "Debug", "Release" }; - foreach (var defaultPair in defaults) - { - foreach (string config in configs) - { - // Config=Release always causes relinking when publishing - bool publishValue = forPublish && config == "Release" ? true : false; - // Setting the default value from the runtime pack shouldn't trigger relinking - data.Add(config, $"<{defaultPair.propertyName}>{defaultPair.defaultValueInRuntimePack.ToString().ToLower()}", - /*aot*/ false, /*build*/ false, /*publish*/ publishValue); - // Leaving the property unset, so checking the default - data.Add(config, "", /*aot*/ false, /*build*/ false, /*publish*/ publishValue); - - // Setting the !default value should trigger relinking - data.Add(config, $"<{defaultPair.propertyName}>{(!defaultPair.defaultValueInRuntimePack).ToString().ToLower()}", - /*aot*/ false, /*build*/ true, /*publish*/ true); - } - } - - return data; - } - - public static TheoryData DefaultsTestData(bool forPublish) - { - TheoryData data = new() - { - /* relink by default for publish+Release */ - { "Release", "", /*aot*/ false, /*build*/ false, /*publish*/ true }, - /* NO relink by default for publish+Release, when not trimming */ - { "Release", "false", /*aot*/ false, /*build*/ false, /*publish*/ false }, - - /* When not trimming, and no-aot, we don't relink. But WasmNativeStrip=false should still trigger it*/ - // { "Release", "falsefalse", - // /*aot*/ false, /*build*/ true, /*publish*/ true } - }; - - if (!forPublish) - { - /* Debug config, when building does trigger relinking */ - data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ true); - } - - if (forPublish) - { - /* NO relink by default for publish+Debug */ - data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ false); - - /* AOT */ - data.Add("Release", "", /*aot*/ true, /*build*/ false, /*publish*/ true); - data.Add("Debug", "", /*aot*/ true, /*build*/ false, /*publish*/ true); - - // FIXME: separate test - // { "Release", "true", - // /*aot*/ true, /*build*/ true, /*publish*/ true }, - - /* AOT not affected by trimming */ - data.Add("Release", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); - data.Add("Debug", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); - } - - return data; - } - -#pragma warning disable xUnit1026 // For unused *buildValue*, and *publishValue* parameters - [Theory] - [MemberData(nameof(DefaultsTestData), parameters: false)] - [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: false)] - public void DefaultsWithBuild(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) - { - (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_build", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForBuild, publish: false); - - InferAndCheckPropertyValues(line, isPublish: false, wasmBuildNative: expectWasmBuildNativeForBuild, config: config); - } - - [Theory] - [MemberData(nameof(DefaultsTestData), parameters: true)] - [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: true)] - public void DefaultsWithPublish(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) - { - (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForPublish, publish: true); - - InferAndCheckPropertyValues(line, isPublish: true, wasmBuildNative: expectWasmBuildNativeForPublish, config: config); - } -#pragma warning restore xunit1026 - - public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() - { - {"Debug", "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, - {"Release", "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, - {"Debug", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false }, - {"Release", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } - }; - - public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() - { - { "Debug", "falsetrue", true, false }, - { "Release", "falsetrue", true, false }, - { "Debug", "truetrue", true, true }, - { "Release", "truetrue", true, true } - }; - - [Theory] - [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ false)] - [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] - public void WasmNativeStripDefaultWithBuild(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) - { - (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, dotnetWasmFromRuntimePack: !expectedWasmBuildNativeValue, publish: false); - - CheckPropertyValues(line, - wasmBuildNative: expectedWasmBuildNativeValue, - wasmNativeStrip: expectedWasmNativeStripValue, - wasmNativeDebugSymbols: true, - wasmBuildingForNestedPublish: null); - } - - [Theory] - [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ true)] - [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] - public void WasmNativeStripDefaultWithPublish(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) - { - (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, dotnetWasmFromRuntimePack: !expectedWasmBuildNativeValue, publish: true); - - CheckPropertyValues(line, - wasmBuildNative: expectedWasmBuildNativeValue, - wasmNativeStrip: expectedWasmNativeStripValue, - wasmNativeDebugSymbols: true, - wasmBuildingForNestedPublish: true); - } - - [Theory] - /* always relink */ - [InlineData("Debug", "", /*publish*/ false)] - [InlineData("Debug", "", /*publish*/ true)] - [InlineData("Release", "", /*publish*/ false)] - [InlineData("Release", "", /*publish*/ true)] - [InlineData("Release", "false", /*publish*/ true)] - public void WithNativeReference(string config, string extraProperties, bool publish) - { - string nativeLibPath = Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"); - string nativeRefItem = @$""; - (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", - config, - extraProperties, - aot: false, - dotnetWasmFromRuntimePack: !publish, - publish: publish, - extraItems: nativeRefItem); - - InferAndCheckPropertyValues(line, isPublish: publish, wasmBuildNative: true, config: config); - } - - private (string, string?) CheckWasmNativeDefaultValue(string projectName, - string config, - string extraProperties, - bool aot, - bool dotnetWasmFromRuntimePack, - bool publish, - string extraItems = "") - { - // builds with -O0 - extraProperties += "<_WasmDevel>true"; - - string printValueTarget = @" - - - " + (publish - ? @"" - : @"") - + ""; - - BuildArgs buildArgs = new(ProjectName: projectName, Config: config, AOT: aot, string.Empty, null); - buildArgs = ExpandBuildArgs(buildArgs, - extraProperties: extraProperties, - extraItems: extraItems, - insertAtEnd: printValueTarget); - - (_, string output) = BuildProject(buildArgs, - id: GetRandomId(), - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - ExpectSuccess: false, - UseCache: false, - BuildOnlyAfterPublish: false, - Publish: publish)); - - Assert.Contains("Stopping the build", output); - - Match m = s_regex.Match(output); - Assert.Equal(1, m.Groups.Count); - return (output, m.Success ? m.Groups[0]?.ToString() : null); - } - - private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasmBuildNative, string config) - { - bool expectedWasmNativeStripValue; - if (!isPublish && wasmBuildNative && config == "Debug") - expectedWasmNativeStripValue = false; - else - expectedWasmNativeStripValue = true; - - CheckPropertyValues(line, wasmBuildNative, expectedWasmNativeStripValue, /*wasmNativeDebugSymbols*/true, isPublish); - } - - private void CheckPropertyValues(string? line, bool wasmBuildNative, bool wasmNativeStrip, bool wasmNativeDebugSymbols, bool? wasmBuildingForNestedPublish) - { - Assert.NotNull(line); - Assert.Contains($"** WasmBuildNative: '{wasmBuildNative.ToString().ToLower()}', " + - $"WasmNativeStrip: '{wasmNativeStrip.ToString().ToLower()}', " + - $"WasmNativeDebugSymbols: '{wasmNativeDebugSymbols.ToString().ToLower()}', " + - $"WasmBuildingForNestedPublish: '{(wasmBuildingForNestedPublish.HasValue && wasmBuildingForNestedPublish == true ? "true" : "")}'", - line); - } +// public static TheoryData SettingDifferentFromValuesInRuntimePack(bool forPublish) +// { +// List<(string propertyName, bool defaultValueInRuntimePack)> defaults = new() +// { +// ("WasmEnableSIMD", true), +// ("WasmEnableExceptionHandling", true), +// ("InvariantTimezone", false), +// ("InvariantGlobalization", false), +// // ("WasmNativeStrip", true) -- tested separately because it has special handling in targets +// }; + +// TheoryData data = new(); + +// string[] configs = new[] { "Debug", "Release" }; +// foreach (var defaultPair in defaults) +// { +// foreach (string config in configs) +// { +// // Configuration=Release always causes relinking when publishing +// bool publishValue = forPublish && config == "Release" ? true : false; +// // Setting the default value from the runtime pack shouldn't trigger relinking +// data.Add(config, $"<{defaultPair.propertyName}>{defaultPair.defaultValueInRuntimePack.ToString().ToLower()}", +// /*aot*/ false, /*build*/ false, /*publish*/ publishValue); +// // Leaving the property unset, so checking the default +// data.Add(config, "", /*aot*/ false, /*build*/ false, /*publish*/ publishValue); + +// // Setting the !default value should trigger relinking +// data.Add(config, $"<{defaultPair.propertyName}>{(!defaultPair.defaultValueInRuntimePack).ToString().ToLower()}", +// /*aot*/ false, /*build*/ true, /*publish*/ true); +// } +// } + +// return data; +// } + +// public static TheoryData DefaultsTestData(bool forPublish) +// { +// TheoryData data = new() +// { +// /* relink by default for publish+Release */ +// { "Release", "", /*aot*/ false, /*build*/ false, /*publish*/ true }, +// /* NO relink by default for publish+Release, when not trimming */ +// { "Release", "false", /*aot*/ false, /*build*/ false, /*publish*/ false }, + +// /* When not trimming, and no-aot, we don't relink. But WasmNativeStrip=false should still trigger it*/ +// // { "Release", "falsefalse", +// // /*aot*/ false, /*build*/ true, /*publish*/ true } +// }; + +// if (!forPublish) +// { +// /* Debug config, when building does trigger relinking */ +// data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ true); +// } + +// if (forPublish) +// { +// /* NO relink by default for publish+Debug */ +// data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ false); + +// /* AOT */ +// data.Add("Release", "", /*aot*/ true, /*build*/ false, /*publish*/ true); +// data.Add("Debug", "", /*aot*/ true, /*build*/ false, /*publish*/ true); + +// // FIXME: separate test +// // { "Release", "true", +// // /*aot*/ true, /*build*/ true, /*publish*/ true }, + +// /* AOT not affected by trimming */ +// data.Add("Release", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); +// data.Add("Debug", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); +// } + +// return data; +// } + +// #pragma warning disable xUnit1026 // For unused *buildValue*, and *publishValue* parameters +// [Theory] +// [MemberData(nameof(DefaultsTestData), parameters: false)] +// [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: false)] +// public void DefaultsWithBuild(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) +// { +// (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_build", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForBuild, publish: false); + +// InferAndCheckPropertyValues(line, isPublish: false, wasmBuildNative: expectWasmBuildNativeForBuild, config: config); +// } + +// [Theory] +// [MemberData(nameof(DefaultsTestData), parameters: true)] +// [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: true)] +// public void DefaultsWithPublish(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) +// { +// (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForPublish, publish: true); + +// InferAndCheckPropertyValues(line, isPublish: true, wasmBuildNative: expectWasmBuildNativeForPublish, config: config); +// } +// #pragma warning restore xunit1026 + +// public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() +// { +// {"Debug", "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, +// {"Release", "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, +// {"Debug", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false }, +// {"Release", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } +// }; + +// public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() +// { +// { "Debug", "falsetrue", true, false }, +// { "Release", "falsetrue", true, false }, +// { "Debug", "truetrue", true, true }, +// { "Release", "truetrue", true, true } +// }; + +// [Theory] +// [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ false)] +// [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] +// public void WasmNativeStripDefaultWithBuild(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) +// { +// (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, dotnetWasmFromRuntimePack: !expectedWasmBuildNativeValue, publish: false); + +// CheckPropertyValues(line, +// wasmBuildNative: expectedWasmBuildNativeValue, +// wasmNativeStrip: expectedWasmNativeStripValue, +// wasmNativeDebugSymbols: true, +// wasmBuildingForNestedPublish: null); +// } + +// [Theory] +// [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ true)] +// [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] +// public void WasmNativeStripDefaultWithPublish(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) +// { +// (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, dotnetWasmFromRuntimePack: !expectedWasmBuildNativeValue, publish: true); + +// CheckPropertyValues(line, +// wasmBuildNative: expectedWasmBuildNativeValue, +// wasmNativeStrip: expectedWasmNativeStripValue, +// wasmNativeDebugSymbols: true, +// wasmBuildingForNestedPublish: true); +// } + +// [Theory] +// /* always relink */ +// [InlineData("Debug", "", /*publish*/ false)] +// [InlineData("Debug", "", /*publish*/ true)] +// [InlineData("Release", "", /*publish*/ false)] +// [InlineData("Release", "", /*publish*/ true)] +// [InlineData("Release", "false", /*publish*/ true)] +// public void WithNativeReference(string config, string extraProperties, bool publish) +// { +// string nativeLibPath = Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"); +// string nativeRefItem = @$""; +// (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", +// config, +// extraProperties, +// aot: false, +// dotnetWasmFromRuntimePack: !publish, +// publish: publish, +// extraItems: nativeRefItem); + +// InferAndCheckPropertyValues(line, isPublish: publish, wasmBuildNative: true, config: config); +// } + +// private (string, string?) CheckWasmNativeDefaultValue(string projectName, +// string config, +// string extraProperties, +// bool aot, +// bool dotnetWasmFromRuntimePack, +// bool publish, +// string extraItems = "") +// { +// // builds with -O0 +// extraProperties += "<_WasmDevel>true"; + +// string printValueTarget = @" +// +// +// " + (publish +// ? @"" +// : @"") +// + ""; + +// ProjectInfo buildArgs = new(ProjectName: projectName, Configuration: config, AOT: aot, string.Empty, null); +// buildArgs = ExpandBuildArgs(buildArgs, +// extraProperties: extraProperties, +// extraItems: extraItems, +// insertAtEnd: printValueTarget); + +// (_, string output) = BuildProject(buildArgs, +// id: GetRandomId(), +// new BuildProjectOptions( +// InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), +// DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, +// ExpectSuccess: false, +// UseCache: false, +// BuildOnlyAfterPublish: false, +// Publish: publish)); + +// Assert.Contains("Stopping the build", output); + +// Match m = s_regex.Match(output); +// Assert.Equal(1, m.Groups.Count); +// return (output, m.Success ? m.Groups[0]?.ToString() : null); +// } + +// private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasmBuildNative, string config) +// { +// bool expectedWasmNativeStripValue; +// if (!isPublish && wasmBuildNative && config == "Debug") +// expectedWasmNativeStripValue = false; +// else +// expectedWasmNativeStripValue = true; + +// CheckPropertyValues(line, wasmBuildNative, expectedWasmNativeStripValue, /*wasmNativeDebugSymbols*/true, isPublish); +// } + +// private void CheckPropertyValues(string? line, bool wasmBuildNative, bool wasmNativeStrip, bool wasmNativeDebugSymbols, bool? wasmBuildingForNestedPublish) +// { +// Assert.NotNull(line); +// Assert.Contains($"** WasmBuildNative: '{wasmBuildNative.ToString().ToLower()}', " + +// $"WasmNativeStrip: '{wasmNativeStrip.ToString().ToLower()}', " + +// $"WasmNativeDebugSymbols: '{wasmNativeDebugSymbols.ToString().ToLower()}', " + +// $"WasmBuildingForNestedPublish: '{(wasmBuildingForNestedPublish.HasValue && wasmBuildingForNestedPublish == true ? "true" : "")}'", +// line); +// } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 775d9cb46582d2..1b5dfc165186f6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -14,43 +14,43 @@ public class WasmRunOutOfAppBundleTests : TestMainJsTestBase public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - [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"))); - - string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Config); - string appBundleDir = Path.Combine(binDir, "AppBundle"); - string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); - - if (host is RunHost.Chrome) - { - 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); - } - } - - RunAndTestWasmApp(buildArgs, - expectedExitCode: 42, - host: host, - id: id, - bundleDir: outerDir, - jsRelativePath: "./AppBundle/test-main.js"); - } + // [Theory] + // [BuildAndRun] + // public void RunOutOfAppBundle(ProjectInfo buildArgs, RunHost host, string id) + // { + // buildArgs = buildArgs with { ProjectName = $"outofappbundle_{buildArgs.Configuration}_{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.Configuration == "Release"))); + + // string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Configuration); + // string appBundleDir = Path.Combine(binDir, "AppBundle"); + // string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); + + // if (host is RunHost.Chrome) + // { + // 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); + // } + // } + + // RunAndTestWasmApp(buildArgs, + // expectedExitCode: 42, + // host: host, + // id: id, + // bundleDir: outerDir, + // jsRelativePath: "./AppBundle/test-main.js"); + // } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 08ac8512665b75..9f528d235ab3c0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -17,100 +17,98 @@ public WasmSIMDTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bu { } - public static IEnumerable MainMethodSimdTestData(bool aot, RunHost host, bool simd) - => ConfigWithAOTData(aot, extraArgs: $"-p:WasmEnableSIMD={simd}") - .WithRunHosts(host) - .UnwrapItemsAsArrays(); - - [Theory] - [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, RunHost.All, true /* simd */ })] - public void Build_NoAOT_ShouldNotRelink(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"build_with_workload_no_aot"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs); - - (_, string output) = BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), - Publish: false, - DotnetWasmFromRuntimePack: true)); - - // Confirm that we didn't relink - Assert.DoesNotContain("Compiling native assets with emcc", output); - - RunAndTestWasmApp(buildArgs, - expectedExitCode: 42, - test: output => - { - Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); - Assert.Contains("Hello, World!", output); - }, host: host, id: id); - } - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - public void PublishWithSIMD_AOT(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"simd_with_workload_aot"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, "true"); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), - DotnetWasmFromRuntimePack: false)); - - RunAndTestWasmApp(buildArgs, - expectedExitCode: 42, - test: output => - { - Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); - Assert.Contains("Hello, World!", output); - }, host: host, id: id); - } - - [Theory] - [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - public void PublishWithoutSIMD_AOT(BuildArgs buildArgs, RunHost host, string id) - { - string projectName = $"nosimd_with_workload_aot"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, "false"); - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), - DotnetWasmFromRuntimePack: false)); - - RunAndTestWasmApp(buildArgs, - expectedExitCode: 42, - test: output => - { - Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); - Assert.Contains("Hello, World!", output); - }, host: host, id: id); - } - - private static string s_simdProgramText = @" - using System; - using System.Runtime.Intrinsics; - - public class TestClass { - public static int Main() - { - var v1 = Vector128.Create(0x12345678); - var v2 = Vector128.Create(0x23456789); - var v3 = v1*v2; - Console.WriteLine(v3); - Console.WriteLine(""Hello, World!""); - - return 42; - } - }"; + // public static IEnumerable MainMethodSimdTestData(bool aot, bool simd) + // => ConfigWithAOTData(aot, extraArgs: $"-p:WasmEnableSIMD={simd}").UnwrapItemsAsArrays(); + + // [Theory] + // [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, RunHost.All, true /* simd */ })] + // public void Build_NoAOT_ShouldNotRelink(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"build_with_workload_no_aot"; + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs); + + // (_, string output) = BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), + // Publish: false, + // DotnetWasmFromRuntimePack: true)); + + // // Confirm that we didn't relink + // Assert.DoesNotContain("Compiling native assets with emcc", output); + + // RunAndTestWasmApp(buildArgs, + // expectedExitCode: 42, + // test: output => + // { + // Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); + // Assert.Contains("Hello, World!", output); + // }, host: host, id: id); + // } + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] + // public void PublishWithSIMD_AOT(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"simd_with_workload_aot"; + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, "true"); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), + // DotnetWasmFromRuntimePack: false)); + + // RunAndTestWasmApp(buildArgs, + // expectedExitCode: 42, + // test: output => + // { + // Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); + // Assert.Contains("Hello, World!", output); + // }, host: host, id: id); + // } + + // [Theory] + // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] + // public void PublishWithoutSIMD_AOT(ProjectInfo buildArgs, RunHost host, string id) + // { + // string projectName = $"nosimd_with_workload_aot"; + // buildArgs = buildArgs with { ProjectName = projectName }; + // buildArgs = ExpandBuildArgs(buildArgs, "false"); + + // BuildProject(buildArgs, + // id: id, + // new BuildProjectOptions( + // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), + // DotnetWasmFromRuntimePack: false)); + + // RunAndTestWasmApp(buildArgs, + // expectedExitCode: 42, + // test: output => + // { + // Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); + // Assert.Contains("Hello, World!", output); + // }, host: host, id: id); + // } + + // private static string s_simdProgramText = @" + // using System; + // using System.Runtime.Intrinsics; + + // public class TestClass { + // public static int Main() + // { + // var v1 = Vector128.Create(0x12345678); + // var v2 = Vector128.Create(0x23456789); + // var v3 = v1*v2; + // Console.WriteLine(v3); + // Console.WriteLine(""Hello, World!""); + + // return 42; + // } + // }"; } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index 06d47877717507..1178a2e6c2d5ca 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -22,9 +22,10 @@ public WasmSdkBasedProjectProvider(ITestOutputHelper _testOutput, string default _defaultTargetFramework = defaultTargetFramework; IsFingerprintingSupported = true; } + protected override string BundleDirName { get { return "wwwroot"; } } - protected override IReadOnlyDictionary GetAllKnownDotnetFilesToFingerprintMap(AssertBundleOptionsBase assertOptions) + protected override IReadOnlyDictionary GetAllKnownDotnetFilesToFingerprintMap(AssertBundleOptions assertOptions) => new SortedDictionary() { { "dotnet.js", false }, @@ -38,7 +39,7 @@ protected override IReadOnlyDictionary GetAllKnownDotnetFilesToFin { "dotnet.runtime.js.map", false }, }; - protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOptionsBase assertOptions) + protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOptions assertOptions) { SortedSet res = new() { @@ -47,16 +48,16 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp "dotnet.native.js", "dotnet.runtime.js", }; - if (assertOptions.RuntimeType is RuntimeVariant.MultiThreaded) + if (assertOptions.BuildOptions.RuntimeType is RuntimeVariant.MultiThreaded) { res.Add("dotnet.native.worker.mjs"); } - if (assertOptions.GlobalizationMode is GlobalizationMode.Hybrid) + if (assertOptions.BuildOptions.GlobalizationMode is GlobalizationMode.Hybrid) { res.Add("dotnet.globalization.js"); } - if (!assertOptions.IsPublish) + if (!assertOptions.BuildOptions.IsPublish) { res.Add("dotnet.js.map"); res.Add("dotnet.runtime.js.map"); @@ -69,29 +70,23 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp } - protected void AssertBundle(BuildArgs buildArgs, BuildProjectOptions buildProjectOptions) + public void AssertBundle(BuildProjectOptions buildOptions) { - string frameworkDir = buildProjectOptions.BinFrameworkDir ?? - FindBinFrameworkDir(buildArgs.Config, buildProjectOptions.Publish, buildProjectOptions.TargetFramework); - AssertBundle(new( - Config: buildArgs.Config, - IsPublish: buildProjectOptions.Publish, - TargetFramework: buildProjectOptions.TargetFramework, - BinFrameworkDir: frameworkDir, - CustomIcuFile: buildProjectOptions.CustomIcuFile, - GlobalizationMode: buildProjectOptions.GlobalizationMode, - AssertSymbolsFile: false, - ExpectedFileType: buildProjectOptions.Publish && buildArgs.Config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack + AssertBundle(new AssertBundleOptions( + BuildOptions: buildOptions, + ExpectSymbolsFile: true, + AssertIcuAssets: true, + AssertSymbolsFile: false )); } - protected void AssertBundle(AssertWasmSdkBundleOptions assertOptions) + private void AssertBundle(AssertBundleOptions assertOptions) { IReadOnlyDictionary actualDotnetFiles = AssertBasicBundle(assertOptions); - if (assertOptions.IsPublish) + if (assertOptions.BuildOptions.IsPublish) { - string publishPath = Path.GetFullPath(Path.Combine(assertOptions.BinFrameworkDir, "..", "..")); + string publishPath = Path.GetFullPath(Path.Combine(assertOptions.BuildOptions.BinFrameworkDir, "..", "..")); Assert.Equal("publish", Path.GetFileName(publishPath)); var dlls = Directory.EnumerateFiles(publishPath, "*.dll"); @@ -105,24 +100,25 @@ protected void AssertBundle(AssertWasmSdkBundleOptions assertOptions) return; // Compare files with the runtime pack - string objBuildDir = Path.Combine(ProjectDir!, "obj", assertOptions.Config, assertOptions.TargetFramework, "wasm", assertOptions.IsPublish ? "for-publish" : "for-build"); + string objBuildDir = Path.Combine(ProjectDir!, "obj", assertOptions.BuildOptions.Configuration, assertOptions.BuildOptions.TargetFramework, "wasm", assertOptions.BuildOptions.IsPublish ? "for-publish" : "for-build"); - string runtimeNativeDir = BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.TargetFramework, assertOptions.RuntimeType); + string runtimeNativeDir = BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.BuildOptions.TargetFramework, assertOptions.BuildOptions.RuntimeType); - string srcDirForNativeFileToCompareAgainst = assertOptions.ExpectedFileType switch + string srcDirForNativeFileToCompareAgainst = assertOptions.BuildOptions.ExpectedFileType switch { NativeFilesType.FromRuntimePack => runtimeNativeDir, NativeFilesType.Relinked => objBuildDir, NativeFilesType.AOT => objBuildDir, - _ => throw new ArgumentOutOfRangeException(nameof(assertOptions.ExpectedFileType)) + _ => throw new ArgumentOutOfRangeException(nameof(assertOptions.BuildOptions.ExpectedFileType)) }; - string buildType = assertOptions.IsPublish ? "publish" : "build"; + + string buildType = assertOptions.BuildOptions.IsPublish ? "publish" : "build"; var nativeFilesToCheck = new List() { "dotnet.native.wasm", "dotnet.native.js" }; - if (assertOptions.RuntimeType == RuntimeVariant.MultiThreaded) + if (assertOptions.BuildOptions.RuntimeType == RuntimeVariant.MultiThreaded) { nativeFilesToCheck.Add("dotnet.native.worker.mjs"); } - if (assertOptions.GlobalizationMode == GlobalizationMode.Hybrid) + if (assertOptions.BuildOptions.GlobalizationMode == GlobalizationMode.Hybrid) { nativeFilesToCheck.Add("dotnet.globalization.js"); } @@ -138,7 +134,7 @@ protected void AssertBundle(AssertWasmSdkBundleOptions assertOptions) actualDotnetFiles[nativeFilename].ActualPath, buildType); - if (assertOptions.ExpectedFileType != NativeFilesType.FromRuntimePack) + if (assertOptions.BuildOptions.ExpectedFileType != NativeFilesType.FromRuntimePack) { if (nativeFilename == "dotnet.native.worker.mjs") { @@ -152,41 +148,32 @@ protected void AssertBundle(AssertWasmSdkBundleOptions assertOptions) } } } - - public void AssertTestMainJsBundle(BuildArgs buildArgs, - BuildProjectOptions buildProjectOptions, - string? buildOutput = null, - AssertTestMainJsAppBundleOptions? assertAppBundleOptions = null) + + public void AssertWasmSdkBundle(BuildProjectOptions buildOptions, string? buildOutput = null) { if (buildOutput is not null) - ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildProjectOptions.TargetFramework ?? _defaultTargetFramework); - - if (assertAppBundleOptions is not null) - AssertBundle(assertAppBundleOptions); - else - AssertBundle(buildArgs, buildProjectOptions); + ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework); + AssertBundle(buildOptions); } - - public void AssertWasmSdkBundle(BuildArgs buildArgs, - BuildProjectOptions buildProjectOptions, - string? buildOutput = null, - AssertWasmSdkBundleOptions? assertAppBundleOptions = null) + + public BuildPaths GetBuildPaths(ProjectInfo info, bool forPublish) { - if (buildOutput is not null) - ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildProjectOptions.TargetFramework ?? _defaultTargetFramework); - - if (assertAppBundleOptions is not null) - AssertBundle(assertAppBundleOptions); - else - AssertBundle(buildArgs, buildProjectOptions); + Assert.NotNull(ProjectDir); + string objDir = Path.Combine(ProjectDir, "obj", info.Configuration, _defaultTargetFramework); + string binDir = Path.Combine(ProjectDir, "bin", info.Configuration, _defaultTargetFramework); + string binFrameworkDir = GetBinFrameworkDir(info.Configuration, forPublish, _defaultTargetFramework); + + string objWasmDir = Path.Combine(objDir, "wasm", forPublish ? "for-publish" : "for-build"); + // for build: we should take from runtime pack? + return new BuildPaths(objWasmDir, objDir, binDir, binFrameworkDir); } - public override string FindBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) + public override string GetBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) { EnsureProjectDirIsSet(); string basePath = Path.Combine(projectDir ?? ProjectDir!, "bin", config, framework); if (forPublish) - basePath = FindSubDirIgnoringCase(basePath, "publish"); + basePath = Path.Combine(basePath, "publish"); return Path.Combine(basePath, BundleDirName, "_framework"); } From a451e4e76a540e5ab639048345598986797b1b21 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:47:22 +0000 Subject: [PATCH 002/104] Fix WASI build errors - WASI is not prepared for making `BrowserStructures` common. --- .../{Common => BrowserStructures}/BuildProduct.cs | 0 .../{Common => BrowserStructures}/NativeFilesType.cs | 0 .../Wasm.Build.Tests/{Common => BrowserStructures}/RunOptions.cs | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/mono/wasm/Wasm.Build.Tests/{Common => BrowserStructures}/BuildProduct.cs (100%) rename src/mono/wasm/Wasm.Build.Tests/{Common => BrowserStructures}/NativeFilesType.cs (100%) rename src/mono/wasm/Wasm.Build.Tests/{Common => BrowserStructures}/RunOptions.cs (100%) diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildProduct.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildProduct.cs similarity index 100% rename from src/mono/wasm/Wasm.Build.Tests/Common/BuildProduct.cs rename to src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildProduct.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/NativeFilesType.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/NativeFilesType.cs similarity index 100% rename from src/mono/wasm/Wasm.Build.Tests/Common/NativeFilesType.cs rename to src/mono/wasm/Wasm.Build.Tests/BrowserStructures/NativeFilesType.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs similarity index 100% rename from src/mono/wasm/Wasm.Build.Tests/Common/RunOptions.cs rename to src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs From afd4d5cf3a06add11421f8f2cd08caee81a03ea1 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:29:53 +0000 Subject: [PATCH 003/104] Non-invariatn globalization WBT: done. --- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 14 +- .../wasm/Wasm.Build.Tests/Common/Template.cs | 3 +- .../HybridGlobalizationTests.cs | 79 +++++---- .../wasm/Wasm.Build.Tests/IcuShardingTests.cs | 59 ++++--- .../Wasm.Build.Tests/IcuShardingTests2.cs | 11 +- src/mono/wasm/Wasm.Build.Tests/IcuTests.cs | 72 ++++---- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 161 ++++++++---------- .../Templates/WasmTemplateTestsBase.cs | 7 + 8 files changed, 200 insertions(+), 206 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index b8a69d9880130a..3ac2f73374a109 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -192,13 +192,13 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, return (res, logFilePath); } - protected NativeFilesType GetExpectedFileType(ProjectInfo info, bool isPublish=false) => - !isPublish ? - NativeFilesType.FromRuntimePack : - info.AOT ? NativeFilesType.AOT : - (info.Configuration == "Debug" || !IsUsingWorkloads) ? - NativeFilesType.FromRuntimePack : - NativeFilesType.Relinked; + protected NativeFilesType GetExpectedFileType(ProjectInfo info, bool isPublish, bool isNativeBuild=false) => + isNativeBuild ? NativeFilesType.Relinked : + !isPublish ? NativeFilesType.FromRuntimePack : + info.AOT ? NativeFilesType.AOT : + (info.Configuration == "Debug" || !IsUsingWorkloads) ? + NativeFilesType.FromRuntimePack : + NativeFilesType.Relinked; protected string RunAndTestWasmApp(ProjectInfo buildArgs, string id, diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs b/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs index ac9970a5fe5567..b840205de00706 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/Template.cs @@ -8,5 +8,6 @@ namespace Wasm.Build.Tests; public enum Template { BlazorWasm, - WasmBrowser + WasmBrowser, + Wasi } diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index b10a8350aa6e89..8590107c0ef08f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -10,8 +11,11 @@ namespace Wasm.Build.Tests { - public class HybridGlobalizationTests : TestMainJsTestBase + public class HybridGlobalizationTests : WasmTemplateTestsBase { + // FOR REVIEWER: + // This file will be deteled as a part of HybridGlobalization removal, so issues don't have to get logged + public HybridGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { @@ -20,41 +24,42 @@ public HybridGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestClas public static IEnumerable HybridGlobalizationTestData(bool aot) => ConfigWithAOTData(aot).UnwrapItemsAsArrays(); - // [Theory] - // [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void AOT_HybridGlobalizationTests(ProjectInfo buildArgs, RunHost host, string id) - // => TestHybridGlobalizationTests(buildArgs, host, id); - - // [Theory] - // [MemberData(nameof(HybridGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void RelinkingWithoutAOT(ProjectInfo buildArgs, RunHost host, string id) - // => TestHybridGlobalizationTests(buildArgs, host, id, - // extraProperties: "true", - // dotnetWasmFromRuntimePack: false); - - // private void TestHybridGlobalizationTests(ProjectInfo buildArgs, RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) - // { - // string projectName = $"hybrid"; - // extraProperties = $"{extraProperties}true"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - - // if (dotnetWasmFromRuntimePack == null) - // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - - // string programText = File.ReadAllText(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - // GlobalizationMode: GlobalizationMode.Hybrid)); - - // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("HybridGlobalization works, thrown exception as expected", output); - // } + [Theory] + [BuildAndRun(aot: false)] + [BuildAndRun(aot: true)] + public async Task AOT_HybridGlobalizationTests(string config, bool aot) + => await TestHybridGlobalizationTests(config, aot); + + [Theory] + [BuildAndRun(aot: false)] + // Expected to find /workspaces/runtime/artifacts/bin/Wasm.Build.Tests/Release/net9.0/linux-x64/wbt artifacts/hybrid_Debug_False_g2xwxpxr_lus_鿀蜒枛遫䡫煉/obj/Debug/net9.0/wasm/for-build/dotnet.globalization.js + [ActiveIssue("dotnet.globalization.js not found")] + public async Task RelinkingWithoutAOT(string config, bool aot) + => await TestHybridGlobalizationTests(config, aot, isNativeBuild: true); + + private async Task TestHybridGlobalizationTests(string config, bool aot, bool isNativeBuild = false) + { + string extraProperties = $"true"; + if (isNativeBuild) + extraProperties += "true"; + + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "hybrid", extraProperties: extraProperties); + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); + UpdateBrowserMainJs(); + + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), + IsPublish: isPublish, + GlobalizationMode: GlobalizationMode.Hybrid + )); + + string output = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + Assert.Contains("HybridGlobalization works, thrown exception as expected", output); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs index d6ea740a20faf9..ea6b851f6d62c3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs @@ -19,34 +19,33 @@ public class IcuShardingTests : IcuTestsBase public IcuShardingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } -// public static IEnumerable IcuExpectedAndMissingCustomShardTestData(string config) => -// from templateType in templateTypes -// from aot in boolOptions -// from onlyPredefinedCultures in boolOptions -// // isOnlyPredefinedCultures = true fails with wasmbrowser: https://github.com/dotnet/runtime/issues/108272 -// where !(onlyPredefinedCultures && templateType == "wasmbrowser") -// select new object[] { config, templateType, aot, CustomIcuPath, s_customIcuTestedLocales, onlyPredefinedCultures }; - -// public static IEnumerable IcuExpectedAndMissingAutomaticShardTestData(string config) -// { -// var locales = new Dictionary -// { -// { "fr-FR", GetEfigsTestedLocales(SundayNames.French) }, -// { "ja-JP", GetCjkTestedLocales(SundayNames.Japanese) }, -// { "sk-SK", GetNocjkTestedLocales(SundayNames.Slovak) } -// }; -// return from aot in boolOptions -// from locale in locales -// select new object[] { config, "wasmbrowser", aot, locale.Key, locale.Value }; -// } - -// [Theory] -// [MemberData(nameof(IcuExpectedAndMissingCustomShardTestData), parameters: new object[] { "Release" })] -// public async Task CustomIcuShard(string config, string templateType, bool aot, string customIcuPath, string customLocales, bool onlyPredefinedCultures) => -// await TestIcuShards(config, templateType, aot, customIcuPath, customLocales, GlobalizationMode.Custom, onlyPredefinedCultures); - -// [Theory] -// [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { "Release" })] -// public async Task AutomaticShardSelectionDependingOnEnvLocale(string config, string templateType, bool aot, string environmentLocale, string testedLocales) => -// await BuildAndRunIcuTest(config, templateType, aot, testedLocales, GlobalizationMode.Sharded, language: environmentLocale); + public static IEnumerable IcuExpectedAndMissingCustomShardTestData(string config) => + from aot in boolOptions + from onlyPredefinedCultures in boolOptions + // isOnlyPredefinedCultures = true fails with wasmbrowser: https://github.com/dotnet/runtime/issues/108272 + where !(onlyPredefinedCultures) + select new object[] { config, aot, CustomIcuPath, s_customIcuTestedLocales, onlyPredefinedCultures }; + + public static IEnumerable IcuExpectedAndMissingAutomaticShardTestData(string config) + { + var locales = new Dictionary + { + { "fr-FR", GetEfigsTestedLocales(SundayNames.French) }, + { "ja-JP", GetCjkTestedLocales(SundayNames.Japanese) }, + { "sk-SK", GetNocjkTestedLocales(SundayNames.Slovak) } + }; + return from aot in boolOptions + from locale in locales + select new object[] { config, aot, locale.Key, locale.Value }; + } + + [Theory] + [MemberData(nameof(IcuExpectedAndMissingCustomShardTestData), parameters: new object[] { "Release" })] + public async Task CustomIcuShard(string config, bool aot, string customIcuPath, string customLocales, bool onlyPredefinedCultures) => + await TestIcuShards(config, Template.WasmBrowser, aot, customIcuPath, customLocales, GlobalizationMode.Custom, onlyPredefinedCultures); + + [Theory] + [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { "Release" })] + public async Task AutomaticShardSelectionDependingOnEnvLocale(string config, bool aot, string environmentLocale, string testedLocales) => + await BuildAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, GlobalizationMode.Sharded, language: environmentLocale); } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs index 4afc09b29c3afd..cb6259315e4f54 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs @@ -31,14 +31,13 @@ public static IEnumerable IcuExpectedAndMissingShardFromRuntimePackTes { "icudt_no_CJK.dat", GetNocjkTestedLocales() } }; return - from templateType in templateTypes from aot in boolOptions from locale in locales - select new object[] { config, templateType, aot, locale.Key, locale.Value }; + select new object[] { config, aot, locale.Key, locale.Value }; } - // [Theory] - // [MemberData(nameof(IcuExpectedAndMissingShardFromRuntimePackTestData), parameters: new object[] { "Release" })] - // public async Task DefaultAvailableIcuShardsFromRuntimePack(string config, string templateType, bool aot, string shardName, string testedLocales) => - // await TestIcuShards(config, templateType, aot, shardName, testedLocales, GlobalizationMode.Custom); + [Theory] + [MemberData(nameof(IcuExpectedAndMissingShardFromRuntimePackTestData), parameters: new object[] { "Release" })] + public async Task DefaultAvailableIcuShardsFromRuntimePack(string config, bool aot, string shardName, string testedLocales) => + await TestIcuShards(config, Template.WasmBrowser, aot, shardName, testedLocales, GlobalizationMode.Custom); } \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs index 6ee351b688805a..fb6d8513168f1e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs @@ -20,10 +20,9 @@ public IcuTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildCo : base(output, buildContext) { } public static IEnumerable FullIcuWithICustomIcuTestData(string config) => - from templateType in templateTypes - from aot in boolOptions + from aot in boolOptions from fullIcu in boolOptions - select new object[] { config, templateType, aot, fullIcu }; + select new object[] { config, aot, fullIcu }; public static IEnumerable FullIcuWithInvariantTestData(string config) { @@ -35,10 +34,9 @@ public static IEnumerable FullIcuWithInvariantTestData(string config) new object[] { false, false, GetEfigsTestedLocales() }, new object[] { false, true, s_fullIcuTestedLocales } }; - return from templateType in templateTypes - from aot in boolOptions + return from aot in boolOptions from locale in locales - select new object[] { config, templateType, aot, locale[0], locale[1], locale[2] }; + select new object[] { config, aot, locale[0], locale[1], locale[2] }; } public static IEnumerable IncorrectIcuTestData(string config) @@ -48,57 +46,61 @@ public static IEnumerable IncorrectIcuTestData(string config) { "icudtNonExisting.dat", true }, { "incorrectName.dat", false } }; - return from templateType in templateTypes - from customFile in customFiles - select new object[] { config, templateType, customFile.Key, customFile.Value }; + return from customFile in customFiles + select new object[] { config, customFile.Key, customFile.Value }; } - // [Theory] - // [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { "Release" })] - // public async Task FullIcuFromRuntimePackWithInvariant(string config, string templateType, bool aot, bool invariant, bool fullIcu, string testedLocales) => - // await BuildAndRunIcuTest( - // config, - // templateType, - // aot, - // testedLocales, - // globalizationMode: invariant ? GlobalizationMode.Invariant : fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Sharded, - // extraProperties: - // // https://github.com/dotnet/runtime/issues/94133: "wasmbrowser" should use WasmIncludeFullIcuData, not BlazorWebAssemblyLoadAllGlobalizationData - // $"{invariant}{fullIcu}{aot}"); + [Theory] + [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { "Release" })] + public async Task FullIcuFromRuntimePackWithInvariant(string config="Release", bool aot=false, bool invariant=true, bool fullIcu=true, string testedLocales="Array.Empty()") => + await BuildAndRunIcuTest( + config, + Template.WasmBrowser, + aot, + testedLocales, + globalizationMode: invariant ? GlobalizationMode.Invariant : fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Sharded, + extraProperties: + // https://github.com/dotnet/runtime/issues/94133: "wasmbrowser" should use WasmIncludeFullIcuData, not BlazorWebAssemblyLoadAllGlobalizationData + $"{invariant}{fullIcu}{aot}"); // [Theory] // [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { "Release" })] - // public async Task FullIcuFromRuntimePackWithCustomIcu(string config, string templateType, bool aot, bool fullIcu) + // public async Task FullIcuFromRuntimePackWithCustomIcu(string config, bool aot, bool fullIcu) // { - // bool isBrowser = templateType == "wasmbrowser"; - // string customIcuProperty = isBrowser ? "BlazorIcuDataFileName" : "WasmIcuDataFileName"; - // string fullIcuProperty = isBrowser ? "BlazorWebAssemblyLoadAllGlobalizationData" : "WasmIncludeFullIcuData"; + // string customIcuProperty = "BlazorIcuDataFileName"; + // string fullIcuProperty = "BlazorWebAssemblyLoadAllGlobalizationData"; // string extraProperties = $"<{customIcuProperty}>{CustomIcuPath}<{fullIcuProperty}>{fullIcu}{aot}"; // string testedLocales = fullIcu ? s_fullIcuTestedLocales : s_customIcuTestedLocales; // GlobalizationMode globalizationMode = fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Custom; // string customIcuFile = fullIcu ? "" : CustomIcuPath; - // string output = await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); + // string output = await BuildAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); // if (fullIcu) // Assert.Contains($"$({customIcuProperty}) has no effect when $({fullIcuProperty}) is set to true.", output); // } // [Theory] // [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { "Release" })] - // public void NonExistingCustomFileAssertError(string config, string templateType, string customIcu, bool isFilenameFormCorrect) + // public void NonExistingCustomFileAssertError(string config, string customIcu, bool isFilenameFormCorrect) // { // string customIcuProperty = "BlazorIcuDataFileName"; // string extraProperties = $"<{customIcuProperty}>{customIcu}"; - // (ProjectInfo buildArgs, string projectFile) = CreateIcuProject( - // config, templateType, aot: false, "Array.Empty()", extraProperties); - // string output = BuildIcuTest( - // buildArgs, - // GlobalizationMode.Custom, - // customIcu, - // expectSuccess: false, - // assertAppBundle: false); + // ProjectInfo info = CreateIcuProject(config, Template.WasmBrowser, aot: false, "Array.Empty()", extraProperties); + // bool isPublish = false; + // (string _, string output) = BuildTemplateProject(info, + // new BuildProjectOptions( + // config, + // info.ProjectName, + // BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + // ExpectedFileType: GetExpectedFileType(info, isPublish), + // IsPublish: isPublish, + // GlobalizationMode: GlobalizationMode.Custom, + // CustomIcuFile: customIcu, + // ExpectSuccess: false, + // AssertAppBundle: false + // )); // if (isFilenameFormCorrect) // { diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index a62d3951324f4d..c0aa793315005e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -106,94 +106,75 @@ protected string GetProgramText(string testedLocales, bool onlyPredefinedCulture public record Locale(string Code, string? SundayName); "; - // protected async Task TestIcuShards(string config, string templateType, bool aot, string shardName, string testedLocales, GlobalizationMode globalizationMode, bool onlyPredefinedCultures=false) - // { - // string icuProperty = "BlazorIcuDataFileName"; // https://github.com/dotnet/runtime/issues/94133 - // // by default, we remove resource strings from an app. ICU tests are checking exception messages contents -> resource string keys are not enough - // string extraProperties = $"<{icuProperty}>{shardName}false{aot}"; - // if (onlyPredefinedCultures) - // extraProperties = $"{extraProperties}true"; - // await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, onlyPredefinedCultures, icuFileName: shardName); - // } - - // protected (ProjectInfo buildArgs, string projectFile) CreateIcuProject( - // string config, - // string templateType, - // bool aot, - // string testedLocales, - // string extraProperties = "", - // bool onlyPredefinedCultures=false) - // { - // string id = $"icu_{config}_{aot}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, templateType); - // string projectDirectory = Path.GetDirectoryName(projectFile)!; - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - // var buildArgs = new ProjectInfo(projectName, config, aot, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // string programPath = Path.Combine(projectDirectory, "Program.cs"); - // string programText = GetProgramText(testedLocales, onlyPredefinedCultures); - // File.WriteAllText(programPath, programText); - // _testOutput.WriteLine($"----- Program: -----{Environment.NewLine}{programText}{Environment.NewLine}-------"); - - // string mainPath = Path.Combine("wwwroot", "main.js"); - // var replacements = new Dictionary { - // { "runMain", "runMainAndExit" }, - // { ".create()", ".withConsoleForwarding().withElementOnExit().withExitCodeLogging().create()" } - // }; - // UpdateFile(mainPath, replacements); - // RemoveContentsFromProjectFile(mainPath, ".create();", "await runMainAndExit();"); - // return (buildArgs, projectFile); - // } - - // protected string BuildIcuTest( - // ProjectInfo buildArgs, - // GlobalizationMode globalizationMode, - // string icuFileName = "", - // bool expectSuccess = true, - // bool assertAppBundle = true) - // { - // bool dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - // (string _, string buildOutput) = BuildTemplateProject(buildArgs, - // id: buildArgs.Id, - // new BuildProjectOptions( - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - // CreateProject: false, - // Publish: true, - // TargetFramework: BuildTestBase.DefaultTargetFramework, - // UseCache: false, - // GlobalizationMode: globalizationMode, - // CustomIcuFile: icuFileName, - // ExpectSuccess: expectSuccess, - // AssertAppBundle: assertAppBundle - // )); - // return buildOutput; - // } - - // protected async Task BuildAndRunIcuTest( - // string config, - // string templateType, - // bool aot, - // string testedLocales, - // GlobalizationMode globalizationMode, - // string extraProperties = "", - // bool onlyPredefinedCultures=false, - // string language = "en-US", - // string icuFileName = "") - // { - // try - // { - // (ProjectInfo buildArgs, string projectFile) = CreateIcuProject( - // config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); - // string buildOutput = BuildIcuTest(buildArgs, globalizationMode, icuFileName); - // string runOutput = await RunBuiltBrowserApp(buildArgs.Configuration, projectFile, language); - // return $"{buildOutput}\n{runOutput}"; - // } - // catch(Exception ex) - // { - // Console.WriteLine($"Exception: {ex}; _testOutput={_testOutput}"); - // throw; - // } - // } + protected async Task TestIcuShards(string config, Template templateType, bool aot, string shardName, string testedLocales, GlobalizationMode globalizationMode, bool onlyPredefinedCultures=false) + { + string icuProperty = "BlazorIcuDataFileName"; // https://github.com/dotnet/runtime/issues/94133 + // by default, we remove resource strings from an app. ICU tests are checking exception messages contents -> resource string keys are not enough + string extraProperties = $"<{icuProperty}>{shardName}false{aot}"; + if (onlyPredefinedCultures) + extraProperties = $"{extraProperties}true"; + await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, onlyPredefinedCultures, icuFileName: shardName); + } + + protected ProjectInfo CreateIcuProject( + string config, + Template templateType, + bool aot, + string testedLocales, + string extraProperties = "", + bool onlyPredefinedCultures=false) + { + ProjectInfo info = CreateWasmTemplateProject(templateType, config, aot, "icu", extraProperties: extraProperties); + string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; + string programPath = Path.Combine(projectDirectory, "Program.cs"); + string programText = GetProgramText(testedLocales, onlyPredefinedCultures); + File.WriteAllText(programPath, programText); + _testOutput.WriteLine($"----- Program: -----{Environment.NewLine}{programText}{Environment.NewLine}-------"); + + string mainPath = Path.Combine("wwwroot", "main.js"); + var replacements = new Dictionary { + { "runMain", "runMainAndExit" }, + { ".create()", ".withConsoleForwarding().withElementOnExit().withExitCodeLogging().create()" } + }; + UpdateFile(mainPath, replacements); + RemoveContentsFromProjectFile(mainPath, ".create();", "await runMainAndExit();"); + return info; + } + + protected async Task BuildAndRunIcuTest( + string config, + Template templateType, + bool aot, + string testedLocales, + GlobalizationMode globalizationMode, + string extraProperties = "", + bool onlyPredefinedCultures=false, + string language = "en-US", + string icuFileName = "") + { + try + { + ProjectInfo info = CreateIcuProject( + config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); + bool isPublish = false; + bool triggersNativeBuild = globalizationMode == GlobalizationMode.Invariant; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, triggersNativeBuild), + IsPublish: isPublish, + GlobalizationMode: globalizationMode, + CustomIcuFile: icuFileName + )); + string runOutput = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath, language); + return $"{buildOutput}\n{runOutput}"; + } + catch(Exception ex) + { + Console.WriteLine($"Exception: {ex}; _testOutput={_testOutput}"); + throw; + } + } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index b251307e1a26ad..9a5de132020305 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -129,6 +129,13 @@ protected void UpdateFile(string pathRelativeToProjectDir, Dictionary Date: Mon, 21 Oct 2024 14:33:31 +0000 Subject: [PATCH 004/104] Missing change to previous commit. --- src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index c0aa793315005e..fd1a3e4a907f13 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -130,14 +130,8 @@ protected ProjectInfo CreateIcuProject( string programText = GetProgramText(testedLocales, onlyPredefinedCultures); File.WriteAllText(programPath, programText); _testOutput.WriteLine($"----- Program: -----{Environment.NewLine}{programText}{Environment.NewLine}-------"); - - string mainPath = Path.Combine("wwwroot", "main.js"); - var replacements = new Dictionary { - { "runMain", "runMainAndExit" }, - { ".create()", ".withConsoleForwarding().withElementOnExit().withExitCodeLogging().create()" } - }; - UpdateFile(mainPath, replacements); - RemoveContentsFromProjectFile(mainPath, ".create();", "await runMainAndExit();"); + + UpdateBrowserMainJs(); return info; } From cd4f94d0eb44480b57474aeddc1e205967c21de3 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:42:25 +0000 Subject: [PATCH 005/104] `InvariantGlobalizationTests` done --- .../InvariantGlobalizationTests.cs | 91 ++++++++++--------- .../InvariantGlobalization.cs | 7 +- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index afea2759c89c6d..07fb08cea33b6a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -10,7 +11,7 @@ namespace Wasm.Build.Tests { - public class InvariantGlobalizationTests : TestMainJsTestBase + public class InvariantGlobalizationTests : WasmTemplateTestsBase { public InvariantGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -25,54 +26,54 @@ public InvariantGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestC new object?[] { true }) .UnwrapItemsAsArrays(); - // // TODO: check that icu bits have been linked out - // [Theory] - // [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void AOT_InvariantGlobalization(ProjectInfo buildArgs, bool? invariantGlobalization, RunHost host, string id) - // => TestInvariantGlobalization(buildArgs, invariantGlobalization, host, id); + // TODO: check that icu bits have been linked out + [Theory] + [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false })] + [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ true })] + public async Task AOT_InvariantGlobalization(string config, bool aot, bool? invariantGlobalization) + => await TestInvariantGlobalization(config, aot, invariantGlobalization); - // // TODO: What else should we use to verify a relinked build? - // [Theory] - // [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void RelinkingWithoutAOT(ProjectInfo buildArgs, bool? invariantGlobalization, RunHost host, string id) - // => TestInvariantGlobalization(buildArgs, invariantGlobalization, host, id, - // extraProperties: "true", - // dotnetWasmFromRuntimePack: false); + // TODO: What else should we use to verify a relinked build? + [Theory] + [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false })] + public async Task RelinkingWithoutAOT(string config, bool aot, bool? invariantGlobalization) + => await TestInvariantGlobalization(config, aot, invariantGlobalization, isNativeBuild: true); - // private void TestInvariantGlobalization(ProjectInfo buildArgs, bool? invariantGlobalization, - // RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) - // { - // string projectName = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; - // if (invariantGlobalization != null) - // extraProperties = $"{extraProperties}{invariantGlobalization}"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - - // if (dotnetWasmFromRuntimePack == null) - // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + private async Task TestInvariantGlobalization(string config, bool aot, bool? invariantGlobalization, bool isNativeBuild = false) + { + string extraProperties = isNativeBuild ? "true" : ""; + if (invariantGlobalization != null) + extraProperties = $"{extraProperties}{invariantGlobalization}"; - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs"), Path.Combine(_projectDir!, "Program.cs")), - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - // GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded)); + string prefix = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs")); + UpdateBrowserMainJs(); - // if (invariantGlobalization == true) - // { - // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Could not create es-ES culture", output); - // Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); - // } - // else - // { - // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id, args: "nativename=\"espa\u00F1ol (Espa\u00F1a)\""); - // Assert.Contains("es-ES: Is Invariant LCID: False", output); + bool isPublish = false; + // invariantGlobalization triggers native build + isNativeBuild = isNativeBuild || invariantGlobalization == true; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), + IsPublish: isPublish, + GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded + )); - // // ignoring the last line of the output which prints the current culture - // } - // } + string output = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + if (invariantGlobalization == true) + { + Assert.Contains("Could not create es-ES culture", output); + Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); + } + else + { + Assert.Contains("es-ES: Is Invariant LCID: False", output); + // ignoring the last line of the output which prints the current culture + } + } } } diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs index c7b1219b6aabde..b92bac226848ef 100644 --- a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs @@ -7,11 +7,8 @@ { CultureInfo culture = new ("es-ES", false); Console.WriteLine($"es-ES: Is Invariant LCID: {culture.LCID == CultureInfo.InvariantCulture.LCID}"); - - var nativeNameArg = args.FirstOrDefault(arg => arg.StartsWith("nativename=")); - if (nativeNameArg == null) - throw new ArgumentException($"When not in invariant mode, InvariantGlobalization.cs expects nativename argument with expected es-ES NativeName."); - string expectedNativeName = nativeNameArg.Substring(11).Trim('"'); // skip nativename= + + string expectedNativeName = "espa\u00F1ol (Espa\u00F1a)"; string nativeName = culture.NativeName; if (nativeName != expectedNativeName) throw new ArgumentException($"Expected es-ES NativeName: {expectedNativeName}, but got: {nativeName}"); From 531a1974f0a66e8a4b56d829463110532c796f0e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:54:25 +0000 Subject: [PATCH 006/104] Missing change to icu tests. --- .../Blazor/IcuShardingTests.cs | 94 +------------- .../wasm/Wasm.Build.Tests/Blazor/IcuTests.cs | 116 +----------------- src/mono/wasm/Wasm.Build.Tests/IcuTests.cs | 86 ++++++------- 3 files changed, 51 insertions(+), 245 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs index 03cec1e19cf246..a9238a8a4ec67b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs @@ -19,94 +19,8 @@ public class IcuShardingTests : BlazorWasmTestBase public IcuShardingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - // [Theory] - // [InlineData("Debug", "icudt.dat")] - // [InlineData("Release", "icudt.dat")] - // [InlineData("Debug", "icudt_CJK.dat")] - // [InlineData("Release", "icudt_CJK.dat")] - // public async Task CustomIcuFileFromRuntimePack(string config, string fileName) - // { - // string id = $"blz_customFromRuntimePack_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // var buildOptions = new BuildProjectOptions( - // id, - // config, - // WarnAsError: true, - // GlobalizationMode: GlobalizationMode.Custom, - // CustomIcuFile: fileName - // ); - // AddItemsPropertiesToProject( - // projectFile, - // extraProperties: - // $"{fileName}"); - - // (CommandResult res, string logPath) = BlazorBuild(buildOptions); - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } - - // [Theory] - // [InlineData("Debug", "incorrectName.dat", false)] - // [InlineData("Release", "incorrectName.dat", false)] - // [InlineData("Debug", "icudtNonExisting.dat", true)] - // [InlineData("Release", "icudtNonExisting.dat", true)] - // public void NonExistingCustomFileAssertError(string config, string fileName, bool isFilenameCorrect) - // { - // string id = $"blz_invalidCustomIcu_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // AddItemsPropertiesToProject( - // projectFile, - // extraProperties: - // $"{fileName}"); - - // try - // { - // (CommandResult res, string logPath) = BlazorBuild( - // new BuildProjectOptions( - // id, - // config, - // WarnAsError: false, - // GlobalizationMode: GlobalizationMode.Custom, - // CustomIcuFile: fileName - // )); - // } - // catch (XunitException ex) - // { - // if (isFilenameCorrect) - // { - // Assert.Contains($"Could not find $(BlazorIcuDataFileName)={fileName}, or when used as a path relative to the runtime pack", ex.Message); - // } - // else - // { - // Assert.Contains("File name in $(BlazorIcuDataFileName) has to start with 'icudt'", ex.Message); - // } - // } - // catch (Exception) - // { - // throw new Exception("Unexpected exception in test scenario."); - // } - // // we expect build error, so there is not point in running the app - // } - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task CustomFileNotFromRuntimePackAbsolutePath(string config) - // { - // string id = $"blz_invalidCustomIcu_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // AddItemsPropertiesToProject( - // projectFile, - // extraProperties: - // $"{IcuTestsBase.CustomIcuPath}"); - - // (CommandResult res, string logPath) = BlazorBuild( - // new BuildProjectOptions( - // id, - // config, - // WarnAsError: false, - // GlobalizationMode: GlobalizationMode.Custom, - // CustomIcuFile: IcuTestsBase.CustomIcuPath - // )); - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } + // FOR REVIEWER: + // These tests are not specific for Blazor, they are testing ICU mechanisms that are commond for all apps using browser SDK + // From this reason, tests in this file are duplicates of IcuShardingTests.cs and IcuShardingTests2.cs in mono/wasm/Wasm.Build.Tests + // This file will get removed after approval of the PR } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs index 4bdf2ca6111140..e462b7e82c9da4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs @@ -19,116 +19,8 @@ public class IcuTests : BlazorWasmTestBase public IcuTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - // [Theory] - // [InlineData("Debug", false)] - // [InlineData("Debug", true)] - // [InlineData("Debug", null)] - // [InlineData("Release", false)] - // [InlineData("Release", true)] - // [InlineData("Release", null)] - // public async Task HybridWithInvariant(string config, bool? invariant) - // { - // string id = $"blz_hybrid_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // string extraProperties = "true"; - // if (invariant != null) - // extraProperties += $"{invariant}"; - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // (CommandResult res, string logPath) = BlazorBuild( - // new BuildProjectOptions( - // id, - // config, - // WarnAsError: false, - // GlobalizationMode: invariant == true ? GlobalizationMode.Invariant : GlobalizationMode.Hybrid, - // ExpectedFileType: invariant == true ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack - // )); - - // string warning = "$(HybridGlobalization) has no effect when $(InvariantGlobalization) is set to true."; - // if (invariant == true) - // { - // Assert.Contains(warning, res.Output); - // } - // else - // { - // Assert.DoesNotContain(warning, res.Output); - // } - - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } - - // [Theory] - // [InlineData("Debug", false)] - // [InlineData("Debug", true)] - // [InlineData("Debug", null)] - // [InlineData("Release", false)] - // [InlineData("Release", true)] - // [InlineData("Release", null)] - // public async Task HybridWithFullIcuFromRuntimePack(string config, bool? fullIcu) - // { - // string id = $"blz_hybrid_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // string extraProperties = "true"; - // if (fullIcu != null) - // extraProperties += $"{fullIcu}"; - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // (CommandResult res, string logPath) = BlazorBuild( - // new BuildProjectOptions( - // id, - // config, - // WarnAsError: false, - // GlobalizationMode: GlobalizationMode.Hybrid - // )); - - // string warning = "$(BlazorWebAssemblyLoadAllGlobalizationData) has no effect when $(HybridGlobalization) is set to true."; - // if (fullIcu == true) - // { - // Assert.Contains(warning, res.Output); - // } - // else - // { - // Assert.DoesNotContain(warning, res.Output); - // } - - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } - - // [Theory] - // [InlineData("Debug", false)] - // [InlineData("Debug", true)] - // [InlineData("Debug", null)] - // [InlineData("Release", false)] - // [InlineData("Release", true)] - // [InlineData("Release", null)] - // public async Task FullIcuFromRuntimePackWithInvariant(string config, bool? invariant) - // { - // string id = $"blz_hybrid_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // string extraProperties = "true"; - // if (invariant != null) - // extraProperties += $"{invariant}"; - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // (CommandResult res, string logPath) = BlazorBuild( - // new BuildProjectOptions( - // id, - // config, - // WarnAsError: false, - // GlobalizationMode: invariant == true ? GlobalizationMode.Invariant : GlobalizationMode.FullIcu, - // ExpectedFileType: invariant == true ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack - // )); - - // string warning = "$(BlazorWebAssemblyLoadAllGlobalizationData) has no effect when $(InvariantGlobalization) is set to true."; - // if (invariant == true) - // { - // Assert.Contains(warning, res.Output); - // } - // else - // { - // Assert.DoesNotContain(warning, res.Output); - // } - - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } + // FOR REVIEWER: + // These tests are not specific for Blazor, they are testing ICU mechanisms that are commond for all apps using browser SDK + // From this reason, tests in this file are duplicates of IcuTests.cs and HybridGlobalizationTests.cs in mono/wasm/Wasm.Build.Tests + // This file will get removed after approval of the PR } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs index fb6d8513168f1e..3ea31bc499a001 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs @@ -64,51 +64,51 @@ await BuildAndRunIcuTest( // https://github.com/dotnet/runtime/issues/94133: "wasmbrowser" should use WasmIncludeFullIcuData, not BlazorWebAssemblyLoadAllGlobalizationData $"{invariant}{fullIcu}{aot}"); - // [Theory] - // [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { "Release" })] - // public async Task FullIcuFromRuntimePackWithCustomIcu(string config, bool aot, bool fullIcu) - // { - // string customIcuProperty = "BlazorIcuDataFileName"; - // string fullIcuProperty = "BlazorWebAssemblyLoadAllGlobalizationData"; - // string extraProperties = $"<{customIcuProperty}>{CustomIcuPath}<{fullIcuProperty}>{fullIcu}{aot}"; + [Theory] + [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { "Release" })] + public async Task FullIcuFromRuntimePackWithCustomIcu(string config, bool aot, bool fullIcu) + { + string customIcuProperty = "BlazorIcuDataFileName"; + string fullIcuProperty = "BlazorWebAssemblyLoadAllGlobalizationData"; + string extraProperties = $"<{customIcuProperty}>{CustomIcuPath}<{fullIcuProperty}>{fullIcu}{aot}"; - // string testedLocales = fullIcu ? s_fullIcuTestedLocales : s_customIcuTestedLocales; - // GlobalizationMode globalizationMode = fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Custom; - // string customIcuFile = fullIcu ? "" : CustomIcuPath; - // string output = await BuildAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); - // if (fullIcu) - // Assert.Contains($"$({customIcuProperty}) has no effect when $({fullIcuProperty}) is set to true.", output); - // } + string testedLocales = fullIcu ? s_fullIcuTestedLocales : s_customIcuTestedLocales; + GlobalizationMode globalizationMode = fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Custom; + string customIcuFile = fullIcu ? "" : CustomIcuPath; + string output = await BuildAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); + if (fullIcu) + Assert.Contains($"$({customIcuProperty}) has no effect when $({fullIcuProperty}) is set to true.", output); + } - // [Theory] - // [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { "Release" })] - // public void NonExistingCustomFileAssertError(string config, string customIcu, bool isFilenameFormCorrect) - // { - // string customIcuProperty = "BlazorIcuDataFileName"; - // string extraProperties = $"<{customIcuProperty}>{customIcu}"; + [Theory] + [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { "Release" })] + public void NonExistingCustomFileAssertError(string config, string customIcu, bool isFilenameFormCorrect) + { + string customIcuProperty = "BlazorIcuDataFileName"; + string extraProperties = $"<{customIcuProperty}>{customIcu}"; - // ProjectInfo info = CreateIcuProject(config, Template.WasmBrowser, aot: false, "Array.Empty()", extraProperties); - // bool isPublish = false; - // (string _, string output) = BuildTemplateProject(info, - // new BuildProjectOptions( - // config, - // info.ProjectName, - // BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - // ExpectedFileType: GetExpectedFileType(info, isPublish), - // IsPublish: isPublish, - // GlobalizationMode: GlobalizationMode.Custom, - // CustomIcuFile: customIcu, - // ExpectSuccess: false, - // AssertAppBundle: false - // )); + ProjectInfo info = CreateIcuProject(config, Template.WasmBrowser, aot: false, "Array.Empty()", extraProperties); + bool isPublish = false; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + GlobalizationMode: GlobalizationMode.Custom, + CustomIcuFile: customIcu, + ExpectSuccess: false, + AssertAppBundle: false + )); - // if (isFilenameFormCorrect) - // { - // Assert.Contains($"Could not find $({customIcuProperty})={customIcu}, or when used as a path relative to the runtime pack", output); - // } - // else - // { - // Assert.Contains($"File name in $({customIcuProperty}) has to start with 'icudt'.", output); - // } - // } + if (isFilenameFormCorrect) + { + Assert.Contains($"Could not find $({customIcuProperty})={customIcu}, or when used as a path relative to the runtime pack", output); + } + else + { + Assert.Contains($"File name in $({customIcuProperty}) has to start with 'icudt'.", output); + } + } } From d762fb67511309f2db85f2a496f3fa8e8a021f5f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:21:39 +0000 Subject: [PATCH 007/104] `InvariantTimezoneTests` done --- .../InvariantTimezoneTests.cs | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 93e1ab1b437cda..717773ef7255c9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -10,7 +11,7 @@ namespace Wasm.Build.Tests { - public class InvariantTimezoneTests : TestMainJsTestBase + public class InvariantTimezoneTests : WasmTemplateTestsBase { public InvariantTimezoneTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -25,48 +26,50 @@ public InvariantTimezoneTests(ITestOutputHelper output, SharedBuildPerTestClassF new object?[] { true }) .UnwrapItemsAsArrays(); - // [Theory] - // [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void AOT_InvariantTimezone(ProjectInfo buildArgs, bool? invariantTimezone, RunHost host, string id) - // => TestInvariantTimezone(buildArgs, invariantTimezone, host, id); + [Theory] + [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, })] + [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ true })] + public async Task AOT_InvariantTimezone(string config, bool aot, bool? invariantTimezone) + => await TestInvariantTimezone(config, aot, invariantTimezone); - // [Theory] - // [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void RelinkingWithoutAOT(ProjectInfo buildArgs, bool? invariantTimezone, RunHost host, string id) - // => TestInvariantTimezone(buildArgs, invariantTimezone, host, id, - // extraProperties: "true", - // dotnetWasmFromRuntimePack: false); + [Theory] + [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false })] + public async Task RelinkingWithoutAOT(string config, bool aot, bool? invariantTimezone) + => await TestInvariantTimezone(config, aot, invariantTimezone, isNativeBuild: true); - // private void TestInvariantTimezone(ProjectInfo buildArgs, bool? invariantTimezone, - // RunHost host, string id, string extraProperties="", bool? dotnetWasmFromRuntimePack=null) - // { - // string projectName = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; - // if (invariantTimezone != null) - // extraProperties = $"{extraProperties}{invariantTimezone}"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); + private async Task TestInvariantTimezone(string config, bool aot, bool? invariantTimezone, bool isNativeBuild = false) + { + string extraProperties = isNativeBuild ? "true" : ""; + if (invariantTimezone != null) + extraProperties = $"{extraProperties}{invariantTimezone}"; - // if (dotnetWasmFromRuntimePack == null) - // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); + string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs")); + UpdateBrowserMainJs(); - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs"), Path.Combine(_projectDir!, "Program.cs")), - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); + bool isPublish = false; + // invariantTimezone triggers native build + isNativeBuild = isNativeBuild || invariantTimezone == true; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), + IsPublish: isPublish + )); - // string output = RunAndTestWasmApp(buildArgs, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("UTC BaseUtcOffset is 0", output); - // if (invariantTimezone == true) - // { - // Assert.Contains("Could not find Asia/Tokyo", output); - // } - // else - // { - // Assert.Contains("Asia/Tokyo BaseUtcOffset is 09:00:00", output); - // } - // } + string output = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + Assert.Contains("UTC BaseUtcOffset is 0", output); + if (invariantTimezone == true) + { + Assert.Contains("Could not find Asia/Tokyo", output); + } + else + { + Assert.Contains("Asia/Tokyo BaseUtcOffset is 09:00:00", output); + } + } } } From 84d1df2e04eb1d8db5a6d3a3c5b744530e229a70 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 22 Oct 2024 07:28:07 +0000 Subject: [PATCH 008/104] Draft of `MainWithArgsTests` - does not work. --- .../Wasm.Build.Tests/MainWithArgsTests.cs | 122 +++++++----------- .../Templates/WasmTemplateTestsBase.cs | 14 +- .../AsyncMainWithArgs.cs | 13 ++ .../SyncMainWithArgs.cs | 13 ++ 4 files changed, 82 insertions(+), 80 deletions(-) create mode 100644 src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs create mode 100644 src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index ef590a6c74befc..d9793503506db7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -11,7 +12,7 @@ namespace Wasm.Build.Tests { - public class MainWithArgsTests : TestMainJsTestBase + public class MainWithArgsTests : WasmTemplateTestsBase { public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -24,82 +25,55 @@ public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur new object?[] { new object?[0] } ).UnwrapItemsAsArrays(); - // [Theory] - // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void AsyncMainWithArgs(ProjectInfo buildArgs, string[] args, RunHost host, string id) - // => TestMainWithArgs("async_main_with_args", @" - // public class TestClass { - // public static async System.Threading.Tasks.Task Main(string[] args) - // { - // ##CODE## - // return await System.Threading.Tasks.Task.FromResult(42 + count); - // } - // }", - // buildArgs, args, host, id); + [Theory] + [ActiveIssue("ToDo: passing args to the program does not work, possible error in the test logic")] + [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] + [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true })] + public async Task AsyncMainWithArgs(string config, bool aot, string[] args) + => await TestMainWithArgs(config, aot, "async_main_with_args", "AsyncMainWithArgs.cs", args); - // [Theory] - // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void NonAsyncMainWithArgs(ProjectInfo buildArgs, string[] args, RunHost host, string id) - // => TestMainWithArgs("non_async_main_args", @" - // public class TestClass { - // public static int Main(string[] args) - // { - // ##CODE## - // return 42 + count; - // } - // }", buildArgs, args, host, id); + [Theory] + [ActiveIssue("ToDo: passing args to the program does not work, possible error in the test logic")] + [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] + [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true })] + public async Task NonAsyncMainWithArgs(string config, bool aot, string[] args) + => await TestMainWithArgs(config, aot, "non_async_main_args", "SyncMainWithArgs.cs", args); - // void TestMainWithArgs(string projectNamePrefix, - // string projectContents, - // ProjectInfo buildArgs, - // string[] args, - // RunHost host, - // string id, - // bool? dotnetWasmFromRuntimePack=null) - // { - // string projectName = $"{projectNamePrefix}_{buildArgs.Configuration}_{buildArgs.AOT}"; - // string code = @" - // int count = args == null ? 0 : args.Length; - // System.Console.WriteLine($""args#: {args?.Length}""); - // foreach (var arg in args ?? System.Array.Empty()) - // System.Console.WriteLine($""arg: {arg}""); - // "; - // string programText = projectContents.Replace("##CODE##", code); - - // buildArgs = buildArgs with { ProjectName = projectName, ProjectFileContents = programText }; - // buildArgs = ExpandBuildArgs(buildArgs); - // if (dotnetWasmFromRuntimePack == null) - // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - - // _testOutput.WriteLine ($"-- args: {buildArgs}, name: {projectName}"); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - - // // Because we get extra "-verbosity", "Debug" from XHarness - // int argsCount = args.Length; - // bool isBrowser = host == RunHost.Chrome || host == RunHost.Firefox || host == RunHost.Safari; - // if (isBrowser) - // argsCount += 2; + async Task TestMainWithArgs(string config, + bool aot, + string projectNamePrefix, + string projectContentsName, + string[] args) + { + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, projectNamePrefix); + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", projectContentsName)); + UpdateBrowserMainJs(); + string mainJsPath = Path.Combine(_projectDir!, "wwwroot", "main.js"); + UpdateFile( + mainJsPath, + new Dictionary { + { ".withApplicationArguments(\"start\")", $".withApplicationArgumentsFromQuery()" } + }); + _testOutput.WriteLine ($"-- args: {args}, name: {projectContentsName}"); - // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42 + argsCount, args: string.Join(' ', args), - // test: output => - // { - // Assert.Contains($"args#: {argsCount}", output); - // foreach (var arg in args) - // Assert.Contains($"arg: {arg}", output); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); - // if (isBrowser) - // { - // Assert.Contains($"arg: -verbosity", output); - // Assert.Contains($"arg: Debug", output); - // } - // }, host: host, id: id); - // } + int argsCount = args.Length; + int expectedCode = 42 + argsCount; + string argsStr = string.Join(" ", args); + string output = await RunPublishedBrowserApp(info.Configuration, extraArgs: argsStr, expectedExitCode: expectedCode); + Console.WriteLine(output); + Assert.Contains($"args#: {argsCount}", output); + foreach (var arg in args) + Assert.Contains($"arg: {arg}", output); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 9a5de132020305..dac9b2f58babc3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -152,7 +152,7 @@ protected void RemoveContentsFromProjectFile(string pathRelativeToProjectDir, st } protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramework, string runtimeAssetsRelativePath = DefaultRuntimeAssetsRelativePath) - { + { string mainJsPath = Path.Combine(_projectDir!, "wwwroot", "main.js"); string mainJsContent = File.ReadAllText(mainJsPath); @@ -175,21 +175,23 @@ protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramewo } // ToDo: consolidate with BlazorRunTest - protected async Task RunBuiltBrowserApp(string config, string projectFile, string language = "en-US", string extraArgs = "", string testScenario = "") + protected async Task RunBuiltBrowserApp(string config, string projectFile, string language = "en-US", string extraArgs = "", string testScenario = "", int expectedExitCode = 42) => await RunBrowser( $"run --no-silent -c {config} --no-build --project \"{projectFile}\" --forward-console {extraArgs}", _projectDir!, + expectedExitCode: expectedExitCode, language, testScenario: testScenario); - protected async Task RunPublishedBrowserApp(string config, string language = "en-US", string extraArgs = "", string testScenario = "") + protected async Task RunPublishedBrowserApp(string config, string language = "en-US", string extraArgs = "", string testScenario = "", int expectedExitCode = 42) => await RunBrowser( - command: $"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", + command: $"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files {extraArgs}", workingDirectory: Path.Combine(GetBinFrameworkDir(config, forPublish: true), ".."), + expectedExitCode: expectedExitCode, language: language, testScenario: testScenario); - private async Task RunBrowser(string command, string workingDirectory, string language = "en-US", string testScenario = "") + private async Task RunBrowser(string command, string workingDirectory, int expectedExitCode, string language = "en-US", string testScenario = "") { using var runCommand = new RunCommand(s_buildEnv, _testOutput).WithWorkingDirectory(workingDirectory); await using var runner = new BrowserRunner(_testOutput); @@ -198,7 +200,7 @@ private async Task RunBrowser(string command, string workingDirectory, s browserUrl => new Uri(new Uri(browserUrl), $"?test={testScenario}").ToString(); var page = await runner.RunAsync(runCommand, command, language: language, modifyBrowserUrl: modifyBrowserUrl); await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); - Assert.Contains("WASM EXIT 42", string.Join(Environment.NewLine, runner.OutputLines)); + Assert.Contains($"WASM EXIT {expectedExitCode}", string.Join(Environment.NewLine, runner.OutputLines)); return string.Join("\n", runner.OutputLines); } diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs new file mode 100644 index 00000000000000..aaa7f399a75bfe --- /dev/null +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; + +public class TestClass { + public static async Task Main(string[] args) + { + int count = args == null ? 0 : args.Length; + Console.WriteLine($"args#: {args?.Length}"); + foreach (var arg in args ?? Array.Empty()) + Console.WriteLine($"arg: {arg}"); + return await Task.FromResult(42 + count); + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs new file mode 100644 index 00000000000000..f41199dd440f10 --- /dev/null +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; + +public class TestClass { + public static int Main(string[] args) + { + int count = args == null ? 0 : args.Length; + Console.WriteLine($"args#: {args?.Length}"); + foreach (var arg in args ?? Array.Empty()) + Console.WriteLine($"arg: {arg}"); + return 42 + count; + } +} \ No newline at end of file From 43fbb6e2a5ce824d40033dacc3639c0903c78629 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:33:27 +0000 Subject: [PATCH 009/104] Consolidate Blazor and Browser app run methods. --- .../Blazor/BlazorWasmTestBase.cs | 103 +++++------------- .../Blazor/WorkloadRequiredTests.cs | 2 +- .../wasm/Wasm.Build.Tests/BrowserRunner.cs | 10 +- .../BrowserStructures/RunOptions.cs | 5 +- .../Wasm.Build.Tests/BuildPublishTests.cs | 19 ++-- .../HybridGlobalizationTests.cs | 5 +- .../wasm/Wasm.Build.Tests/IcuShardingTests.cs | 2 +- src/mono/wasm/Wasm.Build.Tests/IcuTests.cs | 4 +- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 11 +- .../InvariantGlobalizationTests.cs | 5 +- .../InvariantTimezoneTests.cs | 5 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 13 ++- .../Templates/WasmTemplateTestsBase.cs | 102 ++++++++++++----- .../AsyncMainWithArgs.cs | 6 +- .../HybridGlobalization.cs | 8 +- .../InvariantGlobalization.cs | 11 +- .../InvariantTimezone.cs | 10 +- .../SyncMainWithArgs.cs | 6 +- 18 files changed, 177 insertions(+), 150 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index ffb08a24d8216b..2593d12e4072dd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -174,85 +174,42 @@ protected string CreateProjectWithNativeReference(string id) // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public Task BlazorRunForBuildWithDotnetRun(RunOptions runOptions) - => BlazorRunTest(runOptions with { Host = RunHost.DotnetRun }); + public async Task BlazorRunForBuildWithDotnetRun(RunOptions runOptions) + => await BlazorRunTest(runOptions with { Host = RunHost.DotnetRun }); - public Task BlazorRunForPublishWithWebServer(RunOptions runOptions) - => BlazorRunTest(runOptions with { Host = RunHost.WebServer }); + public async Task BlazorRunForPublishWithWebServer(RunOptions runOptions) + => await BlazorRunTest(runOptions with { Host = RunHost.WebServer }); - public Task BlazorRunTest(RunOptions runOptions) => runOptions.Host switch + public async Task BlazorRunTest(RunOptions runOptions) { - RunHost.DotnetRun => - BlazorRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions), - - RunHost.WebServer => - BlazorRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", - Path.GetFullPath(Path.Combine(GetBlazorBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")), - runOptions), - - _ => throw new NotImplementedException(runOptions.Host.ToString()) - }; - - public async Task BlazorRunTest(string runArgs, - string workingDirectory, - RunOptions runOptions) - { - if (!string.IsNullOrEmpty(runOptions.ExtraArgs)) - runArgs += $" {runOptions.ExtraArgs}"; - - runOptions.ServerEnvironment?.ToList().ForEach( - kv => s_buildEnv.EnvVars[kv.Key] = kv.Value); - - using RunCommand runCommand = new RunCommand(s_buildEnv, _testOutput); - ToolCommand cmd = runCommand.WithWorkingDirectory(workingDirectory); - - await using var runner = new BrowserRunner(_testOutput); - var page = await runner.RunAsync( - cmd, - runArgs, - onConsoleMessage: OnConsoleMessage, - onServerMessage: runOptions.OnServerMessage, - onError: OnErrorMessage, - modifyBrowserUrl: browserUrl => new Uri(new Uri(browserUrl), runOptions.BrowserPath + runOptions.QueryString).ToString()); - - _testOutput.WriteLine("Waiting for page to load"); - await page.WaitForLoadStateAsync(LoadState.DOMContentLoaded, new () { Timeout = 1 * 60 * 1000 }); - - if (runOptions.CheckCounter) + if (runOptions.ExecuteAfterLoaded is null) { - await page.Locator("text=Counter").ClickAsync(); - var txt = await page.Locator("p[role='status']").InnerHTMLAsync(); - Assert.Equal("Current count: 0", txt); - - await page.Locator("text=\"Click me\"").ClickAsync(); - await Task.Delay(300); - txt = await page.Locator("p[role='status']").InnerHTMLAsync(); - Assert.Equal("Current count: 1", txt); + runOptions = runOptions with { ExecuteAfterLoaded = async (runOptions, page) => + { + if (runOptions.CheckCounter) + { + await page.Locator("text=Counter").ClickAsync(); + var txt = await page.Locator("p[role='status']").InnerHTMLAsync(); + Assert.Equal("Current count: 0", txt); + + await page.Locator("text=\"Click me\"").ClickAsync(); + await Task.Delay(300); + txt = await page.Locator("p[role='status']").InnerHTMLAsync(); + Assert.Equal("Current count: 1", txt); + } + } + }; } - - if (runOptions.Test is not null) - await runOptions.Test(page); - - _testOutput.WriteLine($"Waiting for additional 10secs to see if any errors are reported"); - await Task.Delay(10_000); - - void OnConsoleMessage(IPage page, IConsoleMessage msg) - { - _testOutput.WriteLine($"[{msg.Type}] {msg.Text}"); - - runOptions.OnConsoleMessage?.Invoke(page, msg); - - if (runOptions.DetectRuntimeFailures) - { - if (msg.Text.Contains("[MONO] * Assertion") || msg.Text.Contains("Error: [MONO] ")) - throw new XunitException($"Detected a runtime failure at line: {msg.Text}"); - } - } - - void OnErrorMessage(string msg) + switch (runOptions.Host) { - _testOutput.WriteLine($"[ERROR] {msg}"); - runOptions.OnErrorMessage?.Invoke(msg); + case RunHost.DotnetRun: + return await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions); + case RunHost.WebServer: + return await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", + Path.GetFullPath(Path.Combine(GetBlazorBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")), + runOptions); + default: + throw new NotImplementedException(runOptions.Host.ToString()); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index 15c8c5ab1fd3f3..707ae999acf217 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -116,7 +116,7 @@ public static TheoryData SettingDifferentFromValuesInRunti // } // StringBuilder sbOutput = new(); - // await BlazorRunTest(new RunOptions() + // await RunBrowserTest(new RunOptions() // { // Configuration = config, // Host = publish ? RunHost.WebServer : RunHost.DotnetRun, diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs index 0b6b7d3dda4130..bfaf24d7844421 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs @@ -113,12 +113,12 @@ public async Task SpawnBrowserAsync( bool headless = true, int? timeout = null, int maxRetries = 3, - string language = "en-US" + string locale = "en-US" ) { var url = new Uri(browserUrl); Playwright = await Microsoft.Playwright.Playwright.CreateAsync(); // codespaces: ignore certificate error -> Microsoft.Playwright.PlaywrightException : net::ERR_CERT_AUTHORITY_INVALID - string[] chromeArgs = new[] { $"--explicitly-allowed-ports={url.Port}", "--ignore-certificate-errors", $"--lang={language}" }; + string[] chromeArgs = new[] { $"--explicitly-allowed-ports={url.Port}", "--ignore-certificate-errors", $"--lang={locale}" }; _testOutput.WriteLine($"Launching chrome ('{s_chromePath.Value}') via playwright with args = {string.Join(',', chromeArgs)}"); int attempt = 0; @@ -155,15 +155,15 @@ public async Task RunAsync( ToolCommand cmd, string args, bool headless = true, - string language = "en-US", + string locale = "en-US", Action? onConsoleMessage = null, Action? onServerMessage = null, Action? onError = null, Func? modifyBrowserUrl = null) { var urlString = await StartServerAndGetUrlAsync(cmd, args, onServerMessage); - var browser = await SpawnBrowserAsync(urlString, headless, language: language); - var context = await browser.NewContextAsync(new BrowserNewContextOptions { Locale = language }); + var browser = await SpawnBrowserAsync(urlString, headless, locale: locale); + var context = await browser.NewContextAsync(new BrowserNewContextOptions { Locale = locale }); return await RunAsync(context, urlString, headless, onConsoleMessage, onError, modifyBrowserUrl); } diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index 10cc3a10961c0c..9de34559a73139 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -25,7 +25,10 @@ public record RunOptions string ExtraArgs = "", string BrowserPath = "", string QueryString = "", - int? ExpectedExitCode = 0 + string Locale = "en-US", + int? ExpectedExitCode = 0, + + Func? ExecuteAfterLoaded = null ); public enum RunHost { DotnetRun, WebServer }; diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 85613e8a3c90f7..111b1e9f2e988f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -53,9 +53,9 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) bool isPublish = false; BuildTemplateProject(info, new BuildProjectOptions( - config, + info.Configuration, info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), ExpectedFileType: GetExpectedFileType(info, isPublish), IsPublish: isPublish )); @@ -63,20 +63,20 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + RunOptions runOptions = new(info.Configuration); + await RunForBuildWithDotnetRun(runOptions); isPublish = true; BuildTemplateProject(info, new BuildProjectOptions( - config, + info.Configuration, info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), ExpectedFileType: GetExpectedFileType(info, isPublish), IsPublish: isPublish, UseCache: false )); - - await RunPublishedBrowserApp(info.Configuration); + await RunForPublishWithWebServer(runOptions); } [Theory] @@ -113,7 +113,8 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + RunOptions runOptions = new(info.Configuration); + await RunForBuildWithDotnetRun(runOptions); File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); @@ -144,7 +145,7 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) pathsDict["dotnet.js.map"] = (pathsDict["dotnet.js.map"].fullPath, unchanged: false); pathsDict["dotnet.runtime.js.map"] = (pathsDict["dotnet.runtime.js.map"].fullPath, unchanged: false); CompareStat(firstBuildStat, publishStat, pathsDict); - await RunPublishedBrowserApp(info.Configuration); + await RunForPublishWithWebServer(runOptions); // second build isPublish = false; diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 8590107c0ef08f..23f7ba0ce80936 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -47,7 +47,7 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); UpdateBrowserMainJs(); - bool isPublish = false; + bool isPublish = true; BuildTemplateProject(info, new BuildProjectOptions( config, @@ -58,7 +58,8 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is GlobalizationMode: GlobalizationMode.Hybrid )); - string output = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + RunOptions runOptions = new(info.Configuration); + string output = await RunForPublishWithWebServer(runOptions); Assert.Contains("HybridGlobalization works, thrown exception as expected", output); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs index ea6b851f6d62c3..c2471af7a2b7b7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs @@ -47,5 +47,5 @@ public async Task CustomIcuShard(string config, bool aot, string customIcuPath, [Theory] [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { "Release" })] public async Task AutomaticShardSelectionDependingOnEnvLocale(string config, bool aot, string environmentLocale, string testedLocales) => - await BuildAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, GlobalizationMode.Sharded, language: environmentLocale); + await PublishAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, GlobalizationMode.Sharded, locale: environmentLocale); } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs index 3ea31bc499a001..f29ac07400c7fe 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs @@ -54,7 +54,7 @@ public static IEnumerable IncorrectIcuTestData(string config) [Theory] [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { "Release" })] public async Task FullIcuFromRuntimePackWithInvariant(string config="Release", bool aot=false, bool invariant=true, bool fullIcu=true, string testedLocales="Array.Empty()") => - await BuildAndRunIcuTest( + await PublishAndRunIcuTest( config, Template.WasmBrowser, aot, @@ -75,7 +75,7 @@ public async Task FullIcuFromRuntimePackWithCustomIcu(string config, bool aot, b string testedLocales = fullIcu ? s_fullIcuTestedLocales : s_customIcuTestedLocales; GlobalizationMode globalizationMode = fullIcu ? GlobalizationMode.FullIcu : GlobalizationMode.Custom; string customIcuFile = fullIcu ? "" : CustomIcuPath; - string output = await BuildAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); + string output = await PublishAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, globalizationMode, extraProperties, icuFileName: customIcuFile); if (fullIcu) Assert.Contains($"$({customIcuProperty}) has no effect when $({fullIcuProperty}) is set to true.", output); } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index fd1a3e4a907f13..522f2861d0413d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -113,7 +113,7 @@ protected async Task TestIcuShards(string config, Template templateType, bool ao string extraProperties = $"<{icuProperty}>{shardName}false{aot}"; if (onlyPredefinedCultures) extraProperties = $"{extraProperties}true"; - await BuildAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, onlyPredefinedCultures, icuFileName: shardName); + await PublishAndRunIcuTest(config, templateType, aot, testedLocales, globalizationMode, extraProperties, onlyPredefinedCultures, icuFileName: shardName); } protected ProjectInfo CreateIcuProject( @@ -135,7 +135,7 @@ protected ProjectInfo CreateIcuProject( return info; } - protected async Task BuildAndRunIcuTest( + protected async Task PublishAndRunIcuTest( string config, Template templateType, bool aot, @@ -143,14 +143,14 @@ protected async Task BuildAndRunIcuTest( GlobalizationMode globalizationMode, string extraProperties = "", bool onlyPredefinedCultures=false, - string language = "en-US", + string locale = "en-US", string icuFileName = "") { try { ProjectInfo info = CreateIcuProject( config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); - bool isPublish = false; + bool isPublish = true; bool triggersNativeBuild = globalizationMode == GlobalizationMode.Invariant; (string _, string buildOutput) = BuildTemplateProject(info, new BuildProjectOptions( @@ -162,7 +162,8 @@ protected async Task BuildAndRunIcuTest( GlobalizationMode: globalizationMode, CustomIcuFile: icuFileName )); - string runOutput = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath, language); + RunOptions runOptions = new(info.Configuration, Locale: locale); + string runOutput = await RunForPublishWithWebServer(runOptions); return $"{buildOutput}\n{runOutput}"; } catch(Exception ex) diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 07fb08cea33b6a..32ceff12b959bf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -50,7 +50,7 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs")); UpdateBrowserMainJs(); - bool isPublish = false; + bool isPublish = true; // invariantGlobalization triggers native build isNativeBuild = isNativeBuild || invariantGlobalization == true; BuildTemplateProject(info, @@ -63,7 +63,8 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded )); - string output = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + RunOptions runOptions = new(info.Configuration); + string output = await RunForPublishWithWebServer(runOptions); if (invariantGlobalization == true) { Assert.Contains("Could not create es-ES culture", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 717773ef7255c9..327d332eee4d79 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -48,7 +48,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs")); UpdateBrowserMainJs(); - bool isPublish = false; + bool isPublish = true; // invariantTimezone triggers native build isNativeBuild = isNativeBuild || invariantTimezone == true; BuildTemplateProject(info, @@ -60,7 +60,8 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian IsPublish: isPublish )); - string output = await RunBuiltBrowserApp(info.Configuration, info.ProjectFilePath); + RunOptions runOptions = new(info.Configuration); + string output = await RunForPublishWithWebServer(runOptions); Assert.Contains("UTC BaseUtcOffset is 0", output); if (invariantTimezone == true) { diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index d9793503506db7..9f246231f8cdb9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -21,12 +21,13 @@ public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur public static IEnumerable MainWithArgsTestData(bool aot) => ConfigWithAOTData(aot).Multiply( - new object?[] { new object?[] { "abc", "foobar"} }, + // ToDo: + // ActiveIssue - passing args to the program does not work, possible error in the test logic + // new object?[] { new object?[] { "abc", "foobar"} }, new object?[] { new object?[0] } ).UnwrapItemsAsArrays(); [Theory] - [ActiveIssue("ToDo: passing args to the program does not work, possible error in the test logic")] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true })] public async Task AsyncMainWithArgs(string config, bool aot, string[] args) @@ -54,7 +55,8 @@ async Task TestMainWithArgs(string config, new Dictionary { { ".withApplicationArguments(\"start\")", $".withApplicationArgumentsFromQuery()" } }); - _testOutput.WriteLine ($"-- args: {args}, name: {projectContentsName}"); + string argsStr = string.Join(" ", args); + _testOutput.WriteLine ($"-- args: {argsStr}, name: {projectContentsName}"); bool isPublish = true; BuildTemplateProject(info, @@ -68,9 +70,8 @@ async Task TestMainWithArgs(string config, int argsCount = args.Length; int expectedCode = 42 + argsCount; - string argsStr = string.Join(" ", args); - string output = await RunPublishedBrowserApp(info.Configuration, extraArgs: argsStr, expectedExitCode: expectedCode); - Console.WriteLine(output); + RunOptions runOptions = new(info.Configuration, ExtraArgs: argsStr); + string output = await RunForPublishWithWebServer(runOptions); Assert.Contains($"args#: {argsCount}", output); foreach (var arg in args) Assert.Contains($"arg: {arg}", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index dac9b2f58babc3..ebfbebafa3774a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Playwright; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; @@ -27,7 +28,7 @@ public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFi private Dictionary browserProgramReplacements = new Dictionary { - { "while(true)", $"int i = 0;{Environment.NewLine}while(i++ < 10)" }, + { "while(true)", $"int i = 0;{Environment.NewLine}while(i++ < 0)" }, // the test has to be fast, skip the loop { "partial class StopwatchSample", $"return 42;{Environment.NewLine}partial class StopwatchSample" } }; @@ -174,34 +175,83 @@ protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramewo File.WriteAllText(mainJsPath, updatedMainJsContent); } - // ToDo: consolidate with BlazorRunTest - protected async Task RunBuiltBrowserApp(string config, string projectFile, string language = "en-US", string extraArgs = "", string testScenario = "", int expectedExitCode = 42) - => await RunBrowser( - $"run --no-silent -c {config} --no-build --project \"{projectFile}\" --forward-console {extraArgs}", - _projectDir!, - expectedExitCode: expectedExitCode, - language, - testScenario: testScenario); - - protected async Task RunPublishedBrowserApp(string config, string language = "en-US", string extraArgs = "", string testScenario = "", int expectedExitCode = 42) - => await RunBrowser( - command: $"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files {extraArgs}", - workingDirectory: Path.Combine(GetBinFrameworkDir(config, forPublish: true), ".."), - expectedExitCode: expectedExitCode, - language: language, - testScenario: testScenario); - - private async Task RunBrowser(string command, string workingDirectory, int expectedExitCode, string language = "en-US", string testScenario = "") + // Keeping these methods with explicit Build/Publish in the name + // so in the test code it is evident which is being run! + public async Task RunForBuildWithDotnetRun(RunOptions runOptions) + => await BrowserRun(runOptions with { Host = RunHost.DotnetRun }); + + public async Task RunForPublishWithWebServer(RunOptions runOptions) + => await BrowserRun(runOptions with { Host = RunHost.WebServer }); + + private async Task BrowserRun(RunOptions runOptions) => runOptions.Host switch + { + RunHost.DotnetRun => + await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions), + + RunHost.WebServer => + await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", + Path.GetFullPath(Path.Combine(GetBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")), + runOptions), + + _ => throw new NotImplementedException(runOptions.Host.ToString()) + }; + + protected async Task BrowserRunTest(string runArgs, + string workingDirectory, + RunOptions runOptions) { - using var runCommand = new RunCommand(s_buildEnv, _testOutput).WithWorkingDirectory(workingDirectory); + if (!string.IsNullOrEmpty(runOptions.ExtraArgs)) + runArgs += $" {runOptions.ExtraArgs}"; + + runOptions.ServerEnvironment?.ToList().ForEach( + kv => s_buildEnv.EnvVars[kv.Key] = kv.Value); + + using RunCommand runCommand = new RunCommand(s_buildEnv, _testOutput); + ToolCommand cmd = runCommand.WithWorkingDirectory(workingDirectory); + await using var runner = new BrowserRunner(_testOutput); - Func? modifyBrowserUrl = string.IsNullOrEmpty(testScenario) ? - null : - browserUrl => new Uri(new Uri(browserUrl), $"?test={testScenario}").ToString(); - var page = await runner.RunAsync(runCommand, command, language: language, modifyBrowserUrl: modifyBrowserUrl); - await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); - Assert.Contains($"WASM EXIT {expectedExitCode}", string.Join(Environment.NewLine, runner.OutputLines)); + var page = await runner.RunAsync( + cmd, + runArgs, + onConsoleMessage: OnConsoleMessage, + onServerMessage: runOptions.OnServerMessage, + onError: OnErrorMessage, + modifyBrowserUrl: browserUrl => new Uri(new Uri(browserUrl), runOptions.BrowserPath + runOptions.QueryString).ToString()); + + _testOutput.WriteLine("Waiting for page to load"); + await page.WaitForLoadStateAsync(LoadState.DOMContentLoaded, new () { Timeout = 1 * 60 * 1000 }); + + if (runOptions.ExecuteAfterLoaded is not null) + { + await runOptions.ExecuteAfterLoaded(runOptions, page); + } + + if (runOptions.Test is not null) + await runOptions.Test(page); + + _testOutput.WriteLine($"Waiting for additional 10secs to see if any errors are reported"); + await runner.WaitForExitMessageAsync(TimeSpan.FromSeconds(10)); + return string.Join("\n", runner.OutputLines); + + void OnConsoleMessage(IPage page, IConsoleMessage msg) + { + _testOutput.WriteLine($"[{msg.Type}] {msg.Text}"); + + runOptions.OnConsoleMessage?.Invoke(page, msg); + + if (runOptions.DetectRuntimeFailures) + { + if (msg.Text.Contains("[MONO] * Assertion") || msg.Text.Contains("Error: [MONO] ")) + throw new XunitException($"Detected a runtime failure at line: {msg.Text}"); + } + } + + void OnErrorMessage(string msg) + { + _testOutput.WriteLine($"[ERROR] {msg}"); + runOptions.OnErrorMessage?.Invoke(msg); + } } public string GetBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFramework, string? projectDir = null) => diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs index aaa7f399a75bfe..594a03a50d9067 100644 --- a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs @@ -2,12 +2,14 @@ using System.Threading.Tasks; public class TestClass { + static void WriteTestOutput(string output) => Console.WriteLine($"TestOutput -> {output}"); + public static async Task Main(string[] args) { int count = args == null ? 0 : args.Length; - Console.WriteLine($"args#: {args?.Length}"); + WriteTestOutput($"args#: {args?.Length}"); foreach (var arg in args ?? Array.Empty()) - Console.WriteLine($"arg: {arg}"); + WriteTestOutput($"arg: {arg}"); return await Task.FromResult(42 + count); } } \ No newline at end of file diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/HybridGlobalization.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/HybridGlobalization.cs index 094a10d7871790..d318530fb26ffa 100644 --- a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/HybridGlobalization.cs +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/HybridGlobalization.cs @@ -1,6 +1,8 @@ using System; using System.Globalization; +void WriteTestOutput(string output) => Console.WriteLine($"TestOutput -> {output}"); + try { CompareInfo compareInfo = new CultureInfo("es-ES").CompareInfo; @@ -10,16 +12,16 @@ return 1; } int shouldThrow = compareInfo.Compare("A\u0300", "\u00C0", CompareOptions.IgnoreNonSpace); - Console.WriteLine($"Did not throw as expected but returned {shouldThrow} as a result. Using CompareOptions.IgnoreNonSpace option alone should be unavailable in HybridGlobalization mode."); + WriteTestOutput($"Did not throw as expected but returned {shouldThrow} as a result. Using CompareOptions.IgnoreNonSpace option alone should be unavailable in HybridGlobalization mode."); } catch (PlatformNotSupportedException pnse) { - Console.WriteLine($"HybridGlobalization works, thrown exception as expected: {pnse}."); + WriteTestOutput($"HybridGlobalization works, thrown exception as expected: {pnse}."); return 42; } catch (Exception ex) { - Console.WriteLine($"HybridGlobalization failed, unexpected exception was thrown: {ex}."); + WriteTestOutput($"HybridGlobalization failed, unexpected exception was thrown: {ex}."); return 2; } return 3; diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs index b92bac226848ef..535209b197c5dc 100644 --- a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs @@ -3,10 +3,13 @@ using System.Linq; // https://github.com/dotnet/runtime/blob/main/docs/design/features/globalization-invariant-mode.md#cultures-and-culture-data + + +void WriteTestOutput(string output) => Console.WriteLine($"TestOutput -> {output}"); try -{ +{ CultureInfo culture = new ("es-ES", false); - Console.WriteLine($"es-ES: Is Invariant LCID: {culture.LCID == CultureInfo.InvariantCulture.LCID}"); + WriteTestOutput($"es-ES: Is Invariant LCID: {culture.LCID == CultureInfo.InvariantCulture.LCID}"); string expectedNativeName = "espa\u00F1ol (Espa\u00F1a)"; string nativeName = culture.NativeName; @@ -15,8 +18,8 @@ } catch (CultureNotFoundException cnfe) { - Console.WriteLine($"Could not create es-ES culture: {cnfe.Message}"); + WriteTestOutput($"Could not create es-ES culture: {cnfe.Message}"); } -Console.WriteLine($"CurrentCulture.NativeName: {CultureInfo.CurrentCulture.NativeName}"); +WriteTestOutput($"CurrentCulture.NativeName: {CultureInfo.CurrentCulture.NativeName}"); return 42; diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantTimezone.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantTimezone.cs index deba28c7be27ea..1ef6c684b3a195 100644 --- a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantTimezone.cs +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantTimezone.cs @@ -2,20 +2,22 @@ // https://github.com/dotnet/runtime/blob/main/docs/design/features/timezone-invariant-mode.md +void WriteTestOutput(string output) => Console.WriteLine($"TestOutput -> {output}"); + var timezonesCount = TimeZoneInfo.GetSystemTimeZones().Count; -Console.WriteLine($"Found {timezonesCount} timezones in the TZ database"); +WriteTestOutput($"Found {timezonesCount} timezones in the TZ database"); TimeZoneInfo utc = TimeZoneInfo.FindSystemTimeZoneById("UTC"); -Console.WriteLine($"{utc.DisplayName} BaseUtcOffset is {utc.BaseUtcOffset}"); +WriteTestOutput($"{utc.DisplayName} BaseUtcOffset is {utc.BaseUtcOffset}"); try { TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo"); - Console.WriteLine($"{tst.DisplayName} BaseUtcOffset is {tst.BaseUtcOffset}"); + WriteTestOutput($"{tst.DisplayName} BaseUtcOffset is {tst.BaseUtcOffset}"); } catch (TimeZoneNotFoundException tznfe) { - Console.WriteLine($"Could not find Asia/Tokyo: {tznfe.Message}"); + WriteTestOutput($"Could not find Asia/Tokyo: {tznfe.Message}"); } return 42; diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs index f41199dd440f10..08b859d5173e9e 100644 --- a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs @@ -2,12 +2,14 @@ using System.Threading.Tasks; public class TestClass { + static void WriteTestOutput(string output) => Console.WriteLine($"TestOutput -> {output}"); + public static int Main(string[] args) { int count = args == null ? 0 : args.Length; - Console.WriteLine($"args#: {args?.Length}"); + WriteTestOutput($"args#: {args?.Length}"); foreach (var arg in args ?? Array.Empty()) - Console.WriteLine($"arg: {arg}"); + WriteTestOutput($"arg: {arg}"); return 42 + count; } } \ No newline at end of file From 58d2e431925eb40ff008777ba21644cf1f7a53f1 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:54:37 +0000 Subject: [PATCH 010/104] `NativeBuildTests`: done. --- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 209 ++++++++++-------- .../Templates/WasmTemplateTestsBase.cs | 5 +- 2 files changed, 121 insertions(+), 93 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index 18e819b6af73f1..9a50abcbab8545 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data; using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; @@ -12,105 +13,131 @@ namespace Wasm.Build.Tests { - public class NativeBuildTests : TestMainJsTestBase + public class NativeBuildTests : WasmTemplateTestsBase { public NativeBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - // [Theory] - // [BuildAndRun] - // public void SimpleNativeBuild(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"simple_native_build_{buildArgs.Configuration}_{buildArgs.AOT}"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraProperties: "true"); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - // DotnetWasmFromRuntimePack: false)); - - // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, - // test: output => { }, - // host: host, id: id); - // } - - // [Theory] - // [BuildAndRun(aot: true)] - // public void AOTNotSupportedWithNoTrimming(ProjectInfo buildArgs, string id) - // { - // string projectName = $"mono_aot_cross_{buildArgs.Configuration}_{buildArgs.AOT}"; - - // buildArgs = buildArgs with { ProjectName = projectName, ExtraBuildArgs = "-p:PublishTrimmed=false" }; - // buildArgs = ExpandBuildArgs(buildArgs); - - // (_, string output) = BuildProject( - // buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - // DotnetWasmFromRuntimePack: false, - // ExpectSuccess: false)); - - // Assert.Contains("AOT is not supported without IL trimming", output); - // } - - // [Theory] - // [BuildAndRun(aot: true)] - // public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(ProjectInfo buildArgs, string id) - // { - // string printFileTypeTarget = @" - // - // - - // - // - - // - // - // "; - // string projectName = $"bc_to_o_{buildArgs.Configuration}"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, insertAtEnd: printFileTypeTarget); - - // (_, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - // DotnetWasmFromRuntimePack: false)); - - // if (!output.Contains("** wasm-dis exit code: 0")) - // throw new XunitException($"Expected to successfully run wasm-dis on System.Private.CoreLib.dll.o ." - // + " It might fail if it was incorrectly compiled to a bitcode file, instead of wasm."); - // } - - // [Theory] - // [BuildAndRun(aot: true)] - // public void NativeBuildIsRequired(ProjectInfo buildArgs, string id) - // { - // string projectName = $"native_build_{buildArgs.Configuration}_{buildArgs.AOT}"; + [Theory] + [BuildAndRun(aot: false)] + public async Task SimpleNativeBuild(string config, bool aot) + { + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot, + "simple_native_build", + extraProperties: "true"); + + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + RunOptions runOptions = new(config); + await RunForPublishWithWebServer(runOptions); + } - // buildArgs = buildArgs with { ProjectName = projectName, ExtraBuildArgs = "-p:WasmBuildNative=false -p:WasmSingleFileBundle=true" }; - // buildArgs = ExpandBuildArgs(buildArgs); + [Theory] + [BuildAndRun(aot: true)] + public void AOTNotSupportedWithNoTrimming(string config, bool aot) + { + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot, + "mono_aot_cross", + extraProperties: "false"); + + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: false), + IsPublish: isPublish, + ExpectSuccess: false + )); + Assert.Contains("AOT is not supported without IL trimming", output); + } - // (_, string output) = BuildProject( - // buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - // DotnetWasmFromRuntimePack: false, - // ExpectSuccess: false)); + [Theory] + [BuildAndRun(config: "Release", aot: true)] + public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(string config, bool aot) + { + string printFileTypeTarget = @" + + + + + + + + + "; + + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot, + "bc_to_o", + atTheEnd: printFileTypeTarget); + + bool isPublish = true; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: false), + IsPublish: isPublish + )); + + if (!output.Contains("** wasm-dis exit code: 0")) + throw new XunitException($"Expected to successfully run wasm-dis on System.Private.CoreLib.dll.o ." + + " It might fail if it was incorrectly compiled to a bitcode file, instead of wasm."); + } - // Assert.Contains("WasmBuildNative is required", output); - // } + [Theory] + [BuildAndRun(config: "Release", aot: true)] + public void NativeBuildIsRequired(string config, bool aot) + { + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot, + "native_build", + extraProperties: "falsetrue"); + + bool isPublish = true; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: false), + IsPublish: isPublish, + ExpectSuccess: false + )); + + Assert.Contains("WasmBuildNative is required", output); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index ebfbebafa3774a..5a120f9a2bd175 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -41,7 +41,8 @@ public ProjectInfo CreateWasmTemplateProject( string extraArgs = "", bool runAnalyzers = true, bool addFrameworkArg = false, - string extraProperties = "") + string extraProperties = "", + string atTheEnd = "") { string projectName = appendUnicodeToPath ? $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : @@ -68,7 +69,7 @@ public ProjectInfo CreateWasmTemplateProject( if (runAnalyzers) extraProperties += "true"; - AddItemsPropertiesToProject(projectFilePath, extraProperties); + AddItemsPropertiesToProject(projectFilePath, extraProperties, atTheEnd: atTheEnd); return new ProjectInfo(config, aot, projectName, projectFilePath); } From 2f03ff14501fa7b273f561a3b210b51b00ca2ebf Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:15:21 +0000 Subject: [PATCH 011/104] HybridGlobalization should be disabled till removal. --- src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 23f7ba0ce80936..5c3f464077ae02 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -27,12 +27,13 @@ public HybridGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestClas [Theory] [BuildAndRun(aot: false)] [BuildAndRun(aot: true)] + // Expected to find /workspaces/runtime/artifacts/bin/Wasm.Build.Tests/Release/net9.0/linux-x64/wbt artifacts/hybrid_Debug_False_g2xwxpxr_lus_鿀蜒枛遫䡫煉/obj/Debug/net9.0/wasm/for-build/dotnet.globalization.js + [ActiveIssue("dotnet.globalization.js not found")] public async Task AOT_HybridGlobalizationTests(string config, bool aot) => await TestHybridGlobalizationTests(config, aot); [Theory] [BuildAndRun(aot: false)] - // Expected to find /workspaces/runtime/artifacts/bin/Wasm.Build.Tests/Release/net9.0/linux-x64/wbt artifacts/hybrid_Debug_False_g2xwxpxr_lus_鿀蜒枛遫䡫煉/obj/Debug/net9.0/wasm/for-build/dotnet.globalization.js [ActiveIssue("dotnet.globalization.js not found")] public async Task RelinkingWithoutAOT(string config, bool aot) => await TestHybridGlobalizationTests(config, aot, isNativeBuild: true); From 31b3239c28d6e6e593be34bedc017e6bef9e7dd3 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:56:22 +0000 Subject: [PATCH 012/104] `NativeLibraryTests`: done. --- .../wasm/Wasm.Build.Tests/Common/Utils.cs | 4 +- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 2 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 293 +++++++++--------- .../Templates/WasmTemplateTestsBase.cs | 3 +- .../testassets/AppUsingNativeLib/Program.cs | 2 +- .../AppUsingNativeLib/native-lib.cpp | 2 +- .../Wasm.Buid.Tests.Programs/NativeCrypto.cs | 17 + .../wasm/testassets/native-libs/native-lib.o | Bin 542 -> 617 bytes 8 files changed, 165 insertions(+), 158 deletions(-) create mode 100644 src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeCrypto.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/Utils.cs b/src/mono/wasm/Wasm.Build.Tests/Common/Utils.cs index b6d087a0135759..54152700de9899 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/Utils.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/Utils.cs @@ -13,7 +13,7 @@ internal static class Utils { - public static void DirectoryCopy(string sourceDirName, string destDirName, Func? predicate=null, bool copySubDirs=true, bool silent=false, ITestOutputHelper? testOutput = null) + public static void DirectoryCopy(string sourceDirName, string destDirName, Func? predicate=null, bool copySubDirs=true, bool silent=false, ITestOutputHelper? testOutput = null, bool overwrite = false) { // Get the subdirectories for the specified directory. DirectoryInfo dir = new DirectoryInfo(sourceDirName); @@ -45,7 +45,7 @@ public static void DirectoryCopy(string sourceDirName, string destDirName, Func< string tempPath = Path.Combine(destDirName, file.Name); if (!silent) testOutput?.WriteLine($"Copying {fullPath} to {tempPath}"); - file.CopyTo(tempPath, false); + file.CopyTo(tempPath, overwrite); } // If copying subdirectories, copy them and their contents to new location. diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index 9a50abcbab8545..ca5e22e73c034c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -62,7 +62,7 @@ public void AOTNotSupportedWithNoTrimming(string config, bool aot) UpdateBrowserMainJs(); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, + (string _, string output) = BuildTemplateProject(info, new BuildProjectOptions( info.Configuration, info.ProjectName, diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 9fe02a2db2b9f6..3d760118f6e864 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -10,163 +11,151 @@ namespace Wasm.Build.Tests { - public class NativeLibraryTests : TestMainJsTestBase + public class NativeLibraryTests : WasmTemplateTestsBase { public NativeLibraryTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - // [Theory] - // [BuildAndRun(aot: false)] - // [BuildAndRun(aot: true)] - // public void ProjectWithNativeReference(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"AppUsingNativeLib-a"; - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraItems: ""); - - // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? _)) - // { - // InitPaths(id); - // if (Directory.Exists(_projectDir)) - // Directory.Delete(_projectDir, recursive: true); - - // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); - // } - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions(DotnetWasmFromRuntimePack: false)); - - // string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - // test: output => {}, - // host: host, id: id); - - // Assert.Contains("print_line: 100", output); - // Assert.Contains("from pinvoke: 142", output); - // } - -// [Theory] -// [BuildAndRun(aot: false)] -// [BuildAndRun(aot: true)] -// [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] -// public void ProjectUsingSkiaSharp(ProjectInfo buildArgs, RunHost host, string id) -// { -// string projectName = $"AppUsingSkiaSharp"; -// buildArgs = buildArgs with { ProjectName = projectName }; -// buildArgs = ExpandBuildArgs(buildArgs, -// extraItems: @$" -// {GetSkiaSharpReferenceItems()} -// -// "); - -// string programText = @" -// using System; -// using SkiaSharp; - -// public class Test -// { -// public static int Main() -// { -// using SKFileStream skfs = new SKFileStream(""mono.png""); -// using SKImage img = SKImage.FromEncodedData(skfs); - -// Console.WriteLine ($""Size: {skfs.Length} Height: {img.Height}, Width: {img.Width}""); -// return 0; -// } -// }"; - -// BuildProject(buildArgs, -// id: id, -// new BuildProjectOptions( -// InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), -// DotnetWasmFromRuntimePack: false)); - -// string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, -// test: output => {}, -// host: host, id: id, -// args: "mono.png"); - -// Assert.Contains("Size: 26462 Height: 599, Width: 499", output); -// } - -// [Theory] -// [BuildAndRun(aot: false, )] -// [BuildAndRun(aot: true, )] -// public void ProjectUsingBrowserNativeCrypto(ProjectInfo buildArgs, RunHost host, string id) -// { -// string projectName = $"AppUsingBrowserNativeCrypto"; -// buildArgs = buildArgs with { ProjectName = projectName }; -// buildArgs = ExpandBuildArgs(buildArgs); - -// string programText = @" -// using System; -// using System.Security.Cryptography; - -// public class Test -// { -// public static int Main() -// { -// using (SHA256 mySHA256 = SHA256.Create()) -// { -// byte[] data = { (byte)'H', (byte)'e', (byte)'l', (byte)'l', (byte)'o' }; -// byte[] hashed = mySHA256.ComputeHash(data); -// string asStr = string.Join(' ', hashed); -// Console.WriteLine(""Hashed: "" + asStr); -// return 0; -// } -// } -// }"; - -// BuildProject(buildArgs, -// id: id, -// new BuildProjectOptions( -// InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), -// DotnetWasmFromRuntimePack: !buildArgs.AOT && buildArgs.Configuration != "Release")); - -// string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, -// test: output => {}, -// host: host, id: id); - -// Assert.Contains( -// "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105", -// output); - -// string cryptoInitMsg = "MONO_WASM: Initializing Crypto WebWorker"; -// Assert.DoesNotContain(cryptoInitMsg, output); -// } - - // [Theory] - // [BuildAndRun(aot: false)] - // [BuildAndRun(aot: true)] - // public void ProjectWithNativeLibrary(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"AppUsingNativeLibrary-a"; - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraItems: "\n"); - - // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? _)) - // { - // InitPaths(id); - // if (Directory.Exists(_projectDir)) - // Directory.Delete(_projectDir, recursive: true); - - // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); - // } - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions(DotnetWasmFromRuntimePack: false)); - - // string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - // test: output => {}, - // host: host, id: id); - - // Assert.Contains("print_line: 100", output); - // Assert.Contains("from pinvoke: 142", output); - // } + [Theory] + [BuildAndRun(aot: false)] + [BuildAndRun(config: "Release", aot: true)] + public async Task ProjectWithNativeReference(string config, bool aot) + { + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot, + "AppUsingNativeLib-a", + extraProperties: "true", + extraItems: ""); + + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); + UpdateBrowserMainJs(); + + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + RunOptions runOptions = new(config); + string output = await RunForPublishWithWebServer(runOptions); + + Assert.Contains("print_line: 100", output); + Assert.Contains("from pinvoke: 142", output); + } + + [Theory] + [BuildAndRun(aot: false)] + [BuildAndRun(aot: true)] + [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] + public void ProjectUsingSkiaSharp(ProjectInfo buildArgs, RunHost host, string id) + { + string projectName = $"AppUsingSkiaSharp"; + buildArgs = buildArgs with { ProjectName = projectName }; + buildArgs = ExpandBuildArgs(buildArgs, + extraItems: @$" + {GetSkiaSharpReferenceItems()} + + "); + + string programText = @" +using System; +using SkiaSharp; + +public class Test +{ + public static int Main() + { + using SKFileStream skfs = new SKFileStream(""mono.png""); + using SKImage img = SKImage.FromEncodedData(skfs); + + Console.WriteLine ($""Size: {skfs.Length} Height: {img.Height}, Width: {img.Width}""); + return 0; + } +}"; + + BuildProject(buildArgs, + id: id, + new BuildProjectOptions( + InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), + DotnetWasmFromRuntimePack: false)); + + string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, + test: output => {}, + host: host, id: id, + args: "mono.png"); + + Assert.Contains("Size: 26462 Height: 599, Width: 499", output); + } + + [Theory] + [BuildAndRun(aot: false)] + [BuildAndRun(config: "Release", aot: true)] + public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) + { + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "AppUsingBrowserNativeCrypto"); + + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeCrypto.cs")); + UpdateBrowserMainJs(); + + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); + + RunOptions runOptions = new(info.Configuration); + string output = await RunForPublishWithWebServer(runOptions); + + Assert.Contains( + "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105", + output); + + string cryptoInitMsg = "MONO_WASM: Initializing Crypto WebWorker"; + Assert.DoesNotContain(cryptoInitMsg, output); + } + + [Theory] + [BuildAndRun(aot: false)] + [BuildAndRun(config: "Release", aot: true)] + public async Task ProjectWithNativeLibrary(string config, bool aot) + { + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot, + "AppUsingNativeLib-a", + extraItems: "\n"); + + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); + UpdateBrowserMainJs(); + + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + RunOptions runOptions = new(config); + string output = await RunForPublishWithWebServer(runOptions); + + Assert.Contains("print_line: 100", output); + Assert.Contains("from pinvoke: 142", output); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 5a120f9a2bd175..fea7df12091473 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -42,6 +42,7 @@ public ProjectInfo CreateWasmTemplateProject( bool runAnalyzers = true, bool addFrameworkArg = false, string extraProperties = "", + string extraItems = "", string atTheEnd = "") { string projectName = appendUnicodeToPath ? @@ -69,7 +70,7 @@ public ProjectInfo CreateWasmTemplateProject( if (runAnalyzers) extraProperties += "true"; - AddItemsPropertiesToProject(projectFilePath, extraProperties, atTheEnd: atTheEnd); + AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, atTheEnd); return new ProjectInfo(config, aot, projectName, projectFilePath); } diff --git a/src/mono/wasm/testassets/AppUsingNativeLib/Program.cs b/src/mono/wasm/testassets/AppUsingNativeLib/Program.cs index 5134392c9d8ca3..b56e43a2e84040 100644 --- a/src/mono/wasm/testassets/AppUsingNativeLib/Program.cs +++ b/src/mono/wasm/testassets/AppUsingNativeLib/Program.cs @@ -11,7 +11,7 @@ public class Test { public static int Main(string[] args) { - Console.WriteLine ($"from pinvoke: {SimpleConsole.Test.print_line(100)}"); + Console.WriteLine ($"TestOutput -> from pinvoke: {SimpleConsole.Test.print_line(100)}"); return 0; } diff --git a/src/mono/wasm/testassets/AppUsingNativeLib/native-lib.cpp b/src/mono/wasm/testassets/AppUsingNativeLib/native-lib.cpp index 329a593279fe2d..9babda6dde8bc6 100644 --- a/src/mono/wasm/testassets/AppUsingNativeLib/native-lib.cpp +++ b/src/mono/wasm/testassets/AppUsingNativeLib/native-lib.cpp @@ -6,6 +6,6 @@ int print_line(int x) { - printf("print_line: %d\n", x); + printf("TestOutput -> print_line: %d\n", x); return 42 + x; } diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeCrypto.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeCrypto.cs new file mode 100644 index 00000000000000..5dadfd89d41529 --- /dev/null +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeCrypto.cs @@ -0,0 +1,17 @@ +using System; +using System.Security.Cryptography; + +public class Test +{ + public static int Main() + { + using (SHA256 mySHA256 = SHA256.Create()) + { + byte[] data = { (byte)'H', (byte)'e', (byte)'l', (byte)'l', (byte)'o' }; + byte[] hashed = mySHA256.ComputeHash(data); + string asStr = string.Join(' ', hashed); + Console.WriteLine("TestOutput -> Hashed: " + asStr); + return 0; + } + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/native-libs/native-lib.o b/src/mono/wasm/testassets/native-libs/native-lib.o index 10ccf42c5ff2397c2201e74ed6ffa7237ed4f24f..5b5218ec686a8d75c3e2ea5f5926702c1bf4775e 100644 GIT binary patch delta 275 zcmXYry-tNN7(mMnG3Gj4R}*tX;-H2UM1+8YKbwPzi#sXpSHzTp?FarW@(7wcxHIA7WMg>^7O#5jdi3at_xiKDO`LgWYK?`eHOw}N zGg}KT1B-@`Q`TP?kYHe1r1;o@_1A4(X$lYc3!a2q AUjP6A delta 200 zcmaFKGLL1#WA14U4Gj#842}%k0u%qJ%djwV6%=LWmBi;{=A|+TFfcN)>G|jtmlQED z2u!wTv}as7xt>wEzJt-wSkFMuKtV%4zo10FSif99vq(QVF*zeuKRvTVKRKf)KR2^9 zS1&z3KRqY4IKQ+gIaMz?KUX)kq9nB_FEK|Ks4Sy22`rYAQCUgsm^0QKtOB75k rOpQz}j7*J Date: Wed, 23 Oct 2024 06:19:32 +0000 Subject: [PATCH 013/104] Blocked `SkiaSharp` test has to get refactored as well to remove build failures. --- .../Wasm.Build.Tests/NativeLibraryTests.cs | 54 +++++++------------ .../Wasm.Buid.Tests.Programs/SkiaSharp.cs | 14 +++++ 2 files changed, 34 insertions(+), 34 deletions(-) create mode 100644 src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SkiaSharp.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 3d760118f6e864..a2221892846fab 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -53,45 +53,31 @@ public async Task ProjectWithNativeReference(string config, bool aot) [Theory] [BuildAndRun(aot: false)] - [BuildAndRun(aot: true)] + [BuildAndRun(config: "Release", aot: true)] [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] - public void ProjectUsingSkiaSharp(ProjectInfo buildArgs, RunHost host, string id) + public async Task ProjectUsingSkiaSharp(string config, bool aot) { - string projectName = $"AppUsingSkiaSharp"; - buildArgs = buildArgs with { ProjectName = projectName }; - buildArgs = ExpandBuildArgs(buildArgs, - extraItems: @$" + string prefix = $"AppUsingSkiaSharp"; + string extraItems = @$" {GetSkiaSharpReferenceItems()} - "); - - string programText = @" -using System; -using SkiaSharp; - -public class Test -{ - public static int Main() - { - using SKFileStream skfs = new SKFileStream(""mono.png""); - using SKImage img = SKImage.FromEncodedData(skfs); - - Console.WriteLine ($""Size: {skfs.Length} Height: {img.Height}, Width: {img.Width}""); - return 0; - } -}"; - - BuildProject(buildArgs, - id: id, - new BuildProjectOptions( - InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - DotnetWasmFromRuntimePack: false)); - - string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 0, - test: output => {}, - host: host, id: id, - args: "mono.png"); + "; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraItems: extraItems); + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SkiaSharp.cs")); + UpdateBrowserMainJs(); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + + RunOptions runOptions = new(info.Configuration, ExtraArgs: "mono.png"); + string output = await RunForPublishWithWebServer(runOptions); Assert.Contains("Size: 26462 Height: 599, Width: 499", output); } diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SkiaSharp.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SkiaSharp.cs new file mode 100644 index 00000000000000..97236c63e5a665 --- /dev/null +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SkiaSharp.cs @@ -0,0 +1,14 @@ +using System; +using SkiaSharp; + +public class Test +{ + public static int Main() + { + using SKFileStream skfs = new SKFileStream("mono.png"); + using SKImage img = SKImage.FromEncodedData(skfs); + + Console.WriteLine ($"Size: {skfs.Length} Height: {img.Height}, Width: {img.Width}"); + return 0; + } +} \ No newline at end of file From 1e7bf92d1821adcd63c1489c8e986430651f1a03 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 23 Oct 2024 08:08:26 +0000 Subject: [PATCH 014/104] Fix build errors in WASI - refactor of WASI in a future PR. --- .../SharedBuildPerTestClassFixture.cs | 67 +++++++++++++++++++ .../SharedBuildPerTestClassFixture.cs | 1 + .../Common/AssertBundleOptions.cs | 7 +- 3 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 src/mono/wasi/Wasi.Build.Tests/SharedBuildPerTestClassFixture.cs rename src/mono/wasm/Wasm.Build.Tests/{Common => BrowserStructures}/SharedBuildPerTestClassFixture.cs (95%) diff --git a/src/mono/wasi/Wasi.Build.Tests/SharedBuildPerTestClassFixture.cs b/src/mono/wasi/Wasi.Build.Tests/SharedBuildPerTestClassFixture.cs new file mode 100644 index 00000000000000..a89fc21946b522 --- /dev/null +++ b/src/mono/wasi/Wasi.Build.Tests/SharedBuildPerTestClassFixture.cs @@ -0,0 +1,67 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; + +#nullable enable + +// ToDo: should be common with Wasm.Build.Tests, copied here after Wasm.Build.Tests refactoring +namespace Wasm.Build.Tests +{ + public class SharedBuildPerTestClassFixture : IDisposable + { + public Dictionary _buildPaths = new(); + + public void CacheBuild(BuildArgs buildArgs, BuildProduct product) + { + if (product == null) + throw new ArgumentNullException(nameof(product)); + if (buildArgs == null) + throw new ArgumentNullException(nameof(buildArgs)); + _buildPaths.Add(buildArgs, product); + } + + public void RemoveFromCache(string buildPath, bool keepDir=true) + { + BuildArgs? foundBuildArgs = _buildPaths.Where(kvp => kvp.Value.ProjectDir == buildPath).Select(kvp => kvp.Key).SingleOrDefault(); + if (foundBuildArgs is not null) + _buildPaths.Remove(foundBuildArgs); + + if (!keepDir) + RemoveDirectory(buildPath); + } + + public bool TryGetBuildFor(BuildArgs buildArgs, [NotNullWhen(true)] out BuildProduct? product) + => _buildPaths.TryGetValue(buildArgs, out product); + + public void Dispose() + { + Console.WriteLine ($"============== DELETING THE BUILDS ============="); + foreach (var kvp in _buildPaths.Values) + { + RemoveDirectory(kvp.ProjectDir); + } + } + + private void RemoveDirectory(string path) + { + if (EnvironmentVariables.SkipProjectCleanup == "1") + return; + + try + { + Directory.Delete(path, recursive: true); + } + catch (Exception ex) + { + Console.Error.WriteLine($"Failed to delete '{path}' during test cleanup: {ex}"); + throw; + } + } + + } +} diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs similarity index 95% rename from src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs rename to src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs index 413343bb05266c..88281954624a55 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/SharedBuildPerTestClassFixture.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs @@ -9,6 +9,7 @@ #nullable enable +// ToDo: should be common with Wasi.Build.Tests, copied here after Wasm.Build.Tests refactoring namespace Wasm.Build.Tests { public class SharedBuildPerTestClassFixture : IDisposable diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs index f50432a4be7697..e561ebe5730d0e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs @@ -13,9 +13,4 @@ public record AssertBundleOptions( bool AssertIcuAssets = true, bool AssertSymbolsFile = true, bool ExpectFingerprintOnDotnetJs = false - ) -{ - public bool DotnetWasmFromRuntimePack => BuildOptions.ExpectedFileType == NativeFilesType.FromRuntimePack; - public bool AOT => BuildOptions.ExpectedFileType == NativeFilesType.AOT; - public string BundleDir => Path.Combine(BuildOptions.BinFrameworkDir, ".."); -} +); From 970468a01c7b27e4195f3d144c01cd9f5462ba44 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:24:07 +0000 Subject: [PATCH 015/104] Project lib extension depends on `UseWebcil` value. --- src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index 43b2e7c1ad06f1..0844d33871adcc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -279,7 +279,7 @@ public IDictionary StatFiles(IDictionary files = new() { - Path.Combine(paths.BinDir, "publish", BundleDirName, "_framework", $"{projectInfo.ProjectName}.wasm"), + Path.Combine(paths.BinDir, "publish", BundleDirName, "_framework", $"{projectInfo.ProjectName}{WasmAssemblyExtension}"), Path.Combine(paths.ObjWasmDir, "driver.o"), Path.Combine(paths.ObjWasmDir, "runtime.o"), Path.Combine(paths.ObjWasmDir, "corebindings.o"), From 8ea55388c3f4de2cfe3b63a4181e132ead3892b8 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:47:16 +0000 Subject: [PATCH 016/104] `NoopNativeRebuildTest`: done. --- .../NativeRebuildTestsBase.cs | 157 +++++++++--------- .../NoopNativeRebuildTest.cs | 36 ++-- 2 files changed, 94 insertions(+), 99 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index 8debf135eb7e1e..4ef38e34c2fe4b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -18,7 +18,7 @@ namespace Wasm.Build.NativeRebuild.Tests { // TODO: test for runtime components - public class NativeRebuildTestsBase : TestMainJsTestBase + public class NativeRebuildTestsBase : WasmTemplateTestsBase { public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -26,90 +26,81 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF _enablePerTestCleanup = true; } - // public static IEnumerable NativeBuildData() - // { - // List data = new(); - // // relinking - // data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: false)); - // data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: true)); - - // // aot - // data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: false)); - // data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: true)); - - // return data; - - // IEnumerable GetData(bool aot, bool nativeRelinking, bool invariant) - // => ConfigWithAOTData(aot) - // .Multiply(new object[] { nativeRelinking, invariant }) - // .UnwrapItemsAsArrays().ToList(); - // } - - // internal (ProjectInfo ProjectInfo, BuildPaths paths) FirstNativeBuild(string programText, bool nativeRelink, bool invariant, ProjectInfo buildArgs, string id, string extraProperties="") - // { - // buildArgs = GenerateProjectContents(buildArgs, nativeRelink, invariant, extraProperties); - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - // DotnetWasmFromRuntimePack: false, - // GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, - // CreateProject: true)); - - // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, id: id); - // return (buildArgs, GetBuildPaths(buildArgs)); - // } - - // protected string Rebuild(bool nativeRelink, bool invariant, ProjectInfo buildArgs, string id, string extraProperties="", string extraBuildArgs="", string? verbosity=null) - // { - // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - // throw new XunitException($"Test bug: could not get the build product in the cache"); - - // File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); - - // buildArgs = buildArgs with { ExtraBuildArgs = $"{buildArgs.ExtraBuildArgs} {extraBuildArgs}" }; - // var newBuildArgs = GenerateProjectContents(buildArgs, nativeRelink, invariant, extraProperties); - - // // key(buildArgs) being changed - // _buildContext.RemoveFromCache(product.ProjectDir); - // _buildContext.CacheBuild(newBuildArgs, product); - - // if (buildArgs.ProjectFileContents != newBuildArgs.ProjectFileContents) - // File.WriteAllText(Path.Combine(_projectDir!, $"{buildArgs.ProjectName}.csproj"), buildArgs.ProjectFileContents); - // buildArgs = newBuildArgs; - - // // artificial delay to have new enough timestamps - // Thread.Sleep(5000); - - // _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); - // (_, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // DotnetWasmFromRuntimePack: false, - // GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, - // CreateProject: false, - // UseCache: false, - // Verbosity: verbosity)); - - // return output; - // } - - // protected ProjectInfo GenerateProjectContents(ProjectInfo buildArgs, bool nativeRelink, bool invariant, string extraProperties) - // { - // StringBuilder propertiesBuilder = new(); - // propertiesBuilder.Append("<_WasmDevel>true"); - // if (nativeRelink) - // propertiesBuilder.Append($"true"); - // if (invariant) - // propertiesBuilder.Append($"true"); - // propertiesBuilder.Append(extraProperties); + public static IEnumerable NativeBuildData() + { + List data = new(); + // relinking + data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: false)); + data.AddRange(GetData(aot: false, nativeRelinking: true, invariant: true)); + + // aot + data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: false)); + data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: true)); + + return data; + + IEnumerable GetData(bool aot, bool nativeRelinking, bool invariant) + => ConfigWithAOTData(aot) + .Multiply(new object[] { nativeRelinking, invariant }) + // AOT in Debug is switched off + .Where(item => !(item.ElementAt(0) is string config && config == "Debug") && !(item.ElementAt(1) is bool aotValue && aotValue)) + .UnwrapItemsAsArrays().ToList(); + } - // return ExpandBuildArgs(buildArgs, propertiesBuilder.ToString()); - // } + internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool nativeRelink, bool invariant) + { + bool isNativeBuild = nativeRelink || invariant; + var extraArgs = new string[] { + "-p:_WasmDevel=true", + $"-p:WasmBuildNative={nativeRelink}", + $"-p:InvariantGlobalization={invariant}" + }; + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: nativeRelink), + IsPublish: isPublish, + GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded + ), + extraArgs); + await RunForPublishWithWebServer(new (info.Configuration)); + return GetBuildPaths(info, isPublish); + } - // // appending UTF-8 char makes sure project build&publish under all types of paths is supported - // protected string GetTestProjectPath(string prefix, string config, bool appendUnicode=true) => - // appendUnicode ? $"{prefix}_{config}_{s_unicodeChars}" : $"{prefix}_{config}"; + protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal") + { + if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) + throw new XunitException($"Test bug: could not get the build product in the cache"); + + File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + + var extraArgs = new string[] { + extraBuildArgs, + "-p:_WasmDevel=true", + $"-p:WasmBuildNative={nativeRelink}", + $"-p:InvariantGlobalization={invariant}", + $"-v:{verbosity}" + }; + + bool isNativeBuild = nativeRelink || invariant; + bool isPublish = true; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild), + IsPublish: isPublish, + GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, + UseCache: false + ), + extraArgs); + + return output; + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 153952f70d0bab..bc49585ed072d3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -17,21 +17,25 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi { } - // [Theory] - // [MemberData(nameof(NativeBuildData))] - // public void NoOpRebuildForNativeBuilds(ProjectInfo buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"rebuild_noop_{buildArgs.Configuration}" }; - // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: nativeRelink, invariant: invariant, buildArgs, id); - - // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // Rebuild(nativeRelink, invariant, buildArgs, id); - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // } + [Theory] + [MemberData(nameof(NativeBuildData))] + public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativeRelink, bool invariant) + { + string prefix = $"rebuild_noop_{config}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); + + var pathsDict = GetFilesTable(info, paths, unchanged: true); + var originalStat = StatFiles(pathsDict); + + Rebuild(info, nativeRelink, invariant); + var newStat = StatFiles(pathsDict); + + CompareStat(originalStat, newStat, pathsDict); + await RunForPublishWithWebServer(new (info.Configuration)); + } } } From df091e7ecb463498bf68fe627f55cc4e3387f0e1 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:23:37 +0000 Subject: [PATCH 017/104] Assert test run exit code. --- src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs | 7 ++++--- src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs | 6 +++--- .../wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs | 3 +-- src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs | 2 +- .../Wasm.Build.Tests/InvariantGlobalizationTests.cs | 3 +-- .../wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs | 3 +-- src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs | 3 +-- src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs | 3 +-- src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs | 11 ++++------- .../NativeRebuildTests/NoopNativeRebuildTest.cs | 2 +- .../Templates/WasmTemplateTestsBase.cs | 4 +++- 11 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs index bfaf24d7844421..e1c9055c927022 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs @@ -227,7 +227,7 @@ public async Task RunAsync( return page; } - public async Task WaitForExitMessageAsync(TimeSpan timeout) + public async Task WaitForExitMessageAsync(TimeSpan timeout) { if (RunTask is null || RunTask.IsCompleted) throw new Exception($"No run task, or already completed"); @@ -235,8 +235,9 @@ public async Task WaitForExitMessageAsync(TimeSpan timeout) await Task.WhenAny(RunTask!, _exited.Task, Task.Delay(timeout)); if (_exited.Task.IsCompleted) { - _testOutput.WriteLine ($"Exited with {await _exited.Task}"); - return; + int code = await _exited.Task; + _testOutput.WriteLine ($"Exited with {code}"); + return code; } throw new Exception($"Timed out after {timeout.TotalSeconds}s waiting for 'WASM EXIT' message"); diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 111b1e9f2e988f..6e7504c4b90cd2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -63,7 +63,7 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - RunOptions runOptions = new(info.Configuration); + RunOptions runOptions = new(info.Configuration, ExpectedExitCode: 42); await RunForBuildWithDotnetRun(runOptions); isPublish = true; @@ -76,7 +76,7 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) IsPublish: isPublish, UseCache: false )); - await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(runOptions); } [Theory] @@ -113,7 +113,7 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - RunOptions runOptions = new(info.Configuration); + RunOptions runOptions = new(info.Configuration, ExpectedExitCode: 42); await RunForBuildWithDotnetRun(runOptions); File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 5c3f464077ae02..80fa87f82fa8af 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -59,8 +59,7 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is GlobalizationMode: GlobalizationMode.Hybrid )); - RunOptions runOptions = new(info.Configuration); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); Assert.Contains("HybridGlobalization works, thrown exception as expected", output); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index 522f2861d0413d..7b23127167a986 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -162,7 +162,7 @@ protected async Task PublishAndRunIcuTest( GlobalizationMode: globalizationMode, CustomIcuFile: icuFileName )); - RunOptions runOptions = new(info.Configuration, Locale: locale); + RunOptions runOptions = new(info.Configuration, Locale: locale, ExpectedExitCode: 42); string runOutput = await RunForPublishWithWebServer(runOptions); return $"{buildOutput}\n{runOutput}"; } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 32ceff12b959bf..9d43bbb75d71de 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -63,8 +63,7 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded )); - RunOptions runOptions = new(info.Configuration); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); if (invariantGlobalization == true) { Assert.Contains("Could not create es-ES culture", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 327d332eee4d79..e77af4439da91a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -60,8 +60,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian IsPublish: isPublish )); - RunOptions runOptions = new(info.Configuration); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); Assert.Contains("UTC BaseUtcOffset is 0", output); if (invariantTimezone == true) { diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 9f246231f8cdb9..fe9e5b654bc7df 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -70,8 +70,7 @@ async Task TestMainWithArgs(string config, int argsCount = args.Length; int expectedCode = 42 + argsCount; - RunOptions runOptions = new(info.Configuration, ExtraArgs: argsStr); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(info.Configuration, ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); Assert.Contains($"args#: {argsCount}", output); foreach (var arg in args) Assert.Contains($"arg: {arg}", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index ca5e22e73c034c..e435fa2f5f0663 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -43,8 +43,7 @@ public async Task SimpleNativeBuild(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - RunOptions runOptions = new(config); - await RunForPublishWithWebServer(runOptions); + await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); } [Theory] diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index a2221892846fab..37e0984f56b18c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -44,8 +44,7 @@ public async Task ProjectWithNativeReference(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - RunOptions runOptions = new(config); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); Assert.Contains("print_line: 100", output); Assert.Contains("from pinvoke: 142", output); @@ -77,7 +76,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) )); RunOptions runOptions = new(info.Configuration, ExtraArgs: "mono.png"); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); Assert.Contains("Size: 26462 Height: 599, Width: 499", output); } @@ -101,8 +100,7 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) IsPublish: isPublish )); - RunOptions runOptions = new(info.Configuration); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); Assert.Contains( "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105", @@ -137,8 +135,7 @@ public async Task ProjectWithNativeLibrary(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - RunOptions runOptions = new(config); - string output = await RunForPublishWithWebServer(runOptions); + string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); Assert.Contains("print_line: 100", output); Assert.Contains("from pinvoke: 142", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index bc49585ed072d3..b73fe50ba9d886 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -35,7 +35,7 @@ public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativ var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (info.Configuration)); + await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index fea7df12091473..aa06de339bc338 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -232,7 +232,9 @@ protected async Task BrowserRunTest(string runArgs, await runOptions.Test(page); _testOutput.WriteLine($"Waiting for additional 10secs to see if any errors are reported"); - await runner.WaitForExitMessageAsync(TimeSpan.FromSeconds(10)); + int exitCode = await runner.WaitForExitMessageAsync(TimeSpan.FromSeconds(10)); + if (runOptions.ExpectedExitCode is not null && exitCode != runOptions.ExpectedExitCode) + throw new Exception($"Expected exit code {runOptions.ExpectedExitCode} but got {exitCode}"); return string.Join("\n", runner.OutputLines); From 2500064b62b38f91a33a1cd1f21132756e7371da Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:53:20 +0000 Subject: [PATCH 018/104] ToDo: `NativeRebuildTests` that still require work. --- .../FlagsChangeRebuildTest.cs | 83 ++++++++++--------- .../NativeRebuildTestsBase.cs | 13 +-- .../OptimizationFlagChangeTests.cs | 78 ++++++++--------- .../ReferenceNewAssemblyRebuildTest.cs | 65 +++++++-------- .../SimpleSourceChangeRebuildTest.cs | 64 +++++++------- .../NativeRebuildNewAssembly.cs | 12 +++ .../SimpleSourceChange.cs | 7 ++ 7 files changed, 169 insertions(+), 153 deletions(-) create mode 100644 src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeRebuildNewAssembly.cs create mode 100644 src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SimpleSourceChange.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 54b572a04e8be4..a40ad8b2b6c9b4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -21,49 +21,54 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass public static IEnumerable FlagsChangesForNativeRelinkingData(bool aot) => ConfigWithAOTData(aot, config: "Release").Multiply( - new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" }, - new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" }, - new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } + new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" } + // File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not + // new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } + // new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } ).UnwrapItemsAsArrays(); - // [Theory] - // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ false)] + [Theory] + [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ false)] + // Found statically linked AOT module: failed // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] - // public void ExtraEmccFlagsSetButNoRealChange(ProjectInfo buildArgs, string extraCFlags, string extraLDFlags, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"rebuild_flags_{buildArgs.Configuration}" }; - // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: true, invariant: false, buildArgs, id); - // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); - // if (extraLDFlags.Length > 0) - // pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); - - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // // Rebuild - - // string mainAssembly = $"{buildArgs.ProjectName}.dll"; - // string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; - // string output = Rebuild(nativeRelink: true, invariant: false, buildArgs, id, extraBuildArgs: extraBuildArgs, verbosity: "normal"); - - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - - // // cflags: pinvoke get's compiled, but doesn't overwrite pinvoke.o - // // and thus doesn't cause relinking - // TestUtils.AssertSubstring("pinvoke.c -> pinvoke.o", output, contains: extraCFlags.Length > 0); - - // // ldflags: link step args change, so it should trigger relink - // TestUtils.AssertSubstring("Linking with emcc", output, contains: extraLDFlags.Length > 0); + public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, string extraCFlags, string extraLDFlags) + { + string prefix = $"rebuild_flags_{config}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false); + var pathsDict = GetFilesTable(info, paths, unchanged: true); + if (extraLDFlags.Length > 0) + pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); - // if (buildArgs.AOT) - // { - // // ExtraEmccLDFlags does not affect .bc files - // Assert.DoesNotContain("Compiling assembly bitcode files", output); - // } + var originalStat = StatFiles(pathsDict); - // string runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, - // contains: buildArgs.AOT); - // } + // Rebuild + string mainAssembly = $"{info.ProjectName}.dll"; + string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; + string output = Rebuild(info, nativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); + + pathsDict = GetFilesTable(info, paths, unchanged: true); + var newStat = StatFiles(pathsDict); + CompareStat(originalStat, newStat, pathsDict); + + // cflags: pinvoke get's compiled, but doesn't overwrite pinvoke.o + // and thus doesn't cause relinking + TestUtils.AssertSubstring("pinvoke.c -> pinvoke.o", output, contains: extraCFlags.Length > 0); + + // ldflags: link step args change, so it should trigger relink + TestUtils.AssertSubstring("Linking with emcc", output, contains: extraLDFlags.Length > 0); + + if (info.AOT) + { + // ExtraEmccLDFlags does not affect .bc files + Assert.DoesNotContain("Compiling assembly bitcode files", output); + } + + string runOutput = await RunForPublishWithWebServer(new (info.Configuration)); + TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, + contains: info.AOT); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index 4ef38e34c2fe4b..f873ff1394f4b0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -43,17 +43,18 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF => ConfigWithAOTData(aot) .Multiply(new object[] { nativeRelinking, invariant }) // AOT in Debug is switched off - .Where(item => !(item.ElementAt(0) is string config && config == "Debug") && !(item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays().ToList(); } - internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool nativeRelink, bool invariant) + internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool nativeRelink, bool invariant, string extraBuildArgs="") { bool isNativeBuild = nativeRelink || invariant; var extraArgs = new string[] { "-p:_WasmDevel=true", $"-p:WasmBuildNative={nativeRelink}", - $"-p:InvariantGlobalization={invariant}" + $"-p:InvariantGlobalization={invariant}", + extraBuildArgs }; bool isPublish = true; BuildTemplateProject(info, @@ -66,7 +67,7 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool na GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded ), extraArgs); - await RunForPublishWithWebServer(new (info.Configuration)); + await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); return GetBuildPaths(info, isPublish); } @@ -78,11 +79,11 @@ protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, st File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); var extraArgs = new string[] { - extraBuildArgs, "-p:_WasmDevel=true", $"-p:WasmBuildNative={nativeRelink}", $"-p:InvariantGlobalization={invariant}", - $"-v:{verbosity}" + $"-v:{verbosity}", + extraBuildArgs }; bool isNativeBuild = nativeRelink || invariant; diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 7967ba1de45e5e..3f8f7bd449d65a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -22,50 +22,54 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC public static IEnumerable FlagsOnlyChangeData(bool aot) => ConfigWithAOTData(aot, config: "Release").Multiply( + // ToDo: File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not new object[] { /*cflags*/ "/p:EmccCompileOptimizationFlag=-O1", /*ldflags*/ "" }, new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccLinkOptimizationFlag=-O1" } ).UnwrapItemsAsArrays(); - // [Theory] - // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] - // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] - // public void OptimizationFlagChange(ProjectInfo buildArgs, string cflags, string ldflags, RunHost host, string id) - // { - // // force _WasmDevel=false, so we don't get -O0 - // buildArgs = buildArgs with { ProjectName = $"rebuild_flags_{buildArgs.Configuration}", ExtraBuildArgs = "/p:_WasmDevel=false" }; - // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink: true, invariant: false, buildArgs, id); - - // string mainAssembly = $"{buildArgs.ProjectName}.dll"; - // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); - // pathsDict.UpdateTo(unchanged: true, mainAssembly, "icall-table.h", "pinvoke-table.h", "driver-gen.c"); - // if (cflags.Length == 0) - // pathsDict.UpdateTo(unchanged: true, "pinvoke.o", "corebindings.o", "driver.o", "runtime.o"); + [Theory] + [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] + [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] + public async void OptimizationFlagChange(string config, bool aot, string cflags, string ldflags) + { + string prefix = $"rebuild_flags_{config}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + // force _WasmDevel=false, so we don't get -O0 + BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); - // pathsDict.Remove(mainAssembly); - // if (buildArgs.AOT) - // { - // // link optimization flag change affects .bc->.o files too, but - // // it might result in only *some* files being *changed, - // // so, don't check for those - // // Link optimization flag is set to Compile optimization flag, if unset - // // so, it affects .bc files too! - // foreach (string key in pathsDict.Keys.ToArray()) - // { - // if (key.EndsWith(".dll.bc", StringComparison.Ordinal) || key.EndsWith(".dll.o", StringComparison.Ordinal)) - // pathsDict.Remove(key); - // } - // } + string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; + var pathsDict = GetFilesTable(info, paths, unchanged: false); + pathsDict.UpdateTo(unchanged: true, mainAssembly, "icall-table.h", "pinvoke-table.h", "driver-gen.c"); + if (cflags.Length == 0) + pathsDict.UpdateTo(unchanged: true, "pinvoke.o", "corebindings.o", "driver.o", "runtime.o"); - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + pathsDict.Remove(mainAssembly); + if (info.AOT) + { + // link optimization flag change affects .bc->.o files too, but + // it might result in only *some* files being *changed, + // so, don't check for those + // Link optimization flag is set to Compile optimization flag, if unset + // so, it affects .bc files too! + foreach (string key in pathsDict.Keys.ToArray()) + { + if (key.EndsWith(".dll.bc", StringComparison.Ordinal) || key.EndsWith(".dll.o", StringComparison.Ordinal)) + pathsDict.Remove(key); + } + } + var originalStat = StatFiles(pathsDict); - // // Rebuild + // Rebuild - // string output = Rebuild(nativeRelink: true, invariant: false, buildArgs, id, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); + string output = Rebuild(info, nativeRelink: true, invariant: false, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); + var newStat = StatFiles(pathsDict); + CompareStat(originalStat, newStat, pathsDict); - // string runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, - // contains: buildArgs.AOT); - // } + string runOutput = await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, + contains: info.AOT); + } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 7fe6d17f1abd32..91abbaaeaecc46 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -19,42 +19,33 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT { } - // [Theory] - // [MemberData(nameof(NativeBuildData))] - // public void ReferenceNewAssembly(ProjectInfo buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"rebuild_tasks_{buildArgs.Configuration}" }; - // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink, invariant: invariant, buildArgs, id); - - // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: false); - // pathsDict.UpdateTo(unchanged: true, "corebindings.o"); - // pathsDict.UpdateTo(unchanged: true, "driver.o"); - // if (!buildArgs.AOT) // relinking - // pathsDict.UpdateTo(unchanged: true, "driver-gen.c"); - - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // string programText = - // @$" - // using System; - // using System.Text.Json; - // public class Test - // {{ - // public static int Main() - // {{" + - // @" string json = ""{ \""name\"": \""value\"" }"";" + - // @" var jdoc = JsonDocument.Parse($""{json}"", new JsonDocumentOptions());" + - // @$" Console.WriteLine($""json: {{jdoc}}""); - // return 42; - // }} - // }}"; - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - - // Rebuild(nativeRelink, invariant, buildArgs, id); - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // } + [Theory] + [MemberData(nameof(NativeBuildData))] + [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] + public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelink, bool invariant) + { + string prefix = $"rebuild_tasks_{config}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); + + var pathsDict = GetFilesTable(info, paths, unchanged: false); + pathsDict.UpdateTo(unchanged: true, "corebindings.o"); + pathsDict.UpdateTo(unchanged: true, "driver.o"); + if (!info.AOT) // relinking + pathsDict.UpdateTo(unchanged: true, "driver-gen.c"); + + var originalStat = StatFiles(pathsDict); + + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeRebuildNewAssembly.cs")); + + Rebuild(info, nativeRelink, invariant); + var newStat = StatFiles(pathsDict); + + CompareStat(originalStat, newStat, pathsDict); + await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 305dd4347bd7e2..bcb6c99d35040c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -18,39 +18,35 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes { } - // [Theory] - // [MemberData(nameof(NativeBuildData))] - // public void SimpleStringChangeInSource(ProjectInfo buildArgs, bool nativeRelink, bool invariant, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"rebuild_simple_{buildArgs.Configuration}" }; - // (buildArgs, BuildPaths paths) = FirstNativeBuild(s_mainReturns42, nativeRelink, invariant: invariant, buildArgs, id); - - // string mainAssembly = $"{buildArgs.ProjectName}.dll"; - // var pathsDict = _provider.GetFilesTable(buildArgs, paths, unchanged: true); - // pathsDict.UpdateTo(unchanged: false, mainAssembly); - // pathsDict.UpdateTo(unchanged: !buildArgs.AOT, "dotnet.native.wasm", "dotnet.native.js"); - - // if (buildArgs.AOT) - // pathsDict.UpdateTo(unchanged: false, $"{mainAssembly}.bc", $"{mainAssembly}.o"); - - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // // Changes - // string mainResults55 = @" - // public class TestClass { - // public static int Main() - // { - // return 55; - // } - // }"; - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), mainResults55); - - // // Rebuild - // Rebuild(nativeRelink, invariant, buildArgs, id); - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - // RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 55, host: host, id: id); - // } + [Theory] + [MemberData(nameof(NativeBuildData))] + [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] + public async void SimpleStringChangeInSource(string config, bool aot, bool nativeRelink, bool invariant) + { + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, $"rebuild_simple_{config}"); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); + + string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; + var pathsDict = GetFilesTable(info, paths, unchanged: true); + pathsDict.UpdateTo(unchanged: false, mainAssembly); + pathsDict.UpdateTo(unchanged: !info.AOT, "dotnet.native.wasm", "dotnet.native.js"); + + if (info.AOT) + pathsDict.UpdateTo(unchanged: false, $"{mainAssembly}.bc", $"{mainAssembly}.o"); + + var originalStat = StatFiles(pathsDict); + + UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SimpleSourceChange.cs")); + + // Rebuild + Rebuild(info, nativeRelink, invariant); + var newStat = StatFiles(pathsDict); + + CompareStat(originalStat, newStat, pathsDict); + await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 55)); + } } } diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeRebuildNewAssembly.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeRebuildNewAssembly.cs new file mode 100644 index 00000000000000..07083f4b6bbb01 --- /dev/null +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeRebuildNewAssembly.cs @@ -0,0 +1,12 @@ +using System; +using System.Text.Json; +public class Test +{ + public static int Main() + { + string json = "{ \"name\": \"value\" }"; + var jdoc = JsonDocument.Parse($"{json}", new JsonDocumentOptions()); + Console.WriteLine($"json: {jdoc}"); + return 42; + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SimpleSourceChange.cs b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SimpleSourceChange.cs new file mode 100644 index 00000000000000..e86104e6df8f55 --- /dev/null +++ b/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SimpleSourceChange.cs @@ -0,0 +1,7 @@ +public class TestClass +{ + public static int Main() + { + return 55; + } +} \ No newline at end of file From 0f502df7f554443c296a7349d4286ec2f221871a Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:40:13 +0000 Subject: [PATCH 019/104] Merge `AppTestBase` with `WasmTemplateTestBase`. --- .../Blazor/BlazorWasmTestBase.cs | 6 +- .../wasm/Wasm.Build.Tests/BrowserRunner.cs | 17 +- .../BrowserStructures/RunOptions.cs | 3 +- .../Wasm.Build.Tests/BuildPublishTests.cs | 2 +- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 2 + .../wasm/Wasm.Build.Tests/Common/TestUtils.cs | 8 + .../wasm/Wasm.Build.Tests/DebugLevelTests.cs | 123 ------------- .../HybridGlobalizationTests.cs | 4 +- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 4 +- .../InvariantGlobalizationTests.cs | 8 +- .../InvariantTimezoneTests.cs | 8 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 6 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 27 ++- .../FlagsChangeRebuildTest.cs | 4 +- .../OptimizationFlagChangeTests.cs | 4 +- .../wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 18 +- .../Templates/WasmTemplateTestsBase.cs | 85 +++++++-- .../TestAppScenarios/AppSettingsTests.cs | 33 ++-- .../TestAppScenarios/AppTestBase.cs | 161 ------------------ .../TestAppScenarios/DebugLevelTests.cs | 132 ++++++++++++++ .../TestAppScenarios/DownloadThenInitTests.cs | 20 ++- .../TestAppScenarios/InterpPgoTests.cs | 16 +- .../TestAppScenarios/LazyLoadingTests.cs | 45 +++-- .../LibraryInitializerTests.cs | 39 +++-- .../MaxParallelDownloadsTests.cs | 22 ++- .../TestAppScenarios/MemoryTests.cs | 37 +++- .../TestAppScenarios/ModuleConfigTests.cs | 64 +++++-- .../TestAppScenarios/SatelliteLoadingTests.cs | 34 +++- 28 files changed, 488 insertions(+), 444 deletions(-) delete mode 100644 src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 2593d12e4072dd..4ba6471b303cc3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -174,13 +174,13 @@ protected string CreateProjectWithNativeReference(string id) // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public async Task BlazorRunForBuildWithDotnetRun(RunOptions runOptions) + public async Task BlazorRunForBuildWithDotnetRun(RunOptions runOptions) => await BlazorRunTest(runOptions with { Host = RunHost.DotnetRun }); - public async Task BlazorRunForPublishWithWebServer(RunOptions runOptions) + public async Task BlazorRunForPublishWithWebServer(RunOptions runOptions) => await BlazorRunTest(runOptions with { Host = RunHost.WebServer }); - public async Task BlazorRunTest(RunOptions runOptions) + public async Task BlazorRunTest(RunOptions runOptions) { if (runOptions.ExecuteAfterLoaded is null) { diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs index e1c9055c927022..be2e2dd13a29be 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserRunner.cs @@ -156,7 +156,7 @@ public async Task RunAsync( string args, bool headless = true, string locale = "en-US", - Action? onConsoleMessage = null, + Action? onConsoleMessage = null, Action? onServerMessage = null, Action? onError = null, Func? modifyBrowserUrl = null) @@ -171,7 +171,7 @@ public async Task RunAsync( IBrowserContext context, string browserUrl, bool headless = true, - Action? onConsoleMessage = null, + Action? onConsoleMessage = null, Action? onError = null, Func? modifyBrowserUrl = null, bool resetExitedState = false @@ -192,26 +192,15 @@ public async Task RunAsync( { message = payloadMatch.Groups["payload"].Value; } - if (message.StartsWith("TestOutput -> ")) - { - lock (OutputLines) - { - OutputLines.Add(message); - } - } Match exitMatch = s_exitRegex.Match(message); if (exitMatch.Success) { - lock (OutputLines) - { - OutputLines.Add(message); - } int exitCode = int.Parse(exitMatch.Groups["exitCode"].Value); _exited.TrySetResult(exitCode); } if (onConsoleMessage is not null) { - onConsoleMessage(page, msg); + onConsoleMessage(msg.Type, message); } }; diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index 9de34559a73139..2d4e3a964ecd04 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -19,12 +19,11 @@ public record RunOptions Func? Test = null, string? TestScenario = null, Dictionary? BrowserQueryString = null, - Action? OnConsoleMessage = null, + Action? OnConsoleMessage = null, Action? OnServerMessage = null, Action? OnErrorMessage = null, string ExtraArgs = "", string BrowserPath = "", - string QueryString = "", string Locale = "en-US", int? ExpectedExitCode = 0, diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 6e7504c4b90cd2..f845be4439e1bc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -76,7 +76,7 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) IsPublish: isPublish, UseCache: false )); - string output = await RunForPublishWithWebServer(runOptions); + await RunForPublishWithWebServer(runOptions); } [Theory] diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 3ac2f73374a109..a3ca27c87ce203 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -366,6 +366,8 @@ protected void InitPaths(string id) protected void InitProjectDir(string dir, bool addNuGetSourceForLocalPackages = true, string targetFramework = DefaultTargetFramework) { + if (Directory.Exists(dir)) + Directory.Delete(dir, recursive: true); Directory.CreateDirectory(dir); File.WriteAllText(Path.Combine(dir, "Directory.Build.props"), s_buildEnv.DirectoryBuildPropsContents); File.WriteAllText(Path.Combine(dir, "Directory.Build.targets"), s_buildEnv.DirectoryBuildTargetsContents); diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/TestUtils.cs b/src/mono/wasm/Wasm.Build.Tests/Common/TestUtils.cs index fdf88fecc9ee0f..aed3fbc235c8b5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/TestUtils.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/TestUtils.cs @@ -65,6 +65,14 @@ public static string FindSubDirIgnoringCase(string parentDir, string dirName) return first ?? Path.Combine(parentDir, dirName); } + public static void AssertSubstring(string substring, IReadOnlyCollection full, bool contains) + { + if (contains) + Assert.Contains(full, m => m.Contains(substring)); + else + Assert.All(full, m => Assert.DoesNotContain(substring, m)); + } + public static void AssertSubstring(string substring, string full, bool contains) { if (contains) diff --git a/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs deleted file mode 100644 index 2b6aaf3570faf7..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs +++ /dev/null @@ -1,123 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Xunit; -using Xunit.Abstractions; -using Wasm.Build.Tests.TestAppScenarios; - -#nullable enable - -namespace Wasm.Build.Tests; - -// ToDo: fix to be based on WasmTemplateTestBase -public class DebugLevelTests : AppTestBase -{ - public DebugLevelTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(output, buildContext) - { - } - - // private void AssertDebugLevel(string result, int value) - // => Assert.Contains($"WasmDebugLevel: {value}", result); - - // private BuildProjectOptions GetProjectOptions(bool isPublish = false) => - // new BuildProjectOptions( - // DotnetWasmFromRuntimePack: !isPublish, - // CreateProject: false, - // Publish: isPublish, - // AssertAppBundle: false, - // UseCache: false - // ); - - // private string BuildPublishProject(string projectName, string config, bool isPublish = false, params string[] extraArgs) - // { - // var buildArgs = new ProjectInfo(projectName, config, false, projectName, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // (string _, string output) = BuildTemplateProject(buildArgs, - // buildArgs.Id, - // GetProjectOptions(isPublish), - // extraArgs: extraArgs - // ); - // return output; - // } - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task BuildWithDefaultLevel(string configuration) - // { - // string testAssetName = "WasmBasicTestApp"; - // string projectFile = $"{testAssetName}.csproj"; - // CopyTestAsset(testAssetName, $"DebugLevelTests_BuildWithDefaultLevel_{configuration}", "App"); - // BuildPublishProject(projectFile, configuration); - - // string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); - // AssertDebugLevel(result, -1); - // } - - // [Theory] - // [InlineData("Debug", 1)] - // [InlineData("Release", 1)] - // [InlineData("Debug", 0)] - // [InlineData("Release", 0)] - // public async Task BuildWithExplicitValue(string configuration, int debugLevel) - // { - // string testAssetName = "WasmBasicTestApp"; - // string projectFile = $"{testAssetName}.csproj"; - // CopyTestAsset(testAssetName, $"DebugLevelTests_BuildWithExplicitValue_{configuration}", "App"); - // BuildPublishProject(projectFile, configuration, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); - - // string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); - // AssertDebugLevel(result, debugLevel); - // } - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task PublishWithDefaultLevel(string configuration) - // { - // string testAssetName = "WasmBasicTestApp"; - // string projectFile = $"{testAssetName}.csproj"; - // CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithDefaultLevel_{configuration}", "App"); - // BuildPublishProject(projectFile, configuration, isPublish: true); - - // string result = await RunPublishedBrowserApp(configuration, testScenario: "DebugLevelTest"); - // AssertDebugLevel(result, 0); - // } - - // [Theory] - // [InlineData("Debug", 1)] - // [InlineData("Release", 1)] - // [InlineData("Debug", -1)] - // [InlineData("Release", -1)] - // public async Task PublishWithExplicitValue(string configuration, int debugLevel) - // { - // string testAssetName = "WasmBasicTestApp"; - // string projectFile = $"{testAssetName}.csproj"; - // CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithExplicitValue_{configuration}", "App"); - // BuildPublishProject(projectFile, configuration, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); - - // string result = await RunBuiltBrowserApp(configuration, projectFile, testScenario: "DebugLevelTest"); - // AssertDebugLevel(result, debugLevel); - // } - - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task PublishWithDefaultLevelAndPdbs(string configuration) - // { - // string testAssetName = "WasmBasicTestApp"; - // string projectFile = $"{testAssetName}.csproj"; - // CopyTestAsset(testAssetName, $"DebugLevelTests_PublishWithDefaultLevelAndPdbs_{configuration}", "App"); - // BuildPublishProject(projectFile, configuration, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); - - // var result = await RunPublishedBrowserApp(configuration, testScenario: "DebugLevelTest"); - // AssertDebugLevel(result, -1); - // } -} diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 80fa87f82fa8af..3860562ff1feff 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -59,8 +59,8 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is GlobalizationMode: GlobalizationMode.Hybrid )); - string output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); - Assert.Contains("HybridGlobalization works, thrown exception as expected", output); + RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + Assert.Contains(output.TestOutput, m => m.Contains("HybridGlobalization works, thrown exception as expected")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index 7b23127167a986..64b6b2280343be 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -163,8 +163,8 @@ protected async Task PublishAndRunIcuTest( CustomIcuFile: icuFileName )); RunOptions runOptions = new(info.Configuration, Locale: locale, ExpectedExitCode: 42); - string runOutput = await RunForPublishWithWebServer(runOptions); - return $"{buildOutput}\n{runOutput}"; + RunResult runOutput = await RunForPublishWithWebServer(runOptions); + return $"{buildOutput}\n{runOutput.TestOutput}"; } catch(Exception ex) { diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 9d43bbb75d71de..46a6798ec5e3ac 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -63,15 +63,15 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded )); - string output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); if (invariantGlobalization == true) { - Assert.Contains("Could not create es-ES culture", output); - Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); + Assert.Contains(output.TestOutput, m => m.Contains("Could not create es-ES culture")); + Assert.Contains(output.TestOutput, m => m.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)")); } else { - Assert.Contains("es-ES: Is Invariant LCID: False", output); + Assert.Contains(output.TestOutput, m => m.Contains("es-ES: Is Invariant LCID: False")); // ignoring the last line of the output which prints the current culture } } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index e77af4439da91a..199a953c515bef 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -60,15 +60,15 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian IsPublish: isPublish )); - string output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); - Assert.Contains("UTC BaseUtcOffset is 0", output); + RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + Assert.Contains("UTC BaseUtcOffset is 0", output.TestOutput); if (invariantTimezone == true) { - Assert.Contains("Could not find Asia/Tokyo", output); + Assert.Contains(output.TestOutput, m => m.Contains("Could not find Asia/Tokyo")); } else { - Assert.Contains("Asia/Tokyo BaseUtcOffset is 09:00:00", output); + Assert.Contains(output.TestOutput, m => m.Contains("Asia/Tokyo BaseUtcOffset is 09:00:00")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index fe9e5b654bc7df..753bb468a01957 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -70,10 +70,10 @@ async Task TestMainWithArgs(string config, int argsCount = args.Length; int expectedCode = 42 + argsCount; - string output = await RunForPublishWithWebServer(new(info.Configuration, ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); - Assert.Contains($"args#: {argsCount}", output); + RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); + Assert.Contains(output.TestOutput, m => m.Contains($"args#: {argsCount}")); foreach (var arg in args) - Assert.Contains($"arg: {arg}", output); + Assert.Contains(output.TestOutput, m => m.Contains($"arg: {arg}")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 37e0984f56b18c..e1275ecf879acb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -44,10 +44,10 @@ public async Task ProjectWithNativeReference(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); - Assert.Contains("print_line: 100", output); - Assert.Contains("from pinvoke: 142", output); + Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); + Assert.Contains(output.TestOutput, m => m.Contains("from pinvoke: 142")); } [Theory] @@ -76,8 +76,8 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) )); RunOptions runOptions = new(info.Configuration, ExtraArgs: "mono.png"); - string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); - Assert.Contains("Size: 26462 Height: 599, Width: 499", output); + RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + Assert.Contains(output.TestOutput, m => m.Contains("Size: 26462 Height: 599, Width: 499")); } [Theory] @@ -100,14 +100,13 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) IsPublish: isPublish )); - string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); - - Assert.Contains( - "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105", - output); + RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + + string hash = "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105"; + Assert.Contains(output.TestOutput, m => m.Contains(hash)); string cryptoInitMsg = "MONO_WASM: Initializing Crypto WebWorker"; - Assert.DoesNotContain(cryptoInitMsg, output); + Assert.All(output.TestOutput, m => Assert.DoesNotContain(cryptoInitMsg, m)); } [Theory] @@ -135,10 +134,10 @@ public async Task ProjectWithNativeLibrary(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - string output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); - Assert.Contains("print_line: 100", output); - Assert.Contains("from pinvoke: 142", output); + Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); + Assert.Contains(output.TestOutput, m => m.Contains("from pinvoke: 142")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index a40ad8b2b6c9b4..06ebec27a9a6d6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -66,8 +66,8 @@ public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, stri Assert.DoesNotContain("Compiling assembly bitcode files", output); } - string runOutput = await RunForPublishWithWebServer(new (info.Configuration)); - TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, + RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration)); + TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: info.AOT); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 3f8f7bd449d65a..c683657fdb2907 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -68,8 +68,8 @@ public async void OptimizationFlagChange(string config, bool aot, string cflags, var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - string runOutput = await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); - TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput, + RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: info.AOT); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index 183d984b39b481..f983436329c590 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -12,7 +12,7 @@ namespace Wasm.Build.Tests; -public class SignalRTestsBase : AppTestBase +public class SignalRTestsBase : WasmTemplateTestsBase { public SignalRTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -21,10 +21,20 @@ public SignalRTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture protected async Task SignalRPassMessage(string staticWebAssetBasePath, string config, string transport) { - CopyTestAsset("WasmOnAspNetCore", "SignalRClientTests", "AspNetCoreServer"); - PublishProject(config, runtimeType: RuntimeVariant.MultiThreaded, assertAppBundle: false); + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SignalRClientTests", "AspNetCoreServer"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish, + RuntimeType: RuntimeVariant.MultiThreaded, + AssertAppBundle: false + )); - var result = await RunSdkStyleAppForBuild(new( + var result = await RunForPublishWithWebServer(new( Configuration: config, ServerEnvironment: new Dictionary { ["ASPNETCORE_ENVIRONMENT"] = "Development" }, BrowserPath: staticWebAssetBasePath, diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index aa06de339bc338..4dd580033f9140 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -32,6 +32,19 @@ public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFi { "partial class StopwatchSample", $"return 42;{Environment.NewLine}partial class StopwatchSample" } }; + private string GetProjectName(string idPrefix, string config, bool aot, bool appendUnicodeToPath) => + appendUnicodeToPath ? + $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : + $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; + + private string InitProjectLocation(string idPrefix, string config, bool aot, bool appendUnicodeToPath) + { + string projectName = GetProjectName(idPrefix, config, aot, appendUnicodeToPath); + InitPaths(projectName); + InitProjectDir(_projectDir, addNuGetSourceForLocalPackages: true); + return projectName; + } + public ProjectInfo CreateWasmTemplateProject( Template template, string config, @@ -45,11 +58,7 @@ public ProjectInfo CreateWasmTemplateProject( string extraItems = "", string atTheEnd = "") { - string projectName = appendUnicodeToPath ? - $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : - $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; - InitPaths(projectName); - InitProjectDir(_projectDir, addNuGetSourceForLocalPackages: true); + string projectName = InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); if (addFrameworkArg) extraArgs += $" -f {DefaultTargetFramework}"; @@ -75,6 +84,19 @@ public ProjectInfo CreateWasmTemplateProject( return new ProjectInfo(config, aot, projectName, projectFilePath); } + protected ProjectInfo CopyTestAsset(string config, bool aot, string assetDirName, string idPrefix, string projectDirReativeToAssetDir = "", bool appendUnicodeToPath = true) + { + string projectName = InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, assetDirName), Path.Combine(_projectDir!)); + if (!string.IsNullOrEmpty(projectDirReativeToAssetDir)) + { + _projectDir = Path.Combine(_projectDir!, projectDirReativeToAssetDir); + } + string projectFilePath = Path.Combine(_projectDir!, $"{projectName}.csproj"); + return new ProjectInfo(config, aot, projectName, projectFilePath); + } + + public (string projectDir, string buildOutput) BuildTemplateProject( ProjectInfo projectInfo, BuildProjectOptions buildOptions, @@ -179,13 +201,13 @@ protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramewo // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public async Task RunForBuildWithDotnetRun(RunOptions runOptions) + public async Task RunForBuildWithDotnetRun(RunOptions runOptions) => await BrowserRun(runOptions with { Host = RunHost.DotnetRun }); - public async Task RunForPublishWithWebServer(RunOptions runOptions) + public async Task RunForPublishWithWebServer(RunOptions runOptions) => await BrowserRun(runOptions with { Host = RunHost.WebServer }); - private async Task BrowserRun(RunOptions runOptions) => runOptions.Host switch + private async Task BrowserRun(RunOptions runOptions) => runOptions.Host switch { RunHost.DotnetRun => await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions), @@ -198,7 +220,7 @@ await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-se _ => throw new NotImplementedException(runOptions.Host.ToString()) }; - protected async Task BrowserRunTest(string runArgs, + protected async Task BrowserRunTest(string runArgs, string workingDirectory, RunOptions runOptions) { @@ -211,14 +233,23 @@ protected async Task BrowserRunTest(string runArgs, using RunCommand runCommand = new RunCommand(s_buildEnv, _testOutput); ToolCommand cmd = runCommand.WithWorkingDirectory(workingDirectory); + var query = runOptions.BrowserQueryString ?? new Dictionary(); + if (!string.IsNullOrEmpty(runOptions.TestScenario)) + query.Add("test", runOptions.TestScenario); + var queryString = query.Any() ? "?" + string.Join("&", query.Select(kvp => $"{kvp.Key}={kvp.Value}")) : ""; + + List testOutput = new(); + List consoleOutput = new(); + List serverOutput = new(); await using var runner = new BrowserRunner(_testOutput); var page = await runner.RunAsync( cmd, runArgs, + locale: runOptions.Locale, onConsoleMessage: OnConsoleMessage, - onServerMessage: runOptions.OnServerMessage, + onServerMessage: OnServerMessage, onError: OnErrorMessage, - modifyBrowserUrl: browserUrl => new Uri(new Uri(browserUrl), runOptions.BrowserPath + runOptions.QueryString).ToString()); + modifyBrowserUrl: browserUrl => new Uri(new Uri(browserUrl), runOptions.BrowserPath + queryString).ToString()); _testOutput.WriteLine("Waiting for page to load"); await page.WaitForLoadStateAsync(LoadState.DOMContentLoaded, new () { Timeout = 1 * 60 * 1000 }); @@ -234,23 +265,41 @@ protected async Task BrowserRunTest(string runArgs, _testOutput.WriteLine($"Waiting for additional 10secs to see if any errors are reported"); int exitCode = await runner.WaitForExitMessageAsync(TimeSpan.FromSeconds(10)); if (runOptions.ExpectedExitCode is not null && exitCode != runOptions.ExpectedExitCode) - throw new Exception($"Expected exit code {runOptions.ExpectedExitCode} but got {exitCode}"); + throw new Exception($"Expected exit code {runOptions.ExpectedExitCode} but got {exitCode}.\nconsoleOutput={string.Join("\n", consoleOutput)}"); - return string.Join("\n", runner.OutputLines); + return new(exitCode, testOutput, consoleOutput, serverOutput); - void OnConsoleMessage(IPage page, IConsoleMessage msg) + void OnConsoleMessage(string type, string msg) { - _testOutput.WriteLine($"[{msg.Type}] {msg.Text}"); + _testOutput.WriteLine($"[{type}] {msg}"); + consoleOutput.Add(msg); + OnTestOutput(msg); - runOptions.OnConsoleMessage?.Invoke(page, msg); + runOptions.OnConsoleMessage?.Invoke(type, msg); if (runOptions.DetectRuntimeFailures) { - if (msg.Text.Contains("[MONO] * Assertion") || msg.Text.Contains("Error: [MONO] ")) - throw new XunitException($"Detected a runtime failure at line: {msg.Text}"); + if (msg.Contains("[MONO] * Assertion") || msg.Contains("Error: [MONO] ")) + throw new XunitException($"Detected a runtime failure at line: {msg}"); } } + void OnServerMessage(string msg) + { + serverOutput.Add(msg); + OnTestOutput(msg); + + if (runOptions.OnServerMessage != null) + runOptions.OnServerMessage(msg); + } + + void OnTestOutput(string msg) + { + const string testOutputPrefix = "TestOutput -> "; + if (msg.StartsWith(testOutputPrefix)) + testOutput.Add(msg.Substring(testOutputPrefix.Length)); + } + void OnErrorMessage(string msg) { _testOutput.WriteLine($"[ERROR] {msg}"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index 4ce41342917778..68fd6f12fe07fa 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -13,7 +13,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class AppSettingsTests : AppTestBase +public class AppSettingsTests : WasmTemplateTestsBase { public AppSettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -25,22 +25,25 @@ public AppSettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [InlineData("Production")] public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicationEnvironment) { - CopyTestAsset("WasmBasicTestApp", "AppSettingsTests", "App"); - PublishProject("Debug"); - - var result = await RunSdkStyleAppForPublish(new( - Configuration: "Debug", + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, aot: false, "WasmBasicTestApp", "AppSettingsTest", "App"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + RunOptions options = new( + info.Configuration, TestScenario: "AppSettingsTest", BrowserQueryString: new Dictionary { ["applicationEnvironment"] = applicationEnvironment } - )); - Assert.Collection( - result.TestOutput, - m => Assert.Equal(GetFileExistenceMessage("/appsettings.json", true), m), - m => Assert.Equal(GetFileExistenceMessage("/appsettings.Development.json", applicationEnvironment == "Development"), m), - m => Assert.Equal(GetFileExistenceMessage("/appsettings.Production.json", applicationEnvironment == "Production"), m) ); + RunResult result = await RunForPublishWithWebServer(options); + Assert.Contains(result.TestOutput, m => m.Contains("'/appsettings.json' exists 'True'")); + Assert.Contains(result.TestOutput, m => m.Contains($"'/appsettings.Development.json' exists '{applicationEnvironment == "Development"}'")); + Assert.Contains(result.TestOutput, m => m.Contains($"'/appsettings.Production.json' exists '{applicationEnvironment == "Production"}'")); } - - // Synchronize with AppSettingsTest - private static string GetFileExistenceMessage(string path, bool expected) => $"'{path}' exists '{expected}'"; } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs deleted file mode 100644 index 1ffd16321109d9..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppTestBase.cs +++ /dev/null @@ -1,161 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using Microsoft.Playwright; -using Xunit.Abstractions; -using Wasm.Build.Tests.Blazor; - -namespace Wasm.Build.Tests.TestAppScenarios; - -public abstract class AppTestBase : BlazorWasmTestBase -{ - protected AppTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(output, buildContext) - { - } - - protected string Id { get; set; } - protected string LogPath { get; set; } - - protected void CopyTestAsset(string assetName, string generatedProjectNamePrefix = null, string? projectDirSuffix = null) - { - Id = $"{generatedProjectNamePrefix ?? assetName}_{GetRandomId()}"; - InitBlazorWasmProjectDir(Id); - - LogPath = Path.Combine(s_buildEnv.LogRootPath, Id); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, assetName), Path.Combine(_projectDir!)); - - if (!string.IsNullOrEmpty(projectDirSuffix)) - { - _projectDir = Path.Combine(_projectDir, projectDirSuffix); - } - } - - protected void BuildProject( - string configuration, - string? binFrameworkDir = null, - RuntimeVariant runtimeType = RuntimeVariant.SingleThreaded, - bool assertAppBundle = true, - bool expectSuccess = true, - string bootConfigFileName = "blazor.boot.json", - params string[] extraArgs) - { - (CommandResult result, _) = BlazorBuild(new BuildProjectOptions( - Id: Id, - Configuration: configuration, - BinFrameworkDir: binFrameworkDir, - RuntimeType: runtimeType, - AssertAppBundle: assertAppBundle, - BootConfigFileName: bootConfigFileName, - ExpectSuccess: expectSuccess), extraArgs); - if (expectSuccess) - { - result.EnsureSuccessful(); - } - else - { - result.EnsureFailed(); - } - } - - protected void PublishProject( - string configuration, - RuntimeVariant runtimeType = RuntimeVariant.SingleThreaded, - bool assertAppBundle = true, - string bootConfigFileName = "blazor.boot.json", - params string[] extraArgs) - { - (CommandResult result, _) = BlazorPublish(new BuildProjectOptions( - Id: Id, - Configuration: configuration, - BinFrameworkDir: GetBinFrameworkDir(configuration, forPublish: true), - RuntimeType: runtimeType, - BootConfigFileName: bootConfigFileName, - AssertAppBundle: assertAppBundle), extraArgs); - result.EnsureSuccessful(); - } - - protected Task RunSdkStyleAppForBuild(RunOptions options) - => RunSdkStyleApp(options, RunHost.DotnetRun); - - protected Task RunSdkStyleAppForPublish(RunOptions options) - => RunSdkStyleApp(options, RunHost.WebServer); - - private async Task RunSdkStyleApp(RunOptions options, RunHost host = RunHost.DotnetRun) - { - var query = options.BrowserQueryString ?? new Dictionary(); - if (!string.IsNullOrEmpty(options.TestScenario)) - query.Add("test", options.TestScenario); - - var queryString = query.Any() ? "?" + string.Join("&", query.Select(kvp => $"{kvp.Key}={kvp.Value}")) : ""; - var tcs = new TaskCompletionSource(); - List testOutput = new(); - List consoleOutput = new(); - List serverOutput = new(); - Regex exitRegex = new Regex("WASM EXIT (?[0-9]+)$"); - - RunOptions blazorRunOptions = new( - CheckCounter: false, - Configuration: options.Configuration, - ServerEnvironment: options.ServerEnvironment, - OnConsoleMessage: OnConsoleMessage, - OnServerMessage: OnServerMessage, - BrowserPath: options.BrowserPath, - QueryString: queryString, - Host: host, - ExtraArgs: options.ExtraArgs); - - await BlazorRunTest(blazorRunOptions); - - void OnConsoleMessage(IPage page, IConsoleMessage msg) - { - consoleOutput.Add(msg.Text); - - OnTestOutput(msg.Text); - - var exitMatch = exitRegex.Match(msg.Text); - if (exitMatch.Success) - tcs.TrySetResult(int.Parse(exitMatch.Groups["exitCode"].Value)); - - if (msg.Text.StartsWith("Error: Missing test scenario")) - throw new Exception(msg.Text); - - if (options.OnConsoleMessage != null) - options.OnConsoleMessage(page, msg); - } - - void OnServerMessage(string msg) - { - serverOutput.Add(msg); - OnTestOutput(msg); - - if (options.OnServerMessage != null) - options.OnServerMessage(msg); - } - - void OnTestOutput(string msg) - { - const string testOutputPrefix = "TestOutput -> "; - if (msg.StartsWith(testOutputPrefix)) - testOutput.Add(msg.Substring(testOutputPrefix.Length)); - } - - //TimeSpan timeout = TimeSpan.FromMinutes(2); - //await Task.WhenAny(tcs.Task, Task.Delay(timeout)); - //if (!tcs.Task.IsCompleted) - //throw new Exception($"Timed out after {timeout.TotalSeconds}s waiting for process to exit"); - - int wasmExitCode = tcs.Task.Result; - if (options.ExpectedExitCode != null && wasmExitCode != options.ExpectedExitCode) - throw new Exception($"Expected exit code {options.ExpectedExitCode} but got {wasmExitCode}"); - - return new(wasmExitCode, testOutput, consoleOutput, serverOutput); - } - -} diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs new file mode 100644 index 00000000000000..438285250f28f4 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -0,0 +1,132 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +#nullable enable + +namespace Wasm.Build.Tests.TestAppScenarios; + +public class DebugLevelTests : WasmTemplateTestsBase +{ + public DebugLevelTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) + : base(output, buildContext) + { + } + + private void AssertDebugLevel(IReadOnlyCollection result, int value) + => Assert.Contains(result, m => m.Contains($"WasmDebugLevel: {value}")); + + private void BuildPublishProject(ProjectInfo info, bool isPublish = false, params string[] extraArgs) + => BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + ), + extraArgs: extraArgs + ); + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public async Task BuildWithDefaultLevel(string configuration) + { + ProjectInfo info = CopyTestAsset( + configuration, + aot: false, + assetDirName: "WasmBasicTestApp", + idPrefix: "DebugLevelTests_BuildWithDefaultLevel", + projectDirReativeToAssetDir: "App" + ); + BuildPublishProject(info); + RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + RunResult result = await RunForBuildWithDotnetRun(options); + AssertDebugLevel(result.TestOutput, -1); + } + + [Theory] + [InlineData("Debug", 1)] + [InlineData("Release", 1)] + [InlineData("Debug", 0)] + [InlineData("Release", 0)] + public async Task BuildWithExplicitValue(string configuration, int debugLevel) + { + ProjectInfo info = CopyTestAsset( + configuration, + aot: false, + assetDirName: "WasmBasicTestApp", + idPrefix: "DebugLevelTests_BuildWithExplicitValue", + projectDirReativeToAssetDir: "App" + ); + BuildPublishProject(info, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); + RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + RunResult result = await RunForBuildWithDotnetRun(options); + AssertDebugLevel(result.TestOutput, debugLevel); + } + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public async Task PublishWithDefaultLevel(string configuration) + { + ProjectInfo info = CopyTestAsset( + configuration, + aot: false, + assetDirName: "WasmBasicTestApp", + idPrefix: "DebugLevelTests_PublishWithDefaultLevel", + projectDirReativeToAssetDir: "App" + ); + BuildPublishProject(info, isPublish: true); + RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + RunResult result = await RunForPublishWithWebServer(options); + AssertDebugLevel(result.TestOutput, 0); + } + + [Theory] + [InlineData("Debug", 1)] + [InlineData("Release", 1)] + [InlineData("Debug", -1)] + [InlineData("Release", -1)] + public async Task PublishWithExplicitValue(string configuration, int debugLevel) + { + ProjectInfo info = CopyTestAsset( + configuration, + aot: false, + assetDirName: "WasmBasicTestApp", + idPrefix: "DebugLevelTests_PublishWithExplicitValue", + projectDirReativeToAssetDir: "App" + ); + BuildPublishProject(info, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); + RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + RunResult result = await RunForPublishWithWebServer(options); + AssertDebugLevel(result.TestOutput, debugLevel); + } + + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public async Task PublishWithDefaultLevelAndPdbs(string configuration) + { + ProjectInfo info = CopyTestAsset( + configuration, + aot: false, + assetDirName: "WasmBasicTestApp", + idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs", + projectDirReativeToAssetDir: "App" + ); + BuildPublishProject(info, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); + RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + RunResult result = await RunForPublishWithWebServer(options); + AssertDebugLevel(result.TestOutput, -1); + } +} diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index aaa2df9b596557..4eadf2d5144387 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -12,7 +12,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class DownloadThenInitTests : AppTestBase +public class DownloadThenInitTests : WasmTemplateTestsBase { public DownloadThenInitTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -24,12 +24,20 @@ public DownloadThenInitTests(ITestOutputHelper output, SharedBuildPerTestClassFi [InlineData("Release")] public async Task NoResourcesReFetchedAfterDownloadFinished(string config) { - CopyTestAsset("WasmBasicTestApp", "DownloadThenInitTests", "App"); - BuildProject(config); - - var result = await RunSdkStyleAppForBuild(new(Configuration: config, TestScenario: "DownloadThenInit")); + ProjectInfo info = CopyTestAsset(config, aot: false, "WasmBasicTestApp", "DownloadThenInitTests", "App"); + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + RunOptions options = new(info.Configuration, TestScenario: "DownloadThenInit"); + RunResult result = await RunForBuildWithDotnetRun(options); var resultTestOutput = result.TestOutput.ToList(); - int index = resultTestOutput.FindIndex(s => s == "download finished"); + int index = resultTestOutput.FindIndex(s => s.Contains("download finished")); Assert.True(index > 0); // number of fetched resources cannot be 0 var afterDownload = resultTestOutput.Skip(index + 1).Where(s => s.StartsWith("fetching")).ToList(); if (afterDownload.Count > 0) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs index 9399ee93ec87ce..19fefbc26f709c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs @@ -15,7 +15,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class InterpPgoTests : AppTestBase +public class InterpPgoTests : WasmTemplateTestsBase { public InterpPgoTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -34,10 +34,20 @@ public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(string config) const int iterationCount = 70; _testOutput.WriteLine("/// Creating project"); - CopyTestAsset("WasmBasicTestApp", "InterpPgoTest", "App"); + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "InterpPgoTest", "App"); _testOutput.WriteLine("/// Building"); - BuildProject(config, extraArgs: "-p:WasmDebugLevel=0"); + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + ), + extraArgs: "-p:WasmDebugLevel=0" + ); _testOutput.WriteLine("/// Starting server"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index eb98b3d6f6e0a3..500d103e52501d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -13,7 +13,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class LazyLoadingTests : AppTestBase +public class LazyLoadingTests : WasmTemplateTestsBase { public LazyLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -30,16 +30,27 @@ public LazyLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [MemberData(nameof(LoadLazyAssemblyBeforeItIsNeededData))] public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtension, string[] allLazyLoadingTestExtensions) { - CopyTestAsset("WasmBasicTestApp", "LazyLoadingTests", "App"); - BuildProject("Debug", extraArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension}"); + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LazyLoadingTests", "App"); + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + ), + extraArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension}" + ); // We are running the app and passing all possible lazy extensions to test matrix of all possibilities. // We don't need to rebuild the application to test how client is trying to load the assembly. foreach (var clientLazyLoadingTestExtension in allLazyLoadingTestExtensions) { - var result = await RunSdkStyleAppForBuild(new( - Configuration: "Debug", - TestScenario: "LazyLoadingTest", + RunResult result = await RunForBuildWithDotnetRun(new( + info.Configuration, + TestScenario: "LazyLoadingTest", BrowserQueryString: new Dictionary { ["lazyLoadingTestExtension"] = clientLazyLoadingTestExtension } )); @@ -51,15 +62,23 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi [Fact] public async Task FailOnMissingLazyAssembly() { - CopyTestAsset("WasmBasicTestApp", "LazyLoadingTests", "App"); - PublishProject("Debug"); - - var result = await RunSdkStyleAppForPublish(new( - Configuration: "Debug", + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LazyLoadingTests", "App"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + RunOptions options = new( + info.Configuration, TestScenario: "LazyLoadingTest", BrowserQueryString: new Dictionary { ["loadRequiredAssembly"] = "false" }, - ExpectedExitCode: 1 - )); + ExpectedExitCode: 1); + RunResult result = await RunForPublishWithWebServer(options); Assert.True(result.ConsoleOutput.Any(m => m.Contains("Could not load file or assembly") && m.Contains("Json")), "The lazy loading test didn't emit expected error message"); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index 5e351203596d43..a5bc1a12324bd5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -16,7 +16,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public partial class LibraryInitializerTests : AppTestBase +public partial class LibraryInitializerTests : WasmTemplateTestsBase { public LibraryInitializerTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -26,10 +26,18 @@ public LibraryInitializerTests(ITestOutputHelper output, SharedBuildPerTestClass [Fact] public async Task LoadLibraryInitializer() { - CopyTestAsset("WasmBasicTestApp", "LibraryInitializerTests_LoadLibraryInitializer", "App"); - PublishProject("Debug"); - - var result = await RunSdkStyleAppForPublish(new(Configuration: "Debug", TestScenario: "LibraryInitializerTest")); + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LibraryInitializerTests_LoadLibraryInitializer", "App"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + RunResult result = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "LibraryInitializerTest")); Assert.Collection( result.TestOutput, m => Assert.Equal("LIBRARY_INITIALIZER_TEST = 1", m) @@ -42,15 +50,24 @@ public async Task LoadLibraryInitializer() [Fact] public async Task AbortStartupOnError() { - CopyTestAsset("WasmBasicTestApp", "LibraryInitializerTests_AbortStartupOnError", "App"); - PublishProject("Debug"); + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LibraryInitializerTests_AbortStartupOnError", "App"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); - var result = await RunSdkStyleAppForPublish(new( - Configuration: "Debug", + RunOptions options = new( + info.Configuration, TestScenario: "LibraryInitializerTest", BrowserQueryString: new Dictionary { ["throwError"] = "true" }, - ExpectedExitCode: 1 - )); + ExpectedExitCode: 1); + RunResult result = await RunForPublishWithWebServer(options); Assert.True(result.ConsoleOutput.Any(m => AbortStartupOnErrorRegex().IsMatch(m)), "The library initializer test didn't emit expected error message"); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index d9ae89ef0c6e5a..3ecf5b92a2904a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -13,7 +13,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class MaxParallelDownloadsTests : AppTestBase +public class MaxParallelDownloadsTests : WasmTemplateTestsBase { public MaxParallelDownloadsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -25,14 +25,22 @@ public MaxParallelDownloadsTests(ITestOutputHelper output, SharedBuildPerTestCla [InlineData("Release", "4")] public async Task NeverFetchMoreThanMaxAllowed(string config, string maxParallelDownloads) { - CopyTestAsset("WasmBasicTestApp", "MaxParallelDownloadsTests", "App"); - BuildProject(config); - - var result = await RunSdkStyleAppForBuild(new( - Configuration: config, + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "MaxParallelDownloadsTests", "App"); + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + RunResult result = await RunForBuildWithDotnetRun(new( + info.Configuration, TestScenario: "MaxParallelDownloads", - BrowserQueryString: new Dictionary { ["maxParallelDownloads"] = maxParallelDownloads } + BrowserQueryString: new Dictionary { ["maxParallelDownloads"] = maxParallelDownloads } )); + var resultTestOutput = result.TestOutput.ToList(); var regex = new Regex(@"Active downloads: (\d+)"); foreach (var line in resultTestOutput) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index 239950d1fd7279..eeb3f6ff2d1d01 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -13,7 +13,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class MemoryTests : AppTestBase +public class MemoryTests : WasmTemplateTestsBase { public MemoryTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -29,13 +29,25 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop_NoWorkload() => public async Task AllocateLargeHeapThenRepeatedlyInterop() { string config = "Release"; - CopyTestAsset("WasmBasicTestApp", "MemoryTests", "App"); + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "MemoryTests", "App"); + bool isPublish = false; string extraArgs = BuildTestBase.IsUsingWorkloads ? "-p:EmccMaximumHeapSize=4294901760" : "-p:EmccMaximumHeapSize=4294901760"; - BuildProject(config, assertAppBundle: false, extraArgs: extraArgs, expectSuccess: BuildTestBase.IsUsingWorkloads); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + // using EmccMaximumHeapSize forces native rebuild + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish, + ExpectSuccess: BuildTestBase.IsUsingWorkloads + ), + extraArgs: extraArgs + ); if (BuildTestBase.IsUsingWorkloads) { - await RunSdkStyleAppForBuild(new (Configuration: config, TestScenario: "AllocateLargeHeapThenInterop")); + await RunForBuildWithDotnetRun(new (Configuration: config, TestScenario: "AllocateLargeHeapThenInterop")); } } @@ -43,12 +55,23 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop() public async Task RunSimpleAppWithProfiler() { string config = "Release"; - CopyTestAsset("WasmBasicTestApp", "ProfilerTest", "App"); + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "ProfilerTest", "App"); + bool isPublish = false; // are are linking all 3 profilers, but below we only initialize log profiler and test it string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; - BuildProject(config, assertAppBundle: false, extraArgs: extraArgs); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish, + AssertAppBundle: false + ), + extraArgs: extraArgs + ); - var result = await RunSdkStyleAppForBuild(new (Configuration: config, TestScenario: "ProfilerTest")); + var result = await RunForBuildWithDotnetRun(new (Configuration: config, TestScenario: "ProfilerTest")); Regex regex = new Regex(@"Profile data of size (\d+) bytes"); var match = result.TestOutput .Select(line => regex.Match(line)) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index e5abf407dbd9d7..47f74d84eefdb0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -13,7 +13,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class ModuleConfigTests : AppTestBase +public class ModuleConfigTests : WasmTemplateTestsBase { public ModuleConfigTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -25,11 +25,20 @@ public ModuleConfigTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [InlineData(true)] public async Task DownloadProgressFinishes(bool failAssemblyDownload) { - CopyTestAsset("WasmBasicTestApp", $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}", "App"); - PublishProject("Debug"); + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}", "App"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); - var result = await RunSdkStyleAppForPublish(new( - Configuration: "Debug", + var result = await RunForPublishWithWebServer(new( + Configuration: info.Configuration, TestScenario: "DownloadResourceProgressTest", BrowserQueryString: new Dictionary { ["failAssemblyDownload"] = failAssemblyDownload.ToString().ToLowerInvariant() } )); @@ -58,10 +67,19 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) [Fact] public async Task OutErrOverrideWorks() { - CopyTestAsset("WasmBasicTestApp", $"ModuleConfigTests_OutErrOverrideWorks", "App"); - PublishProject("Debug"); + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "ModuleConfigTests_OutErrOverrideWorks", "App"); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); - var result = await RunSdkStyleAppForPublish(new( + var result = await RunForPublishWithWebServer(new( Configuration: "Debug", TestScenario: "OutErrOverrideWorks" )); @@ -80,21 +98,37 @@ public async Task OutErrOverrideWorks() [InlineData("Release", false)] public async Task OverrideBootConfigName(string config, bool isPublish) { - CopyTestAsset("WasmBasicTestApp", $"OverrideBootConfigName", "App"); + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "OverrideBootConfigName", "App"); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); string[] extraArgs = ["-p:WasmBootConfigFileName=boot.json"]; - if (isPublish) - PublishProject(config, bootConfigFileName: "boot.json", extraArgs: extraArgs); - else - BuildProject(config, bootConfigFileName: "boot.json", extraArgs: extraArgs); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish, + BootConfigFileName: "boot.json", + UseCache: false + ), + extraArgs: extraArgs + ); var runOptions = new RunOptions( Configuration: config, TestScenario: "OverrideBootConfigName" ); var result = await (isPublish - ? RunSdkStyleAppForPublish(runOptions) - : RunSdkStyleAppForBuild(runOptions) + ? RunForPublishWithWebServer(runOptions) + : RunForBuildWithDotnetRun(runOptions) ); Assert.Collection( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index ea1037e27872ac..5a795f67cf9257 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -17,7 +17,7 @@ namespace Wasm.Build.Tests.TestAppScenarios; -public class SatelliteLoadingTests : AppTestBase +public class SatelliteLoadingTests : WasmTemplateTestsBase { public SatelliteLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -29,11 +29,20 @@ public SatelliteLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFi [InlineData(true)] public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) { - CopyTestAsset("WasmBasicTestApp", "SatelliteLoadingTests", "App"); - BuildProject("Debug"); + string config = "Debug"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SatelliteLoadingTests", "App"); + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); - var result = await RunSdkStyleAppForBuild(new( - Configuration: "Debug", + var result = await RunForBuildWithDotnetRun(new( + Configuration: info.Configuration, TestScenario: "SatelliteAssembliesTest", BrowserQueryString: new Dictionary { ["loadAllSatelliteResources"] = loadAllSatelliteResources.ToString().ToLowerInvariant() } )); @@ -59,7 +68,9 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) [Fact] public async Task LoadSatelliteAssemblyFromReference() { - CopyTestAsset("WasmBasicTestApp", "SatelliteLoadingTestsFromReference", "App"); + string config = "Release"; + ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SatelliteLoadingTestsFromReference", "App"); + bool isPublish = true; // Replace ProjectReference with Reference var appCsprojPath = Path.Combine(_projectDir!, "WasmBasicTestApp.csproj"); @@ -84,9 +95,16 @@ public async Task LoadSatelliteAssemblyFromReference() .EnsureSuccessful(); // Publish the app and assert - PublishProject("Release"); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); - var result = await RunSdkStyleAppForPublish(new(Configuration: "Release", TestScenario: "SatelliteAssembliesTest")); + var result = await RunForPublishWithWebServer(new(Configuration: "Release", TestScenario: "SatelliteAssembliesTest")); Assert.Collection( result.TestOutput, m => Assert.Equal("default: hello", m), From f7f00412f754a6c8528ea24e353ca16c432ce0a2 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 25 Oct 2024 09:19:19 +0000 Subject: [PATCH 020/104] NativeRelink cannot be false when it's forced by other property values. --- .../NativeRebuildTestsBase.cs | 3 +-- .../NoopNativeRebuildTest.cs | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index f873ff1394f4b0..802435ac0269e7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -35,7 +35,6 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF // aot data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: false)); - data.AddRange(GetData(aot: true, nativeRelinking: false, invariant: true)); return data; @@ -53,7 +52,7 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool na var extraArgs = new string[] { "-p:_WasmDevel=true", $"-p:WasmBuildNative={nativeRelink}", - $"-p:InvariantGlobalization={invariant}", + $"-p:InvariantGlobalization={invariant}", extraBuildArgs }; bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index b73fe50ba9d886..43b258e08d7a49 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -37,5 +37,31 @@ public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativ CompareStat(originalStat, newStat, pathsDict); await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); } + + [Fact] + + public void NativeRelinkFailsWithInvariant() + { + bool nativeRelink = false; + var extraArgs = new string[] { + "-p:_WasmDevel=true", + $"-p:WasmBuildNative={nativeRelink}", + $"-p:InvariantGlobalization=true", + }; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, "Release", aot: true, "relink_fails"); + bool isPublish = true; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + IsPublish: isPublish, + GlobalizationMode: GlobalizationMode.Invariant, + ExpectSuccess: false + ), + extraArgs + ); + Assert.Contains("WasmBuildNative is required because InvariantGlobalization=true, but WasmBuildNative is already set to 'false'", _testOutput.ToString()); + } } } From 309bd9a25205727b476891e5bbf9e707c319eba2 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 25 Oct 2024 09:19:36 +0000 Subject: [PATCH 021/104] Fix minor mistakes in refactoring. --- src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs | 2 +- .../NativeRebuildTests/FlagsChangeRebuildTest.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 199a953c515bef..1e9bf89a344845 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -61,7 +61,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian )); RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); - Assert.Contains("UTC BaseUtcOffset is 0", output.TestOutput); + Assert.Contains(output.TestOutput, m => m.Contains("UTC BaseUtcOffset is 0")); if (invariantTimezone == true) { Assert.Contains(output.TestOutput, m => m.Contains("Could not find Asia/Tokyo")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 06ebec27a9a6d6..7611f2515a6195 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -66,7 +66,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, stri Assert.DoesNotContain("Compiling assembly bitcode files", output); } - RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration)); + RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: info.AOT); } From fe7b988468afee110ea643ee3b959bf0b2d36dac Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:36:39 +0000 Subject: [PATCH 022/104] `WasmBuildAppBase`: done but reading from config fails. --- .../HybridGlobalizationTests.cs | 2 +- .../InvariantGlobalizationTests.cs | 2 +- .../InvariantTimezoneTests.cs | 2 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 2 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 4 +- .../ReferenceNewAssemblyRebuildTest.cs | 2 +- .../SimpleSourceChangeRebuildTest.cs | 2 +- .../Templates/WasmTemplateTestsBase.cs | 9 +- .../wasm/Wasm.Build.Tests/WasmBuildAppTest.cs | 328 +++++++++--------- .../WasmBasicTestApp/App/wwwroot/main.js | 1 + 10 files changed, 174 insertions(+), 180 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 3860562ff1feff..067912c7d22570 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -45,7 +45,7 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is extraProperties += "true"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "hybrid", extraProperties: extraProperties); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); UpdateBrowserMainJs(); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 46a6798ec5e3ac..ad77a17ec6a0f3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -47,7 +47,7 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv string prefix = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs")); UpdateBrowserMainJs(); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 1e9bf89a344845..7f95174f0e83de 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -45,7 +45,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs")); UpdateBrowserMainJs(); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 753bb468a01957..867e2e1bc161aa 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -47,7 +47,7 @@ async Task TestMainWithArgs(string config, string[] args) { ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, projectNamePrefix); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", projectContentsName)); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", projectContentsName)); UpdateBrowserMainJs(); string mainJsPath = Path.Combine(_projectDir!, "wwwroot", "main.js"); UpdateFile( diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index e1275ecf879acb..2bc6df107c8b8e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -62,7 +62,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) "; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraItems: extraItems); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SkiaSharp.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SkiaSharp.cs")); UpdateBrowserMainJs(); bool isPublish = true; @@ -87,7 +87,7 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) { ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "AppUsingBrowserNativeCrypto"); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeCrypto.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeCrypto.cs")); UpdateBrowserMainJs(); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 91abbaaeaecc46..fdd6400aea3e7a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -39,7 +39,7 @@ public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelin var originalStat = StatFiles(pathsDict); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeRebuildNewAssembly.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeRebuildNewAssembly.cs")); Rebuild(info, nativeRelink, invariant); var newStat = StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index bcb6c99d35040c..9b641b1426660c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -39,7 +39,7 @@ public async void SimpleStringChangeInSource(string config, bool aot, bool nativ var originalStat = StatFiles(pathsDict); - UpdateFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SimpleSourceChange.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SimpleSourceChange.cs")); // Rebuild Rebuild(info, nativeRelink, invariant); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 4dd580033f9140..230f0b9fcdb758 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -154,13 +154,18 @@ protected void UpdateFile(string pathRelativeToProjectDir, Dictionary TestMain("top_level", - // @"System.Console.WriteLine(""Hello, World!""); return await System.Threading.Tasks.Task.FromResult(42);", - // buildArgs, host, id); - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void AsyncMain(ProjectInfo buildArgs, RunHost host, string id) - // => TestMain("async_main", @" - // using System; - // using System.Threading.Tasks; - - // public class TestClass { - // public static async Task Main() - // { - // Console.WriteLine(""Hello, World!""); - // return await Task.FromResult(42); - // } - // }", buildArgs, host, id); - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void NonAsyncMain(ProjectInfo buildArgs, RunHost host, string id) - // => TestMain("non_async_main", @" - // using System; - // using System.Threading.Tasks; - - // public class TestClass { - // public static int Main() - // { - // Console.WriteLine(""Hello, World!""); - // return 42; - // } - // }", buildArgs, host, id); - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void ExceptionFromMain(ProjectInfo buildArgs, RunHost host, string id) - // => TestMain("main_exception", """ - // using System; - // using System.Threading.Tasks; - - // public class TestClass { - // public static int Main() => throw new Exception("MessageFromMyException"); - // } - // """, buildArgs, host, id, expectedExitCode: 71, expectedOutput: "Error: MessageFromMyException"); - - // private static string s_bug49588_ProgramCS = @" - // using System; - // public class TestClass { - // public static int Main() - // { - // Console.WriteLine($""tc: {Environment.TickCount}, tc64: {Environment.TickCount64}""); - - // // if this gets printed, then we didn't crash! - // Console.WriteLine(""Hello, World!""); - // return 42; - // } - // }"; - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void Bug49588_RegressionTest_AOT(ProjectInfo buildArgs, RunHost host, string id) - // => TestMain("bug49588_aot", s_bug49588_ProgramCS, buildArgs, host, id); - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void Bug49588_RegressionTest_NativeRelinking(ProjectInfo buildArgs, RunHost host, string id) - // => TestMain("bug49588_native_relinking", s_bug49588_ProgramCS, buildArgs, host, id, - // extraProperties: "true", - // dotnetWasmFromRuntimePack: false); - - // [Theory] - // [BuildAndRun] - // public void PropertiesFromRuntimeConfigJson(ProjectInfo buildArgs, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"runtime_config_{buildArgs.Configuration}_{buildArgs.AOT}" }; - // buildArgs = ExpandBuildArgs(buildArgs); - - // string programText = @" - // using System; - // using System.Runtime.CompilerServices; - - // var config = AppContext.GetData(""test_runtimeconfig_json""); - // Console.WriteLine ($""test_runtimeconfig_json: {(string)config}""); - // return 42; - // "; - - // string runtimeConfigTemplateJson = @" - // { - // ""configProperties"": { - // ""abc"": ""4"", - // ""test_runtimeconfig_json"": ""25"" - // } - // }"; - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - // File.WriteAllText(Path.Combine(_projectDir!, "runtimeconfig.template.json"), runtimeConfigTemplateJson); - // }, - // DotnetWasmFromRuntimePack: IsDotnetWasmFromRuntimePack(buildArgs))); - - // RunAndTestWasmApp(buildArgs, expectedExitCode: 42, - // test: output => Assert.Contains("test_runtimeconfig_json: 25", output), host: host, id: id); - // } - - // [Theory] - // [BuildAndRun] - // public void PropertiesFromCsproj(ProjectInfo buildArgs, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"runtime_config_csproj_{buildArgs.Configuration}_{buildArgs.AOT}" }; - // buildArgs = ExpandBuildArgs(buildArgs, extraProperties: "20"); - - // string programText = @" - // using System; - // using System.Runtime.CompilerServices; - - // var config = AppContext.GetData(""System.Threading.ThreadPool.MaxThreads""); - // Console.WriteLine ($""System.Threading.ThreadPool.MaxThreads: {(string)config}""); - // return 42; - // "; - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - // }, - // DotnetWasmFromRuntimePack: IsDotnetWasmFromRuntimePack(buildArgs))); - - // RunAndTestWasmApp(buildArgs, expectedExitCode: 42, - // test: output => Assert.Contains("System.Threading.ThreadPool.MaxThreads: 20", output), host: host, id: id); - // } + [Theory] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] + public void TopLevelMain(string config, bool aot) + => TestMain("top_level", + @"System.Console.WriteLine(""Hello, World!""); return await System.Threading.Tasks.Task.FromResult(42);", + config, aot); + + [Theory] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] + public void AsyncMain(string config, bool aot) + => TestMain("async_main", @" + using System; + using System.Threading.Tasks; + + public class TestClass { + public static async Task Main() + { + Console.WriteLine(""Hello, World!""); + return await Task.FromResult(42); + } + }", config, aot); + + [Theory] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] + public void NonAsyncMain(string config, bool aot) + => TestMain("non_async_main", @" + using System; + using System.Threading.Tasks; + + public class TestClass { + public static int Main() + { + Console.WriteLine(""Hello, World!""); + return 42; + } + }", config, aot); + + [Theory] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] + public void ExceptionFromMain(string config, bool aot) + => TestMain("main_exception", """ + using System; + using System.Threading.Tasks; + + public class TestClass { + public static int Main() => throw new Exception("MessageFromMyException"); + } + """, config, aot, expectedExitCode: 1, expectedOutput: "Error: MessageFromMyException"); + + private static string s_bug49588_ProgramCS = @" + using System; + public class TestClass { + public static int Main() + { + Console.WriteLine($""tc: {Environment.TickCount}, tc64: {Environment.TickCount64}""); + + // if this gets printed, then we didn't crash! + Console.WriteLine(""Hello, World!""); + return 42; + } + }"; + + [Theory] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] + public void Bug49588_RegressionTest_AOT(string config, bool aot) + => TestMain("bug49588_aot", s_bug49588_ProgramCS, config, aot); + + [Theory] + [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] + public void Bug49588_RegressionTest_NativeRelinking(string config, bool aot) + => TestMain("bug49588_native_relinking", s_bug49588_ProgramCS, config, aot, + extraArgs: "-p:WasmBuildNative=true", + isNativeBuild: true); + + [Theory] + [BuildAndRun] + // Issue: we cannot read from the config file + public void PropertiesFromRuntimeConfigJson(string config, bool aot) + => TestMain("runtime_config_json", + @" + using System; + using System.Runtime.CompilerServices; + + var config = AppContext.GetData(""test_runtimeconfig_json""); + Console.WriteLine ($""test_runtimeconfig_json: {(string)config}""); + return 42; + ", + config, + aot, + runtimeConfigContents: @" + }, + ""configProperties"": { + ""abc"": ""4"", + ""test_runtimeconfig_json"": ""25"" + } + }", + expectedOutput: "test_runtimeconfig_json: 25"); + + [Theory] + [BuildAndRun] + // Issue: we cannot read from the config file + public void PropertiesFromCsproj(string config, bool aot) + => TestMain("csproj_properties", + @" + using System; + using System.Runtime.CompilerServices; + + var config = AppContext.GetData(""System.Threading.ThreadPool.MaxThreads""); + Console.WriteLine ($""System.Threading.ThreadPool.MaxThreads: {(string)config}""); + return 42; + ", + config, + aot, + extraArgs: "-p:ThreadPoolMaxThreads=20", + expectedOutput: "System.Threading.ThreadPool.MaxThreads: 20"); } - public class WasmBuildAppBase : TestMainJsTestBase + public class WasmBuildAppBase : WasmTemplateTestsBase { public static IEnumerable MainMethodTestData(bool aot) - => ConfigWithAOTData(aot).UnwrapItemsAsArrays(); + => ConfigWithAOTData(aot) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .UnwrapItemsAsArrays(); public WasmBuildAppBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - // protected void TestMain(string projectName, - // string programText, - // ProjectInfo buildArgs, - // RunHost host, - // string id, - // string extraProperties = "", - // bool? dotnetWasmFromRuntimePack = null, - // int expectedExitCode = 42, - // string expectedOutput = "Hello, World!") - // { - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, extraProperties); - - // if (dotnetWasmFromRuntimePack == null) - // dotnetWasmFromRuntimePack = IsDotnetWasmFromRuntimePack(buildArgs); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText), - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - - // RunAndTestWasmApp(buildArgs, expectedExitCode: expectedExitCode, - // test: output => Assert.Contains(expectedOutput, output), host: host, id: id); - // } + protected async void TestMain(string projectName, + string programText, + string config, + bool aot, + bool isNativeBuild = false, + int expectedExitCode = 42, + string expectedOutput = "Hello, World!", + string runtimeConfigContents = "", + params string[] extraArgs) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "TestMain", "App"); + UpdateFile(Path.Combine("Common", "Program.cs"), programText); + if (!string.IsNullOrEmpty(runtimeConfigContents)) + { + UpdateFile("runtimeconfig.template.json", new Dictionary { { "}\n}", runtimeConfigContents } }); + } + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild), + IsPublish: isPublish + ), + extraArgs + ); + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "TestMain", + ExpectedExitCode: expectedExitCode) + ); + Assert.Contains(result.ConsoleOutput, m => m.Contains(expectedOutput)); + } } } diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js index bc9cc730a364e9..dee035b50bda2c 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js @@ -186,6 +186,7 @@ try { exit(0); break; case "OutErrOverrideWorks": + case "TestMain": dotnet.run(); break; case "DebugLevelTest": From bb96e7d8e5d9aad70c68f21a0cda85cc54401770 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:23:37 +0000 Subject: [PATCH 023/104] `WorkloadTests`, `WasmTemplateTestsBase`, `WasmSIMDTests`, `WasmRunOutOfAppBundleTests`, `WasmNativeDefaultsTests`, `WasmBuildAppTest`: done --- .../Blazor/WorkloadRequiredTests.cs | 2 +- .../BrowserStructures/RunOptions.cs | 1 + .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 8 +- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 2 +- .../Templates/WasmTemplateTests.cs | 2 +- .../Templates/WasmTemplateTestsBase.cs | 26 +- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 60 +++ .../wasm/Wasm.Build.Tests/WasmBuildAppTest.cs | 47 -- .../WasmNativeDefaultsTests.cs | 457 +++++++++--------- .../WasmRunOutOfAppBundleTests.cs | 80 +-- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 171 +++---- .../wasm/Wasm.Build.Tests/WorkloadTests.cs | 2 +- .../WasmBasicTestApp/App/wwwroot/main.js | 2 +- 13 files changed, 439 insertions(+), 421 deletions(-) create mode 100644 src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index 707ae999acf217..2fb93d2ae6a075 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -156,7 +156,7 @@ public static TheoryData SettingDifferentFromValuesInRunti // string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); // AddItemsPropertiesToProject(projectFile, extraProperties, - // atTheEnd: @" + // insertAtEnd: @" // // "); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index 2d4e3a964ecd04..41fc3d9f7dbc2b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -26,6 +26,7 @@ public record RunOptions string BrowserPath = "", string Locale = "en-US", int? ExpectedExitCode = 0, + string CustomBundleDir = "", Func? ExecuteAfterLoaded = null ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index a3ca27c87ce203..ff49575933341d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -527,11 +527,11 @@ void LogData(string label, string? message) } } - public static string AddItemsPropertiesToProject(string projectFile, string? extraProperties = null, string? extraItems = null, string? atTheEnd = null) + public static string AddItemsPropertiesToProject(string projectFile, string? extraProperties = null, string? extraItems = null, string? insertAtEnd = null) { if (!File.Exists(projectFile)) throw new Exception($"{projectFile} does not exist"); - if (extraProperties == null && extraItems == null && atTheEnd == null) + if (extraProperties == null && extraItems == null && insertAtEnd == null) return projectFile; XmlDocument doc = new(); @@ -552,10 +552,10 @@ public static string AddItemsPropertiesToProject(string projectFile, string? ext root.AppendChild(node); } - if (atTheEnd != null) + if (insertAtEnd != null) { XmlNode node = doc.CreateNode(XmlNodeType.DocumentFragment, "foo", null); - node.InnerXml = atTheEnd; + node.InnerXml = insertAtEnd; root.InsertAfter(node, root.LastChild); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index e435fa2f5f0663..a3189542210fd0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -97,7 +97,7 @@ public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(string config, bool aot config, aot, "bc_to_o", - atTheEnd: printFileTypeTarget); + insertAtEnd: printFileTypeTarget); bool isPublish = true; (string _, string output) = BuildTemplateProject(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index d5aad6f6f29444..43f3b7f403f206 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -48,7 +48,7 @@ public WasmTemplateTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur // var buildArgs = new ProjectInfo(projectName, config, false, id, null); // AddItemsPropertiesToProject(projectFile, - // atTheEnd: + // insertAtEnd: // """ // // diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 230f0b9fcdb758..6ace7ec5092fb3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -56,7 +56,7 @@ public ProjectInfo CreateWasmTemplateProject( bool addFrameworkArg = false, string extraProperties = "", string extraItems = "", - string atTheEnd = "") + string insertAtEnd = "") { string projectName = InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); @@ -79,21 +79,31 @@ public ProjectInfo CreateWasmTemplateProject( if (runAnalyzers) extraProperties += "true"; - AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, atTheEnd); + AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); return new ProjectInfo(config, aot, projectName, projectFilePath); } - protected ProjectInfo CopyTestAsset(string config, bool aot, string assetDirName, string idPrefix, string projectDirReativeToAssetDir = "", bool appendUnicodeToPath = true) + protected ProjectInfo CopyTestAsset( + string config, + bool aot, + string assetDirName, + string idPrefix, + string projectDirReativeToAssetDir = "", + bool appendUnicodeToPath = true, + string extraProperties = "", + string extraItems = "", + string insertAtEnd = "") { - string projectName = InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); + InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, assetDirName), Path.Combine(_projectDir!)); if (!string.IsNullOrEmpty(projectDirReativeToAssetDir)) { _projectDir = Path.Combine(_projectDir!, projectDirReativeToAssetDir); } - string projectFilePath = Path.Combine(_projectDir!, $"{projectName}.csproj"); - return new ProjectInfo(config, aot, projectName, projectFilePath); + string projectFilePath = Path.Combine(_projectDir!, $"{assetDirName}.csproj"); + AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); + return new ProjectInfo(config, aot, assetDirName, projectFilePath); } @@ -219,7 +229,9 @@ await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDi RunHost.WebServer => await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", - Path.GetFullPath(Path.Combine(GetBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")), + string.IsNullOrEmpty(runOptions.CustomBundleDir) ? + Path.GetFullPath(Path.Combine(GetBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")) : + runOptions.CustomBundleDir, runOptions), _ => throw new NotImplementedException(runOptions.Host.ToString()) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs new file mode 100644 index 00000000000000..d7ffedddabc9a9 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.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.Collections.Generic; +using System.IO; +using System.Linq; +using Xunit; +using Xunit.Abstractions; + +#nullable enable + +namespace Wasm.Build.Tests +{ + public class WasmBuildAppBase : WasmTemplateTestsBase + { + public static IEnumerable MainMethodTestData(bool aot) + => ConfigWithAOTData(aot) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .UnwrapItemsAsArrays(); + + public WasmBuildAppBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) + { + } + + protected async void TestMain(string projectName, + string programText, + string config, + bool aot, + bool isNativeBuild = false, + int expectedExitCode = 42, + string expectedOutput = "Hello, World!", + string runtimeConfigContents = "", + params string[] extraArgs) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "DotnetRun", "App"); + UpdateFile(Path.Combine("Common", "Program.cs"), programText); + if (!string.IsNullOrEmpty(runtimeConfigContents)) + { + UpdateFile("runtimeconfig.template.json", new Dictionary { { "}\n}", runtimeConfigContents } }); + } + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild), + IsPublish: isPublish + ), + extraArgs + ); + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: expectedExitCode) + ); + Assert.Contains(result.ConsoleOutput, m => m.Contains(expectedOutput)); + } + } +} diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs index 32831dc9a29b17..77685155f2b466 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs @@ -136,51 +136,4 @@ public void PropertiesFromCsproj(string config, bool aot) extraArgs: "-p:ThreadPoolMaxThreads=20", expectedOutput: "System.Threading.ThreadPool.MaxThreads: 20"); } - - public class WasmBuildAppBase : WasmTemplateTestsBase - { - public static IEnumerable MainMethodTestData(bool aot) - => ConfigWithAOTData(aot) - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) - .UnwrapItemsAsArrays(); - - public WasmBuildAppBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) - { - } - - protected async void TestMain(string projectName, - string programText, - string config, - bool aot, - bool isNativeBuild = false, - int expectedExitCode = 42, - string expectedOutput = "Hello, World!", - string runtimeConfigContents = "", - params string[] extraArgs) - { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "TestMain", "App"); - UpdateFile(Path.Combine("Common", "Program.cs"), programText); - if (!string.IsNullOrEmpty(runtimeConfigContents)) - { - UpdateFile("runtimeconfig.template.json", new Dictionary { { "}\n}", runtimeConfigContents } }); - } - bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild), - IsPublish: isPublish - ), - extraArgs - ); - RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, - TestScenario: "TestMain", - ExpectedExitCode: expectedExitCode) - ); - Assert.Contains(result.ConsoleOutput, m => m.Contains(expectedOutput)); - } - } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 9b3d2a1fa94733..1926c1d2a22b86 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -11,7 +11,7 @@ namespace Wasm.Build.Tests { - public class WasmNativeDefaultsTests : TestMainJsTestBase + public class WasmNativeDefaultsTests : WasmTemplateTestsBase { private static Regex s_regex = new("\\*\\* WasmBuildNative:.*"); public WasmNativeDefaultsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) @@ -19,231 +19,234 @@ public WasmNativeDefaultsTests(ITestOutputHelper output, SharedBuildPerTestClass { } -// public static TheoryData SettingDifferentFromValuesInRuntimePack(bool forPublish) -// { -// List<(string propertyName, bool defaultValueInRuntimePack)> defaults = new() -// { -// ("WasmEnableSIMD", true), -// ("WasmEnableExceptionHandling", true), -// ("InvariantTimezone", false), -// ("InvariantGlobalization", false), -// // ("WasmNativeStrip", true) -- tested separately because it has special handling in targets -// }; - -// TheoryData data = new(); - -// string[] configs = new[] { "Debug", "Release" }; -// foreach (var defaultPair in defaults) -// { -// foreach (string config in configs) -// { -// // Configuration=Release always causes relinking when publishing -// bool publishValue = forPublish && config == "Release" ? true : false; -// // Setting the default value from the runtime pack shouldn't trigger relinking -// data.Add(config, $"<{defaultPair.propertyName}>{defaultPair.defaultValueInRuntimePack.ToString().ToLower()}", -// /*aot*/ false, /*build*/ false, /*publish*/ publishValue); -// // Leaving the property unset, so checking the default -// data.Add(config, "", /*aot*/ false, /*build*/ false, /*publish*/ publishValue); - -// // Setting the !default value should trigger relinking -// data.Add(config, $"<{defaultPair.propertyName}>{(!defaultPair.defaultValueInRuntimePack).ToString().ToLower()}", -// /*aot*/ false, /*build*/ true, /*publish*/ true); -// } -// } - -// return data; -// } - -// public static TheoryData DefaultsTestData(bool forPublish) -// { -// TheoryData data = new() -// { -// /* relink by default for publish+Release */ -// { "Release", "", /*aot*/ false, /*build*/ false, /*publish*/ true }, -// /* NO relink by default for publish+Release, when not trimming */ -// { "Release", "false", /*aot*/ false, /*build*/ false, /*publish*/ false }, - -// /* When not trimming, and no-aot, we don't relink. But WasmNativeStrip=false should still trigger it*/ -// // { "Release", "falsefalse", -// // /*aot*/ false, /*build*/ true, /*publish*/ true } -// }; - -// if (!forPublish) -// { -// /* Debug config, when building does trigger relinking */ -// data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ true); -// } - -// if (forPublish) -// { -// /* NO relink by default for publish+Debug */ -// data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ false); - -// /* AOT */ -// data.Add("Release", "", /*aot*/ true, /*build*/ false, /*publish*/ true); -// data.Add("Debug", "", /*aot*/ true, /*build*/ false, /*publish*/ true); - -// // FIXME: separate test -// // { "Release", "true", -// // /*aot*/ true, /*build*/ true, /*publish*/ true }, - -// /* AOT not affected by trimming */ -// data.Add("Release", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); -// data.Add("Debug", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); -// } - -// return data; -// } - -// #pragma warning disable xUnit1026 // For unused *buildValue*, and *publishValue* parameters -// [Theory] -// [MemberData(nameof(DefaultsTestData), parameters: false)] -// [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: false)] -// public void DefaultsWithBuild(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) -// { -// (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_build", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForBuild, publish: false); - -// InferAndCheckPropertyValues(line, isPublish: false, wasmBuildNative: expectWasmBuildNativeForBuild, config: config); -// } - -// [Theory] -// [MemberData(nameof(DefaultsTestData), parameters: true)] -// [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: true)] -// public void DefaultsWithPublish(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) -// { -// (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForPublish, publish: true); - -// InferAndCheckPropertyValues(line, isPublish: true, wasmBuildNative: expectWasmBuildNativeForPublish, config: config); -// } -// #pragma warning restore xunit1026 - -// public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() -// { -// {"Debug", "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, -// {"Release", "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, -// {"Debug", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false }, -// {"Release", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } -// }; - -// public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() -// { -// { "Debug", "falsetrue", true, false }, -// { "Release", "falsetrue", true, false }, -// { "Debug", "truetrue", true, true }, -// { "Release", "truetrue", true, true } -// }; - -// [Theory] -// [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ false)] -// [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] -// public void WasmNativeStripDefaultWithBuild(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) -// { -// (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, dotnetWasmFromRuntimePack: !expectedWasmBuildNativeValue, publish: false); - -// CheckPropertyValues(line, -// wasmBuildNative: expectedWasmBuildNativeValue, -// wasmNativeStrip: expectedWasmNativeStripValue, -// wasmNativeDebugSymbols: true, -// wasmBuildingForNestedPublish: null); -// } - -// [Theory] -// [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ true)] -// [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] -// public void WasmNativeStripDefaultWithPublish(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) -// { -// (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, dotnetWasmFromRuntimePack: !expectedWasmBuildNativeValue, publish: true); - -// CheckPropertyValues(line, -// wasmBuildNative: expectedWasmBuildNativeValue, -// wasmNativeStrip: expectedWasmNativeStripValue, -// wasmNativeDebugSymbols: true, -// wasmBuildingForNestedPublish: true); -// } - -// [Theory] -// /* always relink */ -// [InlineData("Debug", "", /*publish*/ false)] -// [InlineData("Debug", "", /*publish*/ true)] -// [InlineData("Release", "", /*publish*/ false)] -// [InlineData("Release", "", /*publish*/ true)] -// [InlineData("Release", "false", /*publish*/ true)] -// public void WithNativeReference(string config, string extraProperties, bool publish) -// { -// string nativeLibPath = Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"); -// string nativeRefItem = @$""; -// (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", -// config, -// extraProperties, -// aot: false, -// dotnetWasmFromRuntimePack: !publish, -// publish: publish, -// extraItems: nativeRefItem); - -// InferAndCheckPropertyValues(line, isPublish: publish, wasmBuildNative: true, config: config); -// } - -// private (string, string?) CheckWasmNativeDefaultValue(string projectName, -// string config, -// string extraProperties, -// bool aot, -// bool dotnetWasmFromRuntimePack, -// bool publish, -// string extraItems = "") -// { -// // builds with -O0 -// extraProperties += "<_WasmDevel>true"; - -// string printValueTarget = @" -// -// -// " + (publish -// ? @"" -// : @"") -// + ""; - -// ProjectInfo buildArgs = new(ProjectName: projectName, Configuration: config, AOT: aot, string.Empty, null); -// buildArgs = ExpandBuildArgs(buildArgs, -// extraProperties: extraProperties, -// extraItems: extraItems, -// insertAtEnd: printValueTarget); - -// (_, string output) = BuildProject(buildArgs, -// id: GetRandomId(), -// new BuildProjectOptions( -// InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), -// DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, -// ExpectSuccess: false, -// UseCache: false, -// BuildOnlyAfterPublish: false, -// Publish: publish)); - -// Assert.Contains("Stopping the build", output); - -// Match m = s_regex.Match(output); -// Assert.Equal(1, m.Groups.Count); -// return (output, m.Success ? m.Groups[0]?.ToString() : null); -// } - -// private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasmBuildNative, string config) -// { -// bool expectedWasmNativeStripValue; -// if (!isPublish && wasmBuildNative && config == "Debug") -// expectedWasmNativeStripValue = false; -// else -// expectedWasmNativeStripValue = true; - -// CheckPropertyValues(line, wasmBuildNative, expectedWasmNativeStripValue, /*wasmNativeDebugSymbols*/true, isPublish); -// } - -// private void CheckPropertyValues(string? line, bool wasmBuildNative, bool wasmNativeStrip, bool wasmNativeDebugSymbols, bool? wasmBuildingForNestedPublish) -// { -// Assert.NotNull(line); -// Assert.Contains($"** WasmBuildNative: '{wasmBuildNative.ToString().ToLower()}', " + -// $"WasmNativeStrip: '{wasmNativeStrip.ToString().ToLower()}', " + -// $"WasmNativeDebugSymbols: '{wasmNativeDebugSymbols.ToString().ToLower()}', " + -// $"WasmBuildingForNestedPublish: '{(wasmBuildingForNestedPublish.HasValue && wasmBuildingForNestedPublish == true ? "true" : "")}'", -// line); -// } + public static TheoryData SettingDifferentFromValuesInRuntimePack(bool forPublish) + { + List<(string propertyName, bool defaultValueInRuntimePack)> defaults = new() + { + ("WasmEnableSIMD", true), + ("WasmEnableExceptionHandling", true), + ("InvariantTimezone", false), + ("InvariantGlobalization", false), + // ("WasmNativeStrip", true) -- tested separately because it has special handling in targets + }; + + TheoryData data = new(); + + string[] configs = new[] { "Debug", "Release" }; + foreach (var defaultPair in defaults) + { + foreach (string config in configs) + { + // Configuration=Release always causes relinking when publishing + bool publishValue = forPublish && config == "Release" ? true : false; + // Setting the default value from the runtime pack shouldn't trigger relinking + data.Add(config, $"<{defaultPair.propertyName}>{defaultPair.defaultValueInRuntimePack.ToString().ToLower()}", + /*aot*/ false, /*build*/ false, /*publish*/ publishValue); + // Leaving the property unset, so checking the default + data.Add(config, "", /*aot*/ false, /*build*/ false, /*publish*/ publishValue); + + // Setting the !default value should trigger relinking + data.Add(config, $"<{defaultPair.propertyName}>{(!defaultPair.defaultValueInRuntimePack).ToString().ToLower()}", + /*aot*/ false, /*build*/ true, /*publish*/ true); + } + } + + return data; + } + + public static TheoryData DefaultsTestData(bool forPublish) + { + TheoryData data = new() + { + /* relink by default for publish+Release */ + { "Release", "", /*aot*/ false, /*build*/ false, /*publish*/ true }, + /* NO relink by default for publish+Release, when not trimming */ + { "Release", "false", /*aot*/ false, /*build*/ false, /*publish*/ false }, + + /* When not trimming, and no-aot, we don't relink. But WasmNativeStrip=false should still trigger it*/ + // { "Release", "falsefalse", + // /*aot*/ false, /*build*/ true, /*publish*/ true } + }; + + if (!forPublish) + { + /* Debug config, when building does trigger relinking */ + data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ true); + } + + if (forPublish) + { + /* NO relink by default for publish+Debug */ + data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ false); + + /* AOT */ + data.Add("Release", "", /*aot*/ true, /*build*/ false, /*publish*/ true); + data.Add("Debug", "", /*aot*/ true, /*build*/ false, /*publish*/ true); + + // FIXME: separate test + // { "Release", "true", + // /*aot*/ true, /*build*/ true, /*publish*/ true }, + + /* AOT not affected by trimming */ + data.Add("Release", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); + data.Add("Debug", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); + } + + return data; + } + +#pragma warning disable xUnit1026 // For unused *buildValue*, and *publishValue* parameters + [Theory] + [MemberData(nameof(DefaultsTestData), parameters: false)] + [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: false)] + public void DefaultsWithBuild(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) + { + (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_build", config, extraProperties, aot, expectWasmBuildNativeForBuild, isPublish: false); + + InferAndCheckPropertyValues(line, isPublish: false, wasmBuildNative: expectWasmBuildNativeForBuild, config: config); + } + + [Theory] + [MemberData(nameof(DefaultsTestData), parameters: true)] + [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: true)] + public void DefaultsWithPublish(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) + { + (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForPublish, publish: true); + + InferAndCheckPropertyValues(line, isPublish: true, wasmBuildNative: expectWasmBuildNativeForPublish, config: config); + } +#pragma warning restore xunit1026 + + public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() + { + {"Debug", "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, + {"Release", "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, + {"Debug", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false }, + {"Release", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } + }; + + public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() + { + { "Debug", "falsetrue", true, false }, + { "Release", "falsetrue", true, false }, + { "Debug", "truetrue", true, true }, + { "Release", "truetrue", true, true } + }; + + [Theory] + [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ false)] + [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] + public void WasmNativeStripDefaultWithBuild(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) + { + (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, expectedWasmBuildNativeValue, isPublish: false); + + CheckPropertyValues(line, + wasmBuildNative: expectedWasmBuildNativeValue, + wasmNativeStrip: expectedWasmNativeStripValue, + wasmNativeDebugSymbols: true, + wasmBuildingForNestedPublish: null); + } + + [Theory] + [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ true)] + [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] + public void WasmNativeStripDefaultWithPublish(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) + { + (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, expectedWasmBuildNativeValue, isPublish: true); + + CheckPropertyValues(line, + wasmBuildNative: expectedWasmBuildNativeValue, + wasmNativeStrip: expectedWasmNativeStripValue, + wasmNativeDebugSymbols: true, + wasmBuildingForNestedPublish: true); + } + + [Theory] + /* always relink */ + [InlineData("Debug", "", /*publish*/ false)] + [InlineData("Debug", "", /*publish*/ true)] + [InlineData("Release", "", /*publish*/ false)] + [InlineData("Release", "", /*publish*/ true)] + [InlineData("Release", "false", /*publish*/ true)] + public void WithNativeReference(string config, string extraProperties, bool publish) + { + string nativeLibPath = Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"); + string nativeRefItem = @$""; + (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", + config, + extraProperties, + aot: false, + dotnetWasmFromRuntimePack: !publish, + publish: publish, + extraItems: nativeRefItem); + + InferAndCheckPropertyValues(line, isPublish: publish, wasmBuildNative: true, config: config); + } + + private (string, string?) CheckWasmNativeDefaultValue(string projectPrefix, + string config, + string extraProperties, + bool aot, + bool nativeBuild, + bool isPublish, + string extraItems = "") + { + // builds with -O0 + extraProperties += "<_WasmDevel>true"; + + string printValueTarget = @" + + + " + (isPublish + ? @"" + : @"") + + ""; + ProjectInfo info = CopyTestAsset( + config, + aot, + "WasmBasicTestApp", + projectPrefix, + "App", + extraProperties: extraProperties, + extraItems: extraItems, + insertAtEnd: printValueTarget); + UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); + + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, nativeBuild), + IsPublish: isPublish, + ExpectSuccess: false + )); + Assert.Contains("Stopping the build", output); + + Match m = s_regex.Match(output); + Assert.Equal(1, m.Groups.Count); + return (output, m.Success ? m.Groups[0]?.ToString() : null); + } + + private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasmBuildNative, string config) + { + bool expectedWasmNativeStripValue; + if (!isPublish && wasmBuildNative && config == "Debug") + expectedWasmNativeStripValue = false; + else + expectedWasmNativeStripValue = true; + + CheckPropertyValues(line, wasmBuildNative, expectedWasmNativeStripValue, /*wasmNativeDebugSymbols*/true, isPublish); + } + + private void CheckPropertyValues(string? line, bool wasmBuildNative, bool wasmNativeStrip, bool wasmNativeDebugSymbols, bool? wasmBuildingForNestedPublish) + { + Assert.NotNull(line); + Assert.Contains($"** WasmBuildNative: '{wasmBuildNative.ToString().ToLower()}', " + + $"WasmNativeStrip: '{wasmNativeStrip.ToString().ToLower()}', " + + $"WasmNativeDebugSymbols: '{wasmNativeDebugSymbols.ToString().ToLower()}', " + + $"WasmBuildingForNestedPublish: '{(wasmBuildingForNestedPublish.HasValue && wasmBuildingForNestedPublish == true ? "true" : "")}'", + line); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 1b5dfc165186f6..5ab0da13581783 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -9,48 +9,48 @@ namespace Wasm.Build.Tests; -public class WasmRunOutOfAppBundleTests : TestMainJsTestBase +public class WasmRunOutOfAppBundleTests : WasmTemplateTestsBase { public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) {} - // [Theory] - // [BuildAndRun] - // public void RunOutOfAppBundle(ProjectInfo buildArgs, RunHost host, string id) - // { - // buildArgs = buildArgs with { ProjectName = $"outofappbundle_{buildArgs.Configuration}_{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.Configuration == "Release"))); - - // string binDir = GetBinDir(baseDir: _projectDir!, config: buildArgs.Configuration); - // string appBundleDir = Path.Combine(binDir, "AppBundle"); - // string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); - - // if (host is RunHost.Chrome) - // { - // 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); - // } - // } - - // RunAndTestWasmApp(buildArgs, - // expectedExitCode: 42, - // host: host, - // id: id, - // bundleDir: outerDir, - // jsRelativePath: "./AppBundle/test-main.js"); - // } + [Theory] + [BuildAndRun] + public async void RunOutOfAppBundle(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "outofappbundle", "App"); + UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); + bool isPublish = true; + string binFrameworkDir = GetBinFrameworkDir(info.Configuration, isPublish); + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: binFrameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + + string appBundleDir = Path.Combine(binFrameworkDir, ".."); + string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); + 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"); + string relativeMainJsPath = "./wwwroot/main.js"; + if (!File.Exists(indexHtmlPath)) + { + var html = $@""; + File.WriteAllText(indexHtmlPath, html); + } + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + CustomBundleDir: outerDir, + ExpectedExitCode: 42) + ); + } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 9f528d235ab3c0..ece7ba161cd352 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using System.Linq; using Xunit; using Xunit.Abstractions; @@ -10,105 +11,93 @@ namespace Wasm.Build.Tests { - public class WasmSIMDTests : WasmBuildAppBase + public class WasmSIMDTests : WasmTemplateTestsBase { public WasmSIMDTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - // public static IEnumerable MainMethodSimdTestData(bool aot, bool simd) - // => ConfigWithAOTData(aot, extraArgs: $"-p:WasmEnableSIMD={simd}").UnwrapItemsAsArrays(); + public static IEnumerable MainMethodSimdTestData(bool aot, bool simd) + => ConfigWithAOTData(aot) + .Multiply(new object[] { simd }) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .UnwrapItemsAsArrays(); - // [Theory] - // [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, RunHost.All, true /* simd */ })] - // public void Build_NoAOT_ShouldNotRelink(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"build_with_workload_no_aot"; - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs); - - // (_, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), - // Publish: false, - // DotnetWasmFromRuntimePack: true)); - - // // Confirm that we didn't relink - // Assert.DoesNotContain("Compiling native assets with emcc", output); - - // RunAndTestWasmApp(buildArgs, - // expectedExitCode: 42, - // test: output => - // { - // Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); - // Assert.Contains("Hello, World!", output); - // }, host: host, id: id); - // } - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false, RunHost.All })] - // public void PublishWithSIMD_AOT(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"simd_with_workload_aot"; - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, "true"); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), - // DotnetWasmFromRuntimePack: false)); - - // RunAndTestWasmApp(buildArgs, - // expectedExitCode: 42, - // test: output => - // { - // Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); - // Assert.Contains("Hello, World!", output); - // }, host: host, id: id); - // } - - // [Theory] - // [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true, RunHost.All })] - // public void PublishWithoutSIMD_AOT(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"nosimd_with_workload_aot"; - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, "false"); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_simdProgramText), - // DotnetWasmFromRuntimePack: false)); - - // RunAndTestWasmApp(buildArgs, - // expectedExitCode: 42, - // test: output => - // { - // Assert.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>", output); - // Assert.Contains("Hello, World!", output); - // }, host: host, id: id); - // } - - // private static string s_simdProgramText = @" - // using System; - // using System.Runtime.Intrinsics; + [Theory] + [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, /* simd */ true })] + public async void Build_NoAOT_ShouldNotRelink(string config, bool aot, bool simd) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_with_workload_no_aot", "App"); + UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); + bool isPublish = false; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + ), + extraArgs: $"-p:WasmEnableSIMD={simd}" + ); + // Confirm that we didn't relink + Assert.DoesNotContain("Compiling native assets with emcc", output); + + RunResult result = await RunForBuildWithDotnetRun(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42) + ); + + Assert.Contains(result.TestOutput, m => m.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>")); + Assert.Contains(result.TestOutput, m => m.Contains("Hello, World!")); + } - // public class TestClass { - // public static int Main() - // { - // var v1 = Vector128.Create(0x12345678); - // var v2 = Vector128.Create(0x23456789); - // var v3 = v1*v2; - // Console.WriteLine(v3); - // Console.WriteLine(""Hello, World!""); + [Theory] + [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ true, /* simd */ true })] + [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, /* simd */ true })] + [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ true, /* simd */ false })] + public async void PublishSIMD_AOT(string config, bool aot, bool simd) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "simd_publish", "App"); + UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); + bool isPublish = true; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + ), + extraArgs: $"-p:WasmEnableSIMD={simd}" + ); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42) + ); + Assert.Contains(result.TestOutput, m => m.Contains("<-2094756296, -2094756296, -2094756296, -2094756296>")); + Assert.Contains(result.TestOutput, m => m.Contains("Hello, World!")); + } - // return 42; - // } - // }"; + private static string s_simdProgramText = @" + using System; + using System.Runtime.Intrinsics; + + public class TestClass { + public static int Main() + { + var v1 = Vector128.Create(0x12345678); + var v2 = Vector128.Create(0x23456789); + var v3 = v1*v2; + Console.WriteLine($""TestOutput -> {v3}""); + Console.WriteLine(""TestOutput -> Hello, World!""); + + return 42; + } + }"; } } diff --git a/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs b/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs index 009da0c7bb1aee..0889d53091c02a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WorkloadTests.cs @@ -16,7 +16,7 @@ namespace Wasm.Build.Tests { - public class WorkloadTests : TestMainJsTestBase + public class WorkloadTests : WasmTemplateTestsBase { public WorkloadTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js index dee035b50bda2c..556cd91f5bf3c3 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js @@ -186,7 +186,7 @@ try { exit(0); break; case "OutErrOverrideWorks": - case "TestMain": + case "DotnetRun": dotnet.run(); break; case "DebugLevelTest": From 902f6d0e08ba3b839c4f350f91fc80cf5667cec2 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 1 Nov 2024 12:56:30 +0100 Subject: [PATCH 024/104] Correct typo in assets path + shorten. --- .../Wasm.Build.Tests/HybridGlobalizationTests.cs | 2 +- .../InvariantGlobalizationTests.cs | 9 +++++---- .../Wasm.Build.Tests/InvariantTimezoneTests.cs | 2 +- .../wasm/Wasm.Build.Tests/MainWithArgsTests.cs | 2 +- .../wasm/Wasm.Build.Tests/NativeLibraryTests.cs | 16 ++++++++-------- .../ReferenceNewAssemblyRebuildTest.cs | 2 +- .../PInvokeTableGeneratorTests.cs | 2 +- .../AsyncMainWithArgs.cs | 0 .../HybridGlobalization.cs | 0 .../InvariantGlobalization.cs | 0 .../InvariantTimezone.cs | 0 .../NativeCrypto.cs | 0 .../NativeRebuildNewAssembly.cs | 0 .../SimpleSourceChange.cs | 0 .../SkiaSharp.cs | 0 .../SyncMainWithArgs.cs | 0 .../UnmanagedCallback.cs | 0 17 files changed, 18 insertions(+), 17 deletions(-) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/AsyncMainWithArgs.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/HybridGlobalization.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/InvariantGlobalization.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/InvariantTimezone.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/NativeCrypto.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/NativeRebuildNewAssembly.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/SimpleSourceChange.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/SkiaSharp.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/SyncMainWithArgs.cs (100%) rename src/mono/wasm/testassets/{Wasm.Buid.Tests.Programs => EntryPoints}/UnmanagedCallback.cs (100%) diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 067912c7d22570..03b7f9fef2e909 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -45,7 +45,7 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is extraProperties += "true"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "hybrid", extraProperties: extraProperties); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "HybridGlobalization.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "HybridGlobalization.cs")); UpdateBrowserMainJs(); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index ad77a17ec6a0f3..37aa53d734b59a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -24,6 +25,7 @@ public InvariantGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestC new object?[] { null }, new object?[] { false }, new object?[] { true }) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); // TODO: check that icu bits have been linked out @@ -46,9 +48,8 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv extraProperties = $"{extraProperties}{invariantGlobalization}"; string prefix = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantGlobalization.cs")); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantGlobalization.cs")); bool isPublish = true; // invariantGlobalization triggers native build @@ -63,7 +64,7 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded )); - RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42)); if (invariantGlobalization == true) { Assert.Contains(output.TestOutput, m => m.Contains("Could not create es-ES culture")); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 7f95174f0e83de..c6fe70f913081f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -45,7 +45,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "InvariantTimezone.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); UpdateBrowserMainJs(); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 867e2e1bc161aa..c7e3f5b1628e55 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -47,7 +47,7 @@ async Task TestMainWithArgs(string config, string[] args) { ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, projectNamePrefix); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", projectContentsName)); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", projectContentsName)); UpdateBrowserMainJs(); string mainJsPath = Path.Combine(_projectDir!, "wwwroot", "main.js"); UpdateFile( diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 2bc6df107c8b8e..993324842dd7cf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -29,8 +29,8 @@ public async Task ProjectWithNativeReference(string config, bool aot) aot, "AppUsingNativeLib-a", extraProperties: "true", - extraItems: ""); - + extraItems: ""); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); UpdateBrowserMainJs(); @@ -62,7 +62,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) "; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraItems: extraItems); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SkiaSharp.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); UpdateBrowserMainJs(); bool isPublish = true; @@ -74,7 +74,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), IsPublish: isPublish )); - + RunOptions runOptions = new(info.Configuration, ExtraArgs: "mono.png"); RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("Size: 26462 Height: 599, Width: 499")); @@ -86,8 +86,8 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) { ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "AppUsingBrowserNativeCrypto"); - - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeCrypto.cs")); + + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); UpdateBrowserMainJs(); bool isPublish = true; @@ -119,8 +119,8 @@ public async Task ProjectWithNativeLibrary(string config, bool aot) config, aot, "AppUsingNativeLib-a", - extraItems: "\n"); - + extraItems: "\n"); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); UpdateBrowserMainJs(); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index fdd6400aea3e7a..7d5c9720f76a5d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -39,7 +39,7 @@ public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelin var originalStat = StatFiles(pathsDict); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "NativeRebuildNewAssembly.cs")); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Build.Tests.Programs", "NativeRebuildNewAssembly.cs")); Rebuild(info, nativeRelink, invariant); var newStat = StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 29b31b3a37f551..430a214366f3c7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -957,7 +957,7 @@ public PInvokeTableGeneratorTests(ITestOutputHelper output, SharedBuildPerTestCl // new BuildProjectOptions( // InitProject: () => // { - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "UnmanagedCallback.cs"), Path.Combine(_projectDir!, "Program.cs")); + // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "UnmanagedCallback.cs"), Path.Combine(_projectDir!, "Program.cs")); // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "local.c"), Path.Combine(_projectDir!, "local.c")); // }, // Publish: true, diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs b/src/mono/wasm/testassets/EntryPoints/AsyncMainWithArgs.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/AsyncMainWithArgs.cs rename to src/mono/wasm/testassets/EntryPoints/AsyncMainWithArgs.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/HybridGlobalization.cs b/src/mono/wasm/testassets/EntryPoints/HybridGlobalization.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/HybridGlobalization.cs rename to src/mono/wasm/testassets/EntryPoints/HybridGlobalization.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs b/src/mono/wasm/testassets/EntryPoints/InvariantGlobalization.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantGlobalization.cs rename to src/mono/wasm/testassets/EntryPoints/InvariantGlobalization.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantTimezone.cs b/src/mono/wasm/testassets/EntryPoints/InvariantTimezone.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/InvariantTimezone.cs rename to src/mono/wasm/testassets/EntryPoints/InvariantTimezone.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeCrypto.cs b/src/mono/wasm/testassets/EntryPoints/NativeCrypto.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeCrypto.cs rename to src/mono/wasm/testassets/EntryPoints/NativeCrypto.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeRebuildNewAssembly.cs b/src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/NativeRebuildNewAssembly.cs rename to src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SimpleSourceChange.cs b/src/mono/wasm/testassets/EntryPoints/SimpleSourceChange.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SimpleSourceChange.cs rename to src/mono/wasm/testassets/EntryPoints/SimpleSourceChange.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SkiaSharp.cs b/src/mono/wasm/testassets/EntryPoints/SkiaSharp.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SkiaSharp.cs rename to src/mono/wasm/testassets/EntryPoints/SkiaSharp.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs b/src/mono/wasm/testassets/EntryPoints/SyncMainWithArgs.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/SyncMainWithArgs.cs rename to src/mono/wasm/testassets/EntryPoints/SyncMainWithArgs.cs diff --git a/src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/UnmanagedCallback.cs b/src/mono/wasm/testassets/EntryPoints/UnmanagedCallback.cs similarity index 100% rename from src/mono/wasm/testassets/Wasm.Buid.Tests.Programs/UnmanagedCallback.cs rename to src/mono/wasm/testassets/EntryPoints/UnmanagedCallback.cs From c1dbde67419034a961f3fd80fba23d1687a241dd Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:02:54 +0000 Subject: [PATCH 025/104] Fix binlog location. --- src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index ff49575933341d..b4e822845afb29 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -140,8 +140,8 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, params string[] extraArgs) { string buildType = buildOptions.IsPublish ? "publish" : "build"; - string logFileSuffix = buildOptions.Label == null ? string.Empty : buildOptions.Label.Replace(' ', '_') + "-"; - string logFilePath = Path.Combine(s_buildEnv.LogRootPath, buildOptions.Id, $"{buildOptions.Id}-{logFileSuffix}{buildType}.binlog"); + string logFileSuffix = string.IsNullOrEmpty(buildOptions.Label) ? string.Empty : buildOptions.Label.Replace(' ', '_') + "-"; + string logFilePath = Path.Combine(_logPath, $"{buildOptions.Id}-{logFileSuffix}{buildType}.binlog"); _testOutput.WriteLine($"{Environment.NewLine}** -------- {buildType} -------- **{Environment.NewLine}"); _testOutput.WriteLine($"Binlog path: {logFilePath}"); From e05d2aadf61d240e76faf6e7643f4d1a0c389b0f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 1 Nov 2024 13:33:19 +0000 Subject: [PATCH 026/104] Fix `WasmNativeDefaultsTests` --- .../Templates/WasmTemplateTestsBase.cs | 29 ++++++++++--------- .../WasmNativeDefaultsTests.cs | 12 ++++---- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 6ace7ec5092fb3..03281f8146d27d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -69,18 +69,7 @@ public ProjectInfo CreateWasmTemplateProject( .EnsureSuccessful(); string projectFilePath = Path.Combine(_projectDir!, $"{projectName}.csproj"); - - if (aot) - { - extraProperties += $"\ntrue"; - extraProperties += $"\n{s_isWindows}"; - } - extraProperties += "true"; - if (runAnalyzers) - extraProperties += "true"; - - AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); - + UpdateProjectFile(projectFilePath, aot, runAnalyzers, extraProperties, extraItems, insertAtEnd); return new ProjectInfo(config, aot, projectName, projectFilePath); } @@ -91,6 +80,7 @@ protected ProjectInfo CopyTestAsset( string idPrefix, string projectDirReativeToAssetDir = "", bool appendUnicodeToPath = true, + bool runAnalyzers = true, string extraProperties = "", string extraItems = "", string insertAtEnd = "") @@ -102,10 +92,23 @@ protected ProjectInfo CopyTestAsset( _projectDir = Path.Combine(_projectDir!, projectDirReativeToAssetDir); } string projectFilePath = Path.Combine(_projectDir!, $"{assetDirName}.csproj"); - AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); + UpdateProjectFile(projectFilePath, aot, runAnalyzers, extraProperties, extraItems, insertAtEnd); return new ProjectInfo(config, aot, assetDirName, projectFilePath); } + private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyzers, string extraProperties, string extraItems, string insertAtEnd) + { + if (aot) + { + extraProperties += $"\ntrue"; + extraProperties += $"\n{s_isWindows}"; + } + extraProperties += "true"; + if (runAnalyzers) + extraProperties += "true"; + AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); + } + public (string projectDir, string buildOutput) BuildTemplateProject( ProjectInfo projectInfo, diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 1926c1d2a22b86..6486a8bfdbdbee 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -111,7 +111,7 @@ public void DefaultsWithBuild(string config, string extraProperties, bool aot, b [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: true)] public void DefaultsWithPublish(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) { - (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, dotnetWasmFromRuntimePack: !expectWasmBuildNativeForPublish, publish: true); + (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, expectWasmBuildNativeForPublish, isPublish: true); InferAndCheckPropertyValues(line, isPublish: true, wasmBuildNative: expectWasmBuildNativeForPublish, config: config); } @@ -176,8 +176,8 @@ public void WithNativeReference(string config, string extraProperties, bool publ config, extraProperties, aot: false, - dotnetWasmFromRuntimePack: !publish, - publish: publish, + nativeBuild: true, + isPublish: publish, extraItems: nativeRefItem); InferAndCheckPropertyValues(line, isPublish: publish, wasmBuildNative: true, config: config); @@ -242,11 +242,11 @@ private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasm private void CheckPropertyValues(string? line, bool wasmBuildNative, bool wasmNativeStrip, bool wasmNativeDebugSymbols, bool? wasmBuildingForNestedPublish) { Assert.NotNull(line); - Assert.Contains($"** WasmBuildNative: '{wasmBuildNative.ToString().ToLower()}', " + + string expected = $"** WasmBuildNative: '{wasmBuildNative.ToString().ToLower()}', " + $"WasmNativeStrip: '{wasmNativeStrip.ToString().ToLower()}', " + $"WasmNativeDebugSymbols: '{wasmNativeDebugSymbols.ToString().ToLower()}', " + - $"WasmBuildingForNestedPublish: '{(wasmBuildingForNestedPublish.HasValue && wasmBuildingForNestedPublish == true ? "true" : "")}'", - line); + $"WasmBuildingForNestedPublish: '{(wasmBuildingForNestedPublish.HasValue && wasmBuildingForNestedPublish == true ? "true" : "")}'"; + Assert.Contains(expected, line); } } } From 15860cf5643914bfedadb32dbc7ba143e38d591d Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:06:00 +0000 Subject: [PATCH 027/104] Block tests that should get fixed later. --- src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs index 77685155f2b466..fd7500f2838828 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs @@ -96,7 +96,7 @@ public void Bug49588_RegressionTest_NativeRelinking(string config, bool aot) [Theory] [BuildAndRun] - // Issue: we cannot read from the config file + [ActiveIssue("from some reason we cannot read from the config file")] public void PropertiesFromRuntimeConfigJson(string config, bool aot) => TestMain("runtime_config_json", @" @@ -120,7 +120,7 @@ public void PropertiesFromRuntimeConfigJson(string config, bool aot) [Theory] [BuildAndRun] - // Issue: we cannot read from the config file + [ActiveIssue("from some reason we cannot read from the config file")] public void PropertiesFromCsproj(string config, bool aot) => TestMain("csproj_properties", @" From a0974c7a359013c579e18f71c81e1885781294ff Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:06:24 +0000 Subject: [PATCH 028/104] Correct a typo. --- .../wasm/testassets/WasmBasicTestApp/App/wwwroot/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/index.html b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/index.html index 5179693a495f65..f0429391614fb3 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/index.html +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/index.html @@ -8,7 +8,7 @@ - + From 1f74ee2aef6db1676809e30a7689b98e491350ca Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Mon, 4 Nov 2024 17:14:51 +0100 Subject: [PATCH 029/104] Avoid AOT long path issues in scenario-based tests on Windows. --- .../Templates/WasmTemplateTestsBase.cs | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 03281f8146d27d..7c11c06cfb31ef 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -32,14 +32,16 @@ public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFi { "partial class StopwatchSample", $"return 42;{Environment.NewLine}partial class StopwatchSample" } }; - private string GetProjectName(string idPrefix, string config, bool aot, bool appendUnicodeToPath) => - appendUnicodeToPath ? - $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : - $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; - - private string InitProjectLocation(string idPrefix, string config, bool aot, bool appendUnicodeToPath) + private string GetProjectName(string idPrefix, string config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) => + avoidAotLongPathIssue ? // https://github.com/dotnet/runtime/issues/103625 + $"{GetRandomId()}" : + appendUnicodeToPath ? + $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : + $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; + + private string InitProjectLocation(string idPrefix, string config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) { - string projectName = GetProjectName(idPrefix, config, aot, appendUnicodeToPath); + string projectName = GetProjectName(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue); InitPaths(projectName); InitProjectDir(_projectDir, addNuGetSourceForLocalPackages: true); return projectName; @@ -78,18 +80,18 @@ protected ProjectInfo CopyTestAsset( bool aot, string assetDirName, string idPrefix, - string projectDirReativeToAssetDir = "", + string projectDirRelativeToAssetDir = "", bool appendUnicodeToPath = true, bool runAnalyzers = true, string extraProperties = "", string extraItems = "", string insertAtEnd = "") { - InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); + InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue: s_isWindows && aot); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, assetDirName), Path.Combine(_projectDir!)); - if (!string.IsNullOrEmpty(projectDirReativeToAssetDir)) + if (!string.IsNullOrEmpty(projectDirRelativeToAssetDir)) { - _projectDir = Path.Combine(_projectDir!, projectDirReativeToAssetDir); + _projectDir = Path.Combine(_projectDir!, projectDirRelativeToAssetDir); } string projectFilePath = Path.Combine(_projectDir!, $"{assetDirName}.csproj"); UpdateProjectFile(projectFilePath, aot, runAnalyzers, extraProperties, extraItems, insertAtEnd); @@ -122,7 +124,7 @@ private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyze //buildOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(buildOptions, extraArgs); - + if (buildOptions.UseCache) _buildContext.CacheBuild(projectInfo, new BuildProduct(_projectDir!, logFilePath, true, res.Output)); @@ -278,10 +280,10 @@ protected async Task BrowserRunTest(string runArgs, { await runOptions.ExecuteAfterLoaded(runOptions, page); } - + if (runOptions.Test is not null) await runOptions.Test(page); - + _testOutput.WriteLine($"Waiting for additional 10secs to see if any errors are reported"); int exitCode = await runner.WaitForExitMessageAsync(TimeSpan.FromSeconds(10)); if (runOptions.ExpectedExitCode is not null && exitCode != runOptions.ExpectedExitCode) From 5cf34db86fd22ef311c03f539fc06467715d742c Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Mon, 4 Nov 2024 18:05:22 +0100 Subject: [PATCH 030/104] Missing file in arg rename. --- .../TestAppScenarios/DebugLevelTests.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index 438285250f28f4..b3683c08564f1f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -45,7 +45,7 @@ public async Task BuildWithDefaultLevel(string configuration) aot: false, assetDirName: "WasmBasicTestApp", idPrefix: "DebugLevelTests_BuildWithDefaultLevel", - projectDirReativeToAssetDir: "App" + projectDirRelativeToAssetDir: "App" ); BuildPublishProject(info); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -65,7 +65,7 @@ public async Task BuildWithExplicitValue(string configuration, int debugLevel) aot: false, assetDirName: "WasmBasicTestApp", idPrefix: "DebugLevelTests_BuildWithExplicitValue", - projectDirReativeToAssetDir: "App" + projectDirRelativeToAssetDir: "App" ); BuildPublishProject(info, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -83,7 +83,7 @@ public async Task PublishWithDefaultLevel(string configuration) aot: false, assetDirName: "WasmBasicTestApp", idPrefix: "DebugLevelTests_PublishWithDefaultLevel", - projectDirReativeToAssetDir: "App" + projectDirRelativeToAssetDir: "App" ); BuildPublishProject(info, isPublish: true); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -103,14 +103,14 @@ public async Task PublishWithExplicitValue(string configuration, int debugLevel) aot: false, assetDirName: "WasmBasicTestApp", idPrefix: "DebugLevelTests_PublishWithExplicitValue", - projectDirReativeToAssetDir: "App" + projectDirRelativeToAssetDir: "App" ); BuildPublishProject(info, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, debugLevel); } - + [Theory] [InlineData("Debug")] @@ -122,7 +122,7 @@ public async Task PublishWithDefaultLevelAndPdbs(string configuration) aot: false, assetDirName: "WasmBasicTestApp", idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs", - projectDirReativeToAssetDir: "App" + projectDirRelativeToAssetDir: "App" ); BuildPublishProject(info, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); From b3b82c1e9c146622dd8630443229fd4814ae8b08 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 4 Nov 2024 17:11:27 +0000 Subject: [PATCH 031/104] Workaround for interpreter issues. --- .../Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 7c11c06cfb31ef..32b00ef234e433 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -123,6 +123,12 @@ private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyze // TODO: reenable this when the SDK supports targetting net10.0 //buildOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; + if (buildOptions.IsPublish && projectInfo.AOT) + { + // avoid https://github.com/dotnet/runtime/issues/92238 + extraArgs = extraArgs.Concat(new string[] { "-p:WasmStripILAfterAOT=false" }).ToArray(); + } + (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(buildOptions, extraArgs); if (buildOptions.UseCache) From 1a0ea6e1ff57a4e969c8c72e58c5ade33c63149f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 5 Nov 2024 12:07:32 +0000 Subject: [PATCH 032/104] Improve workaround. --- .../Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs | 6 ------ .../Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs | 6 ++++-- .../testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 32b00ef234e433..7c11c06cfb31ef 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -123,12 +123,6 @@ private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyze // TODO: reenable this when the SDK supports targetting net10.0 //buildOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; - if (buildOptions.IsPublish && projectInfo.AOT) - { - // avoid https://github.com/dotnet/runtime/issues/92238 - extraArgs = extraArgs.Concat(new string[] { "-p:WasmStripILAfterAOT=false" }).ToArray(); - } - (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(buildOptions, extraArgs); if (buildOptions.UseCache) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index 500d103e52501d..ffc7f91aaeb4ae 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -41,7 +41,7 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), IsPublish: isPublish ), - extraArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension}" + extraArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension} -p:TestLazyLoading=true" ); // We are running the app and passing all possible lazy extensions to test matrix of all possibilities. @@ -72,7 +72,9 @@ public async Task FailOnMissingLazyAssembly() BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), IsPublish: isPublish - )); + ), + extraArgs: $"-p:TestLazyLoading=true" + ); RunOptions options = new( info.Configuration, TestScenario: "LazyLoadingTest", diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj b/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj index 548b310286bedf..371aaa7dcca46c 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj @@ -19,7 +19,7 @@ - + From 10dd1ab8f509e5c157de19183926e0d908c11c44 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:44:12 +0000 Subject: [PATCH 033/104] Avoid timeouts on Windows. --- .../Wasm.Build.Tests/BuildPublishTests.cs | 9 ++-- .../InvariantTimezoneTests.cs | 7 ++- .../Wasm.Build.Tests/MainWithArgsTests.cs | 21 ++++----- .../Wasm.Build.Tests/NativeLibraryTests.cs | 45 +++++++------------ 4 files changed, 32 insertions(+), 50 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index f845be4439e1bc..284990819ad14b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -25,7 +25,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [BuildAndRun(config: "Debug", aot: true)] public void Wasm_CannotAOT_InDebug(string config, bool aot) { - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "no_aot_in_debug"); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "no_aot_in_debug", "App"); bool isPublish = true; (string _, string buildOutput) = BuildTemplateProject(info, @@ -45,10 +45,7 @@ public void Wasm_CannotAOT_InDebug(string config, bool aot) [BuildAndRun(config: "Debug")] public async Task BuildThenPublishNoAOT(string config, bool aot) { - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "build_publish"); - - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_publish", "App"); bool isPublish = false; BuildTemplateProject(info, @@ -63,7 +60,7 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - RunOptions runOptions = new(info.Configuration, ExpectedExitCode: 42); + RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index c6fe70f913081f..1f326e731787a5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -44,9 +44,8 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian extraProperties = $"{extraProperties}{invariantTimezone}"; string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraProperties: extraProperties); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); bool isPublish = true; // invariantTimezone triggers native build @@ -60,7 +59,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian IsPublish: isPublish )); - RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42)); Assert.Contains(output.TestOutput, m => m.Contains("UTC BaseUtcOffset is 0")); if (invariantTimezone == true) { diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index c7e3f5b1628e55..2cc89232ee1978 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -24,8 +25,9 @@ public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur // ToDo: // ActiveIssue - passing args to the program does not work, possible error in the test logic // new object?[] { new object?[] { "abc", "foobar"} }, - new object?[] { new object?[0] } - ).UnwrapItemsAsArrays(); + new object?[] { new object?[0] }) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .UnwrapItemsAsArrays(); [Theory] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] @@ -46,15 +48,9 @@ async Task TestMainWithArgs(string config, string projectContentsName, string[] args) { - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, projectNamePrefix); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", projectContentsName)); - UpdateBrowserMainJs(); - string mainJsPath = Path.Combine(_projectDir!, "wwwroot", "main.js"); - UpdateFile( - mainJsPath, - new Dictionary { - { ".withApplicationArguments(\"start\")", $".withApplicationArgumentsFromQuery()" } - }); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", projectNamePrefix, "App"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", projectContentsName)); + string argsStr = string.Join(" ", args); _testOutput.WriteLine ($"-- args: {argsStr}, name: {projectContentsName}"); @@ -70,7 +66,8 @@ async Task TestMainWithArgs(string config, int argsCount = args.Length; int expectedCode = 42 + argsCount; - RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); + RunResult output = await RunForPublishWithWebServer( + new(info.Configuration, TestScenario: "DotnetRun", ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); Assert.Contains(output.TestOutput, m => m.Contains($"args#: {argsCount}")); foreach (var arg in args) Assert.Contains(output.TestOutput, m => m.Contains($"arg: {arg}")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 993324842dd7cf..58a7cee3a2bf72 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -23,17 +23,14 @@ public NativeLibraryTests(ITestOutputHelper output, SharedBuildPerTestClassFixtu [BuildAndRun(config: "Release", aot: true)] public async Task ProjectWithNativeReference(string config, bool aot) { - ProjectInfo info = CreateWasmTemplateProject( - Template.WasmBrowser, - config, - aot, - "AppUsingNativeLib-a", - extraProperties: "true", - extraItems: ""); + string objectFilename = "native-lib.o"; + string extraItems = $""; + string extraProperties = "true"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "AppUsingNativeLib-a", "App", extraItems: extraItems, extraProperties: extraProperties); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir!, objectFilename)); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); - UpdateBrowserMainJs(); + DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); bool isPublish = true; (string _, string buildOutput) = BuildTemplateProject(info, @@ -44,7 +41,7 @@ public async Task ProjectWithNativeReference(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun")); Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); Assert.Contains(output.TestOutput, m => m.Contains("from pinvoke: 142")); @@ -61,9 +58,8 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) {GetSkiaSharpReferenceItems()} "; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix, extraItems: extraItems); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraItems: extraItems); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); bool isPublish = true; BuildTemplateProject(info, @@ -76,7 +72,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) )); RunOptions runOptions = new(info.Configuration, ExtraArgs: "mono.png"); - RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("Size: 26462 Height: 599, Width: 499")); } @@ -85,10 +81,8 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) [BuildAndRun(config: "Release", aot: true)] public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) { - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "AppUsingBrowserNativeCrypto"); - - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "AppUsingBrowserNativeCrypto", "App"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); bool isPublish = true; (string _, string buildOutput) = BuildTemplateProject(info, @@ -100,7 +94,7 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) IsPublish: isPublish )); - RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); string hash = "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105"; Assert.Contains(output.TestOutput, m => m.Contains(hash)); @@ -114,16 +108,11 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) [BuildAndRun(config: "Release", aot: true)] public async Task ProjectWithNativeLibrary(string config, bool aot) { - ProjectInfo info = CreateWasmTemplateProject( - Template.WasmBrowser, - config, - aot, - "AppUsingNativeLib-a", - extraItems: "\n"); - + string extraItems = "\n"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "AppUsingNativeLib-a", "App", extraItems: extraItems); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); + DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); - UpdateBrowserMainJs(); bool isPublish = true; (string _, string buildOutput) = BuildTemplateProject(info, @@ -134,7 +123,7 @@ public async Task ProjectWithNativeLibrary(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), IsPublish: isPublish )); - RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); Assert.Contains(output.TestOutput, m => m.Contains("from pinvoke: 142")); From c8ef33d5a7f077f54dfa5a951652b82649654afc Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:17:21 +0000 Subject: [PATCH 034/104] Missing change for the previous commit. --- .../Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 7c11c06cfb31ef..a84201789d8ad2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -181,6 +181,15 @@ protected void ReplaceFile(string pathRelativeToProjectDir, string pathWithNewCo UpdateFile(pathRelativeToProjectDir, newContent); } + protected void DeleteFile(string pathRelativeToProjectDir) + { + var deletedFilePath = Path.Combine(_projectDir!, pathRelativeToProjectDir); + if(File.Exists(deletedFilePath)) + { + File.Delete(deletedFilePath); + } + } + protected void RemoveContentsFromProjectFile(string pathRelativeToProjectDir, string afterMarker, string beforeMarker) { var path = Path.Combine(_projectDir!, pathRelativeToProjectDir); From bc444bf2636b648c96bc27881a8db6ae958e6143 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 8 Nov 2024 07:22:40 +0000 Subject: [PATCH 035/104] `PInvokeTableGeneratorTests`: done (with two issues). --- .../PInvokeTableGeneratorTests.cs | 1577 +++++++---------- .../EntryPoints/PInvoke/AbiRules.cs | 107 ++ .../PInvoke/BittableDifferentAssembly.cs | 18 + .../PInvoke/BittableDifferentAssembly_Lib.cs | 6 + .../PInvoke/BittableSameAssembly.cs | 21 + .../EntryPoints/PInvoke/BuildNative.cs | 8 + .../EntryPoints/PInvoke/ComInterop.cs | 17 + .../EntryPoints/PInvoke/DllImportNoWarning.cs | 16 + .../EntryPoints/PInvoke/DllImportWarning.cs | 13 + .../EntryPoints/PInvoke/FunctionPointers.cs | 13 + .../EntryPoints/PInvoke/ICall_Lib.cs | 18 + .../{ => PInvoke}/UnmanagedCallback.cs | 4 +- .../PInvoke/UnmanagedCallbackInFile.cs | 16 + .../PInvoke/UnmanagedCallbackNamespaced.cs | 42 + .../EntryPoints/PInvoke/VariadicFunctions.cs | 21 + .../App/WasmBasicTestApp.csproj | 4 +- .../WasmBasicTestApp/App/wwwroot/main.js | 4 + .../{Library => Json}/Json.cs | 0 .../{Library => Json}/Json.csproj | 0 .../WasmBasicTestApp/Library/Library.cs | 5 + .../WasmBasicTestApp/Library/Library.csproj | 7 + src/mono/wasm/testassets/native-libs/local.c | 2 +- 22 files changed, 967 insertions(+), 952 deletions(-) create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/AbiRules.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly_Lib.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/BittableSameAssembly.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/BuildNative.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/ComInterop.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportNoWarning.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportWarning.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/FunctionPointers.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/ICall_Lib.cs rename src/mono/wasm/testassets/EntryPoints/{ => PInvoke}/UnmanagedCallback.cs (83%) create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackInFile.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackNamespaced.cs create mode 100644 src/mono/wasm/testassets/EntryPoints/PInvoke/VariadicFunctions.cs rename src/mono/wasm/testassets/WasmBasicTestApp/{Library => Json}/Json.cs (100%) rename src/mono/wasm/testassets/WasmBasicTestApp/{Library => Json}/Json.csproj (100%) create mode 100644 src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.cs create mode 100644 src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.csproj diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 430a214366f3c7..d017fb95b42744 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; @@ -13,959 +14,639 @@ namespace Wasm.Build.Tests { - public class PInvokeTableGeneratorTests : TestMainJsTestBase + public class PInvokeTableGeneratorTests : WasmTemplateTestsBase { public PInvokeTableGeneratorTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - // [Theory] - // [BuildAndRun()] - // public void NativeLibraryWithVariadicFunctions(ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = @" - // using System; - // using System.Runtime.InteropServices; - // public class Test - // { - // public static int Main(string[] args) - // { - // Console.WriteLine($""Main running""); - // if (args.Length > 2) - // { - // // We don't want to run this, because we can't call variadic functions - // Console.WriteLine($""sum_three: {sum_three(7, 14, 21)}""); - // Console.WriteLine($""sum_two: {sum_two(3, 6)}""); - // Console.WriteLine($""sum_one: {sum_one(5)}""); - // } - // return 42; - // } - - // [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_one(int a); - // [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_two(int a, int b); - // [DllImport(""variadic"", EntryPoint=""sum"")] public static extern int sum_three(int a, int b, int c); - // }"; - - // (buildArgs, string output) = BuildForVariadicFunctionTests(code, - // buildArgs with { ProjectName = $"variadic_{buildArgs.Configuration}_{id}" }, - // id); - // Assert.Matches("warning.*native function.*sum.*varargs", output); - // Assert.Contains("System.Int32 sum_one(System.Int32)", output); - // Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); - // Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); - - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void DllImportWithFunctionPointersCompilesWithoutWarning(ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = - // """ - // using System; - // using System.Runtime.InteropServices; - // public class Test - // { - // public static int Main() - // { - // Console.WriteLine("Main running"); - // return 42; - // } - - // [DllImport("variadic", EntryPoint="sum")] - // public unsafe static extern int using_sum_one(delegate* unmanaged callback); - - // [DllImport("variadic", EntryPoint="sum")] - // public static extern int sum_one(int a, int b); - // } - // """; - - // (buildArgs, string output) = BuildForVariadicFunctionTests(code, - // buildArgs with { ProjectName = $"fnptr_{buildArgs.Configuration}_{id}" }, - // id); - - // Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); - // Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = @" - // using System; - // using System.Runtime.InteropServices; - // public class Test - // { - // public static int Main() - // { - // Console.WriteLine($""Main running""); - // return 42; - // } - - // [DllImport(""variadic"", EntryPoint=""sum"")] - // public unsafe static extern int using_sum_one(delegate* unmanaged callback); - // }"; - - // (buildArgs, string output) = BuildForVariadicFunctionTests(code, - // buildArgs with { ProjectName = $"fnptr_variadic_{buildArgs.Configuration}_{id}" }, - // id); - - // Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); - // Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_NotConsideredBlittable - // (ProjectInfo buildArgs, string id) - // { - // (_, string output) = SingleProjectForDisabledRuntimeMarshallingTest( - // withDisabledRuntimeMarshallingAttribute: false, - // withAutoLayout: true, - // expectSuccess: false, - // buildArgs, - // id - // ); - - // Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_WithStructLayout_ConsideredBlittable - // (ProjectInfo buildArgs, string id) - // { - // (_, string output) = SingleProjectForDisabledRuntimeMarshallingTest( - // withDisabledRuntimeMarshallingAttribute: false, - // withAutoLayout: false, - // expectSuccess: true, - // buildArgs, - // id - // ); - - // Assert.DoesNotMatch("error.*Parameter.*types.*pinvoke.*.*blittable", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMarshallingAttribute_ConsideredBlittable - // (ProjectInfo buildArgs, RunHost host, string id) - // { - // (buildArgs, _) = SingleProjectForDisabledRuntimeMarshallingTest( - // withDisabledRuntimeMarshallingAttribute: true, - // withAutoLayout: true, - // expectSuccess: true, - // buildArgs, - // id - // ); - - // string output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running 5", output); - // } - - // private (ProjectInfo buildArgs ,string output) SingleProjectForDisabledRuntimeMarshallingTest( - // bool withDisabledRuntimeMarshallingAttribute, bool withAutoLayout, - // bool expectSuccess, ProjectInfo buildArgs, string id - // ) { - // string code = - // """ - // using System; - // using System.Runtime.CompilerServices; - // using System.Runtime.InteropServices; - // """ - // + (withDisabledRuntimeMarshallingAttribute ? "[assembly: DisableRuntimeMarshalling]" : "") - // + """ - // public class Test - // { - // public static int Main() - // { - // var x = new S { Value = 5 }; - - // Console.WriteLine("Main running " + x.Value); - // return 42; - // } - // """ - // + (withAutoLayout ? "\n[StructLayout(LayoutKind.Auto)]\n" : "") - // + """ - // public struct S { public int Value; public float Value2; } - - // [UnmanagedCallersOnly] - // public static void M(S myStruct) { } - // } - // """; - - // buildArgs = ExpandBuildArgs( - // buildArgs with { ProjectName = $"not_blittable_{buildArgs.Configuration}_{id}" }, - // extraProperties: buildArgs.AOT - // ? string.Empty - // : "true" - // ); - - // (_, string output) = BuildProject( - // buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - // }, - // Publish: buildArgs.AOT, - // DotnetWasmFromRuntimePack: false, - // ExpectSuccess: expectSuccess - // ) - // ); - - // return (buildArgs, output); - // } - - // public static IEnumerable SeparateAssemblyWithDisableMarshallingAttributeTestData(string config) - // => ConfigWithAOTData(aot: false, config: config).Multiply( - // new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ false, /*expectSuccess*/ false }, - // new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ false, /*expectSuccess*/ false }, - // new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ true, /*expectSuccess*/ true }, - // new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ true, /*expectSuccess*/ true } - // ).UnwrapItemsAsArrays(); - - // [Theory] - // [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Debug")] - // [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Release")] - // public void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly - // (ProjectInfo buildArgs, bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess, RunHost host, string id) - // => SeparateAssembliesForDisableRuntimeMarshallingTest( - // libraryHasAttribute: libraryHasAttribute, - // appHasAttribute: appHasAttribute, - // expectSuccess: expectSuccess, - // buildArgs, - // host, - // id - // ); - - // private void SeparateAssembliesForDisableRuntimeMarshallingTest - // (bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess, ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = - // (libraryHasAttribute ? "[assembly: System.Runtime.CompilerServices.DisableRuntimeMarshalling]" : "") - // + "public struct __NonBlittableTypeForAutomatedTests__ { } public struct S { public int Value; public __NonBlittableTypeForAutomatedTests__ NonBlittable; }"; - - // var libraryBuildArgs = ExpandBuildArgs( - // buildArgs with { ProjectName = $"blittable_different_library_{buildArgs.Configuration}_{id}" }, - // extraProperties: "Library" - // ); - - // (string libraryDir, string output) = BuildProject( - // libraryBuildArgs, - // id: id + "_library", - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "S.cs"), code); - // }, - // Publish: buildArgs.AOT, - // DotnetWasmFromRuntimePack: false, - // AssertAppBundle: false - // ) - // ); - - // code = - // """ - // using System; - // using System.Runtime.CompilerServices; - // using System.Runtime.InteropServices; - - // """ - // + (appHasAttribute ? "[assembly: DisableRuntimeMarshalling]" : "") - // + """ - - // public class Test - // { - // public static int Main() - // { - // var x = new S { Value = 5 }; - - // Console.WriteLine("Main running " + x.Value); - // return 42; - // } - - // [UnmanagedCallersOnly] - // public static void M(S myStruct) { } - // } - // """; - - // buildArgs = ExpandBuildArgs( - // buildArgs with { ProjectName = $"blittable_different_app_{buildArgs.Configuration}_{id}" }, - // extraItems: $@"", - // extraProperties: buildArgs.AOT - // ? string.Empty - // : "true" - // ); - - // _projectDir = null; - - // (_, output) = BuildProject( - // buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - // }, - // Publish: buildArgs.AOT, - // DotnetWasmFromRuntimePack: false, - // ExpectSuccess: expectSuccess - // ) - // ); - - // if (expectSuccess) - // { - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running 5", output); - // } - // else - // { - // Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); - // } - // } - - // [Theory] - // [BuildAndRun()] - // public void DllImportWithFunctionPointers_WarningsAsMessages(ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = - // """ - // using System; - // using System.Runtime.InteropServices; - // public class Test - // { - // public static int Main() - // { - // Console.WriteLine("Main running"); - // return 42; - // } - - // [DllImport("someting")] - // public unsafe static extern void SomeFunction1(delegate* unmanaged callback); - // } - // """; - - // (buildArgs, string output) = BuildForVariadicFunctionTests( - // code, - // buildArgs with { ProjectName = $"fnptr_{buildArgs.Configuration}_{id}" }, - // id, - // verbosity: "normal", - // extraProperties: "$(MSBuildWarningsAsMessage);WASM0001" - // ); - - // Assert.DoesNotContain("warning WASM0001", output); - - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(ProjectInfo buildArgs, string id) - // { - // string code = - // """ - // using System; - // using System.Runtime.InteropServices; - // public class Test - // { - // public static int Main() - // { - // Console.WriteLine("Main running"); - // return 42; - // } - - // [UnmanagedCallersOnly] - // public unsafe static extern void SomeFunction1(delegate* unmanaged callback); - // } - // """; - - // (_, string output) = BuildForVariadicFunctionTests( - // code, - // buildArgs with { ProjectName = $"cb_fnptr_{buildArgs.Configuration}" }, - // id - // ); - - // Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void UnmanagedCallback_InFileType(ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = - // """ - // using System; - // using System.Runtime.InteropServices; - // public class Test - // { - // public static int Main() - // { - // Console.WriteLine("Main running"); - // return 42; - // } - // } - - // file class Foo - // { - // [UnmanagedCallersOnly] - // public unsafe static extern void SomeFunction1(int i); - // } - // """; - - // (buildArgs, string output) = BuildForVariadicFunctionTests( - // code, - // buildArgs with { ProjectName = $"cb_filetype_{buildArgs.Configuration}" }, - // id - // ); - - // Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); - - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("Main running", output); - // } - - // [Theory] - // [BuildAndRun()] - // public void UnmanagedCallersOnly_Namespaced(ProjectInfo buildArgs, RunHost host, string id) - // { - // string code = - // """ - // using System; - // using System.Runtime.InteropServices; - - // public class Test - // { - // public unsafe static int Main() - // { - // ((delegate* unmanaged)&A.Conflict.C)(); - // ((delegate* unmanaged)&B.Conflict.C)(); - // ((delegate* unmanaged)&A.Conflict.C\u733f)(); - // ((delegate* unmanaged)&B.Conflict.C\u733f)(); - // return 42; - // } - // } - - // namespace A { - // public class Conflict { - // [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C")] - // public static void C() { - // Console.WriteLine("A.Conflict.C"); - // } - - // [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C\u733f")] - // public static void C\u733f() { - // Console.WriteLine("A.Conflict.C_\U0001F412"); - // } - // } - // } - - // namespace B { - // public class Conflict { - // [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C")] - // public static void C() { - // Console.WriteLine("B.Conflict.C"); - // } - - // [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C\u733f")] - // public static void C\u733f() { - // Console.WriteLine("B.Conflict.C_\U0001F412"); - // } - // } - // } - // """; - - // (buildArgs, string output) = BuildForVariadicFunctionTests( - // code, - // buildArgs with { ProjectName = $"cb_namespace_{buildArgs.Configuration}" }, - // id - // ); - - // Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); - - // output = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.Contains("A.Conflict.C", output); - // Assert.Contains("B.Conflict.C", output); - // if (OperatingSystem.IsWindows()) { - // // Windows console unicode support is not great - // Assert.Contains("A.Conflict.C_", output); - // Assert.Contains("B.Conflict.C_", output); - // } else { - // Assert.Contains("A.Conflict.C_\U0001F412", output); - // Assert.Contains("B.Conflict.C_\U0001F412", output); - // } - // } - - // [Theory] - // [BuildAndRun()] - // public void IcallWithOverloadedParametersAndEnum(ProjectInfo buildArgs, string id) - // { - // // Build a library containing icalls with overloaded parameters. - - // string code = - // """ - // using System; - // using System.Runtime.CompilerServices; - - // public static class Interop - // { - // public enum Numbers { A, B, C, D } - - // [MethodImplAttribute(MethodImplOptions.InternalCall)] - // internal static extern void Square(Numbers x); - - // [MethodImplAttribute(MethodImplOptions.InternalCall)] - // internal static extern void Square(Numbers x, Numbers y); - - // public static void Main() - // { - // // Noop - // } - // } - // """; - - // var libraryBuildArgs = ExpandBuildArgs( - // buildArgs with { ProjectName = $"icall_enum_library_{buildArgs.Configuration}_{id}" } - // ); - - // (string libraryDir, string output) = BuildProject( - // libraryBuildArgs, - // id: id + "library", - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - // }, - // Publish: false, - // DotnetWasmFromRuntimePack: false, - // AssertAppBundle: false - // ) - // ); - - // // Build a project with ManagedToNativeGenerator task reading icalls from the above library and runtime-icall-table.h bellow. - - // string projectCode = - // """ - // - // - // - // - // pinvoke-table.h - // wasm_m2n_invoke.g.h - // runtime-icall-table.h - // - - // - // - // ###WasmPInvokeModule### - // - - // - // - // - // - // - // """; - - // string AddAssembly(string name) => $""; - - // string icallTable = - // """ - // [ - // { "klass":"Interop", "icalls": [{} ,{ "name": "Square(Numbers)", "func": "ves_abc", "handles": false } - // ,{ "name": "Add(Numbers,Numbers)", "func": "ves_def", "handles": false } - // ]} - // ] - - // """; - - // string tasksDir = Path.Combine(s_buildEnv.WorkloadPacksDir, - // "Microsoft.NET.Runtime.WebAssembly.Sdk", - // s_buildEnv.GetRuntimePackVersion(DefaultTargetFramework), - // "tasks", - // BuildTestBase.TargetFrameworkForTasks); // not net472! - // if (!Directory.Exists(tasksDir)) { - // string? tasksDirParent = Path.GetDirectoryName (tasksDir); - // if (!string.IsNullOrEmpty (tasksDirParent)) { - // if (!Directory.Exists(tasksDirParent)) { - // _testOutput.WriteLine($"Expected {tasksDirParent} to exist and contain TFM subdirectories"); - // } - // _testOutput.WriteLine($"runtime pack tasks dir {tasksDir} contains subdirectories:"); - // foreach (string subdir in Directory.EnumerateDirectories(tasksDirParent)) { - // _testOutput.WriteLine($" - {subdir}"); - // } - // } - // throw new DirectoryNotFoundException($"Could not find tasks directory {tasksDir}"); - // } - - // string? taskPath = Directory.EnumerateFiles(tasksDir, "WasmAppBuilder.dll", SearchOption.AllDirectories) - // .FirstOrDefault(); - // if (string.IsNullOrEmpty(taskPath)) - // throw new FileNotFoundException($"Could not find WasmAppBuilder.dll in {tasksDir}"); - - // _testOutput.WriteLine ("Using WasmAppBuilder.dll from {0}", taskPath); - - // projectCode = projectCode - // .Replace("###WasmPInvokeModule###", AddAssembly("System.Private.CoreLib") + AddAssembly("System.Runtime") + AddAssembly(libraryBuildArgs.ProjectName)) - // .Replace("###WasmAppBuilder###", taskPath); - - // buildArgs = buildArgs with { ProjectName = $"icall_enum_{buildArgs.Configuration}_{id}", ProjectFileContents = projectCode }; - - // _projectDir = null; - - // (_, output) = BuildProject( - // buildArgs, - // id: id + "tasks", - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "runtime-icall-table.h"), icallTable); - // }, - // Publish: buildArgs.AOT, - // DotnetWasmFromRuntimePack: false, - // UseCache: false, - // AssertAppBundle: false - // ) - // ); - - // Assert.DoesNotMatch(".*warning.*Numbers", output); - // } - - // [Theory] - // [BuildAndRun(parameters: new object[] { "tr_TR.UTF-8" })] - // public void BuildNativeInNonEnglishCulture(ProjectInfo buildArgs, string culture, RunHost host, string id) - // { - // // Check that we can generate interp tables in non-english cultures - // // Prompted by https://github.com/dotnet/runtime/issues/71149 - - // string code = @" - // using System; - // using System.Runtime.InteropServices; - - // Console.WriteLine($""square: {square(5)}""); - // return 42; - - // [DllImport(""simple"")] static extern int square(int x); - // "; - - // buildArgs = ExpandBuildArgs(buildArgs, - // extraItems: @$"", - // extraProperties: buildArgs.AOT - // ? string.Empty - // : "true"); - - // var extraEnvVars = new Dictionary { - // { "LANG", culture }, - // { "LC_ALL", culture }, - // }; - - // (_, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "simple.c"), - // Path.Combine(_projectDir!, "simple.c")); - // }, - // Publish: buildArgs.AOT, - // DotnetWasmFromRuntimePack: false, - // ExtraBuildEnvironmentVariables: extraEnvVars - // )); - - // output = RunAndTestWasmApp(buildArgs, - // buildDir: _projectDir, - // expectedExitCode: 42, - // host: host, - // id: id, - // envVars: extraEnvVars); - // Assert.Contains("square: 25", output); - // } - - // [Theory] - // [BuildAndRun(parameters: new object[] { new object[] { - // "with-hyphen", - // "with#hash-and-hyphen", - // "with.per.iod", - // "with🚀unicode#" - // } })] - - // private (ProjectInfo, string) BuildForVariadicFunctionTests(string programText, ProjectInfo buildArgs, string id, string? verbosity = null, string extraProperties = "") - // { - // extraProperties += "true<_WasmDevel>true"; - - // string filename = "variadic.o"; - // buildArgs = ExpandBuildArgs(buildArgs, - // extraItems: $"", - // extraProperties: extraProperties); - - // (_, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", filename), - // Path.Combine(_projectDir!, filename)); - // }, - // Publish: buildArgs.AOT, - // Verbosity: verbosity, - // DotnetWasmFromRuntimePack: false)); - - // return (buildArgs, output); - // } - - // private void EnsureComInteropCompiles(ProjectInfo buildArgs, string id) - // { - // string programText = @" - // using System; - // using System.Runtime.CompilerServices; - // using System.Runtime.InteropServices; - // using System.Runtime.InteropServices.ComTypes; - - // public class Test - // { - // public static int Main(string[] args) - // { - // var s = new STGMEDIUM(); - // ReleaseStgMedium(ref s); - // return 42; - // } - - // [DllImport(""ole32.dll"")] - // internal static extern void ReleaseStgMedium(ref STGMEDIUM medium); - // } - - // "; - - // buildArgs = ExpandBuildArgs(buildArgs); - - // (string libraryDir, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - // }, - // Publish: buildArgs.AOT, - // DotnetWasmFromRuntimePack: true)); - - // Assert.Contains("Generated app bundle at " + libraryDir, output); - // } - - // private void EnsureWasmAbiRulesAreFollowed(ProjectInfo buildArgs, RunHost host, string id) - // { - // string programText = @" - // using System; - // using System.Runtime.CompilerServices; - // using System.Runtime.InteropServices; - - // public struct SingleFloatStruct { - // public float Value; - // } - // public struct SingleDoubleStruct { - // public struct Nested1 { - // // This field is private on purpose to ensure we treat visibility correctly - // double Value; - // } - // public Nested1 Value; - // } - // public struct SingleI64Struct { - // public Int64 Value; - // } - // public struct PairStruct { - // public int A, B; - // } - // public unsafe struct MyFixedArray { - // public fixed int elements[2]; - // } - // [System.Runtime.CompilerServices.InlineArray(2)] - // public struct MyInlineArray { - // public int element0; - // } - - // public class Test - // { - // public static unsafe int Main(string[] argv) - // { - // var i64_a = 0xFF00FF00FF00FF0L; - // var i64_b = ~i64_a; - // var resI = direct64(i64_a); - // Console.WriteLine(""l (l)="" + resI); - - // var sis = new SingleI64Struct { Value = i64_a }; - // var resSI = indirect64(sis); - // Console.WriteLine(""s (s)="" + resSI.Value); - - // var resF = direct(3.14); - // Console.WriteLine(""f (d)="" + resF); - - // SingleDoubleStruct sds = default; - // Unsafe.As(ref sds) = 3.14; - - // resF = indirect_arg(sds); - // Console.WriteLine(""f (s)="" + resF); - - // var res = indirect(sds); - // Console.WriteLine(""s (s)="" + res.Value); - - // var pair = new PairStruct { A = 1, B = 2 }; - // var paires = accept_and_return_pair(pair); - // Console.WriteLine(""paires.B="" + paires.B); - - // // This test is split into methods to simplify debugging issues with it - // var ia = InlineArrayTest1(); - // var iares = InlineArrayTest2(ia); - // Console.WriteLine($""iares[0]={iares[0]} iares[1]={iares[1]}""); - - // MyFixedArray fa = new (); - // for (int i = 0; i < 2; i++) - // fa.elements[i] = i; - // var fares = accept_and_return_fixedarray(fa); - // Console.WriteLine(""fares.elements[1]="" + fares.elements[1]); - - // return (int)res.Value; - // } - - // public static unsafe MyInlineArray InlineArrayTest1 () { - // MyInlineArray ia = new (); - // for (int i = 0; i < 2; i++) - // ia[i] = i; - // return ia; - // } - - // public static unsafe MyInlineArray InlineArrayTest2 (MyInlineArray ia) { - // return accept_and_return_inlinearray(ia); - // } - - // [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] - // public static extern SingleFloatStruct indirect(SingleDoubleStruct arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] - // public static extern float indirect_arg(SingleDoubleStruct arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_double_struct_and_return_float_struct"")] - // public static extern float direct(double arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_i64_struct"")] - // public static extern SingleI64Struct indirect64(SingleI64Struct arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_i64_struct"")] - // public static extern Int64 direct64(Int64 arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_pair"")] - // public static extern PairStruct accept_and_return_pair(PairStruct arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_fixedarray"")] - // public static extern MyFixedArray accept_and_return_fixedarray(MyFixedArray arg); - - // [DllImport(""wasm-abi"", EntryPoint=""accept_and_return_inlinearray"")] - // public static extern MyInlineArray accept_and_return_inlinearray(MyInlineArray arg); - // }"; - - // var extraProperties = "true<_WasmDevel>falsefalse"; - // var extraItems = @""; - - // buildArgs = ExpandBuildArgs(buildArgs, - // extraItems: extraItems, - // extraProperties: extraProperties); - - // (string libraryDir, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), programText); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "wasm-abi.c"), - // Path.Combine(_projectDir!, "wasm-abi.c")); - // }, - // Publish: buildArgs.AOT, - // // Verbosity: "diagnostic", - // DotnetWasmFromRuntimePack: false)); - - // string objDir = Path.Combine(_projectDir!, "obj", buildArgs.Configuration!, "net9.0", "browser-wasm", "wasm", buildArgs.AOT ? "for-publish" : "for-build"); - - // // Verify that the right signature was added for the pinvoke. We can't determine this by examining the m2n file - // // FIXME: Not possible in in-process mode for some reason, even with verbosity at "diagnostic" - // // Assert.Contains("Adding pinvoke signature FD for method 'Test.", output); - - // string pinvokeTable = File.ReadAllText(Path.Combine(objDir, "pinvoke-table.h")); - // // Verify that the invoke is in the pinvoke table. Under various circumstances we will silently skip it, - // // for example if the module isn't found - // Assert.Contains("\"accept_double_struct_and_return_float_struct\", accept_double_struct_and_return_float_struct", pinvokeTable); - // // Verify the signature of the C function prototype. Wasm ABI specifies that the structs should both decompose into scalars. - // Assert.Contains("float accept_double_struct_and_return_float_struct (double);", pinvokeTable); - // Assert.Contains("int64_t accept_and_return_i64_struct (int64_t);", pinvokeTable); - - // var runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 3, host: host, id: id); - // Assert.Contains("l (l)=-1148435428713435121", runOutput); - // Assert.Contains("s (s)=-1148435428713435121", runOutput); - // Assert.Contains("f (d)=3.14", runOutput); - // Assert.Contains("f (s)=3.14", runOutput); - // Assert.Contains("s (s)=3.14", runOutput); - // Assert.Contains("paires.B=4", runOutput); - // Assert.Contains("iares[0]=32", runOutput); - // Assert.Contains("iares[1]=2", runOutput); - // Assert.Contains("fares.elements[1]=2", runOutput); - // } - - // [Theory] - // [BuildAndRun(aot: true)] - // public void EnsureWasmAbiRulesAreFollowedInAOT(ProjectInfo buildArgs, RunHost host, string id) => - // EnsureWasmAbiRulesAreFollowed(buildArgs, host, id); - - // [Theory] - // [BuildAndRun(aot: false)] - // public void EnsureWasmAbiRulesAreFollowedInInterpreter(ProjectInfo buildArgs, RunHost host, string id) => - // EnsureWasmAbiRulesAreFollowed(buildArgs, host, id); - - // [Theory] - // [BuildAndRun(aot: true)] - // public void EnsureComInteropCompilesInAOT(ProjectInfo buildArgs, string id) => - // EnsureComInteropCompiles(buildArgs, id); - - // [Theory] - // [BuildAndRun(aot: false)] - // public void UCOWithSpecialCharacters(ProjectInfo buildArgs, RunHost host, string id) - // { - // var extraProperties = "true"; - // var extraItems = @""; - - // buildArgs = ExpandBuildArgs(buildArgs, - // extraItems: extraItems, - // extraProperties: extraProperties); - - // (string libraryDir, string output) = BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "UnmanagedCallback.cs"), Path.Combine(_projectDir!, "Program.cs")); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "local.c"), Path.Combine(_projectDir!, "local.c")); - // }, - // Publish: true, - // DotnetWasmFromRuntimePack: false)); - - // var runOutput = RunAndTestWasmApp(buildArgs, buildDir: _projectDir, expectedExitCode: 42, host: host, id: id); - // Assert.DoesNotContain("Conflict.A.Managed8\u4F60Func(123) -> 123", runOutput); - // Assert.Contains("ManagedFunc returned 42", runOutput); - // } + [Theory] + [BuildAndRun(aot: false)] + public async void NativeLibraryWithVariadicFunctions(string config, bool aot) + { + ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "variadic"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "VariadicFunctions.cs")); + string output = BuildForVariadicFunctionTests(info); + Assert.Matches("warning.*native function.*sum.*varargs", output); + Assert.Contains("System.Int32 sum_one(System.Int32)", output); + Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); + Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public async void DllImportWithFunctionPointersCompilesWithoutWarning(string config, bool aot) + { + ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "fnptr"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportNoWarning.cs")); + string output = BuildForVariadicFunctionTests(info); + + Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); + Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(string config, bool aot) + { + ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "fnptr_variadic"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportWarning.cs")); + string output = BuildForVariadicFunctionTests(info); + + Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); + Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_NotConsideredBlittable + (string config, bool aot) + { + ProjectInfo info = PrepreProjectForBlittableTests( + config, aot, "not_blittable", disableRuntimeMarshalling: false, useAutoLayout: true); + bool isPublish = false; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + IsPublish: isPublish, + ExpectSuccess: false + )); + Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); + } + + [Theory] + [BuildAndRun()] + public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_WithStructLayout_ConsideredBlittable + (string config, bool aot) + { + ProjectInfo info = PrepreProjectForBlittableTests( + config, aot, "blittable", disableRuntimeMarshalling: false, useAutoLayout: false); + bool isPublish = false; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + Assert.DoesNotMatch("error.*Parameter.*types.*pinvoke.*.*blittable", output); + } + + [Theory] + [BuildAndRun()] + public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMarshallingAttribute_ConsideredBlittable + (string config, bool aot) + { + ProjectInfo info = PrepreProjectForBlittableTests( + config, aot, "blittable", disableRuntimeMarshalling: true, useAutoLayout: true); + bool isPublish = false; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + RunResult result = await RunForBuildWithDotnetRun(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains(result.TestOutput, m => m.Contains("Main running")); + } + + private ProjectInfo PrepreProjectForBlittableTests(string config, bool aot, string prefix, bool disableRuntimeMarshalling, bool useAutoLayout = false) + { + string extraProperties = aot ? string.Empty : "true"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableSameAssembly.cs")); + + var replacements = new Dictionary { }; + if (!disableRuntimeMarshalling) + { + replacements.Add("[assembly: DisableRuntimeMarshalling]", ""); + } + if (!useAutoLayout) + { + replacements.Add("[StructLayout(LayoutKind.Auto)]", ""); + } + if (replacements.Count > 0) + { + UpdateFile(programRelativePath, replacements); + } + return info; + } + + public static IEnumerable SeparateAssemblyWithDisableMarshallingAttributeTestData(string config) + => ConfigWithAOTData(aot: false, config: config).Multiply( + new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ false, /*expectSuccess*/ false }, + new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ false, /*expectSuccess*/ false }, + new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ true, /*expectSuccess*/ true }, + new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ true, /*expectSuccess*/ true } + ).UnwrapItemsAsArrays(); + + [Theory] + [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Debug")] + [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Release")] + public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly + (string config, bool aot, bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess) + { + string extraProperties = aot ? string.Empty : "true"; + string extraItems = @$""; + string libRelativePath = Path.Combine("..", "Library", "Library.cs"); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "blittable_different_library", "App", extraProperties: extraProperties, extraItems: extraItems); + ReplaceFile(libRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableDifferentAssembly_Lib.cs")); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableDifferentAssembly.cs")); + if (!libraryHasAttribute) + { + UpdateFile(libRelativePath, new Dictionary { { "[assembly: System.Runtime.CompilerServices.DisableRuntimeMarshalling]", "" } }); + } + if (!appHasAttribute) + { + UpdateFile(programRelativePath, new Dictionary { { "[assembly: DisableRuntimeMarshalling]", "" } }); + } + bool isPublish = false; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish, + ExpectSuccess: expectSuccess + )); + if (expectSuccess) + { + RunResult result = await RunForBuildWithDotnetRun(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running 5", result.TestOutput); + } + else + { + Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); + } + } + + + [Theory] + [BuildAndRun()] + public async void DllImportWithFunctionPointers_WarningsAsMessages(string config, bool aot) + { + string extraProperties = "$(MSBuildWarningsAsMessage);WASM0001"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "fnptr", "App", extraProperties: extraProperties); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); + + string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + Assert.DoesNotContain("warning WASM0001", output); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "cb_fnptr", "App"); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); + UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); + string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); + } + + [Theory] + [BuildAndRun()] + public async void UnmanagedCallback_InFileType(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "cb_filetype", "App"); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackInFile.cs")); + + string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + [ActiveIssue("RuntimeError: null function or function signature mismatch")] + public async void UnmanagedCallersOnly_Namespaced(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "cb_namespace", "App"); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackNamespaced.cs")); + + string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("A.Conflict.C", result.TestOutput); + Assert.Contains("B.Conflict.C", result.TestOutput); + if (OperatingSystem.IsWindows()) { + // Windows console unicode support is not great + Assert.Contains("A.Conflict.C_", result.TestOutput); + Assert.Contains("B.Conflict.C_", result.TestOutput); + } else { + Assert.Contains("A.Conflict.C_\U0001F412", result.TestOutput); + Assert.Contains("B.Conflict.C_\U0001F412", result.TestOutput); + } + } + + [Theory] + [BuildAndRun()] + public void IcallWithOverloadedParametersAndEnum(string config, bool aot) + { + string appendToTheEnd = + """ + + + + pinvoke-table.h + wasm_m2n_invoke.g.h + runtime-icall-table.h + + + + + ###WasmPInvokeModule### + + + + + + + """; + + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "icall_enum", "App", insertAtEnd: appendToTheEnd); + // build a library containing icalls with overloaded parameters. + ReplaceFile(Path.Combine("..", "Library", "Library.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ICall_Lib.cs")); + // temporarily change the project directory to build the library + _projectDir = Path.Combine(_projectDir!, "..", "Library"); + bool isPublish = false; + // libraries do not have framework dirs + string hypotheticalFrameworkDir = Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)); + string libAssemblyPath = Path.Combine(hypotheticalFrameworkDir, "..", ".."); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + "Library.csproj", + // library project does not have it but it's a required parameter. It's not used when assert: false + BinFrameworkDir: hypotheticalFrameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish, + AssertAppBundle: false + )); + // restore the project directory + _projectDir = Path.Combine(_projectDir!, "..", "App"); + + string icallTable = + """ + [ + { "klass":"Interop", "icalls": [{} ,{ "name": "Square(Numbers)", "func": "ves_abc", "handles": false } + ,{ "name": "Add(Numbers,Numbers)", "func": "ves_def", "handles": false } + ]} + ] + + """; + UpdateFile(Path.Combine(_projectDir!, "runtime-icall-table.h"), icallTable); + + string tasksDir = Path.Combine(s_buildEnv.WorkloadPacksDir, + "Microsoft.NET.Runtime.WebAssembly.Sdk", + s_buildEnv.GetRuntimePackVersion(DefaultTargetFramework), + "tasks", + BuildTestBase.TargetFrameworkForTasks); // not net472! + if (!Directory.Exists(tasksDir)) { + string? tasksDirParent = Path.GetDirectoryName (tasksDir); + if (!string.IsNullOrEmpty (tasksDirParent)) { + if (!Directory.Exists(tasksDirParent)) { + _testOutput.WriteLine($"Expected {tasksDirParent} to exist and contain TFM subdirectories"); + } + _testOutput.WriteLine($"runtime pack tasks dir {tasksDir} contains subdirectories:"); + foreach (string subdir in Directory.EnumerateDirectories(tasksDirParent)) { + _testOutput.WriteLine($" - {subdir}"); + } + } + throw new DirectoryNotFoundException($"Could not find tasks directory {tasksDir}"); + } + + string? taskPath = Directory.EnumerateFiles(tasksDir, "WasmAppBuilder.dll", SearchOption.AllDirectories) + .FirstOrDefault(); + if (string.IsNullOrEmpty(taskPath)) + throw new FileNotFoundException($"Could not find WasmAppBuilder.dll in {tasksDir}"); + + _testOutput.WriteLine ("Using WasmAppBuilder.dll from {0}", taskPath); + + string AddAssembly(string assemblyLocation, string name) => $""; + string frameworkDir = Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)); + string appAssemblyPath = Path.Combine(frameworkDir, "..", ".."); + string pinvokeReplacement = + AddAssembly(appAssemblyPath, "System.Private.CoreLib") + + AddAssembly(appAssemblyPath, "System.Runtime") + + AddAssembly(libAssemblyPath, "Library"); + UpdateFile("WasmBasicTestApp.csproj", new Dictionary { + { "###WasmPInvokeModule###", pinvokeReplacement }, + { "###WasmAppBuilder###", taskPath } + }); + + // Build a project with ManagedToNativeGenerator task reading icalls from the above library and runtime-icall-table.h + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: frameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish, + UseCache: false + )); + + Assert.DoesNotMatch(".*warning.*Numbers", output); + } + + [Theory] + [BuildAndRun(parameters: new object[] { "tr_TR.UTF-8" })] + public async void BuildNativeInNonEnglishCulture(string config, bool aot, string culture) + { + // Check that we can generate interp tables in non-english cultures + // Prompted by https://github.com/dotnet/runtime/issues/71149 + + string extraItems = @$""; + string extraProperties = aot ? string.Empty : "true"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "buildNativeNonEng", "App", extraItems: extraItems); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BuildNative.cs")); + string cCodeFilename = "simple.c"; + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); + + var extraEnvVars = new Dictionary { + { "LANG", culture }, + { "LC_ALL", culture }, + }; + bool isPublish = true; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish, + ExtraBuildEnvironmentVariables: extraEnvVars + )); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42, + Locale: culture + )); + Assert.Contains("square: 25", result.TestOutput); + } + + [Theory] + [BuildAndRun(parameters: new object[] { new object[] { + "with-hyphen", + "with#hash-and-hyphen", + "with.per.iod", + "with🚀unicode#" + } })] + public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(string config, bool aot, string[] libraryNames) + { + var extraItems = @""; + string extraProperties = aot ? string.Empty : "true"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "abi", "App", extraItems: extraItems, extraProperties: extraProperties); + + int baseArg = 10; + GenerateSourceFiles(_projectDir!, baseArg); + bool isPublish = aot; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + + var runOptions = new RunOptions(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42); + RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); + + for (int i = 0; i < libraryNames.Length; i ++) + { + Assert.Contains($"square_{i}: {(i + baseArg) * (i + baseArg)}", result.TestOutput); + } + + void GenerateSourceFiles(string outputPath, int baseArg) + { + StringBuilder csBuilder = new($@" + using System; + using System.Runtime.InteropServices; + "); + + StringBuilder dllImportsBuilder = new(); + for (int i = 0; i < libraryNames.Length; i ++) + { + dllImportsBuilder.AppendLine($"[DllImport(\"{libraryNames[i]}\")] static extern int square_{i}(int x);"); + csBuilder.AppendLine($@"Console.WriteLine($""TestOutput -> square_{i}: {{square_{i}({i + baseArg})}}"");"); + + string nativeCode = $@" + #include + + int square_{i}(int x) + {{ + return x * x; + }}"; + File.WriteAllText(Path.Combine(outputPath, $"{libraryNames[i]}.c"), nativeCode); + } + + csBuilder.AppendLine("return 42;"); + csBuilder.Append(dllImportsBuilder); + + UpdateFile(Path.Combine("Common", "Program.cs"), csBuilder.ToString()); + } + } + + private ProjectInfo PrepreProjectForVariadicFuntion(string config, bool aot, string prefix, string extraProperties = "") + { + string objectFilename = "variadic.o"; + extraProperties += "true<_WasmDevel>true"; + string extraItems = $""; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraItems: extraItems, extraProperties: extraProperties); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir!, objectFilename)); + return info; + } + + private string BuildForVariadicFunctionTests(ProjectInfo info, bool isPublish = true, string? verbosity = null, bool isNativeBuild = true) + { + string verbosityArg = verbosity == null ? string.Empty : $" -v:{verbosity}"; + var extraArgs = new string[] { verbosityArg }; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + // NativeFileReference forces native build + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), + IsPublish: isPublish + ), + extraArgs: extraArgs); + return output; + } + + private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) + { + var extraItems = @""; + var extraProperties = "true<_WasmDevel>falsefalse"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "abi", "App", extraItems: extraItems, extraProperties: extraProperties); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "AbiRules.cs")); + string cCodeFilename = "wasm-abi.c"; + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); + + bool isPublish = aot; + var buildOptions = new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + // NativeFileReference forces native build + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish + ); + BuildTemplateProject(info, buildOptions); + + string objDir = Path.Combine(_projectDir!, "obj", config, buildOptions.TargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); + + // Verify that the right signature was added for the pinvoke. We can't determine this by examining the m2n file + // FIXME: Not possible in in-process mode for some reason, even with verbosity at "diagnostic" + // Assert.Contains("Adding pinvoke signature FD for method 'Test.", output); + + string pinvokeTable = File.ReadAllText(Path.Combine(objDir, "pinvoke-table.h")); + // Verify that the invoke is in the pinvoke table. Under various circumstances we will silently skip it, + // for example if the module isn't found + Assert.Contains("\"accept_double_struct_and_return_float_struct\", accept_double_struct_and_return_float_struct", pinvokeTable); + // Verify the signature of the C function prototype. Wasm ABI specifies that the structs should both decompose into scalars. + Assert.Contains("float accept_double_struct_and_return_float_struct (double);", pinvokeTable); + Assert.Contains("int64_t accept_and_return_i64_struct (int64_t);", pinvokeTable); + + var runOptions = new RunOptions(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 3); + RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); + Assert.Contains("l (l)=-1148435428713435121", result.TestOutput); + Assert.Contains("s (s)=-1148435428713435121", result.TestOutput); + Assert.Contains("f (d)=3.14", result.TestOutput); + Assert.Contains("f (s)=3.14", result.TestOutput); + Assert.Contains("s (s)=3.14", result.TestOutput); + Assert.Contains("paires.B=4", result.TestOutput); + Assert.Contains(result.TestOutput, m => m.Contains("iares[0]=32")); + Assert.Contains(result.TestOutput, m => m.Contains("iares[1]=2")); + Assert.Contains("fares.elements[1]=2", result.TestOutput); + } + + [Theory] + [BuildAndRun(aot: true, config: "Release")] + public async void EnsureWasmAbiRulesAreFollowedInAOT(string config, bool aot) => + await EnsureWasmAbiRulesAreFollowed(config, aot); + + [Theory] + [BuildAndRun(aot: false)] + public async void EnsureWasmAbiRulesAreFollowedInInterpreter(string config, bool aot) => + await EnsureWasmAbiRulesAreFollowed(config, aot); + + [Theory] + [BuildAndRun(aot: true, config: "Release")] + [ActiveIssue("WasmGenerateAppBundle = false, so _WasmGenerateAppBundle is not triggered. Is the change expected?")] + public void EnsureComInteropCompilesInAOT(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "com", "App"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ComInterop.cs")); + bool isPublish = aot; + (string libraryDir, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + Assert.Contains("Generated app bundle at " + libraryDir, output); + } + + [Theory] + [BuildAndRun(aot: false)] + public async void UCOWithSpecialCharacters(string config, bool aot) + { + var extraProperties = "true"; + var extraItems = @""; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "uoc", "App", extraItems: extraItems, extraProperties: extraProperties); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallback.cs")); + string cCodeFilename = "local.c"; + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); + + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + // NativeFileReference forces native build + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), + IsPublish: isPublish + )); + + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.DoesNotContain("Conflict.A.Managed8\u4F60Func(123) -> 123", result.TestOutput); + Assert.Contains("ManagedFunc returned 42", result.TestOutput); + } } } diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/AbiRules.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/AbiRules.cs new file mode 100644 index 00000000000000..3c925215272420 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/AbiRules.cs @@ -0,0 +1,107 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +public struct SingleFloatStruct { + public float Value; +} +public struct SingleDoubleStruct { + public struct Nested1 { + // This field is private on purpose to ensure we treat visibility correctly + double Value; + } + public Nested1 Value; +} +public struct SingleI64Struct { + public Int64 Value; +} +public struct PairStruct { + public int A, B; +} +public unsafe struct MyFixedArray { + public fixed int elements[2]; +} +[System.Runtime.CompilerServices.InlineArray(2)] +public struct MyInlineArray { + public int element0; +} + +public class Test +{ + public static unsafe int Main(string[] argv) + { + var i64_a = 0xFF00FF00FF00FF0L; + var i64_b = ~i64_a; + var resI = direct64(i64_a); + Console.WriteLine("TestOutput -> l (l)=" + resI); + + var sis = new SingleI64Struct { Value = i64_a }; + var resSI = indirect64(sis); + Console.WriteLine("TestOutput -> s (s)=" + resSI.Value); + + var resF = direct(3.14); + Console.WriteLine("TestOutput -> f (d)=" + resF); + + SingleDoubleStruct sds = default; + Unsafe.As(ref sds) = 3.14; + + resF = indirect_arg(sds); + Console.WriteLine("TestOutput -> f (s)=" + resF); + + var res = indirect(sds); + Console.WriteLine("TestOutput -> s (s)=" + res.Value); + + var pair = new PairStruct { A = 1, B = 2 }; + var paires = accept_and_return_pair(pair); + Console.WriteLine("TestOutput -> paires.B=" + paires.B); + + // This test is split into methods to simplify debugging issues with it + var ia = InlineArrayTest1(); + var iares = InlineArrayTest2(ia); + Console.WriteLine($"TestOutput -> iares[0]={iares[0]} iares[1]={iares[1]}"); + + MyFixedArray fa = new (); + for (int i = 0; i < 2; i++) + fa.elements[i] = i; + var fares = accept_and_return_fixedarray(fa); + Console.WriteLine("TestOutput -> fares.elements[1]=" + fares.elements[1]); + + int exitCode = (int)res.Value; + return exitCode; + } + + public static unsafe MyInlineArray InlineArrayTest1 () { + MyInlineArray ia = new (); + for (int i = 0; i < 2; i++) + ia[i] = i; + return ia; + } + + public static unsafe MyInlineArray InlineArrayTest2 (MyInlineArray ia) { + return accept_and_return_inlinearray(ia); + } + + [DllImport("wasm-abi", EntryPoint="accept_double_struct_and_return_float_struct")] + public static extern SingleFloatStruct indirect(SingleDoubleStruct arg); + + [DllImport("wasm-abi", EntryPoint="accept_double_struct_and_return_float_struct")] + public static extern float indirect_arg(SingleDoubleStruct arg); + + [DllImport("wasm-abi", EntryPoint="accept_double_struct_and_return_float_struct")] + public static extern float direct(double arg); + + [DllImport("wasm-abi", EntryPoint="accept_and_return_i64_struct")] + public static extern SingleI64Struct indirect64(SingleI64Struct arg); + + [DllImport("wasm-abi", EntryPoint="accept_and_return_i64_struct")] + public static extern Int64 direct64(Int64 arg); + + [DllImport("wasm-abi", EntryPoint="accept_and_return_pair")] + public static extern PairStruct accept_and_return_pair(PairStruct arg); + + [DllImport("wasm-abi", EntryPoint="accept_and_return_fixedarray")] + public static extern MyFixedArray accept_and_return_fixedarray(MyFixedArray arg); + + [DllImport("wasm-abi", EntryPoint="accept_and_return_inlinearray")] + public static extern MyInlineArray accept_and_return_inlinearray(MyInlineArray arg); +} diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly.cs new file mode 100644 index 00000000000000..562f2384f40c20 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly.cs @@ -0,0 +1,18 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: DisableRuntimeMarshalling] +public class Test +{ + public static int Main() + { + var x = new S { Value = 5 }; + + Console.WriteLine("TestOutput -> Main running " + x.Value); + return 42; + } + + [UnmanagedCallersOnly] + public static void M(S myStruct) { } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly_Lib.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly_Lib.cs new file mode 100644 index 00000000000000..597b51823e5182 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableDifferentAssembly_Lib.cs @@ -0,0 +1,6 @@ +[assembly: System.Runtime.CompilerServices.DisableRuntimeMarshalling] +public struct __NonBlittableTypeForAutomatedTests__ { } +public struct S { + public int Value; + public __NonBlittableTypeForAutomatedTests__ NonBlittable; +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableSameAssembly.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableSameAssembly.cs new file mode 100644 index 00000000000000..f5103f279e2a19 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/BittableSameAssembly.cs @@ -0,0 +1,21 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: DisableRuntimeMarshalling] +public class Test +{ + public static int Main() + { + var x = new S { Value = 5 }; + + Console.WriteLine("TestOutput -> Main running " + x.Value); + return 42; + } + + [StructLayout(LayoutKind.Auto)] + public struct S { public int Value; public float Value2; } + + [UnmanagedCallersOnly] + public static void M(S myStruct) { } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/BuildNative.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/BuildNative.cs new file mode 100644 index 00000000000000..088651f205c79f --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/BuildNative.cs @@ -0,0 +1,8 @@ +using System; +using System.Runtime.InteropServices; + +Console.WriteLine($"TestOutput -> square: {square(5)}"); +return 42; + +[DllImport("simple")] +static extern int square(int x); \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/ComInterop.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/ComInterop.cs new file mode 100644 index 00000000000000..b347a9162c0659 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/ComInterop.cs @@ -0,0 +1,17 @@ +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +public class Test +{ + public static int Main(string[] args) + { + var s = new STGMEDIUM(); + ReleaseStgMedium(ref s); + return 42; + } + + [DllImport("ole32.dll")] + internal static extern void ReleaseStgMedium(ref STGMEDIUM medium); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportNoWarning.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportNoWarning.cs new file mode 100644 index 00000000000000..a77515ae54c1ac --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportNoWarning.cs @@ -0,0 +1,16 @@ +using System; +using System.Runtime.InteropServices; +public class Test +{ + public static int Main() + { + Console.WriteLine("TestOutput -> Main running"); + return 42; + } + + [DllImport("variadic", EntryPoint="sum")] + public unsafe static extern int using_sum_one(delegate* unmanaged callback); + + [DllImport("variadic", EntryPoint="sum")] + public static extern int sum_one(int a, int b); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportWarning.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportWarning.cs new file mode 100644 index 00000000000000..8e6faeef850d15 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/DllImportWarning.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.InteropServices; +public class Test +{ + public static int Main() + { + Console.WriteLine("TestOutput -> Main running"); + return 42; + } + + [DllImport("variadic", EntryPoint="sum")] + public unsafe static extern int using_sum_one(delegate* unmanaged callback); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/FunctionPointers.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/FunctionPointers.cs new file mode 100644 index 00000000000000..6c3d56a09e3a5a --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/FunctionPointers.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.InteropServices; +public class Test +{ + public static int Main() + { + Console.WriteLine("TestOutput -> Main running"); + return 42; + } + + [DllImport("someting")] + public unsafe static extern void SomeFunction1(delegate* unmanaged callback); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/ICall_Lib.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/ICall_Lib.cs new file mode 100644 index 00000000000000..351578387cd8fc --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/ICall_Lib.cs @@ -0,0 +1,18 @@ +using System; +using System.Runtime.CompilerServices; + +public static class Interop +{ + public enum Numbers { A, B, C, D } + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void Square(Numbers x); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + internal static extern void Square(Numbers x, Numbers y); + + public static void Main() + { + // Noop + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/UnmanagedCallback.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallback.cs similarity index 83% rename from src/mono/wasm/testassets/EntryPoints/UnmanagedCallback.cs rename to src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallback.cs index 623cd2c5cb707d..0482b445a42f9e 100644 --- a/src/mono/wasm/testassets/EntryPoints/UnmanagedCallback.cs +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallback.cs @@ -18,7 +18,7 @@ file class Interop { [UnmanagedCallersOnly(EntryPoint = "ConflictManagedFunc")] public static int Managed8\u4F60Func(int number) { - Console.WriteLine($"Conflict.A.Managed8\u4F60Func({number}) -> {number}"); + Console.WriteLine($"TestOutput -> Conflict.A.Managed8\u4F60Func({number}) -> {number}"); return number; } } @@ -30,7 +30,7 @@ file partial class Interop public static int Managed8\u4F60Func(int number) { // called from UnmanagedFunc - Console.WriteLine($"Managed8\u4F60Func({number}) -> 42"); + Console.WriteLine($"TestOutput -> Managed8\u4F60Func({number}) -> 42"); return 42; } diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackInFile.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackInFile.cs new file mode 100644 index 00000000000000..a56183c29247df --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackInFile.cs @@ -0,0 +1,16 @@ +using System; +using System.Runtime.InteropServices; +public class Test +{ + public static int Main() + { + Console.WriteLine("TestOutput -> Main running"); + return 42; + } +} + +file class Foo +{ + [UnmanagedCallersOnly] + public unsafe static extern void SomeFunction1(int i); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackNamespaced.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackNamespaced.cs new file mode 100644 index 00000000000000..334e49ef432a26 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/UnmanagedCallbackNamespaced.cs @@ -0,0 +1,42 @@ +using System; +using System.Runtime.InteropServices; + +public class Test +{ + public unsafe static int Main() + { + ((delegate* unmanaged)&A.Conflict.C)(); + ((delegate* unmanaged)&B.Conflict.C)(); + ((delegate* unmanaged)&A.Conflict.C\u733f)(); + ((delegate* unmanaged)&B.Conflict.C\u733f)(); + return 42; + } +} + +namespace A { + public class Conflict { + [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C")] + public static void C() { + Console.WriteLine("TestOutput -> A.Conflict.C"); + } + + [UnmanagedCallersOnly(EntryPoint = "A_Conflict_C\u733f")] + public static void C\u733f() { + Console.WriteLine("TestOutput -> A.Conflict.C_\U0001F412"); + } + } +} + +namespace B { + public class Conflict { + [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C")] + public static void C() { + Console.WriteLine("TestOutput -> B.Conflict.C"); + } + + [UnmanagedCallersOnly(EntryPoint = "B_Conflict_C\u733f")] + public static void C\u733f() { + Console.WriteLine("TestOutput -> B.Conflict.C_\U0001F412"); + } + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/EntryPoints/PInvoke/VariadicFunctions.cs b/src/mono/wasm/testassets/EntryPoints/PInvoke/VariadicFunctions.cs new file mode 100644 index 00000000000000..5357065a9a5997 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/PInvoke/VariadicFunctions.cs @@ -0,0 +1,21 @@ +using System; +using System.Runtime.InteropServices; +public class Test +{ + public static int Main(string[] args) + { + Console.WriteLine("TestOutput -> Main running"); + if (args.Length > 2) + { + // We don't want to run this, because we can't call variadic functions + Console.WriteLine($"sum_three: {sum_three(7, 14, 21)}"); + Console.WriteLine($"sum_two: {sum_two(3, 6)}"); + Console.WriteLine($"sum_one: {sum_one(5)}"); + } + return 42; + } + + [DllImport("variadic", EntryPoint="sum")] public static extern int sum_one(int a); + [DllImport("variadic", EntryPoint="sum")] public static extern int sum_two(int a, int b); + [DllImport("variadic", EntryPoint="sum")] public static extern int sum_three(int a, int b, int c); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj b/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj index 371aaa7dcca46c..d65c69a4ba4aba 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/WasmBasicTestApp.csproj @@ -4,6 +4,8 @@ browser-wasm Exe true + + $(NoWarn);CS0169 @@ -15,7 +17,7 @@ - + diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js index e82ec4c46efd37..20f300f8867ed4 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js @@ -151,6 +151,9 @@ switch (testCase) { case "OverrideBootConfigName": dotnet.withConfigSrc("boot.json"); break; + case "MainWithArgs": + dotnet.withApplicationArgumentsFromQuery(); + break; } const { setModuleImports, Module, getAssemblyExports, getConfig, INTERNAL } = await dotnet.create(); @@ -200,6 +203,7 @@ try { break; case "OutErrOverrideWorks": case "DotnetRun": + case "MainWithArgs": dotnet.run(); break; case "DebugLevelTest": diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/Library/Json.cs b/src/mono/wasm/testassets/WasmBasicTestApp/Json/Json.cs similarity index 100% rename from src/mono/wasm/testassets/WasmBasicTestApp/Library/Json.cs rename to src/mono/wasm/testassets/WasmBasicTestApp/Json/Json.cs diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/Library/Json.csproj b/src/mono/wasm/testassets/WasmBasicTestApp/Json/Json.csproj similarity index 100% rename from src/mono/wasm/testassets/WasmBasicTestApp/Library/Json.csproj rename to src/mono/wasm/testassets/WasmBasicTestApp/Json/Json.csproj diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.cs b/src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.cs new file mode 100644 index 00000000000000..a1ed50130d7136 --- /dev/null +++ b/src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.cs @@ -0,0 +1,5 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +// Empty external library that is not referenced by default by the app +// this file can be updated using ReplaceFile or UpdateFile if needed \ No newline at end of file diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.csproj b/src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.csproj new file mode 100644 index 00000000000000..3d5e0e2093c1a9 --- /dev/null +++ b/src/mono/wasm/testassets/WasmBasicTestApp/Library/Library.csproj @@ -0,0 +1,7 @@ + + + net9.0 + Library + true + + diff --git a/src/mono/wasm/testassets/native-libs/local.c b/src/mono/wasm/testassets/native-libs/local.c index df7987bb8f38df..125ee7c4b704b1 100644 --- a/src/mono/wasm/testassets/native-libs/local.c +++ b/src/mono/wasm/testassets/native-libs/local.c @@ -6,5 +6,5 @@ void UnmanagedFunc() int ret = 0; printf("UnmanagedFunc calling ManagedFunc\n"); ret = ManagedFunc(123); - printf("ManagedFunc returned %d\n", ret); + printf("TestOutput -> ManagedFunc returned %d\n", ret); } From e63800e7575a58b57790799c01f760e9d5a6b799 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 8 Nov 2024 07:52:32 +0000 Subject: [PATCH 036/104] `NonWasmTemplateBuildTests`: done --- src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs index 4badc556b7f32b..97af32aaf45721 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs @@ -11,7 +11,7 @@ namespace Wasm.Build.Tests; -public class NonWasmTemplateBuildTests : TestMainJsTestBase +public class NonWasmTemplateBuildTests : WasmTemplateTestsBase { public NonWasmTemplateBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -23,8 +23,8 @@ public NonWasmTemplateBuildTests(ITestOutputHelper output, SharedBuildPerTestCla // So, copy the reference for latest TFM, and add that back with the // TFM=DefaultTargetFramework // - // This is useful for the case when we are on tfm=net7.0, but sdk, and packages - // are really 8.0 . + // This is useful for the case when we are on tfm=net8.0, but sdk, and packages + // are really 9.0 . private const string s_latestTargetFramework = "net9.0"; private const string s_previousTargetFramework = "net8.0"; private static string s_directoryBuildTargetsForPreviousTFM = From 0279b785b4478670a24f6aadb336836c6b2a82af Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 09:07:17 +0000 Subject: [PATCH 037/104] `SatelliteAssembliesTests`: done --- .../SatelliteAssembliesTests.cs | 325 +++++++----------- .../testassets/EntryPoints/CultureResource.cs | 40 +++ .../LibraryWithResources.csproj | 2 +- 3 files changed, 167 insertions(+), 200 deletions(-) create mode 100644 src/mono/wasm/testassets/EntryPoints/CultureResource.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index ecb59aaad77c61..025143b1a52044 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -12,213 +12,140 @@ namespace Wasm.Build.Tests { - public class SatelliteAssembliesTests : TestMainJsTestBase + public class SatelliteAssembliesTests : WasmTemplateTestsBase { public SatelliteAssembliesTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - // public static IEnumerable SatelliteAssemblyTestData(bool aot, bool relinking) - // => ConfigWithAOTData(aot) - // .Multiply( - // new object?[] { relinking, "es-ES" }, - // new object?[] { relinking, null }, - // new object?[] { relinking, "ja-JP" }) - // .UnwrapItemsAsArrays(); - - // [Theory] - // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false, RunHost.All })] - // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true, RunHost.All })] - // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false, RunHost.All })] - // public void ResourcesFromMainAssembly(ProjectInfo buildArgs, - // bool nativeRelink, - // string? argCulture, - // RunHost host, - // string id) - // { - // string projectName = $"sat_asm_from_main_asm"; - // // Release+publish defaults to native relinking - // bool dotnetWasmFromRuntimePack = !nativeRelink && !buildArgs.AOT && buildArgs.Configuration != "Release"; - - // string extraProperties = (nativeRelink ? $"true" : string.Empty) - // // make ASSERTIONS=1 so that we test with it - // + $"-O0 -sASSERTIONS=1" - // + $"-O1"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, - // projectTemplate: s_resourcesProjectTemplate, - // extraProperties: extraProperties); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => - // { - // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); - // CreateProgramForCultureTest(_projectDir!, $"{projectName}.resx.words", "TestClass"); - // }, - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack)); - - // RunAndTestWasmApp( - // buildArgs, expectedExitCode: 42, - // args: argCulture, - // host: host, id: id, - // // check that downloading assets doesn't have timing race conditions - // extraXHarnessMonoArgs: host is RunHost.Chrome ? "--fetch-random-delay=200" : string.Empty); - // } - - // [Theory] - // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false, RunHost.All })] - // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true, RunHost.All })] - // [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false, RunHost.All })] - // public void ResourcesFromProjectReference(ProjectInfo buildArgs, - // bool nativeRelink, - // string? argCulture, - // RunHost host, - // string id) - // { - // string projectName = $"SatelliteAssemblyFromProjectRef"; - // bool dotnetWasmFromRuntimePack = !nativeRelink && !buildArgs.AOT; - - // string extraProperties = $"{(nativeRelink ? "true" : "false")}" - // // make ASSERTIONS=1 so that we test with it - // + $"-O0 -sASSERTIONS=1" - // + $"-O1"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs, - // projectTemplate: s_resourcesProjectTemplate, - // extraProperties: extraProperties, - // extraItems: $""); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // DotnetWasmFromRuntimePack: dotnetWasmFromRuntimePack, - // InitProject: () => - // { - // string rootDir = _projectDir!; - // _projectDir = Path.Combine(rootDir, projectName); - - // Directory.CreateDirectory(_projectDir); - // Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, projectName), rootDir); - - // // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't - // // affect the non-wasm library project - // File.Move(Path.Combine(rootDir, "Directory.Build.props"), Path.Combine(_projectDir, "Directory.Build.props")); - // File.Move(Path.Combine(rootDir, "Directory.Build.targets"), Path.Combine(_projectDir, "Directory.Build.targets")); - // if (UseWBTOverridePackTargets) - // File.Move(Path.Combine(rootDir, "WasmOverridePacks.targets"), Path.Combine(_projectDir, "WasmOverridePacks.targets")); - - // CreateProgramForCultureTest(_projectDir, "LibraryWithResources.resx.words", "LibraryWithResources.Class1"); - - // // The root D.B* should be empty - // File.WriteAllText(Path.Combine(rootDir, "Directory.Build.props"), ""); - // File.WriteAllText(Path.Combine(rootDir, "Directory.Build.targets"), ""); - // })); - - // RunAndTestWasmApp(buildArgs, - // expectedExitCode: 42, - // args: argCulture, - // host: host, id: id); - // } - -// #pragma warning disable xUnit1026 -// [Theory] -// [BuildAndRun(aot: true)] -// public void CheckThatSatelliteAssembliesAreNotAOTed(ProjectInfo buildArgs, string id) -// { -// string projectName = $"check_sat_asm_not_aot"; -// buildArgs = buildArgs with { ProjectName = projectName }; -// buildArgs = ExpandBuildArgs(buildArgs, -// projectTemplate: s_resourcesProjectTemplate, -// extraProperties: $@" -// -O1 -// -O1 -// false", // -O0 can cause aot-instances.dll to blow up, and fail to compile, and it is not really needed here -// extraItems: $""); - -// BuildProject(buildArgs, -// id: id, -// new BuildProjectOptions( -// InitProject: () => CreateProgramForCultureTest(_projectDir!, $"{projectName}.words", "TestClass"), -// DotnetWasmFromRuntimePack: false)); - -// var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) -// .Select(path => Path.GetFileName(path)) -// .ToArray(); - -// // sanity check, in case we change file extensions -// Assert.Contains($"{projectName}.dll.bc", bitCodeFileNames); - -// Assert.Empty(bitCodeFileNames.Where(file => file.EndsWith(".resources.dll.bc"))); -// } -// #pragma warning restore xUnit1026 - -// private void CreateProgramForCultureTest(string dir, string resourceName, string typeName) -// => File.WriteAllText(Path.Combine(dir, "Program.cs"), -// s_cultureResourceTestProgram -// .Replace("##RESOURCE_NAME##", resourceName) -// .Replace("##TYPE_NAME##", typeName)); - -// private const string s_resourcesProjectTemplate = -// @$" -// -// {DefaultTargetFramework} -// browser-wasm -// Exe -// true -// test-main.js -// ##EXTRA_PROPERTIES## -// -// -// ##EXTRA_ITEMS## -// -// ##INSERT_AT_END## -// "; - -// private static string s_cultureResourceTestProgram = @" -// using System; -// using System.Runtime.CompilerServices; -// using System.Globalization; -// using System.Resources; -// using System.Threading; - -// namespace ResourcesTest -// { -// public class TestClass -// { -// public static int Main(string[] args) -// { -// string expected; -// if (args.Length == 1) -// { -// string cultureToTest = args[0]; -// var newCulture = new CultureInfo(cultureToTest); -// Thread.CurrentThread.CurrentCulture = newCulture; -// Thread.CurrentThread.CurrentUICulture = newCulture; - -// if (cultureToTest == ""es-ES"") -// expected = ""hola""; -// else if (cultureToTest == ""ja-JP"") -// expected = ""\u3053\u3093\u306B\u3061\u306F""; -// else -// throw new Exception(""Cannot determine the expected output for {cultureToTest}""); - -// } else { -// expected = ""hello""; -// } + public static IEnumerable SatelliteAssemblyTestData(bool aot, bool relinking) + => ConfigWithAOTData(aot) + .Multiply( + new object?[] { relinking, "es-ES" }, + new object?[] { relinking, null }, + new object?[] { relinking, "ja-JP" }) + .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .UnwrapItemsAsArrays(); + + [Theory] + [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false })] + [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true })] + [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false })] + public async void ResourcesFromMainAssembly(string config, bool aot, bool nativeRelink, string? argCulture) + { + string prefix = $"sat_asm_from_main_asm"; + string extraProperties = (nativeRelink ? $"true" : string.Empty) + // make ASSERTIONS=1 so that we test with it + + $"-O0 -sASSERTIONS=1" + + $"-O1"; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); + CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); + + bool isPublish = true; + (_, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: nativeRelink), + IsPublish: isPublish + )); + RunResult result = await RunForPublishWithWebServer(new( + info.Configuration, + TestScenario: "DotnetRun", + ExpectedExitCode: 42, + Locale: argCulture ?? "en-US", + // check that downloading assets doesn't have timing race conditions + ExtraArgs: "--fetch-random-delay=200" + )); + } -// var currentCultureName = Thread.CurrentThread.CurrentCulture.Name; + [Theory] + [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false })] + [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true })] + [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false })] + public async void ResourcesFromProjectReference(string config, bool aot, bool nativeRelink, string? argCulture) + { + string prefix = $"SatelliteAssemblyFromProjectRef"; + string extraProperties = $"{(nativeRelink ? "true" : "false")}" + // make ASSERTIONS=1 so that we test with it + + $"-O0 -sASSERTIONS=1" + + $"-O1"; + string extraItems = $""; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties, extraItems: extraItems); + // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't + // affect the non-wasm library project + File.Move(Path.Combine(_projectDir!, "..", "Directory.Build.props"), Path.Combine(_projectDir!, "Directory.Build.props")); + File.Move(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), Path.Combine(_projectDir!, "Directory.Build.targets")); + if (UseWBTOverridePackTargets) + File.Move(Path.Combine(BuildEnvironment.TestDataPath, "WasmOverridePacks.targets"), Path.Combine(_projectDir!, "WasmOverridePacks.targets")); + Utils.DirectoryCopy( + Path.Combine(BuildEnvironment.TestAssetsPath, "SatelliteAssemblyFromProjectRef/LibraryWithResources"), + Path.Combine(_projectDir!, "..", "LibraryWithResources")); + CreateProgramForCultureTest("LibraryWithResources.resx.words", "LibraryWithResources.Class1"); + // move src/mono/wasm/testassets/SatelliteAssemblyFromProjectRef/LibraryWithResources to the test project + // The root D.B* should be empty + File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.props"), ""); + File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), ""); + NativeFilesType dotnetWasmFileType = nativeRelink ? NativeFilesType.Relinked : aot ? NativeFilesType.AOT : NativeFilesType.FromRuntimePack; + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: dotnetWasmFileType, + IsPublish: isPublish + )); + + await RunForPublishWithWebServer( + new(Configuration: info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: argCulture ?? "en-US")); + } -// var rm = new ResourceManager(""##RESOURCE_NAME##"", typeof(##TYPE_NAME##).Assembly); -// Console.WriteLine($""For '{currentCultureName}' got: {rm.GetString(""hello"")}""); +#pragma warning disable xUnit1026 + [Theory] + [BuildAndRun(aot: true, config: "Release")] + public void CheckThatSatelliteAssembliesAreNotAOTed(string config, bool aot) + { + string extraProperties = $@"-O1 + -O1 + false"; // -O0 can cause aot-instances.dll to blow up, and fail to compile, and it is not really needed here + string extraItems = $""; + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "check_sat_asm_not_aot", "App", extraProperties: extraProperties, extraItems: extraItems); + CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); + + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), + IsPublish: isPublish + )); + + var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) + .Select(path => Path.GetFileName(path)) + .ToArray(); + + // sanity check, in case we change file extensions + Assert.Contains($"{info.ProjectName}.dll.bc", bitCodeFileNames); + + Assert.Empty(bitCodeFileNames.Where(file => file.EndsWith(".resources.dll.bc"))); + } +#pragma warning restore xUnit1026 -// return rm.GetString(""hello"") == expected ? 42 : -1; -// } -// } -// }"; + private void CreateProgramForCultureTest(string resourceName, string typeName) + { + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "CultureResource.cs")); + var replacements = new Dictionary { + {"##RESOURCE_NAME##", resourceName}, + {"##TYPE_NAME##", typeName} + }; + UpdateFile(programRelativePath, replacements); + } } } diff --git a/src/mono/wasm/testassets/EntryPoints/CultureResource.cs b/src/mono/wasm/testassets/EntryPoints/CultureResource.cs new file mode 100644 index 00000000000000..ca928e32200a45 --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/CultureResource.cs @@ -0,0 +1,40 @@ +using System; +using System.Runtime.CompilerServices; +using System.Globalization; +using System.Resources; +using System.Threading; + +namespace ResourcesTest +{ + public class TestClass + { + public static int Main(string[] args) + { + string expected; + if (args.Length == 1) + { + string cultureToTest = args[0]; + var newCulture = new CultureInfo(cultureToTest); + Thread.CurrentThread.CurrentCulture = newCulture; + Thread.CurrentThread.CurrentUICulture = newCulture; + + if (cultureToTest == "es-ES") + expected = "hola"; + else if (cultureToTest == "ja-JP") + expected = "\u3053\u3093\u306B\u3061\u306F"; + else + throw new Exception($"Cannot determine the expected output for {cultureToTest}"); + + } else { + expected = "hello"; + } + + var currentCultureName = Thread.CurrentThread.CurrentCulture.Name; + + var rm = new ResourceManager("##RESOURCE_NAME##", typeof(##TYPE_NAME##).Assembly); + Console.WriteLine($"For '{currentCultureName}' got: {rm.GetString("hello")}"); + + return rm.GetString("hello") == expected ? 42 : -1; + } + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/SatelliteAssemblyFromProjectRef/LibraryWithResources/LibraryWithResources.csproj b/src/mono/wasm/testassets/SatelliteAssemblyFromProjectRef/LibraryWithResources/LibraryWithResources.csproj index c6c44c64130006..3043227ce00b5f 100644 --- a/src/mono/wasm/testassets/SatelliteAssemblyFromProjectRef/LibraryWithResources/LibraryWithResources.csproj +++ b/src/mono/wasm/testassets/SatelliteAssemblyFromProjectRef/LibraryWithResources/LibraryWithResources.csproj @@ -1,5 +1,5 @@ - net7.0 + net9.0 From 79c6963b685a1ac58021ad3ef9fb5938cedd376b Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 09:26:49 +0000 Subject: [PATCH 038/104] `RebuildTests`: done. `TestMainJsTestBase` is not used anymore. --- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 77 +++++++-------- .../Wasm.Build.Tests/TestMainJsTestBase.cs | 96 ------------------- 2 files changed, 36 insertions(+), 137 deletions(-) delete mode 100644 src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index f7c272e32782bd..0a03b7d43795c7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -14,59 +14,54 @@ namespace Wasm.Build.Tests { - public class RebuildTests : TestMainJsTestBase + public class RebuildTests : WasmTemplateTestsBase { public RebuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - public static IEnumerable NonNativeDebugRebuildData() - => ConfigWithAOTData(aot: false, config: "Debug") - .UnwrapItemsAsArrays().ToList(); - - // [Theory] - // [MemberData(nameof(NonNativeDebugRebuildData))] - // public async Task NoOpRebuild(ProjectInfo buildArgs, RunHost host, string id) - // { - // string projectName = $"rebuild_{buildArgs.Configuration}_{buildArgs.AOT}"; - - // buildArgs = buildArgs with { ProjectName = projectName }; - // buildArgs = ExpandBuildArgs(buildArgs); - - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // InitProject: () => File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), s_mainReturns42), - // DotnetWasmFromRuntimePack: true, - // CreateProject: true)); - - // Run(); + [Theory] + [BuildAndRun(aot: false, config: "Debug")] + public async Task NoOpRebuild(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild", "App"); + UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); - // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - // throw new XunitException($"Test bug: could not get the build product in the cache"); + RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42); + await RunForPublishWithWebServer(runOptions); - // File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) + throw new XunitException($"Test bug: could not get the build product in the cache"); - // // artificial delay to have new enough timestamps - // await Task.Delay(5000); + File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); - // _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); + // artificial delay to have new enough timestamps + await Task.Delay(5000); - // // no-op Rebuild - // BuildProject(buildArgs, - // id: id, - // new BuildProjectOptions( - // DotnetWasmFromRuntimePack: true, - // CreateProject: false, - // UseCache: false)); + _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); - // Run(); + // no-op Rebuild + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false + )); - // void Run() => RunAndTestWasmApp( - // buildArgs, buildDir: _projectDir, expectedExitCode: 42, - // test: output => {}, - // host: host, id: id); - // } + await RunForPublishWithWebServer(runOptions); + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs deleted file mode 100644 index f27639f2eb8d86..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/TestMainJsTestBase.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -using System; -using System.Collections.Generic; -using System.IO; -using Xunit.Abstractions; -using Xunit.Sdk; - -namespace Wasm.Build.Tests; - -public abstract class TestMainJsTestBase : BuildTestBase -{ - protected WasmSdkBasedProjectProvider _provider; - protected TestMainJsTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(new WasmSdkBasedProjectProvider(output, DefaultTargetFramework), output, buildContext) - { - _provider = GetProvider(); - } - - // public (string projectDir, string buildOutput) BuildProject(ProjectInfo buildArgs, - // string id, - // BuildProjectOptions options) - // { - // string msgPrefix = options.Label != null ? $"[{options.Label}] " : string.Empty; - // if (options.UseCache && _buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - // { - // _testOutput.WriteLine($"Using existing build found at {product.ProjectDir}, with build log at {product.LogFile}"); - - // if (!product.Result) - // throw new XunitException($"Found existing build at {product.ProjectDir}, but it had failed. Check build log at {product.LogFile}"); - // _projectDir = product.ProjectDir; - - // // use this test's id for the run logs - // _logPath = Path.Combine(s_buildEnv.LogRootPath, id); - // return (_projectDir, product.BuildOutput); - // } - - // if (options.CreateProject) - // { - // InitPaths(id); - // InitProjectDir(_projectDir); - // options.InitProject?.Invoke(); - - // File.WriteAllText(Path.Combine(_projectDir, $"{buildArgs.ProjectName}.csproj"), buildArgs.ProjectFileContents); - // File.Copy( - // Path.Combine( - // AppContext.BaseDirectory, - // options.TargetFramework == "net7.0" - // ? "data/test-main-7.0.js" - // : "test-main.js" - // ), - // Path.Combine(_projectDir, "test-main.js") - // ); - - // File.WriteAllText(Path.Combine(_projectDir!, "index.html"), @""); - // } - // else if (_projectDir is null) - // { - // throw new Exception("_projectDir should be set, to use options.createProject=false"); - // } - - // if (options.ExtraBuildEnvironmentVariables is null) - // options = options with { ExtraBuildEnvironmentVariables = new Dictionary() }; - - // // TODO: reenable this when the SDK supports targetting net10.0 - // //options.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; - - // try - // { - // (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(id, - // buildArgs.Configuration, - // options, - // string.Join(" ", buildArgs.ExtraBuildArgs)); - - // if (options.ExpectSuccess && options.AssertAppBundle) - // { - // ProjectProviderBase.AssertRuntimePackPath(res.Output, options.TargetFramework ?? DefaultTargetFramework); - // _provider.AssertWasmSdkBundle(options); - // } - - // if (options.UseCache) - // _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir, logFilePath, true, res.Output)); - - // return (_projectDir, res.Output); - // } - // catch (Exception ex) - // { - // if (options.UseCache) - // _buildContext.CacheBuild(buildArgs, new BuildProduct(_projectDir, /*logFilePath*/"unset-log-path", false, $"The build attempt resulted in exception: {ex}.")); - // throw; - // } - // } -} From 42aae4240ed5ff7f73337bf96dc63f6e6a92bf77 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 10:44:17 +0000 Subject: [PATCH 039/104] `WasmTemplateTests`: done. --- .../Templates/WasmTemplateTests.cs | 528 +++++++++--------- .../Templates/WasmTemplateTestsBase.cs | 3 +- 2 files changed, 258 insertions(+), 273 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 43f3b7f403f206..2586dcbf8148e3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -22,251 +22,232 @@ public WasmTemplateTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur { } - // private BuildProjectOptions _basePublishProjectOptions = new BuildProjectOptions( - // DotnetWasmFromRuntimePack: false, - // CreateProject: false, - // Publish: true - // ); - // private BuildProjectOptions _baseBuildProjectOptions = new BuildProjectOptions( - // DotnetWasmFromRuntimePack: true, - // CreateProject: false, - // Publish: false - // ); - - // [Theory, TestCategory("no-fingerprinting")] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void BrowserBuildThenPublish(string config) - // { - // string id = $"browser_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - - // UpdateBrowserProgramFile(); - // UpdateBrowserMainJs(); - - // var buildArgs = new ProjectInfo(projectName, config, false, id, null); - - // AddItemsPropertiesToProject(projectFile, - // insertAtEnd: - // """ - // - // - // <_LinkedOutFile Include="$(IntermediateOutputPath)\linked\*.dll" /> - // - // - // - // """ - // ); - - // buildArgs = ExpandBuildArgs(buildArgs); - // BuildTemplateProject(buildArgs, id: id, _baseBuildProjectOptions); - - // if (!_buildContext.TryGetBuildFor(buildArgs, out BuildProduct? product)) - // throw new XunitException($"Test bug: could not get the build product in the cache"); - - // File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); - - // _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); - - // bool expectRelinking = config == "Release"; - // BuildTemplateProject(buildArgs, - // id: id, - // _basePublishProjectOptions with - // { - // UseCache = false, - // DotnetWasmFromRuntimePack = !expectRelinking, - // } - // ); - // } - - // public static TheoryData TestDataForAppBundleDir() - // { - // var data = new TheoryData(); - // AddTestData(runOutsideProjectDirectory: false); - // AddTestData(runOutsideProjectDirectory: true); - - // void AddTestData(bool runOutsideProjectDirectory) - // { - // // FIXME: Disabled for `main` right now, till 7.0 gets the fix - // data.Add(runOutsideProjectDirectory, string.Empty); - // data.Add(runOutsideProjectDirectory, - // $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); - // data.Add(runOutsideProjectDirectory, - // $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); - // } - - // return data; - // } - - // [Theory, TestCategory("no-fingerprinting")] - // [MemberData(nameof(TestDataForAppBundleDir))] - // [ActiveIssue("https://github.com/dotnet/runtime/issues/108107")] - // public async Task RunWithDifferentAppBundleLocations(bool runOutsideProjectDirectory, string extraProperties) - // => await BrowserRunTwiceWithAndThenWithoutBuildAsync("Release", extraProperties, runOutsideProjectDirectory); - - // private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, string extraProperties = "", bool runOutsideProjectDirectory = false) - // { - // string id = $"browser_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - - // UpdateBrowserProgramFile(); - // UpdateBrowserMainJs(); - - // if (!string.IsNullOrEmpty(extraProperties)) - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir!; - - // { - // using var runCommand = new RunCommand(s_buildEnv, _testOutput) - // .WithWorkingDirectory(workingDir); - - // await using var runner = new BrowserRunner(_testOutput); - // var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --project \"{projectFile}\" --forward-console"); - // await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); - // Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); - // } - - // { - // using var runCommand = new RunCommand(s_buildEnv, _testOutput) - // .WithWorkingDirectory(workingDir); - - // await using var runner = new BrowserRunner(_testOutput); - // var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{projectFile}\" --forward-console"); - // await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); - // Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); - // } - // } - - // public static IEnumerable BrowserBuildAndRunTestData() - // { - // yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, DefaultRuntimeAssetsRelativePath }; - // yield return new object?[] { "-f net9.0", "net9.0", DefaultRuntimeAssetsRelativePath }; - - // if (EnvironmentVariables.WorkloadsTestPreviousVersions) - // yield return new object?[] { "-f net8.0", "net8.0", DefaultRuntimeAssetsRelativePath }; - - // // ActiveIssue("https://github.com/dotnet/runtime/issues/90979") - // // yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, "./" }; - // // yield return new object?[] { "-f net8.0", "net8.0", "./" }; - // } - - // [Theory] - // [MemberData(nameof(BrowserBuildAndRunTestData))] - // public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework, string runtimeAssetsRelativePath) - // { - // string config = "Debug"; - // string id = $"browser_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser", extraNewArgs, addFrameworkArg: extraNewArgs.Length == 0); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - // string extraProperties = runtimeAssetsRelativePath == DefaultRuntimeAssetsRelativePath ? - // "" : - // $"{runtimeAssetsRelativePath}"; - // AddItemsPropertiesToProject(projectFile, extraProperties); - - // if (targetFramework != "net8.0") - // UpdateBrowserProgramFile(); - // UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath); - - // using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - // .WithWorkingDirectory(_projectDir!); - // cmd.Execute($"build -c {config} -bl:{Path.Combine(s_buildEnv.LogRootPath, $"{id}.binlog")} {(runtimeAssetsRelativePath != DefaultRuntimeAssetsRelativePath ? "-p:WasmRuntimeAssetsLocation=" + runtimeAssetsRelativePath : "")}") - // .EnsureSuccessful(); - // var buildArgs = new ProjectInfo(projectName, config, false, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // BuildTemplateProject(buildArgs, id: id, _baseBuildProjectOptions); - - // string runOutput = await RunBuiltBrowserApp(config, projectFile); - // Assert.Contains("Hello, Browser!", runOutput); - // } - - // [Theory] - // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] - // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] - // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] - // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] - // public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) - // { - // string id = $"{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - // string projectDirectory = Path.GetDirectoryName(projectFile)!; - - // UpdateBrowserProgramFile(); - // UpdateBrowserMainJs(); - - // string extraPropertiesForDBP = string.Empty; - // string frameworkDir = GetBinFrameworkDir(config, forPublish: false); - - // var buildOptions = _baseBuildProjectOptions with - // { - // BinFrameworkDir = frameworkDir - // }; - // if (useArtifacts) - // { - // extraPropertiesForDBP += "true."; - // buildOptions = buildOptions with - // { - // // browser app does not allow appending RID - // BinFrameworkDir = Path.Combine( - // projectDirectory, - // "bin", - // id, - // config.ToLower(), - // "wwwroot", - // "_framework") - // }; - // } - // if (appendRID) - // { - // extraPropertiesForDBP += "true"; - // } - // // UseArtifactsOutput cannot be set in a project file, due to MSBuild ordering constraints. - // string propsPath = Path.Combine(projectDirectory, "Directory.Build.props"); - // AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); - - // var buildArgs = new ProjectInfo(projectName, config, false, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // BuildTemplateProject(buildArgs, id: id, buildOptions); - - // await RunBuiltBrowserApp(config, projectFile, extraArgs: "x y z"); - // } - - // [Theory] - // [InlineData("", true)] // Default case - // [InlineData("false", false)] // the other case - // public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) - // { - // string config = "Release"; - // string id = $"strip_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - // string projectDirectory = Path.GetDirectoryName(projectFile)!; - // bool aot = true; - - // UpdateBrowserProgramFile(); - // UpdateBrowserMainJs(); - - // string extraProperties = "true"; - // if (!string.IsNullOrEmpty(stripILAfterAOT)) - // extraProperties += $"{stripILAfterAOT}"; - // AddItemsPropertiesToProject(projectFile, extraProperties); - - // var buildArgs = new ProjectInfo(projectName, config, aot, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // BuildTemplateProject(buildArgs, - // id: id, - // _basePublishProjectOptions with { - // UseCache = false, - // AssertAppBundle = false - // }); - - // await RunBuiltBrowserApp(config, projectFile); - // string frameworkDir = GetBinFrameworkDir(config, forPublish: true); - // string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); - // TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); - // } + [Theory, TestCategory("no-fingerprinting")] + [InlineData("Debug")] + [InlineData("Release")] + public void BrowserBuildThenPublish(string config) + { + string atEnd = """ + + + <_LinkedOutFile Include="$(IntermediateOutputPath)\linked\*.dll" /> + + + + """; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false, "browser", insertAtEnd: atEnd); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + bool isPublish = false; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); + + if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) + throw new XunitException($"Test bug: could not get the build product in the cache"); + + File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + + _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); + + isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false + )); + } + + public static TheoryData TestDataForAppBundleDir() + { + var data = new TheoryData(); + AddTestData(runOutsideProjectDirectory: false); + AddTestData(runOutsideProjectDirectory: true); + + void AddTestData(bool runOutsideProjectDirectory) + { + // FIXME: Disabled for `main` right now, till 7.0 gets the fix + data.Add(runOutsideProjectDirectory, string.Empty); + data.Add(runOutsideProjectDirectory, + $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); + data.Add(runOutsideProjectDirectory, + $"{Path.Combine(BuildEnvironment.TmpPath, Path.GetRandomFileName())}"); + } + + return data; + } + + [Theory, TestCategory("no-fingerprinting")] + [MemberData(nameof(TestDataForAppBundleDir))] + [ActiveIssue("https://github.com/dotnet/runtime/issues/108107")] + public async Task RunWithDifferentAppBundleLocations(bool runOutsideProjectDirectory, string extraProperties) + => await BrowserRunTwiceWithAndThenWithoutBuildAsync("Release", extraProperties, runOutsideProjectDirectory); + + private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, string extraProperties = "", bool runOutsideProjectDirectory = false) + { + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false, "browser", extraProperties: extraProperties); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir!; + + { + using var runCommand = new RunCommand(s_buildEnv, _testOutput) + .WithWorkingDirectory(workingDir); + + await using var runner = new BrowserRunner(_testOutput); + var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --project \"{info.ProjectName}.csproj\" --forward-console"); + await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); + Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); + } + + { + using var runCommand = new RunCommand(s_buildEnv, _testOutput) + .WithWorkingDirectory(workingDir); + + await using var runner = new BrowserRunner(_testOutput); + var page = await runner.RunAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{info.ProjectName}.csproj\" --forward-console"); + await runner.WaitForExitMessageAsync(TimeSpan.FromMinutes(2)); + Assert.Contains("Hello, Browser!", string.Join(Environment.NewLine, runner.OutputLines)); + } + } + + public static IEnumerable BrowserBuildAndRunTestData() + { + yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, DefaultRuntimeAssetsRelativePath }; + yield return new object?[] { "-f net9.0", "net9.0", DefaultRuntimeAssetsRelativePath }; + + if (EnvironmentVariables.WorkloadsTestPreviousVersions) + yield return new object?[] { "-f net8.0", "net8.0", DefaultRuntimeAssetsRelativePath }; + + // ActiveIssue("https://github.com/dotnet/runtime/issues/90979") + // yield return new object?[] { "", BuildTestBase.DefaultTargetFramework, "./" }; + // yield return new object?[] { "-f net8.0", "net8.0", "./" }; + } + + [Theory] + [MemberData(nameof(BrowserBuildAndRunTestData))] + public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework, string runtimeAssetsRelativePath) + { + string config = "Debug"; + string extraProperties = runtimeAssetsRelativePath == DefaultRuntimeAssetsRelativePath ? + "" : + $"{runtimeAssetsRelativePath}"; + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot: false, + "browser", + extraProperties: extraProperties, + extraArgs: extraNewArgs, + addFrameworkArg: extraNewArgs.Length == 0 + ); + + if (targetFramework != "net8.0") + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath); + + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false + )); + + var runOutput = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + Assert.Contains("Hello, Browser!", runOutput.TestOutput); + } + + [Theory] + [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] + [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] + [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] + [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] + public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) + { + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false); + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + bool isPublish = false; + string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath) ?? ""; + // browser app does not allow appending RID + string frameworkDir = useArtifacts ? + Path.Combine( + projectDirectory, "bin", info.ProjectName, config.ToLower(), "wwwroot", "_framework") : + GetBinFrameworkDir(config, isPublish); + + string extraPropertiesForDBP = string.Empty; + if (useArtifacts) + { + extraPropertiesForDBP += "true."; + } + if (appendRID) + { + extraPropertiesForDBP += "true"; + } + // UseArtifactsOutput cannot be set in a project file, due to MSBuild ordering constraints. + string propsPath = Path.Combine(projectDirectory, "Directory.Build.props"); + AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); + + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: frameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); + + await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42, ExtraArgs: "x y z")); + } + + [Theory] + [InlineData("", true)] // Default case + [InlineData("false", false)] // the other case + public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) + { + string config = "Release"; + bool aot = true; + string extraProperties = "true"; + if (!string.IsNullOrEmpty(stripILAfterAOT)) + extraProperties += $"{stripILAfterAOT}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "strip", extraProperties: extraProperties); + + UpdateBrowserProgramFile(); + UpdateBrowserMainJs(); + + bool isPublish = true; + string frameworkDir = GetBinFrameworkDir(config, forPublish: true); + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: frameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + UseCache: false, + AssertAppBundle: false + )); + await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42)); + string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; + string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); + TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); + } internal static void TestWasmStripILAfterAOTOutput(string objBuildDir, string frameworkDir, bool expectILStripping, ITestOutputHelper testOutput) { @@ -321,32 +302,35 @@ internal static void TestWasmStripILAfterAOTOutput(string objBuildDir, string fr } } - // [Theory] - // [InlineData(false)] - // [InlineData(true)] - // public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) - // { - // string config = "Release"; - // string shouldCopy = copyOutputSymbolsToPublishDirectory.ToString().ToLower(); - // string id = $"publishpdb_{shouldCopy}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "wasmbrowser"); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - // var buildArgs = new ProjectInfo(projectName, config, false, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // AddItemsPropertiesToProject(projectFile, - // extraProperties: $"{shouldCopy}"); - - // BuildTemplateProject(buildArgs, buildArgs.Id, _basePublishProjectOptions); - // string publishPath = GetBinFrameworkDir(config, forPublish: true); - // AssertFile(".pdb"); - // AssertFile(".pdb.gz"); - // AssertFile(".pdb.br"); - - // void AssertFile(string suffix) - // { - // var fileName = Directory.EnumerateFiles(publishPath, $"*{suffix}").FirstOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith(id)); - // Assert.True(copyOutputSymbolsToPublishDirectory == (fileName != null && File.Exists(fileName)), $"The {fileName} file {(copyOutputSymbolsToPublishDirectory ? "should" : "shouldn't")} exist in publish folder"); - // } - // } + [Theory] + [InlineData(false)] + [InlineData(true)] + public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) + { + string config = "Release"; + string shouldCopy = copyOutputSymbolsToPublishDirectory.ToString().ToLower(); + string extraProperties = $"{shouldCopy}"; + ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false, "publishpdb", extraProperties: extraProperties); + + bool isPublish = true; + string publishPath = GetBinFrameworkDir(config, forPublish: true); + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: publishPath, + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); + AssertFile(".pdb"); + AssertFile(".pdb.gz"); + AssertFile(".pdb.br"); + + void AssertFile(string suffix) + { + var fileName = Directory.EnumerateFiles(publishPath, $"*{suffix}").FirstOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith(info.ProjectName)); + Assert.True(copyOutputSymbolsToPublishDirectory == (fileName != null && File.Exists(fileName)), $"The {fileName} file {(copyOutputSymbolsToPublishDirectory ? "should" : "shouldn't")} exist in publish folder"); + } + } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index a84201789d8ad2..79202d33777708 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -29,7 +29,8 @@ public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFi private Dictionary browserProgramReplacements = new Dictionary { { "while(true)", $"int i = 0;{Environment.NewLine}while(i++ < 0)" }, // the test has to be fast, skip the loop - { "partial class StopwatchSample", $"return 42;{Environment.NewLine}partial class StopwatchSample" } + { "partial class StopwatchSample", $"return 42;{Environment.NewLine}partial class StopwatchSample" }, + { "Hello, Browser!", "TestOutput -> Hello, Browser!" } }; private string GetProjectName(string idPrefix, string config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) => From 2f1fd89321da33f299a5c1938eec100583c55901 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:06:00 +0000 Subject: [PATCH 040/104] `NativeBuildTests`: done --- .../Templates/NativeBuildTests.cs | 158 +++++++++--------- .../wasm/testassets/marshal_ilgen_test.cs | 2 +- 2 files changed, 80 insertions(+), 80 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index 65739f8a32bf5f..9732edaf4fb6cb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -18,85 +18,85 @@ public NativeBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture { } - // [Theory] - // [InlineData(true)] - // [InlineData(false)] - // public void BuildWithUndefinedNativeSymbol(bool allowUndefined) - // { - // string id = $"UndefinedNativeSymbol_{(allowUndefined ? "allowed" : "disabled")}_{GetRandomId()}"; - - // string code = @" - // using System; - // using System.Runtime.InteropServices; - - // call(); - // return 42; - - // [DllImport(""undefined_xyz"")] static extern void call(); - // "; - - // string projectPath = CreateWasmTemplateProject(id); - - // AddItemsPropertiesToProject( - // projectPath, - // extraItems: @$"", - // extraProperties: allowUndefined ? $"true" : null - // ); - - // File.WriteAllText(Path.Combine(_projectDir!, "Program.cs"), code); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); - - // using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); - // CommandResult result = cmd.WithWorkingDirectory(_projectDir!) - // .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - // .ExecuteWithCapturedOutput("build", "-c Release"); - - // if (allowUndefined) - // { - // Assert.True(result.ExitCode == 0, "Expected build to succeed"); - // } - // else - // { - // Assert.False(result.ExitCode == 0, "Expected build to fail"); - // Assert.Contains("undefined symbol: sgfg", result.Output); - // Assert.Contains("Use '-p:WasmAllowUndefinedSymbols=true' to allow undefined symbols", result.Output); - // } - // } - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config) - // { - // string id = $"dllimport_incompatible_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, template: "wasmbrowser"); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - - // string nativeSourceFilename = "incompatible_type.c"; - // string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}"; - // File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode); - - // AddItemsPropertiesToProject( - // projectFile, - // extraItems: "" - // ); - - // UpdateBrowserMainJs(); - // File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs"), - // Path.Combine(_projectDir!, "Program.cs"), - // overwrite: true); - - // var buildArgs = new ProjectInfo(projectName, config, false, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); - // BuildTemplateProject(buildArgs, id: id, new BuildProjectOptions( - // AssertAppBundle: false, - // CreateProject: false, - // Publish: false, - // TargetFramework: DefaultTargetFramework) - // ); - // string runOutput = await RunBuiltBrowserApp(config, projectFile); + [Theory] + [InlineData(true)] + [InlineData(false)] + public void BuildWithUndefinedNativeSymbol(bool allowUndefined) + { + string config = "Release"; + string code = @" + using System; + using System.Runtime.InteropServices; + + call(); + return 42; + + [DllImport(""undefined_xyz"")] static extern void call(); + "; + + string extraItems = @$""; + string extraProperties = allowUndefined ? $"true" : ""; + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot: false, + $"UndefinedNativeSymbol_{(allowUndefined ? "allowed" : "disabled")}", + extraItems: extraItems, + extraProperties: extraProperties + ); + UpdateFile("Program.cs", code); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); + + bool isPublish = false; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), + IsPublish: isPublish, + ExpectSuccess: allowUndefined + )); + + if (!allowUndefined) + { + Assert.Contains("undefined symbol: sgfg", buildOutput); + Assert.Contains("Use '-p:WasmAllowUndefinedSymbols=true' to allow undefined symbols", buildOutput); + } + } - // Assert.Contains("call_needing_marhsal_ilgen got called", runOutput); - // } + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config) + { + string nativeSourceFilename = "incompatible_type.c"; + string extraItems = ""; + ProjectInfo info = CreateWasmTemplateProject( + Template.WasmBrowser, + config, + aot: false, + "dllimport_incompatible", + extraItems: extraItems + ); + string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}"; + File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode); + UpdateBrowserMainJs(); + ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs")); + + bool isPublish = false; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(config, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), + IsPublish: isPublish, + AssertAppBundle: false + )); + + var runOutput = await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42)); + Assert.Contains("call_needing_marhsal_ilgen got called", runOutput.TestOutput); + } } } diff --git a/src/mono/wasm/testassets/marshal_ilgen_test.cs b/src/mono/wasm/testassets/marshal_ilgen_test.cs index 1c52a8b5ee3497..685ae119ccc4a8 100644 --- a/src/mono/wasm/testassets/marshal_ilgen_test.cs +++ b/src/mono/wasm/testassets/marshal_ilgen_test.cs @@ -4,7 +4,7 @@ int[] x = new int[0]; MyClass.call_needing_marhsal_ilgen(x); -Console.WriteLine("call_needing_marhsal_ilgen got called"); +Console.WriteLine("TestOutput -> call_needing_marhsal_ilgen got called"); return 42; From 58d35639aa60dccab21a8841d0c1954d1bae2e4c Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:27:43 +0000 Subject: [PATCH 041/104] Started unifying blazor methods. `AppsettingsTests`: done. --- .../Blazor/AppsettingsTests.cs | 85 +++++++------- .../Blazor/BlazorWasmTestBase.cs | 109 +++++++++++------- .../Templates/WasmTemplateTestsBase.cs | 8 +- 3 files changed, 118 insertions(+), 84 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs index 3749fd7926a347..17455914626177 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Xunit; @@ -18,44 +19,48 @@ public AppsettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture _enablePerTestCleanup = true; } - // [Fact] - // public async Task FileInVfs() - // { - // string id = $"blazor_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - - // string projectDirectory = Path.GetDirectoryName(projectFile)!; - - // File.WriteAllText(Path.Combine(projectDirectory, "wwwroot", "appsettings.json"), $"{{ \"Id\": \"{id}\" }}"); - - // string programPath = Path.Combine(projectDirectory, "Program.cs"); - // string programContent = File.ReadAllText(programPath); - // programContent = programContent.Replace("var builder", - // """ - // System.Console.WriteLine($"appSettings Exists '{File.Exists("/appsettings.json")}'"); - // System.Console.WriteLine($"appSettings Content '{File.ReadAllText("/appsettings.json")}'"); - // var builder - // """); - // File.WriteAllText(programPath, programContent); - - // BlazorBuild(new BuildProjectOptions(id, "debug", NativeFilesType.FromRuntimePack)); - - // bool existsChecked = false; - // bool contentChecked = false; - - // await BlazorRunForBuildWithDotnetRun(new RunOptions() - // { - // Configuration = "debug", - // OnConsoleMessage = (_, msg) => - // { - // if (msg.Text.Contains("appSettings Exists 'True'")) - // existsChecked = true; - // else if (msg.Text.Contains($"appSettings Content '{{ \"Id\": \"{id}\" }}'")) - // contentChecked = true; - // } - // }); - - // Assert.True(existsChecked, "File '/appsettings.json' wasn't found"); - // Assert.True(contentChecked, "Content of '/appsettings.json' is not matched"); - // } + [Fact] + public async Task FileInVfs() + { + string config = "debug"; + ProjectInfo info = CreateWasmTemplateProject(Template.BlazorWasm, config, aot: false, "blazor"); + UpdateHomePage(); + string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; + File.WriteAllText(Path.Combine(projectDirectory, "wwwroot", "appsettings.json"), $"{{ \"Id\": \"{info.ProjectName}\" }}"); + UpdateFile("Program.cs", new Dictionary + { + { + "var builder", + """ + System.Console.WriteLine($"appSettings Exists '{File.Exists("/appsettings.json")}'"); + System.Console.WriteLine($"appSettings Content '{File.ReadAllText("/appsettings.json")}'"); + var builder + """ + } + }); + + bool isPublish = false; + (string _, string buildOutput) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); + + bool existsChecked = false; + bool contentChecked = false; + await RunForBuildWithDotnetRun(new( + info.Configuration, + OnConsoleMessage: (_, msg) => { + if (msg.Contains("appSettings Exists 'True'")) + existsChecked = true; + else if (msg.Contains($"appSettings Content '{{ \"Id\": \"{info.ProjectName}\" }}'")) + contentChecked = true; + })); + + Assert.True(existsChecked, "File '/appsettings.json' wasn't found"); + Assert.True(contentChecked, "Content of '/appsettings.json' is not matched"); + } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 4ba6471b303cc3..dc37a271f1e130 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -24,6 +25,63 @@ protected BlazorWasmTestBase(ITestOutputHelper output, SharedBuildPerTestClassFi _provider = GetProvider(); } + private Dictionary blazorHomePageReplacements = new Dictionary + { + { + "Welcome to your new app.", + """ + Welcome to your new app. + @code { + protected override void OnAfterRender(bool firstRender) + { + if (firstRender) + { + Console.WriteLine("WASM EXIT 0"); + } + } + } + """ } + }; + + private Func? _executeAfterLoaded = async (runOptions, page) => + { + if (runOptions.CheckCounter) + { + await page.Locator("text=Counter").ClickAsync(); + var txt = await page.Locator("p[role='status']").InnerHTMLAsync(); + Assert.Equal("Current count: 0", txt); + + await page.Locator("text=\"Click me\"").ClickAsync(); + await Task.Delay(300); + txt = await page.Locator("p[role='status']").InnerHTMLAsync(); + Assert.Equal("Current count: 1", txt); + } + }; + + public override (string projectDir, string buildOutput) BuildTemplateProject( + ProjectInfo projectInfo, + BuildProjectOptions buildOptions, + params string[] extraArgs) + { + try + { + var additionalOptiont = buildOptions.WarnAsError ? + new[] { "-p:BlazorEnableCompression=false", "/warnaserror"} : + new[] { "-p:BlazorEnableCompression=false" }; + extraArgs = extraArgs.Concat(additionalOptiont).ToArray(); + return base.BuildTemplateProject(projectInfo, buildOptions, extraArgs); + } + catch (XunitException xe) + { + if (xe.Message.Contains("error CS1001: Identifier expected")) + Utils.DirectoryCopy(_projectDir!, _logPath, testOutput: _testOutput); + throw; + } + } + + protected void UpdateHomePage() => + UpdateFile(Path.Combine("Pages", "Home.razor"), blazorHomePageReplacements); + public void InitBlazorWasmProjectDir(string id, string targetFramework = DefaultTargetFrameworkForBlazor) { InitPaths(id); @@ -97,7 +155,7 @@ public string CreateBlazorWasmTemplateProject(string id) string id, string config, bool publish = false, - bool setWasmDevel = true, + bool setWasmDevel = true, // always used with false bool expectSuccess = true, params string[] extraArgs) { @@ -113,7 +171,7 @@ public string CreateBlazorWasmTemplateProject(string id) ExpectSuccess: expectSuccess), extraArgs.Concat(new[] { - "-p:BlazorEnableCompression=false", + "-p:BlazorEnableCompression=false", // use it in BuildTemplateProject overload setWasmDevel ? "-p:_WasmDevel=true" : string.Empty }).ToArray()); } @@ -174,44 +232,15 @@ protected string CreateProjectWithNativeReference(string id) // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public async Task BlazorRunForBuildWithDotnetRun(RunOptions runOptions) - => await BlazorRunTest(runOptions with { Host = RunHost.DotnetRun }); - - public async Task BlazorRunForPublishWithWebServer(RunOptions runOptions) - => await BlazorRunTest(runOptions with { Host = RunHost.WebServer }); - - public async Task BlazorRunTest(RunOptions runOptions) - { - if (runOptions.ExecuteAfterLoaded is null) - { - runOptions = runOptions with { ExecuteAfterLoaded = async (runOptions, page) => - { - if (runOptions.CheckCounter) - { - await page.Locator("text=Counter").ClickAsync(); - var txt = await page.Locator("p[role='status']").InnerHTMLAsync(); - Assert.Equal("Current count: 0", txt); - - await page.Locator("text=\"Click me\"").ClickAsync(); - await Task.Delay(300); - txt = await page.Locator("p[role='status']").InnerHTMLAsync(); - Assert.Equal("Current count: 1", txt); - } - } - }; - } - switch (runOptions.Host) - { - case RunHost.DotnetRun: - return await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions); - case RunHost.WebServer: - return await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", - Path.GetFullPath(Path.Combine(GetBlazorBinFrameworkDir(runOptions.Configuration, forPublish: true), "..")), - runOptions); - default: - throw new NotImplementedException(runOptions.Host.ToString()); - } - } + public override async Task RunForBuildWithDotnetRun(RunOptions runOptions) + => await base.RunForBuildWithDotnetRun(runOptions with { + ExecuteAfterLoaded = runOptions.ExecuteAfterLoaded ?? _executeAfterLoaded + }); + + public override async Task RunForPublishWithWebServer(RunOptions runOptions) + => await base.RunForPublishWithWebServer(runOptions with { + ExecuteAfterLoaded = runOptions.ExecuteAfterLoaded ?? _executeAfterLoaded + }); public string GetBlazorBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFrameworkForBlazor, string? projectDir = null) => _provider.GetBinFrameworkDir(config: config, forPublish: forPublish, framework: framework, projectDir: projectDir); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 79202d33777708..345adeef426483 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -113,7 +113,7 @@ private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyze } - public (string projectDir, string buildOutput) BuildTemplateProject( + public virtual (string projectDir, string buildOutput) BuildTemplateProject( ProjectInfo projectInfo, BuildProjectOptions buildOptions, params string[] extraArgs) @@ -231,10 +231,10 @@ protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramewo // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public async Task RunForBuildWithDotnetRun(RunOptions runOptions) + public virtual async Task RunForBuildWithDotnetRun(RunOptions runOptions) => await BrowserRun(runOptions with { Host = RunHost.DotnetRun }); - public async Task RunForPublishWithWebServer(RunOptions runOptions) + public virtual async Task RunForPublishWithWebServer(RunOptions runOptions) => await BrowserRun(runOptions with { Host = RunHost.WebServer }); private async Task BrowserRun(RunOptions runOptions) => runOptions.Host switch @@ -252,7 +252,7 @@ await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-se _ => throw new NotImplementedException(runOptions.Host.ToString()) }; - protected async Task BrowserRunTest(string runArgs, + private async Task BrowserRunTest(string runArgs, string workingDirectory, RunOptions runOptions) { From a1ccf580a90f2221fa7ca48aebbd45ef6221aeaf Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 16:25:58 +0000 Subject: [PATCH 042/104] Added blazor equivalent of `WasmBasicTestApp`. `Blazor.BuildPublishTests`: done. --- .../Blazor/AppsettingsTests.cs | 11 +- .../Blazor/BlazorWasmTestBase.cs | 56 ++- .../Blazor/BuildPublishTests.cs | 355 +++++++++--------- .../Common/AssertBundleOptions.cs | 3 +- .../Common/EnvironmentVariables.cs | 1 + .../Wasm.Build.Tests/ProjectProviderBase.cs | 10 +- .../Templates/WasmTemplateTestsBase.cs | 1 + .../Wasm.Build.Tests/Wasm.Build.Tests.csproj | 3 + .../WasmSdkBasedProjectProvider.cs | 1 - .../testassets/BlazorBasicTestApp/App.razor | 12 + .../BlazorBasicTestApp.csproj | 14 + .../Layout/MainLayout.razor | 16 + .../BlazorBasicTestApp/Layout/NavMenu.razor | 39 ++ .../BlazorBasicTestApp/Pages/Counter.razor | 18 + .../BlazorBasicTestApp/Pages/Home.razor | 17 + .../testassets/BlazorBasicTestApp/Program.cs | 11 + .../BlazorBasicTestApp/_Imports.razor | 10 + .../BlazorBasicTestApp/wwwroot/favicon.png | Bin 0 -> 1148 bytes .../BlazorBasicTestApp/wwwroot/icon-192.png | Bin 0 -> 2626 bytes .../BlazorBasicTestApp/wwwroot/index.html | 32 ++ 20 files changed, 388 insertions(+), 222 deletions(-) create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/App.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/BlazorBasicTestApp.csproj create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/Layout/MainLayout.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/Layout/NavMenu.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Counter.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Home.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/Program.cs create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/_Imports.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/favicon.png create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/icon-192.png create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/index.html diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs index 17455914626177..ce7d169926cc5b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs @@ -39,16 +39,7 @@ var builder } }); - bool isPublish = false; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); - + (string _, string buildOutput) = BlazorBuild(info); bool existsChecked = false; bool contentChecked = false; await RunForBuildWithDotnetRun(new( diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index dc37a271f1e130..d4317368a68492 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -69,7 +69,16 @@ public override (string projectDir, string buildOutput) BuildTemplateProject( new[] { "-p:BlazorEnableCompression=false", "/warnaserror"} : new[] { "-p:BlazorEnableCompression=false" }; extraArgs = extraArgs.Concat(additionalOptiont).ToArray(); - return base.BuildTemplateProject(projectInfo, buildOptions, extraArgs); + (string projectDir, string buildOutput) = base.BuildTemplateProject( + projectInfo, + buildOptions with { AssertAppBundle = false }, + extraArgs + ); + if (buildOptions.ExpectSuccess && buildOptions.AssertAppBundle) + { + AssertBundle(buildOutput, buildOptions); + } + return (projectDir, buildOutput); } catch (XunitException xe) { @@ -112,24 +121,36 @@ public string CreateBlazorWasmTemplateProject(string id) return Path.Combine(_projectDir!, $"{id}.csproj"); } - protected (CommandResult, string) BlazorBuild(BuildProjectOptions options, params string[] extraArgs) + protected (string projectDir, string buildOutput) BlazorBuild( + ProjectInfo info, bool isNativeBuild = false, bool useCache = true, params string[] extraArgs) { - if (options.WarnAsError) - extraArgs = extraArgs.Append("/warnaserror").ToArray(); - - (CommandResult res, string logPath) = BlazorBuildInternal( - options.Id, - options.Configuration, - setWasmDevel: false, - expectSuccess: options.ExpectSuccess, - extraArgs: extraArgs); - - if (options.ExpectSuccess && options.AssertAppBundle) - { - AssertBundle(res.Output, options with { IsPublish = false }); - } + bool isPublish = false; + return BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild), + IsPublish: isPublish, + UseCache: useCache), + extraArgs + ); + } - return (res, logPath); + protected (string projectDir, string buildOutput) BlazorPublish( + ProjectInfo info, bool isNativeBuild = false, bool useCache = true, params string[] extraArgs) + { + bool isPublish = true; + return BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild), + IsPublish: isPublish, + UseCache: useCache), + extraArgs + ); } protected (CommandResult, string) BlazorPublish(BuildProjectOptions options, params string[] extraArgs) @@ -197,7 +218,6 @@ public void AssertBundle(string buildOutput, BuildProjectOptions buildOptions) return; // Publish specific checks - if (buildOptions.ExpectedFileType == NativeFilesType.AOT) { // check for this too, so we know the format is correct for the negative diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 09c6a4c06ef906..8e091cf37ed021 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -23,190 +23,173 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur _enablePerTestCleanup = true; } - // [Theory, TestCategory("no-workload")] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task DefaultTemplate_WithoutWorkload(string config) - // { - // string id = $"blz_no_workload_{config}_{GetRandomId()}_{s_unicodeChars}"; - // CreateBlazorWasmTemplateProject(id); - - // BlazorBuild(new BuildProjectOptions(id, config)); - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - - // BlazorPublish(new BuildProjectOptions(id, config)); - // await BlazorRunForPublishWithWebServer(new RunOptions() { Configuration = config }); - // } - - - // public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) - // { - // var data = new TheoryData(); - // if (!isAot) - // { - // // AOT does not support managed debugging, is disabled by design - // data.Add("Debug", false); - // data.Add("Debug", true); - // } - - // // [ActiveIssue("https://github.com/dotnet/runtime/issues/103625", TestPlatforms.Windows)] - // // when running locally the path might be longer than 260 chars and these tests can fail with AOT - // data.Add("Release", false); // Release relinks by default - // data.Add("Release", true); - // return data; - // } - - // [Theory] - // [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] - // public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) - // { - // string id = testUnicode ? - // $"blz_no_aot_{config}_{GetRandomId()}_{s_unicodeChars}" : - // $"blz_no_aot_{config}_{GetRandomId()}"; - // CreateBlazorWasmTemplateProject(id); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - // if (config == "Release") - // { - // // relinking in publish for Release config - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); - // } - // else - // { - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack, ExpectRelinkDirWhenPublishing: true)); - // } - // } - - // [Theory] - // [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] - // public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) - // { - // string id = testUnicode ? - // $"blz_aot_{config}_{GetRandomId()}_{s_unicodeChars}" : - // $"blz_aot_{config}_{GetRandomId()}"; - // CreateBlazorWasmTemplateProject(id); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT), "-p:RunAOTCompilation=true"); - // } - - // [Theory] - // [InlineData("Debug", false)] - // [InlineData("Release", false)] - // [InlineData("Debug", true)] - // [InlineData("Release", true)] - // public void DefaultTemplate_CheckFingerprinting(string config, bool expectFingerprintOnDotnetJs) - // { - // string id = $"blz_checkfingerprinting_{config}_{GetRandomId()}"; - - // CreateBlazorWasmTemplateProject(id); - - // var options = new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true, ExpectFingerprintOnDotnetJs: expectFingerprintOnDotnetJs); - // var finterprintingArg = expectFingerprintOnDotnetJs ? "/p:WasmFingerprintDotnetJs=true" : string.Empty; - - // BlazorBuild(options, "/p:WasmBuildNative=true", finterprintingArg); - // BlazorPublish(options, "/p:WasmBuildNative=true", finterprintingArg); - // } - - // // Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure - // // how to pick which one to check, for the test - // //[Theory] - // //[InlineData("Debug")] - // //[InlineData("Release")] - // //public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) - // //{ - // //string id = $"blz_aot_pub_{config}"; - // //CreateBlazorWasmTemplateProject(id); - - // //// No relinking, no AOT - // //BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack); - - // //// AOT=true only for the publish command line, similar to what - // //// would happen when setting it in Publish dialog for VS - // //BlazorPublish(new BuildProjectOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); - - // //// publish again, no AOT - // //BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked); - // //} - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void DefaultTemplate_WithResources_Publish(string config) - // { - // string[] cultures = ["ja-JP", "es-ES"]; - // string id = $"blz_resources_{config}_{GetRandomId()}"; - // CreateBlazorWasmTemplateProject(id); - - // // Ensure we have the source data we rely on - // string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); - // foreach (string culture in cultures) - // Assert.True(File.Exists(Path.Combine(resxSourcePath, $"words.{culture}.resx"))); - - // Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir!, "resx")); - - // // Build and assert resource dlls - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - // AssertResourcesDlls(GetBlazorBinFrameworkDir(config, false)); - - // // Publish and assert resource dlls - // if (config == "Release") - // { - // // relinking in publish for Release config - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true, IsPublish: true)); - // } - // else - // { - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack, ExpectRelinkDirWhenPublishing: true, IsPublish: true)); - // } - - // AssertResourcesDlls(GetBlazorBinFrameworkDir(config, true)); - - // void AssertResourcesDlls(string basePath) - // { - // foreach (string culture in cultures) - // { - // string? resourceAssemblyPath = Directory.EnumerateFiles(Path.Combine(basePath, culture), $"*{ProjectProviderBase.WasmAssemblyExtension}").SingleOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith($"{id}.resources")); - // Assert.True(resourceAssemblyPath != null && File.Exists(resourceAssemblyPath), $"Expects to have a resource assembly at {resourceAssemblyPath}"); - // } - // } - // } - - // [Theory] - // [InlineData("", true)] // Default case - // [InlineData("false", false)] // the other case - // public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) - // { - // string config = "Release"; - // string id = $"blz_WasmStripILAfterAOT_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // string projectDirectory = Path.GetDirectoryName(projectFile)!; - - // string extraProperties = "true"; - // if (!string.IsNullOrEmpty(stripILAfterAOT)) - // extraProperties += $"{stripILAfterAOT}"; - // AddItemsPropertiesToProject(projectFile, extraProperties); - - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, AssertAppBundle : false)); - // await BlazorRunForPublishWithWebServer(new RunOptions() { Configuration = config }); - - // string frameworkDir = Path.Combine(projectDirectory, "bin", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); - // string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); - - // WasmTemplateTests.TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); - // } - - // [Theory] - // [InlineData("Debug")] - // public void BlazorWasm_CannotAOT_InDebug(string config) - // { - // string id = $"blazorwasm_{config}_aot_{GetRandomId()}"; - // CreateBlazorWasmTemplateProject(id); - // AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), - // extraItems: null, - // extraProperties: "true"); - - // (CommandResult res, _) = BlazorPublish(new BuildProjectOptions(id, config, ExpectSuccess: false)); - // Assert.Contains("AOT is not supported in debug configuration", res.Output); - // } + [Theory, TestCategory("no-workload")] + [InlineData("Debug")] + [InlineData("Release")] + public async Task DefaultTemplate_WithoutWorkload(string config) + { + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_workload"); + BlazorBuild(info); + await RunForBuildWithDotnetRun(new(info.Configuration)); + + BlazorPublish(info, useCache: false); + await RunForPublishWithWebServer(new(info.Configuration)); + } + + + public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) + { + var data = new TheoryData(); + if (!isAot) + { + // AOT does not support managed debugging, is disabled by design + data.Add("Debug", false); + data.Add("Debug", true); + } + + // [ActiveIssue("https://github.com/dotnet/runtime/issues/103625", TestPlatforms.Windows)] + // when running locally the path might be longer than 260 chars and these tests can fail with AOT + data.Add("Release", false); // Release relinks by default + data.Add("Release", true); + return data; + } + + [Theory] + [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] + public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) + { + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_aot", appendUnicodeToPath: testUnicode); + BlazorPublish(info); + } + + [Theory] + [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] + public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) + { + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_aot", appendUnicodeToPath: testUnicode); + BlazorBuild(info); + + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: NativeFilesType.AOT, + IsPublish: isPublish, + UseCache: false), + extraArgs: "-p:RunAOTCompilation=true" + ); + } + + [Theory] + [InlineData("Debug", false)] + [InlineData("Release", false)] + [InlineData("Debug", true)] + [InlineData("Release", true)] + public void DefaultTemplate_CheckFingerprinting(string config, bool expectFingerprintOnDotnetJs) + { + var extraProperty = expectFingerprintOnDotnetJs ? + "truetrue" : + "true"; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_checkfingerprinting", extraProperties: extraProperty); + BlazorBuild(info, isNativeBuild: true); + BlazorPublish(info, isNativeBuild: true, useCache: false); + } + + Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure + how to pick which one to check, for the test + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) + { + string id = $"blz_aot_pub_{config}"; + CreateBlazorWasmTemplateProject(id); + + // No relinking, no AOT + BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack); + + // AOT=true only for the publish command line, similar to what + // would happen when setting it in Publish dialog for VS + BlazorPublish(new BuildProjectOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); + + // publish again, no AOT + BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked); + } + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void DefaultTemplate_WithResources_Publish(string config) + { + string[] cultures = ["ja-JP", "es-ES"]; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_resources"); + + // Ensure we have the source data we rely on + string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); + foreach (string culture in cultures) + Assert.True(File.Exists(Path.Combine(resxSourcePath, $"words.{culture}.resx"))); + + Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir!, "resx")); + + // Build and assert resource dlls + BlazorBuild(info); + AssertResourcesDlls(GetBlazorBinFrameworkDir(config, forPublish: false)); + + // Publish and assert resource dlls + BlazorPublish(info, useCache: false); + AssertResourcesDlls(GetBlazorBinFrameworkDir(config, forPublish: true)); + + void AssertResourcesDlls(string basePath) + { + foreach (string culture in cultures) + { + string? resourceAssemblyPath = Directory.EnumerateFiles( + Path.Combine(basePath, culture), + $"*{ProjectProviderBase.WasmAssemblyExtension}").SingleOrDefault(f => Path.GetFileNameWithoutExtension(f).StartsWith($"{info.ProjectName}.resources")); + Assert.True(resourceAssemblyPath != null && File.Exists(resourceAssemblyPath), $"Expects to have a resource assembly at {resourceAssemblyPath}"); + } + } + } + + [Theory] + [InlineData("", true)] // Default case + [InlineData("false", false)] // the other case + public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) + { + string config = "Release"; + string extraProperties = "true"; + if (!string.IsNullOrEmpty(stripILAfterAOT)) + extraProperties += $"{stripILAfterAOT}"; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_WasmStripILAfterAOT", extraProperties: extraProperties); + + BlazorPublish(info); + await RunForPublishWithWebServer(new(config)); + + string frameworkDir = Path.Combine(_projectDir!, "bin", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); + string objBuildDir = Path.Combine(_projectDir!, "obj", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); + + WasmTemplateTests.TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); + } + + [Theory] + [InlineData("Debug")] + public void BlazorWasm_CannotAOT_InDebug(string config) + { + ProjectInfo info = CopyTestAsset( + config, aot: true, "BlazorBasicTestApp", "blazorwasm", extraProperties: "true"); + + bool isPublish = true; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + ExpectSuccess: false + )); + Assert.Contains("AOT is not supported in debug configuration", output); + } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs index e561ebe5730d0e..b4867021ed1429 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs @@ -11,6 +11,5 @@ public record AssertBundleOptions( BuildProjectOptions BuildOptions, bool ExpectSymbolsFile = true, bool AssertIcuAssets = true, - bool AssertSymbolsFile = true, - bool ExpectFingerprintOnDotnetJs = false + bool AssertSymbolsFile = true ); diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/EnvironmentVariables.cs b/src/mono/wasm/Wasm.Build.Tests/Common/EnvironmentVariables.cs index d928fc1e1b4069..1e4df1407b692e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/EnvironmentVariables.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/EnvironmentVariables.cs @@ -23,6 +23,7 @@ internal static class EnvironmentVariables internal static readonly bool ShowBuildOutput = IsRunningOnCI || Environment.GetEnvironmentVariable("SHOW_BUILD_OUTPUT") is not null; internal static readonly bool UseWebcil = Environment.GetEnvironmentVariable("USE_WEBCIL_FOR_TESTS") is "true"; internal static readonly bool UseFingerprinting = Environment.GetEnvironmentVariable("USE_FINGERPRINTING_FOR_TESTS") is "true"; + internal static readonly bool UseFingerprintingDotnetJS = Environment.GetEnvironmentVariable("WASM_FINGERPRINT_DOTNET_JS") is "true"; internal static readonly string? SdkDirName = Environment.GetEnvironmentVariable("SDK_DIR_NAME"); internal static readonly string? WasiSdkPath = Environment.GetEnvironmentVariable("WASI_SDK_PATH"); internal static readonly bool WorkloadsTestPreviousVersions = Environment.GetEnvironmentVariable("WORKLOADS_TEST_PREVIOUS_VERSIONS") is "true"; diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index 0844d33871adcc..d4809d5d4e354d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -39,15 +39,15 @@ public abstract class ProjectProviderBase(ITestOutputHelper _testOutput, string? protected BuildEnvironment _buildEnv = BuildTestBase.s_buildEnv; protected abstract string BundleDirName { get; } - public bool IsFingerprintingSupported { get; protected set; } + public bool IsFingerprintingEnabled => EnvironmentVariables.UseFingerprinting; - public bool IsFingerprintingEnabled => IsFingerprintingSupported && EnvironmentVariables.UseFingerprinting; + public bool IsFingerprintingOnDotnetJsEnabled => EnvironmentVariables.UseFingerprintingDotnetJS; // Returns the actual files on disk public IReadOnlyDictionary AssertBasicBundle(AssertBundleOptions assertOptions) { EnsureProjectDirIsSet(); - var dotnetFiles = FindAndAssertDotnetFiles(assertOptions); // HERE, why binFrameworkDir empty? + var dotnetFiles = FindAndAssertDotnetFiles(assertOptions); TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, new[] { "System.Private.CoreLib.dll" }, @@ -82,7 +82,7 @@ public IReadOnlyDictionary FindAndAssertDotnetFiles(Asse { EnsureProjectDirIsSet(); return FindAndAssertDotnetFiles(binFrameworkDir: assertOptions.BuildOptions.BinFrameworkDir, - expectFingerprintOnDotnetJs: assertOptions.ExpectFingerprintOnDotnetJs, + expectFingerprintOnDotnetJs: IsFingerprintingOnDotnetJsEnabled, superSet: GetAllKnownDotnetFilesToFingerprintMap(assertOptions), expected: GetDotNetFilesExpectedSet(assertOptions)); } @@ -487,7 +487,7 @@ public BootJsonData AssertBootJson(AssertBundleOptions options) string extension = Path.GetExtension(expectedFilename).Substring(1); if (ShouldCheckFingerprint(expectedFilename: expectedFilename, - expectFingerprintOnDotnetJs: options.ExpectFingerprintOnDotnetJs, + expectFingerprintOnDotnetJs: IsFingerprintingOnDotnetJsEnabled, expectFingerprintForThisFile: expectFingerprint)) { return Regex.Match(item, $"{prefix}{s_dotnetVersionHashRegex}{extension}").Success; diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 345adeef426483..9b8c83e15b47e7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -68,6 +68,7 @@ public ProjectInfo CreateWasmTemplateProject( using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); CommandResult result = cmd.WithWorkingDirectory(_projectDir!) + .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) .ExecuteWithCapturedOutput($"new {template.ToString().ToLower()} {extraArgs}") .EnsureSuccessful(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csproj b/src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csproj index bb79860f34194f..6ae8811f176f38 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csproj +++ b/src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csproj @@ -118,6 +118,9 @@ + + + diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index 1178a2e6c2d5ca..bdc5802ea1829e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -20,7 +20,6 @@ public WasmSdkBasedProjectProvider(ITestOutputHelper _testOutput, string default : base(_testOutput, _projectDir) { _defaultTargetFramework = defaultTargetFramework; - IsFingerprintingSupported = true; } protected override string BundleDirName { get { return "wwwroot"; } } diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/App.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App.razor new file mode 100644 index 00000000000000..6fd3ed1b5a3b04 --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/App.razor @@ -0,0 +1,12 @@ + + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/BlazorBasicTestApp.csproj b/src/mono/wasm/testassets/BlazorBasicTestApp/BlazorBasicTestApp.csproj new file mode 100644 index 00000000000000..5030d68c356ee4 --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/BlazorBasicTestApp.csproj @@ -0,0 +1,14 @@ + + + + net9.0 + enable + enable + + + + + + + + diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/MainLayout.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/MainLayout.razor new file mode 100644 index 00000000000000..76eb72528390cf --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/MainLayout.razor @@ -0,0 +1,16 @@ +@inherits LayoutComponentBase +
+ + +
+
+ About +
+ +
+ @Body +
+
+
diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/NavMenu.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/NavMenu.razor new file mode 100644 index 00000000000000..345ee43c02f805 --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/NavMenu.razor @@ -0,0 +1,39 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Counter.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Counter.razor new file mode 100644 index 00000000000000..ef23cb31607f88 --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Counter.razor @@ -0,0 +1,18 @@ +@page "/counter" + +Counter + +

Counter

+ +

Current count: @currentCount

+ + + +@code { + private int currentCount = 0; + + private void IncrementCount() + { + currentCount++; + } +} diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Home.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Home.razor new file mode 100644 index 00000000000000..6c432724c86b8b --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Home.razor @@ -0,0 +1,17 @@ +@page "/" + +Home + +

Hello, world!

+ +Welcome to your new app. + +@code { + protected override void OnAfterRender(bool firstRender) + { + if (firstRender) + { + Console.WriteLine("WASM EXIT 0"); + } + } +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Program.cs b/src/mono/wasm/testassets/BlazorBasicTestApp/Program.cs new file mode 100644 index 00000000000000..b81a54015b025e --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/Program.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using BlazorBasicTestApp; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }); + +await builder.Build().RunAsync(); diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/_Imports.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/_Imports.razor new file mode 100644 index 00000000000000..99e8be8c170d9b --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using BlazorBasicTestApp +@using BlazorBasicTestApp.Layout diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/favicon.png b/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8422b59695935d180d11d5dbe99653e711097819 GIT binary patch literal 1148 zcmV-?1cUpDP)9h26h2-Cs%i*@Moc3?#6qJID|D#|3|2Hn7gTIYEkr|%Xjp);YgvFmB&0#2E2b=| zkVr)lMv9=KqwN&%obTp-$<51T%rx*NCwceh-E+=&e(oLO`@Z~7gybJ#U|^tB2Pai} zRN@5%1qsZ1e@R(XC8n~)nU1S0QdzEYlWPdUpH{wJ2Pd4V8kI3BM=)sG^IkUXF2-j{ zrPTYA6sxpQ`Q1c6mtar~gG~#;lt=s^6_OccmRd>o{*=>)KS=lM zZ!)iG|8G0-9s3VLm`bsa6e ze*TlRxAjXtm^F8V`M1%s5d@tYS>&+_ga#xKGb|!oUBx3uc@mj1%=MaH4GR0tPBG_& z9OZE;->dO@`Q)nr<%dHAsEZRKl zedN6+3+uGHejJp;Q==pskSAcRcyh@6mjm2z-uG;s%dM-u0*u##7OxI7wwyCGpS?4U zBFAr(%GBv5j$jS@@t@iI8?ZqE36I^4t+P^J9D^ELbS5KMtZ z{Qn#JnSd$15nJ$ggkF%I4yUQC+BjDF^}AtB7w348EL>7#sAsLWs}ndp8^DsAcOIL9 zTOO!!0!k2`9BLk25)NeZp7ev>I1Mn={cWI3Yhx2Q#DnAo4IphoV~R^c0x&nw*MoIV zPthX?{6{u}sMS(MxD*dmd5rU(YazQE59b|TsB5Tm)I4a!VaN@HYOR)DwH1U5y(E)z zQqQU*B%MwtRQ$%x&;1p%ANmc|PkoFJZ%<-uq%PX&C!c-7ypis=eP+FCeuv+B@h#{4 zGx1m0PjS~FJt}3mdt4c!lel`1;4W|03kcZRG+DzkTy|7-F~eDsV2Tx!73dM0H0CTh zl)F-YUkE1zEzEW(;JXc|KR5{ox%YTh{$%F$a36JP6Nb<0%#NbSh$dMYF-{ z1_x(Vx)}fs?5_|!5xBTWiiIQHG<%)*e=45Fhjw_tlnmlixq;mUdC$R8v#j( zhQ$9YR-o%i5Uc`S?6EC51!bTRK=Xkyb<18FkCKnS2;o*qlij1YA@-nRpq#OMTX&RbL<^2q@0qja!uIvI;j$6>~k@IMwD42=8$$!+R^@5o6HX(*n~v0A9xRwxP|bki~~&uFk>U z#P+PQh zyZ;-jwXKqnKbb6)@RaxQz@vm={%t~VbaZrdbaZrdbaeEeXj>~BG?&`J0XrqR#sSlO zg~N5iUk*15JibvlR1f^^1czzNKWvoJtc!Sj*G37QXbZ8LeD{Fzxgdv#Q{x}ytfZ5q z+^k#NaEp>zX_8~aSaZ`O%B9C&YLHb(mNtgGD&Kezd5S@&C=n~Uy1NWHM`t07VQP^MopUXki{2^#ryd94>UJMYW|(#4qV`kb7eD)Q=~NN zaVIRi@|TJ!Rni8J=5DOutQ#bEyMVr8*;HU|)MEKmVC+IOiDi9y)vz=rdtAUHW$yjt zrj3B7v(>exU=IrzC<+?AE=2vI;%fafM}#ShGDZx=0Nus5QHKdyb9pw&4>4XCpa-o?P(Gnco1CGX|U> z$f+_tA3+V~<{MU^A%eP!8R*-sD9y<>Jc7A(;aC5hVbs;kX9&Sa$JMG!W_BLFQa*hM zri__C@0i0U1X#?)Y=)>JpvTnY6^s;fu#I}K9u>OldV}m!Ch`d1Vs@v9 zb}w(!TvOmSzmMBa9gYvD4xocL2r0ds6%Hs>Z& z#7#o9PGHDmfG%JQq`O5~dt|MAQN@2wyJw_@``7Giyy(yyk(m8U*kk5$X1^;3$a3}N^Lp6hE5!#8l z#~NYHmKAs6IAe&A;bvM8OochRmXN>`D`{N$%#dZCRxp4-dJ?*3P}}T`tYa3?zz5BA zTu7uE#GsDpZ$~j9q=Zq!LYjLbZPXFILZK4?S)C-zE1(dC2d<7nO4-nSCbV#9E|E1MM|V<9>i4h?WX*r*ul1 z5#k6;po8z=fdMiVVz*h+iaTlz#WOYmU^SX5#97H~B32s-#4wk<1NTN#g?LrYieCu> zF7pbOLR;q2D#Q`^t%QcY06*X-jM+ei7%ZuanUTH#9Y%FBi*Z#22({_}3^=BboIsbg zR0#jJ>9QR8SnmtSS6x($?$}6$x+q)697#m${Z@G6Ujf=6iO^S}7P`q8DkH!IHd4lB zDzwxt3BHsPAcXFFY^Fj}(073>NL_$A%v2sUW(CRutd%{G`5ow?L`XYSO*Qu?x+Gzv zBtR}Y6`XF4xX7)Z04D+fH;TMapdQFFameUuHL34NN)r@aF4RO%x&NApeWGtr#mG~M z6sEIZS;Uj1HB1*0hh=O@0q1=Ia@L>-tETu-3n(op+97E z#&~2xggrl(LA|giII;RwBlX2^Q`B{_t}gxNL;iB11gEPC>v` zb4SJ;;BFOB!{chn>?cCeGDKuqI0+!skyWTn*k!WiPNBf=8rn;@y%( znhq%8fj2eAe?`A5mP;TE&iLEmQ^xV%-kmC-8mWao&EUK_^=GW-Y3z ksi~={si~={skwfB0gq6itke#r1ONa407*qoM6N<$g11Kq@c;k- literal 0 HcmV?d00001 diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/index.html b/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/index.html new file mode 100644 index 00000000000000..d9b7c48fe9435a --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/index.html @@ -0,0 +1,32 @@ + + + + + + + BlazorBasicTestApp + + + + + + + + +
+ + + + +
+
+ +
+ An unhandled error has occurred. + Reload + 🗙 +
+ + + + From 902030f9aa3cef9d518cb322d56173f5b9b67af4 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 11 Nov 2024 16:27:43 +0000 Subject: [PATCH 043/104] Some tests should stay disabled. --- .../Blazor/BuildPublishTests.cs | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 8e091cf37ed021..2896fc6237530e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -97,26 +97,26 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger BlazorPublish(info, isNativeBuild: true, useCache: false); } - Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure - how to pick which one to check, for the test - [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) - { - string id = $"blz_aot_pub_{config}"; - CreateBlazorWasmTemplateProject(id); - - // No relinking, no AOT - BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack); - - // AOT=true only for the publish command line, similar to what - // would happen when setting it in Publish dialog for VS - BlazorPublish(new BuildProjectOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); - - // publish again, no AOT - BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked); - } + // Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure + // how to pick which one to check, for the test + //[Theory] + //[InlineData("Debug")] + //[InlineData("Release")] + //public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) + //{ + //string id = $"blz_aot_pub_{config}"; + //CreateBlazorWasmTemplateProject(id); + + //// No relinking, no AOT + //BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack); + + //// AOT=true only for the publish command line, similar to what + //// would happen when setting it in Publish dialog for VS + //BlazorPublish(new BuildProjectOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); + + //// publish again, no AOT + //BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked); + //} [Theory] [InlineData("Debug")] From a52e09bfd23c2016312add30130ebb3613a176b8 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:00:37 +0000 Subject: [PATCH 044/104] `Blazor.CleanTests`: done --- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 164 ++++++++---------- 1 file changed, 75 insertions(+), 89 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index 30972c1904368e..cb68d738cb4212 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -20,93 +20,79 @@ public CleanTests(ITestOutputHelper output, SharedBuildPerTestClassFixture build { } - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void Blazor_BuildThenClean_NativeRelinking(string config) - // { - // string id = GetRandomId(); - - // InitBlazorWasmProjectDir(id); - // string projectFile = CreateBlazorWasmTemplateProject(id); - - // string extraProperties = @"<_WasmDevel>true - // true"; - - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - - // string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); - // Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); - - // string logPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-clean.binlog"); - // using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - // .WithWorkingDirectory(_projectDir!); - // cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - // .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") - // .EnsureSuccessful(); - - // AssertEmptyOrNonExistentDirectory(relinkDir); - // } - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void Blazor_BuildNoNative_ThenBuildNative_ThenClean(string config) - // => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: false); - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) - // => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: true); - - // private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) - // { - // string id = GetRandomId(); - - // InitBlazorWasmProjectDir(id); - // string projectFile = CreateBlazorWasmTemplateProject(id); - - // string extraProperties = @"<_WasmDevel>true"; - - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // bool relink = firstBuildNative; - // BlazorBuildInternal(id, config, publish: false, - // extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); - - // string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); - // if (relink) - // Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); - - // relink = !firstBuildNative; - // BlazorBuildInternal(id, config, publish: false, - // extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); - - // if (relink) - // Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); - - // string logPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-clean.binlog"); - // using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - // .WithWorkingDirectory(_projectDir!); - // cmd.WithEnvironmentVariable("NUGET_PACKAGES", _projectDir!) - // .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") - // .EnsureSuccessful(); - - // AssertEmptyOrNonExistentDirectory(relinkDir); - // } - // private void AssertEmptyOrNonExistentDirectory(string dirPath) - // { - // _testOutput.WriteLine($"dirPath: {dirPath}"); - // if (!Directory.Exists(dirPath)) - // return; - - // var files = Directory.GetFileSystemEntries(dirPath); - // if (files.Length == 0) - // return; - - // string found = string.Join(',', files.Select(p => Path.GetFileName(p))); - // throw new XunitException($"Expected dir {dirPath} to be empty, but found: {found}"); - // } + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void Blazor_BuildThenClean_NativeRelinking(string config) + { + string extraProperties = @"<_WasmDevel>truetrue"; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean", extraProperties: extraProperties); + BlazorBuild(info, isNativeBuild: true); + + string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); + + string logPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}-clean.binlog"); + using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) + .WithWorkingDirectory(_projectDir!); + cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") + .EnsureSuccessful(); + + AssertEmptyOrNonExistentDirectory(relinkDir); + } + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void Blazor_BuildNoNative_ThenBuildNative_ThenClean(string config) + => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: false); + + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) + => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: true); + + private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) + { + string extraProperties = @"<_WasmDevel>true"; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean_native", extraProperties: extraProperties); + + bool relink = firstBuildNative; + BlazorBuild(info, isNativeBuild: relink, extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); + + string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + if (relink) + Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); + + relink = !firstBuildNative; + BlazorBuild(info, useCache: false, isNativeBuild: relink, extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); + + if (relink) + Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); + + string logPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}-clean.binlog"); + using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) + .WithWorkingDirectory(_projectDir!); + cmd.WithEnvironmentVariable("NUGET_PACKAGES", _projectDir!) + .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") + .EnsureSuccessful(); + + AssertEmptyOrNonExistentDirectory(relinkDir); + } + + private void AssertEmptyOrNonExistentDirectory(string dirPath) + { + _testOutput.WriteLine($"dirPath: {dirPath}"); + if (!Directory.Exists(dirPath)) + return; + + var files = Directory.GetFileSystemEntries(dirPath); + if (files.Length == 0) + return; + + string found = string.Join(',', files.Select(p => Path.GetFileName(p))); + throw new XunitException($"Expected dir {dirPath} to be empty, but found: {found}"); + } } From ee9c35515a57f229a90cdd79420265318486f16b Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 10:20:35 +0000 Subject: [PATCH 045/104] `Blazor.MiscTests`: done --- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 92 +++++++++---------- 1 file changed, 41 insertions(+), 51 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index 0785c73c4893b5..d34d7cd430ac70 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.IO; using Xunit; using Xunit.Abstractions; @@ -17,62 +18,51 @@ public MiscTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildC _enablePerTestCleanup = true; } - // [Theory] - // [InlineData("Debug", true)] - // [InlineData("Debug", false)] - // [InlineData("Release", true)] - // [InlineData("Release", false)] - // [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] - // public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRelink) - // { - // string id = $"blz_deploy_on_build_{config}_{nativeRelink}_{GetRandomId()}"; - // string projectFile = CreateProjectWithNativeReference(id); - // string extraProperties = config == "Debug" - // ? ("-O1" + - // "-O1") - // : string.Empty; - // if (!nativeRelink) - // extraProperties += "true"; - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // // build with -p:DeployOnBuild=true, and that will trigger a publish - // (CommandResult res, _) = BlazorBuild(new BuildProjectOptions( - // Id: id, - // Configuration: config, - // ExpectedFileType: nativeRelink ? NativeFilesType.Relinked : NativeFilesType.AOT, - // ExpectRelinkDirWhenPublishing: false, - // IsPublish: false), - // "-p:DeployBuild=true"); + [Theory] + [InlineData("Debug", true)] + [InlineData("Debug", false)] + [InlineData("Release", true)] + [InlineData("Release", false)] + [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] + public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRelink) + { + string extraProperties = config == "Debug" + ? ("-O1" + + "-O1") + : string.Empty; + if (!nativeRelink) + extraProperties += "true"; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_deploy_on_build", extraProperties: extraProperties); - // // double check relinking! - // int index = res.Output.IndexOf("pinvoke.c -> pinvoke.o"); - // Assert.NotEqual(-1, index); + // build with -p:DeployOnBuild=true, and that will trigger a publish + (string _, string buildOutput) = BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:DeployBuild=true"); - // // there should be only one instance of this string! - // index = res.Output.IndexOf("pinvoke.c -> pinvoke.o", index + 1); - // Assert.Equal(-1, index); - // } + // double check relinking! + string substring = "pinvoke.c -> pinvoke.o"; + Assert.Contains(substring, buildOutput); - // [Theory] - // [InlineData("Release")] - // public void DefaultTemplate_AOT_InProjectFile(string config) - // { - // string id = $"blz_aot_prj_file_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); + // there should be only one instance of this string! + int occurrences = buildOutput.Split(new[] { substring }, StringSplitOptions.None).Length - 1; + Assert.Equal(2, occurrences); + } - // string extraProperties = config == "Debug" - // ? ("-O1" + - // "-O1") - // : string.Empty; - // AddItemsPropertiesToProject(projectFile, extraProperties: "true" + extraProperties); + [Theory] + [InlineData("Release")] + public void DefaultTemplate_AOT_InProjectFile(string config) + { + string extraProperties = config == "Debug" + ? ("-O1" + + "-O1") + : string.Empty; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_aot_prj_file", extraProperties: extraProperties); - // // No relinking, no AOT - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); + // No relinking, no AOT + BlazorBuild(info); - // // will aot - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true)); + // will aot + BlazorPublish(info, useCache: false); - // // build again - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - // } + // build again + BlazorBuild(info, useCache: false); + } } From 46841362cfb9ddbd41984bfe88ca3497e880de52 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 11:34:38 +0000 Subject: [PATCH 046/104] `Blazor.MiscTests2`" done. --- src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs index 00a47837523ce4..1b91e4b3a200bb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs @@ -51,14 +51,10 @@ public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(string config) private CommandResult PublishForRequiresWorkloadTest(string config, string extraItems="", string extraProperties="") { - string id = $"needs_workload_{config}_{GetRandomId()}"; - CreateBlazorWasmTemplateProject(id); + ProjectInfo info = CopyTestAsset( + config, aot: false, "BlazorBasicTestApp", "needs_workload", extraProperties: extraProperties, extraItems: extraItems); - AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), - extraProperties: extraProperties, - extraItems: extraItems); - - string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, id, $"{id}.binlog"); + string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); return cmd.WithWorkingDirectory(_projectDir!) .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) From 96b0cff5f93806cde413ad4470881986df756c29 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 12:30:24 +0000 Subject: [PATCH 047/104] `MiscTests3`: done. Debug with aot is not supported. Added library to BlazorBasicTestApp. --- .../Blazor/BuildPublishTests.cs | 14 +- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 4 +- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 4 +- .../Wasm.Build.Tests/Blazor/MiscTests2.cs | 2 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 242 ++++++++---------- .../BlazorBasicTestApp/{ => App}/App.razor | 0 .../{ => App}/BlazorBasicTestApp.csproj | 0 .../{ => App}/Layout/MainLayout.razor | 0 .../{ => App}/Layout/NavMenu.razor | 0 .../{ => App}/Pages/Counter.razor | 0 .../{ => App}/Pages/Home.razor | 0 .../BlazorBasicTestApp/{ => App}/Program.cs | 0 .../{ => App}/_Imports.razor | 0 .../{ => App}/wwwroot/favicon.png | Bin .../{ => App}/wwwroot/icon-192.png | Bin .../{ => App}/wwwroot/index.html | 0 .../RazorClassLibrary/Component1.razor | 3 + .../RazorClassLibrary.csproj | 18 ++ .../RazorClassLibrary/_Imports.razor | 1 + .../testassets/EntryPoints/MyDllImport.cs | 8 + .../wasm/testassets/native-libs/mylib.cpp | 7 + 21 files changed, 149 insertions(+), 154 deletions(-) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/App.razor (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/BlazorBasicTestApp.csproj (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/Layout/MainLayout.razor (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/Layout/NavMenu.razor (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/Pages/Counter.razor (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/Pages/Home.razor (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/Program.cs (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/_Imports.razor (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/wwwroot/favicon.png (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/wwwroot/icon-192.png (100%) rename src/mono/wasm/testassets/BlazorBasicTestApp/{ => App}/wwwroot/index.html (100%) create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/Component1.razor create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/RazorClassLibrary.csproj create mode 100644 src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/_Imports.razor create mode 100644 src/mono/wasm/testassets/EntryPoints/MyDllImport.cs create mode 100644 src/mono/wasm/testassets/native-libs/mylib.cpp diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 2896fc6237530e..508c3c5a261544 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -28,7 +28,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [InlineData("Release")] public async Task DefaultTemplate_WithoutWorkload(string config) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_workload"); + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_workload", "App"); BlazorBuild(info); await RunForBuildWithDotnetRun(new(info.Configuration)); @@ -58,7 +58,7 @@ public static TheoryData TestDataForDefaultTemplate_WithWorkload(b [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_aot", appendUnicodeToPath: testUnicode); + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_aot", "App", appendUnicodeToPath: testUnicode); BlazorPublish(info); } @@ -66,7 +66,7 @@ public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_aot", appendUnicodeToPath: testUnicode); + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_aot", "App", appendUnicodeToPath: testUnicode); BlazorBuild(info); bool isPublish = true; @@ -92,7 +92,7 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger var extraProperty = expectFingerprintOnDotnetJs ? "truetrue" : "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_checkfingerprinting", extraProperties: extraProperty); + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_checkfingerprinting", "App", extraProperties: extraProperty); BlazorBuild(info, isNativeBuild: true); BlazorPublish(info, isNativeBuild: true, useCache: false); } @@ -124,7 +124,7 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger public void DefaultTemplate_WithResources_Publish(string config) { string[] cultures = ["ja-JP", "es-ES"]; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_resources"); + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_resources", "App"); // Ensure we have the source data we rely on string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); @@ -162,7 +162,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL string extraProperties = "true"; if (!string.IsNullOrEmpty(stripILAfterAOT)) extraProperties += $"{stripILAfterAOT}"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_WasmStripILAfterAOT", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_WasmStripILAfterAOT", "App", extraProperties: extraProperties); BlazorPublish(info); await RunForPublishWithWebServer(new(config)); @@ -178,7 +178,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL public void BlazorWasm_CannotAOT_InDebug(string config) { ProjectInfo info = CopyTestAsset( - config, aot: true, "BlazorBasicTestApp", "blazorwasm", extraProperties: "true"); + config, aot: true, "BlazorBasicTestApp", "blazorwasm", "App", extraProperties: "true"); bool isPublish = true; (string _, string output) = BuildTemplateProject(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index cb68d738cb4212..4cd725df3e7ec3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -26,7 +26,7 @@ public CleanTests(ITestOutputHelper output, SharedBuildPerTestClassFixture build public void Blazor_BuildThenClean_NativeRelinking(string config) { string extraProperties = @"<_WasmDevel>truetrue"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean", "App", extraProperties: extraProperties); BlazorBuild(info, isNativeBuild: true); string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); @@ -57,7 +57,7 @@ public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) { string extraProperties = @"<_WasmDevel>true"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean_native", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean_native", "App", extraProperties: extraProperties); bool relink = firstBuildNative; BlazorBuild(info, isNativeBuild: relink, extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index d34d7cd430ac70..378e02edf38606 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -32,7 +32,7 @@ public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRel : string.Empty; if (!nativeRelink) extraProperties += "true"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_deploy_on_build", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_deploy_on_build", "App", extraProperties: extraProperties); // build with -p:DeployOnBuild=true, and that will trigger a publish (string _, string buildOutput) = BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:DeployBuild=true"); @@ -54,7 +54,7 @@ public void DefaultTemplate_AOT_InProjectFile(string config) ? ("-O1" + "-O1") : string.Empty; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_aot_prj_file", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_aot_prj_file", "App", extraProperties: extraProperties); // No relinking, no AOT BlazorBuild(info); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs index 1b91e4b3a200bb..46487579e484c2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs @@ -52,7 +52,7 @@ public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(string config) private CommandResult PublishForRequiresWorkloadTest(string config, string extraItems="", string extraProperties="") { ProjectInfo info = CopyTestAsset( - config, aot: false, "BlazorBasicTestApp", "needs_workload", extraProperties: extraProperties, extraItems: extraItems); + config, aot: false, "BlazorBasicTestApp", "needs_workload", "App", extraProperties: extraProperties, extraItems: extraItems); string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index 24bbdfb2799ea1..e669c98fb7799e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; @@ -22,146 +23,103 @@ public MiscTests3(ITestOutputHelper output, SharedBuildPerTestClassFixture build _enablePerTestCleanup = true; } - // [Theory] - // [InlineData("Debug", /*build*/true, /*publish*/false)] - // [InlineData("Debug", /*build*/false, /*publish*/true)] - // [InlineData("Debug", /*build*/true, /*publish*/true)] - // [InlineData("Release", /*build*/true, /*publish*/false)] - // [InlineData("Release", /*build*/false, /*publish*/true)] - // [InlineData("Release", /*build*/true, /*publish*/true)] - // public async Task WithDllImportInMainAssembly(string config, bool build, bool publish) - // { - // // Based on https://github.com/dotnet/runtime/issues/59255 - // string id = $"blz_dllimp_{config}_{s_unicodeChars}"; - // if (build && publish) - // id += "build_then_publish"; - // else if (build) - // id += "build"; - // else - // id += "publish"; - - // string projectFile = CreateProjectWithNativeReference(id); - // string nativeSource = @" - // #include - - // extern ""C"" { - // int cpp_add(int a, int b) { - // return a + b; - // } - // }"; - - // File.WriteAllText(Path.Combine(_projectDir!, "mylib.cpp"), nativeSource); - - // string myDllImportCs = @$" - // using System.Runtime.InteropServices; - // namespace {id}; - - // public static class MyDllImports - // {{ - // [DllImport(""mylib"")] - // public static extern int cpp_add(int a, int b); - // }}"; - - // File.WriteAllText(Path.Combine(_projectDir!, "Pages", "MyDllImport.cs"), myDllImportCs); - - // AddItemsPropertiesToProject(projectFile, extraItems: @""); - // BlazorAddRazorButton("cpp_add", """ - // var result = MyDllImports.cpp_add(10, 12); - // outputText = $"{result}"; - // """); - - // if (build) - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - - // if (publish) - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: build)); - - // RunOptions runOptions = new() { Configuration = config, Test = TestDllImport }; - // if (publish) - // await BlazorRunForPublishWithWebServer(runOptions); - // else - // await BlazorRunForBuildWithDotnetRun(runOptions); - - // async Task TestDllImport(IPage page) - // { - // await page.Locator("text=\"cpp_add\"").ClickAsync(); - // var txt = await page.Locator("p[role='test']").InnerHTMLAsync(); - // Assert.Equal("Output: 22", txt); - // } - // } - - // [Fact] - // public void BugRegression_60479_WithRazorClassLib() - // { - // string id = $"blz_razor_lib_top_{GetRandomId()}"; - // InitBlazorWasmProjectDir(id); - - // string wasmProjectDir = Path.Combine(_projectDir!, "wasm"); - // string wasmProjectFile = Path.Combine(wasmProjectDir, "wasm.csproj"); - // Directory.CreateDirectory(wasmProjectDir); - // using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); - // cmd.WithWorkingDirectory(wasmProjectDir) - // .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - // .ExecuteWithCapturedOutput("new blazorwasm") - // .EnsureSuccessful(); - - // string razorProjectDir = Path.Combine(_projectDir!, "RazorClassLibrary"); - // Directory.CreateDirectory(razorProjectDir); - // cmd.WithWorkingDirectory(razorProjectDir) - // .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - // .ExecuteWithCapturedOutput("new razorclasslib") - // .EnsureSuccessful(); - - // string razorClassLibraryFileNameWithoutExtension = "RazorClassLibrary"; - // AddItemsPropertiesToProject(wasmProjectFile, extraItems: @$" - // - // - // "); - - // _projectDir = wasmProjectDir; - // string config = "Release"; - // // No relinking, no AOT - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - - // // will relink - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); - - // // publish/wwwroot/_framework/blazor.boot.json - // string frameworkDir = GetBlazorBinFrameworkDir(config, forPublish: true); - // string bootJson = Path.Combine(frameworkDir, "blazor.boot.json"); - - // Assert.True(File.Exists(bootJson), $"Could not find {bootJson}"); - // var jdoc = JsonDocument.Parse(File.ReadAllText(bootJson)); - // if (!jdoc.RootElement.TryGetProperty("resources", out JsonElement resValue) || - // !resValue.TryGetProperty("lazyAssembly", out JsonElement lazyVal)) - // { - // throw new XunitException($"Could not find resources.lazyAssembly object in {bootJson}"); - // } - - // Assert.True(lazyVal.EnumerateObject().Select(jp => jp.Name).FirstOrDefault(f => f.StartsWith(razorClassLibraryFileNameWithoutExtension)) != null); - // } - - // private void BlazorAddRazorButton(string buttonText, string customCode, string methodName = "test", string razorPage = "Pages/Counter.razor") - // { - // string additionalCode = $$""" - //

Output: @outputText

- // - - // @code { - // private string outputText = string.Empty; - // public void {{methodName}}() - // { - // {{customCode}} - // } - // } - // """; - - // // find blazor's Counter.razor - // string counterRazorPath = Path.Combine(_projectDir!, razorPage); - // if (!File.Exists(counterRazorPath)) - // throw new FileNotFoundException($"Could not find {counterRazorPath}"); - - // string oldContent = File.ReadAllText(counterRazorPath); - // File.WriteAllText(counterRazorPath, oldContent + additionalCode); - // } + [Theory] + [InlineData("Debug", /*build*/true, /*publish*/false)] + [InlineData("Release", /*build*/true, /*publish*/false)] + [InlineData("Release", /*build*/false, /*publish*/true)] + [InlineData("Release", /*build*/true, /*publish*/true)] + public async Task WithDllImportInMainAssembly(string config, bool build, bool publish) + { + // Based on https://github.com/dotnet/runtime/issues/59255 + string prefix = $"blz_dllimp_{config}_{s_unicodeChars}"; + if (build && publish) + prefix += "build_then_publish"; + else if (build) + prefix += "build"; + else + prefix += "publish"; + string extraItems = @""; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraItems: extraItems); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "MyDllImport.cs"), Path.Combine(_projectDir!, "Pages", "MyDllImport.cs")); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "mylib.cpp"), Path.Combine(_projectDir!, "mylib.cpp")); + UpdateFile(Path.Combine("Pages", "MyDllImport.cs"), new Dictionary { { "##NAMESPACE##", info.ProjectName } }); + + BlazorAddRazorButton("cpp_add", """ + var result = MyDllImports.cpp_add(10, 12); + outputText = $"{result}"; + """); + + if (build) + BlazorBuild(info, isNativeBuild: true); + + if (publish) + BlazorPublish(info, useCache: false, isNativeBuild: true); + + RunOptions runOptions = new(config, Test: TestDllImport); + if (publish) + await RunForPublishWithWebServer(runOptions); + else + await RunForBuildWithDotnetRun(runOptions); + + async Task TestDllImport(IPage page) + { + await page.Locator("text=\"cpp_add\"").ClickAsync(); + var txt = await page.Locator("p[role='test']").InnerHTMLAsync(); + Assert.Equal("Output: 22", txt); + } + } + + [Fact] + public void BugRegression_60479_WithRazorClassLib() + { + string config = "Release"; + string razorClassLibraryName = "RazorClassLibrary"; + string extraItems = @$" + + "; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_razor_lib_top", "App", extraItems: extraItems); + + // No relinking, no AOT + BlazorBuild(info); + + // will relink + BlazorPublish(info, useCache: false); + + // publish/wwwroot/_framework/blazor.boot.json + string frameworkDir = GetBlazorBinFrameworkDir(config, forPublish: true); + string bootJson = Path.Combine(frameworkDir, "blazor.boot.json"); + + Assert.True(File.Exists(bootJson), $"Could not find {bootJson}"); + var jdoc = JsonDocument.Parse(File.ReadAllText(bootJson)); + if (!jdoc.RootElement.TryGetProperty("resources", out JsonElement resValue) || + !resValue.TryGetProperty("lazyAssembly", out JsonElement lazyVal)) + { + throw new XunitException($"Could not find resources.lazyAssembly object in {bootJson}"); + } + + Assert.True(lazyVal.EnumerateObject().Select(jp => jp.Name).FirstOrDefault(f => f.StartsWith(razorClassLibraryName)) != null); + } + + private void BlazorAddRazorButton(string buttonText, string customCode, string methodName = "test") => + UpdateFile(Path.Combine("Pages", "Counter.razor"), new Dictionary { + { + @"", + $@" + +

Output: @outputText

+ + " + }, + { + "private int currentCount = 0;", + $@" + private int currentCount = 0; + private string outputText = string.Empty; + public void {methodName}() + {{ + {customCode} + }} + " + } + }); } diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/App.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App/App.razor similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/App.razor rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/App.razor diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/BlazorBasicTestApp.csproj b/src/mono/wasm/testassets/BlazorBasicTestApp/App/BlazorBasicTestApp.csproj similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/BlazorBasicTestApp.csproj rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/BlazorBasicTestApp.csproj diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/MainLayout.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App/Layout/MainLayout.razor similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/Layout/MainLayout.razor rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/Layout/MainLayout.razor diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Layout/NavMenu.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App/Layout/NavMenu.razor similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/Layout/NavMenu.razor rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/Layout/NavMenu.razor diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Counter.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App/Pages/Counter.razor similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Counter.razor rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/Pages/Counter.razor diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Home.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App/Pages/Home.razor similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/Pages/Home.razor rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/Pages/Home.razor diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/Program.cs b/src/mono/wasm/testassets/BlazorBasicTestApp/App/Program.cs similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/Program.cs rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/Program.cs diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/_Imports.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/App/_Imports.razor similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/_Imports.razor rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/_Imports.razor diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/favicon.png b/src/mono/wasm/testassets/BlazorBasicTestApp/App/wwwroot/favicon.png similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/favicon.png rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/wwwroot/favicon.png diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/icon-192.png b/src/mono/wasm/testassets/BlazorBasicTestApp/App/wwwroot/icon-192.png similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/icon-192.png rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/wwwroot/icon-192.png diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/index.html b/src/mono/wasm/testassets/BlazorBasicTestApp/App/wwwroot/index.html similarity index 100% rename from src/mono/wasm/testassets/BlazorBasicTestApp/wwwroot/index.html rename to src/mono/wasm/testassets/BlazorBasicTestApp/App/wwwroot/index.html diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/Component1.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/Component1.razor new file mode 100644 index 00000000000000..748079eb2e2284 --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/Component1.razor @@ -0,0 +1,3 @@ +
+ This component is defined in the RazorClassLibrary library. +
diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/RazorClassLibrary.csproj b/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/RazorClassLibrary.csproj new file mode 100644 index 00000000000000..a4991806ea06ca --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/RazorClassLibrary.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + + diff --git a/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/_Imports.razor b/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/_Imports.razor new file mode 100644 index 00000000000000..77285129dabe4b --- /dev/null +++ b/src/mono/wasm/testassets/BlazorBasicTestApp/RazorClassLibrary/_Imports.razor @@ -0,0 +1 @@ +@using Microsoft.AspNetCore.Components.Web diff --git a/src/mono/wasm/testassets/EntryPoints/MyDllImport.cs b/src/mono/wasm/testassets/EntryPoints/MyDllImport.cs new file mode 100644 index 00000000000000..a98e9d0334ab2c --- /dev/null +++ b/src/mono/wasm/testassets/EntryPoints/MyDllImport.cs @@ -0,0 +1,8 @@ +using System.Runtime.InteropServices; +namespace ##NAMESPACE##; + +public static class MyDllImports +{ + [DllImport("mylib")] + public static extern int cpp_add(int a, int b); +} \ No newline at end of file diff --git a/src/mono/wasm/testassets/native-libs/mylib.cpp b/src/mono/wasm/testassets/native-libs/mylib.cpp new file mode 100644 index 00000000000000..b781006fec5961 --- /dev/null +++ b/src/mono/wasm/testassets/native-libs/mylib.cpp @@ -0,0 +1,7 @@ +#include + +extern "C" { + int cpp_add(int a, int b) { + return a + b; + } +} \ No newline at end of file From ab894fe6378f1c289ed3b65858bf523183ecabd5 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 15:29:42 +0000 Subject: [PATCH 048/104] `NativeTests`: done --- .../Blazor/BlazorWasmTestBase.cs | 23 ++--- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 94 +++++++++---------- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index d4317368a68492..08bd4b40961fa3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -65,19 +65,20 @@ public override (string projectDir, string buildOutput) BuildTemplateProject( { try { - var additionalOptiont = buildOptions.WarnAsError ? - new[] { "-p:BlazorEnableCompression=false", "/warnaserror"} : - new[] { "-p:BlazorEnableCompression=false" }; - extraArgs = extraArgs.Concat(additionalOptiont).ToArray(); + var additionalOptiont = buildOptions.WarnAsError + ? new[] { "-p:BlazorEnableCompression=false", "/warnaserror" } + : new[] { "-p:BlazorEnableCompression=false" }; + (string projectDir, string buildOutput) = base.BuildTemplateProject( projectInfo, buildOptions with { AssertAppBundle = false }, - extraArgs - ); + extraArgs.Concat(additionalOptiont).ToArray()); + if (buildOptions.ExpectSuccess && buildOptions.AssertAppBundle) { AssertBundle(buildOutput, buildOptions); } + return (projectDir, buildOutput); } catch (XunitException xe) @@ -236,18 +237,14 @@ public void AssertBundle(string buildOutput, BuildProjectOptions buildOptions) Assert.False(File.Exists(Path.Combine(objBuildDir, "emcc-link.rsp")), $"Found unexpected `emcc-link.rsp` in {objBuildDir}, which gets created when relinking during Build."); } - protected string CreateProjectWithNativeReference(string id) + protected ProjectInfo CreateProjectWithNativeReference(string config, bool aot, string extraProperties) { - CreateBlazorWasmTemplateProject(id); - string extraItems = @$" {GetSkiaSharpReferenceItems()} "; - string projectFile = Path.Combine(_projectDir!, $"{id}.csproj"); - AddItemsPropertiesToProject(projectFile, extraItems: extraItems); - - return projectFile; + return CopyTestAsset( + config, aot, "BlazorBasicTestApp", "blz_nativeref_aot", "App", extraItems: extraItems, extraProperties: extraProperties); } // Keeping these methods with explicit Build/Publish in the name diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index 7327c53e6eda2d..8dc989d15ed981 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -17,61 +17,57 @@ public NativeTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buil _enablePerTestCleanup = true; } - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] - // public void WithNativeReference_AOTInProjectFile(string config) - // { - // string id = $"blz_nativeref_aot_{config}_{GetRandomId()}"; - // string projectFile = CreateProjectWithNativeReference(id); - // string extraProperties = config == "Debug" - // ? ("-O1" + - // "-O1") - // : string.Empty; - // AddItemsPropertiesToProject(projectFile, extraProperties: "true" + extraProperties); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true)); - - // // will relink - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - // } - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] - // public void WithNativeReference_AOTOnCommandLine(string config) - // { - // string id = $"blz_nativeref_aot_{config}_{GetRandomId()}"; - // string projectFile = CreateProjectWithNativeReference(id); - // string extraProperties = config == "Debug" - // ? ("-O1" + - // "-O1") - // : string.Empty; - // AddItemsPropertiesToProject(projectFile, extraProperties: extraProperties); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.AOT, ExpectRelinkDirWhenPublishing: true), "-p:RunAOTCompilation=true"); + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] + public void WithNativeReference_AOTInProjectFile(string config) + { + string extraProperties = config == "Debug" + ? ("-O1" + + "-O1") + : string.Empty; + ProjectInfo info = CreateProjectWithNativeReference(config, aot: true, extraProperties: extraProperties); + BlazorBuild(info, isNativeBuild: true); + BlazorPublish(info, useCache: false, isNativeBuild: true); + // will relink + BlazorBuild(info, useCache: false, isNativeBuild: true); + } - // // no aot! - // BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked, ExpectRelinkDirWhenPublishing: true)); - // } + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] + public void WithNativeReference_AOTOnCommandLine(string config) + { + string extraProperties = config == "Debug" + ? ("-O1" + + "-O1") + : string.Empty; + ProjectInfo info = CreateProjectWithNativeReference(config, aot: false, extraProperties: extraProperties); + BlazorBuild(info, isNativeBuild: true); + BlazorPublish(info, isNativeBuild: true, extraArgs: "-p:RunAOTCompilation=true"); + // no aot! + BlazorPublish(info, isNativeBuild: true); + } // [Theory] // [InlineData("Release")] // public void BlazorWasm_CannotAOT_WithNoTrimming(string config) // { - // string id = $"blazorwasm_{config}_aot_{GetRandomId()}"; - // CreateBlazorWasmTemplateProject(id); - // AddItemsPropertiesToProject(Path.Combine(_projectDir!, $"{id}.csproj"), - // extraItems: null, - // extraProperties: "falsetrue"); + // string extraProperties = "falsetrue"; + // ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blazorwasm_aot", "App", extraProperties: extraProperties); - // (CommandResult res, _) = BlazorPublish(new BuildProjectOptions(id, config, ExpectSuccess: false)); - // Assert.Contains("AOT is not supported without IL trimming", res.Output); + // bool isPublish = true; + // (string _, string output) = BuildTemplateProject(info, + // new BuildProjectOptions( + // info.Configuration, + // info.ProjectName, + // BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + // ExpectedFileType: GetExpectedFileType(info, isPublish), + // IsPublish: isPublish, + // ExpectSuccess: false) + // ); + // Assert.Contains("AOT is not supported without IL trimming", output); // } } From d8762cc4bb6591d697175d6a7bcb8bd723c1fc3e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:10:14 +0000 Subject: [PATCH 049/104] `NativeTests`: uncomment. --- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index 8dc989d15ed981..f837b11c615102 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -51,23 +51,23 @@ public void WithNativeReference_AOTOnCommandLine(string config) BlazorPublish(info, isNativeBuild: true); } - // [Theory] - // [InlineData("Release")] - // public void BlazorWasm_CannotAOT_WithNoTrimming(string config) - // { - // string extraProperties = "falsetrue"; - // ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blazorwasm_aot", "App", extraProperties: extraProperties); + [Theory] + [InlineData("Release")] + public void BlazorWasm_CannotAOT_WithNoTrimming(string config) + { + string extraProperties = "falsetrue"; + ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blazorwasm_aot", "App", extraProperties: extraProperties); - // bool isPublish = true; - // (string _, string output) = BuildTemplateProject(info, - // new BuildProjectOptions( - // info.Configuration, - // info.ProjectName, - // BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - // ExpectedFileType: GetExpectedFileType(info, isPublish), - // IsPublish: isPublish, - // ExpectSuccess: false) - // ); - // Assert.Contains("AOT is not supported without IL trimming", output); - // } + bool isPublish = true; + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + ExpectSuccess: false) + ); + Assert.Contains("AOT is not supported without IL trimming", output); + } } From f40cf8a536df475ef171712243e405db14e1108c Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:11:10 +0000 Subject: [PATCH 050/104] `NoopNativeRebuildTest`: done --- .../Blazor/NoopNativeRebuildTest.cs | 99 +++++++++---------- 1 file changed, 47 insertions(+), 52 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 5923f5b1f2cbc0..5bacd05d9ff87f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -18,59 +18,54 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi { } - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void BlazorNoopRebuild(string config) - // { - // string id = $"blz_rebuild_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // AddItemsPropertiesToProject(projectFile, extraProperties: "true"); - - // string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - // File.Move(Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build.binlog"), - // Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build-first.binlog")); - - // var pathsDict = _provider.GetFilesTable(true, objDir); - // pathsDict.Remove("runtime-icall-table.h"); - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // // build again - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked)); - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - // } - - - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public void BlazorOnlyLinkRebuild(string config) - // { - // string id = $"blz_relink_{config}_{GetRandomId()}"; - // string projectFile = CreateBlazorWasmTemplateProject(id); - // AddItemsPropertiesToProject(projectFile, extraProperties: "true"); - - // string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked), "-p:EmccLinkOptimizationFlag=-O2"); - // File.Move(Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build.binlog"), - // Path.Combine(s_buildEnv.LogRootPath, id, $"{id}-build-first.binlog")); - - // var pathsDict = _provider.GetFilesTable(true, objDir); - // pathsDict.Remove("runtime-icall-table.h"); - // pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js", "emcc-link.rsp"); - - // var originalStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void BlazorNoopRebuild(string config) + { + string extraProperties = "true"; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_rebuild", "App", extraProperties: extraProperties); + BlazorBuild(info, isNativeBuild: true); + string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; + File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), + Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); + + string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); + var pathsDict = _provider.GetFilesTable(true, objDir); + pathsDict.Remove("runtime-icall-table.h"); + var originalStat = _provider.StatFiles(pathsDict); + + // build again + BlazorBuild(info, useCache: false, isNativeBuild: true); + var newStat = _provider.StatFiles(pathsDict); + + _provider.CompareStat(originalStat, newStat, pathsDict); + } - // // build again - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.Relinked), "-p:EmccLinkOptimizationFlag=-O1"); - // var newStat = _provider.StatFiles(pathsDict.Select(kvp => kvp.Value.fullPath)); - // _provider.CompareStat(originalStat, newStat, pathsDict.Values); - // } + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public void BlazorOnlyLinkRebuild(string config) + { + string extraProperties = "true"; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_relink", "App", extraProperties: extraProperties); + BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:EmccLinkOptimizationFlag=-O2"); + string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; + File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), + Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); + + string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); + var pathsDict = _provider.GetFilesTable(true, objDir); + pathsDict.Remove("runtime-icall-table.h"); + pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js", "emcc-link.rsp"); + var originalStat = _provider.StatFiles(pathsDict); + + // build again + BlazorBuild(info, useCache: false, isNativeBuild: true, extraArgs: "-p:EmccLinkOptimizationFlag=-O1"); + var newStat = _provider.StatFiles(pathsDict); + + _provider.CompareStat(originalStat, newStat, pathsDict); + } } } From 5505603d6ff661581ae02f47b401b98ec1f4ca1d Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:40:23 +0000 Subject: [PATCH 051/104] `SimpleRunTests`: done --- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 121 ++++++++---------- 1 file changed, 52 insertions(+), 69 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index 2d527502d8d04a..1be2cd20cacb82 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -22,76 +22,59 @@ public SimpleRunTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b _enablePerTestCleanup = true; } - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task BlazorBuildRunTest(string config) - // { - // string id = $"blazor_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack)); - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } - - // [Theory] - // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] - // [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] - // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] - // [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] - // public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) - // { - // string id = $"{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - // string projectName = Path.GetFileNameWithoutExtension(projectFile); - - // string extraPropertiesForDBP = ""; - // if (appendRID) - // extraPropertiesForDBP += "true"; - // if (useArtifacts) - // extraPropertiesForDBP += "true."; - - // string projectDirectory = Path.GetDirectoryName(projectFile)!; - // if (!string.IsNullOrEmpty(extraPropertiesForDBP)) - // AddItemsPropertiesToProject(Path.Combine(projectDirectory, "Directory.Build.props"), - // extraPropertiesForDBP); - - // var buildArgs = new ProjectInfo(projectName, config, false, id, null); - // buildArgs = ExpandBuildArgs(buildArgs); + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + public async Task BlazorBuildRunTest(string config) + { + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazor", "App"); + BlazorBuild(info); + await RunForBuildWithDotnetRun(new(config)); + } - // BuildProjectOptions buildOptions = new(id, config, NativeFilesType.FromRuntimePack); - // if (useArtifacts) - // { - // buildOptions = buildOptions with - // { - // BinFrameworkDir = Path.Combine(projectDirectory, - // "bin", - // id, - // config.ToLower(), - // "wwwroot", - // "_framework") - // }; - // } - // BlazorBuild(buildOptions); - // await BlazorRunForBuildWithDotnetRun(new RunOptions() { Configuration = config }); - // } + [Theory] + [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] + [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] + [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] + [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] + public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) + { + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazor", "App"); + string extraPropertiesForDBP = ""; + if (appendRID) + extraPropertiesForDBP += "true"; + if (useArtifacts) + extraPropertiesForDBP += "true."; + string projectDir = Path.GetDirectoryName(info.ProjectFilePath) ?? ""; + string rootDir = Path.GetDirectoryName(projectDir) ?? ""; + if (!string.IsNullOrEmpty(extraPropertiesForDBP)) + AddItemsPropertiesToProject(Path.Combine(rootDir, "Directory.Build.props"), + extraPropertiesForDBP); - // [Theory] - // [InlineData("Debug", false)] - // [InlineData("Release", false)] - // [InlineData("Release", true)] - // public async Task BlazorPublishRunTest(string config, bool aot) - // { - // string id = $"blazor_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - // if (aot) - // AddItemsPropertiesToProject(projectFile, "true"); + bool isPublish = false; + string frameworkDir = useArtifacts ? + Path.Combine( + projectDir, "bin", info.ProjectName, config.ToLower(), "wwwroot", "_framework") : + GetBinFrameworkDir(config, isPublish); + BuildTemplateProject(info, + new BuildProjectOptions( + config, + info.ProjectName, + BinFrameworkDir: frameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish + )); + await RunForBuildWithDotnetRun(new(config)); + } - // BlazorPublish(new BuildProjectOptions( - // id, - // config, - // aot ? NativeFilesType.AOT - // : (config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack))); - // await BlazorRunForPublishWithWebServer(new RunOptions() { Configuration = config }); - // } + [Theory] + [InlineData("Debug", false)] + [InlineData("Release", false)] + [InlineData("Release", true)] + public async Task BlazorPublishRunTest(string config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, "BlazorBasicTestApp", "blazor_publish", "App"); + BlazorPublish(info); + await RunForPublishWithWebServer(new(config)); + } } From 0af33559b27bf931ef3446eb2c50f9729522d25c Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 20:50:35 +0000 Subject: [PATCH 052/104] `Blazor.WorkloadRequiredTests`: done --- .../Blazor/WorkloadRequiredTests.cs | 271 ++++++++---------- 1 file changed, 124 insertions(+), 147 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index 2fb93d2ae6a075..e6bfe8c17d4346 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -51,151 +51,128 @@ public static TheoryData SettingDifferentFromValuesInRunti return data; } - // [Theory, TestCategory("no-workload")] - // [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] - // public void WorkloadRequiredForBuild(string config, string extraProperties, bool workloadNeeded) - // => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: false); - - // [Theory, TestCategory("no-workload")] - // [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] - // public void WorkloadRequiredForPublish(string config, string extraProperties, bool workloadNeeded) - // => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: true); - - // public static TheoryData InvariantGlobalizationTestData(bool publish) - // { - // TheoryData data = new(); - // foreach (string config in new[] { "Debug", "Release" }) - // { - // data.Add(config, /*invariant*/ true, /*publish*/ publish); - // data.Add(config, /*invariant*/ false, /*publish*/ publish); - // } - // return data; - // } - - // [Theory, TestCategory("no-workload")] - // [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] - // [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ true)] - // public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bool invariant, bool publish) - // { - // string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - - // if (invariant) - // AddItemsPropertiesToProject(projectFile, extraProperties: "true"); - - // string counterPath = Path.Combine(Path.GetDirectoryName(projectFile)!, "Pages", "Counter.razor"); - // string allText = File.ReadAllText(counterPath); - // string ccText = "currentCount++;"; - // if (allText.IndexOf(ccText) < 0) - // throw new Exception("Counter.razor does not have the expected content. Test needs to be updated."); - - // allText = allText.Replace(ccText, $"{ccText}{Environment.NewLine}TestInvariantCulture();"); - // allText += s_invariantCultureMethodForBlazor; - // File.WriteAllText(counterPath, allText); - // _testOutput.WriteLine($"Updated counter.razor: {allText}"); - - // CommandResult result; - // GlobalizationMode mode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; - // if (publish) - // { - // (result, _) = BlazorPublish( - // new BuildProjectOptions( - // id, - // config, - // ExpectSuccess: true, - // GlobalizationMode: mode)); - // } - // else - // { - // (result, _) = BlazorBuild( - // new BuildProjectOptions( - // id, - // config, - // ExpectSuccess: true, - // GlobalizationMode: mode)); - // } - - // StringBuilder sbOutput = new(); - // await RunBrowserTest(new RunOptions() - // { - // Configuration = config, - // Host = publish ? RunHost.WebServer : RunHost.DotnetRun, - // OnConsoleMessage = (_, msg) => - // { - // sbOutput.AppendLine(msg.Text); - // } - // }); - - // string output = sbOutput.ToString(); - // if (invariant) - // { - // Assert.Contains("Could not create es-ES culture", output); - // // For invariant, we get: - // // Could not create es-ES culture: Argument_CultureNotSupportedInInvariantMode Arg_ParamName_Name, name - // // Argument_CultureInvalidIdentifier, es-ES - // // .. which is expected. - // // - // // Assert.Contains("es-ES is an invalid culture identifier.", output); - // Assert.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); - // Assert.DoesNotContain($"es-ES: Is-LCID-InvariantCulture:", output); - // } - // else - // { - // Assert.DoesNotContain("Could not create es-ES culture", output); - // Assert.DoesNotContain("invalid culture", output); - // Assert.DoesNotContain("CurrentCulture.NativeName: Invariant Language (Invariant Country)", output); - // Assert.Contains("es-ES: Is-LCID-InvariantCulture: False", output); - // Assert.Contains("NativeName: espa\u00F1ol (Espa\u00F1a)", output); - - // // ignoring the last line of the output which prints the current culture - // } - // } - - // private void CheckWorkloadRequired(string config, string extraProperties, bool workloadNeeded, bool publish) - // { - // string id = $"props_req_workload_{(publish ? "publish" : "build")}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - // AddItemsPropertiesToProject(projectFile, extraProperties, - // insertAtEnd: @" - // - // "); - - // CommandResult result; - // if (publish) - // (result, _) = BlazorPublish(new BuildProjectOptions(id, config, ExpectSuccess: false)); - // else - // (result, _) = BlazorBuild(new BuildProjectOptions(id, config, ExpectSuccess: false)); - - // if (workloadNeeded) - // { - // Assert.Contains("following workloads must be installed: wasm-tools", result.Output); - // Assert.DoesNotContain("error : Stopping the build", result.Output); - // } - // else - // { - // Assert.DoesNotContain("following workloads must be installed: wasm-tools", result.Output); - // Assert.Contains("error : Stopping the build", result.Output); - // } - // } - - // private static string s_invariantCultureMethodForBlazor = """ - // @code { - // public int TestInvariantCulture() - // { - // // https://github.com/dotnet/runtime/blob/main/docs/design/features/globalization-invariant-mode.md#cultures-and-culture-data - // try - // { - // System.Globalization.CultureInfo culture = new ("es-ES", false); - // System.Console.WriteLine($"es-ES: Is-LCID-InvariantCulture: {culture.LCID == System.Globalization.CultureInfo.InvariantCulture.LCID}, NativeName: {culture.NativeName}"); - // } - // catch (System.Globalization.CultureNotFoundException cnfe) - // { - // System.Console.WriteLine($"Could not create es-ES culture: {cnfe.Message}"); - // } - - // System.Console.WriteLine($"CurrentCulture.NativeName: {System.Globalization.CultureInfo.CurrentCulture.NativeName}"); - // return 42; - // } - // } - // """; + [Theory, TestCategory("no-workload")] + [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] + public void WorkloadRequiredForBuild(string config, string extraProperties, bool workloadNeeded) + => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: false); + + [Theory, TestCategory("no-workload")] + [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] + public void WorkloadRequiredForPublish(string config, string extraProperties, bool workloadNeeded) + => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: true); + + public static TheoryData InvariantGlobalizationTestData(bool publish) + { + TheoryData data = new(); + foreach (string config in new[] { "Debug", "Release" }) + { + data.Add(config, /*invariant*/ true, /*publish*/ publish); + data.Add(config, /*invariant*/ false, /*publish*/ publish); + } + return data; + } + + [Theory, TestCategory("no-workload")] + [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] + [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ true)] + public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bool invariant, bool publish) + { + string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; + string extraProperties = invariant ? $"true" : ""; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraProperties: extraProperties); + string ccText = "currentCount++;"; + // UpdateFile throws if code that is to be replaced does not exist + UpdateFile(Path.Combine("Pages", "Counter.razor"), new Dictionary + { + { ccText, $"{ccText}\nTestInvariantCulture();" }, + { "private int currentCount = 0;", $"{s_invariantCultureMethodForBlazor}" } + }); + string counterPath = Path.Combine(_projectDir!, "Pages", "Counter.razor"); + string allText = File.ReadAllText(counterPath); + _testOutput.WriteLine($"Updated counter.razor: {allText}"); + + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, publish), + ExpectedFileType: GetExpectedFileType(info, publish), + IsPublish: publish, + GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded + )); + + RunOptions runOptions = new(config); + RunResult result = publish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); + + if (invariant) + { + Assert.Contains(result.TestOutput, m => m.Contains("Could not create es-ES culture")); + // For invariant, we get: + // Could not create es-ES culture: Argument_CultureNotSupportedInInvariantMode Arg_ParamName_Name, name + // Argument_CultureInvalidIdentifier, es-ES + // .. which is expected. + // + // Assert.Contains("es-ES is an invalid culture identifier.", output); + Assert.Contains(result.TestOutput, m => m.Contains("CurrentCulture.NativeName: Invariant Language (Invariant Country)")); + Assert.All(result.TestOutput, m => Assert.DoesNotContain("es-ES: Is-LCID-InvariantCulture", m)); + } + else + { + Assert.All(result.TestOutput, m => Assert.DoesNotContain("Could not create es-ES culture", m)); + Assert.All(result.TestOutput, m => Assert.DoesNotContain("invalid culture", m)); + Assert.All(result.TestOutput, m => Assert.DoesNotContain("CurrentCulture.NativeName: Invariant Language (Invariant Country)", m)); + Assert.Contains(result.TestOutput, m => m.Contains("es-ES: Is-LCID-InvariantCulture: False")); + Assert.Contains(result.TestOutput, m => m.Contains("NativeName: espa\u00F1ol (Espa\u00F1a)")); + // ignoring the last line of the output which prints the current culture + } + } + + private void CheckWorkloadRequired(string config, string extraProperties, bool workloadNeeded, bool publish) + { + string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; + string insertAtEnd = @" + + "; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraProperties: extraProperties, insertAtEnd: insertAtEnd); + (string _, string output) = BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, publish), + ExpectedFileType: GetExpectedFileType(info, publish), + IsPublish: publish, + ExpectSuccess: false + )); + + if (workloadNeeded) + { + Assert.Contains("following workloads must be installed: wasm-tools", output); + Assert.DoesNotContain("error : Stopping the build", output); + } + else + { + Assert.DoesNotContain("following workloads must be installed: wasm-tools", output); + Assert.Contains("error : Stopping the build", output); + } + } + + private static string s_invariantCultureMethodForBlazor = """ + private int currentCount = 0; + public int TestInvariantCulture() + { + // https://github.com/dotnet/runtime/blob/main/docs/design/features/globalization-invariant-mode.md#cultures-and-culture-data + try + { + System.Globalization.CultureInfo culture = new ("es-ES", false); + System.Console.WriteLine($"TestOutput -> es-ES: Is-LCID-InvariantCulture: {culture.LCID == System.Globalization.CultureInfo.InvariantCulture.LCID}, NativeName: {culture.NativeName}"); + } + catch (System.Globalization.CultureNotFoundException cnfe) + { + System.Console.WriteLine($"TestOutput -> Could not create es-ES culture: {cnfe.Message}"); + } + + System.Console.WriteLine($"TestOutput -> CurrentCulture.NativeName: {System.Globalization.CultureInfo.CurrentCulture.NativeName}"); + return 42; + } + """; } From 262ff89aee96eacaeb16c89a1d33cb0786d9ea75 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 12 Nov 2024 21:55:37 +0000 Subject: [PATCH 053/104] `Blazor.SimpleMultiThreadedTests`: has issues with running after build. --- .../Blazor/SimpleMultiThreadedTests.cs | 141 ++++++++++-------- 1 file changed, 76 insertions(+), 65 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 4232398e418910..0cab1b3fec9655 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -21,76 +21,87 @@ public SimpleMultiThreadedTests(ITestOutputHelper output, SharedBuildPerTestClas } // dotnet-run needed for running with *build* so wwwroot has the index.html etc - // [Theory] - // [InlineData("Debug")] - // [InlineData("Release")] - // public async Task BlazorBuildRunTest(string config) - // { - // string id = $"blazor_mt_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - - // AddItemsPropertiesToProject(projectFile, "true"); - // BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack, RuntimeType: RuntimeType.MultiThreaded)); - // // await BlazorRunForBuildWithDotnetRun(config); - - // await BlazorRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files --web-server-use-cors --web-server-use-cop --web-server-use-https --timeout=15:00:00", - // Path.GetFullPath(Path.Combine(GetBlazorBinFrameworkDir(config, forPublish: false), ".."))); - // } + [Theory] + [InlineData("Debug")] + [InlineData("Release")] + [ActiveIssue("run fails with timeout")] + public async Task BlazorBuildRunTest(string config) + { + string extraProperties = "true"; + ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazorwasm", "App", extraProperties: extraProperties); + bool isPublish = false; + string frameworkDir = GetBlazorBinFrameworkDir(info.Configuration, isPublish); + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: frameworkDir, + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + RuntimeType: RuntimeVariant.MultiThreaded + )); + // we wan to use "xharness wasm webserver" but from non-publish location + string extraArgs = " --web-server-use-cors --web-server-use-cop --web-server-use-https --timeout=15:00:00"; + await RunForPublishWithWebServer(new(config, ExtraArgs: extraArgs, CustomBundleDir: Path.Combine(frameworkDir, ".."))); + } - // [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] - // [ActiveIssue("https://github.com/dotnet/runtime/issues/100373")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" - // // [InlineData("Debug", false)] // ActiveIssue https://github.com/dotnet/runtime/issues/98758 - // // [InlineData("Debug", true)] - // [InlineData("Release", false)] - // // [InlineData("Release", true)] - // public async Task BlazorPublishRunTest(string config, bool aot) - // { - // string id = $"blazor_mt_{config}_{GetRandomId()}"; - // string projectFile = CreateWasmTemplateProject(id, "blazorwasm"); - // AddItemsPropertiesToProject(projectFile, "true"); - // // if (aot) - // // AddItemsPropertiesToProject(projectFile, "true"); + [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] + [ActiveIssue("https://github.com/dotnet/runtime/issues/100373")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" + // [InlineData("Debug", false)] // ActiveIssue https://github.com/dotnet/runtime/issues/98758 + // [InlineData("Debug", true)] + [InlineData("Release", false)] + // [InlineData("Release", true)] + public async Task BlazorPublishRunTest(string config, bool aot) + { + string extraProperties = "true"; + ProjectInfo info = CopyTestAsset(config, aot, "BlazorBasicTestApp", "blazor_mt", "App", extraProperties: extraProperties); + // if (aot) + // AddItemsPropertiesToProject(projectFile, "true"); - // File.WriteAllText( - // Path.Combine(Path.GetDirectoryName(projectFile)!, "wwwroot", id + ".lib.module.js"), - // """ - // export function onRuntimeReady({ runtimeBuildInfo }) { - // console.log('Runtime is ready: ' + JSON.stringify(runtimeBuildInfo)); - // console.log(`WasmEnableThreads=${runtimeBuildInfo.wasmEnableThreads}`); - // } - // """ - // ); + File.WriteAllText( + Path.Combine(Path.GetDirectoryName(info.ProjectFilePath)!, "wwwroot", info.ProjectName + ".lib.module.js"), + """ + export function onRuntimeReady({ runtimeBuildInfo }) { + console.log('Runtime is ready: ' + JSON.stringify(runtimeBuildInfo)); + console.log(`WasmEnableThreads=${runtimeBuildInfo.wasmEnableThreads}`); + } + """ + ); - // BlazorPublish(new BuildProjectOptions( - // id, - // config, - // aot ? NativeFilesType.AOT - // : (config == "Release" ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack), - // RuntimeType: RuntimeVariant.MultiThreaded)); + bool isPublish = true; + BuildTemplateProject(info, + new BuildProjectOptions( + info.Configuration, + info.ProjectName, + BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), + ExpectedFileType: GetExpectedFileType(info, isPublish), + IsPublish: isPublish, + RuntimeType: RuntimeVariant.MultiThreaded + )); - // bool hasEmittedWasmEnableThreads = false; - // StringBuilder errorOutput = new(); - // await BlazorRunForPublishWithWebServer( - // runOptions: new RunOptions( - // Configuration: config, - // ExtraArgs: "--web-server-use-cors --web-server-use-cop", - // OnConsoleMessage: (_, message) => - // { - // if (message.Text.Contains("WasmEnableThreads=true")) - // hasEmittedWasmEnableThreads = true; + bool hasEmittedWasmEnableThreads = false; + StringBuilder errorOutput = new(); + await RunForPublishWithWebServer( + runOptions: new RunOptions( + Configuration: config, + ExtraArgs: "--web-server-use-cors --web-server-use-cop", + OnConsoleMessage: (type, message) => + { + if (message.Contains("WasmEnableThreads=true")) + hasEmittedWasmEnableThreads = true; - // if (message.Type == "error") - // errorOutput.AppendLine(message.Text); - // }, - // OnErrorMessage: (message) => - // { - // errorOutput.AppendLine(message); - // })); + if (type == "error") + errorOutput.AppendLine(message); + }, + OnErrorMessage: (message) => + { + errorOutput.AppendLine(message); + })); - // if (errorOutput.Length > 0) - // throw new XunitException($"Errors found in browser console output:\n{errorOutput}"); + if (errorOutput.Length > 0) + throw new XunitException($"Errors found in browser console output:\n{errorOutput}"); - // if (!hasEmittedWasmEnableThreads) - // throw new XunitException($"The test didn't emit expected message 'WasmEnableThreads=true'"); - // } + if (!hasEmittedWasmEnableThreads) + throw new XunitException($"The test didn't emit expected message 'WasmEnableThreads=true'"); + } } From ffab6a3f1525f4aa1bda00b4db9ff4b2b49e0a4f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 14 Nov 2024 10:10:10 +0000 Subject: [PATCH 054/104] Update README. --- src/mono/wasm/Wasm.Build.Tests/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/README.md b/src/mono/wasm/Wasm.Build.Tests/README.md index de0c2b9540dffe..be629ccae43140 100644 --- a/src/mono/wasm/Wasm.Build.Tests/README.md +++ b/src/mono/wasm/Wasm.Build.Tests/README.md @@ -18,7 +18,8 @@ Linux/macOS: `$ make -C src/mono/(browser|wasi) run-build-tests` Windows: `.\dotnet.cmd build .\src\mono\wasm\Wasm.Build.Tests\Wasm.Build.Tests.csproj -c Release -t:Test -p:TargetOS=browser -p:TargetArchitecture=wasm` - Specific tests can be run via `XUnitClassName`, and `XUnitMethodName` - - eg. `XUnitClassName=Wasm.Build.Tests.BlazorWasmTests` + - e.g. `XUnitClassName=Wasm.Build.Tests.BlazorWasmTests` for running class of tests + - e.g. `XUnitMethodName=Wasm.Build.Tests.Blazor.MiscTests3.WithDllImportInMainAssembly` for running a specific test. ## Running on helix @@ -53,10 +54,15 @@ For this, the builds get cached using `ProjectInfo` as the key. use the build bits from the usual locations in artifacts, without requiring regenerating the nugets, and workload re-install. -- Each test gets a randomly generated "id". This `id` can be used to find the - binlogs, or the test directories. +- Each test is saved in directory with randomly generated name and unique `ProjectInfo`. `ProjectInfo` can be used to find the binlogs, or cached builds. ## Useful environment variables - `SHOW_BUILD_OUTPUT` - will show the build output to the console - `SKIP_PROJECT_CLEANUP` - won't remove the temporary project directories generated for the tests + +## How to add tests + +Blazor specific tests should be located in `Blazor` directory. If you are adding a new class with tests, list it in `eng/testing/scenarios/BuildWasmAppsJobsList.txt`. If you are adding a new test to existing class, make sure it does not prolong the execution time significantly. Tests run on parallel on CI and having one class running much longer than the average prolongs the total execution time. + +If you want to test templating mechanism, use `CreateWasmTemplateProject`. Otherwise, use `CopyTestAsset` with either `WasmBasicTestApp` or `BlazorBasicTestApp`, adding your custom `TestScenario` or using a generic `DotnetRun` scenario in case of WASM app and adding a page with test in case of Blazor app. Bigger snippets of code should be saved in `src/mono/wasm/testassets` and placed in the application using methods: `ReplaceFile` or `File.Move`. Replacing existing small parts of code with custom lines is done with `UpdateFile`. \ No newline at end of file From 4380a4a83e1d50c328a4d43fb78a09540559d83c Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:23:24 +0000 Subject: [PATCH 055/104] Speedup NativeRebuild tests - they don't have to use dotnet new. --- .../NativeRebuildTests/FlagsChangeRebuildTest.cs | 9 +++------ .../NativeRebuildTests/NativeRebuildTestsBase.cs | 2 +- .../NativeRebuildTests/NoopNativeRebuildTest.cs | 10 +++------- .../NativeRebuildTests/OptimizationFlagChangeTests.cs | 10 +++------- .../ReferenceNewAssemblyRebuildTest.cs | 10 +++------- .../SimpleSourceChangeRebuildTest.cs | 9 +++------ 6 files changed, 16 insertions(+), 34 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 7611f2515a6195..c01e90bf35c711 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -23,7 +23,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass => ConfigWithAOTData(aot, config: "Release").Multiply( new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" } // File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not - // new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } + // new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" }, // new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } ).UnwrapItemsAsArrays(); @@ -33,10 +33,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, string extraCFlags, string extraLDFlags) { - string prefix = $"rebuild_flags_{config}"; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_flags", "App"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false); var pathsDict = GetFilesTable(info, paths, unchanged: true); if (extraLDFlags.Length > 0) @@ -66,7 +63,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, stri Assert.DoesNotContain("Compiling assembly bitcode files", output); } - RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: info.AOT); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index 802435ac0269e7..b5d3b3833966f3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -66,7 +66,7 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool na GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded ), extraArgs); - await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); return GetBuildPaths(info, isPublish); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 43b258e08d7a49..ecbed32d3b717b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -21,11 +21,7 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi [MemberData(nameof(NativeBuildData))] public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativeRelink, bool invariant) { - string prefix = $"rebuild_noop_{config}"; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_noop", "App"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); var pathsDict = GetFilesTable(info, paths, unchanged: true); @@ -35,7 +31,7 @@ public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativ var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "DotnetRun")); } [Fact] @@ -48,7 +44,7 @@ public void NativeRelinkFailsWithInvariant() $"-p:WasmBuildNative={nativeRelink}", $"-p:InvariantGlobalization=true", }; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, "Release", aot: true, "relink_fails"); + ProjectInfo info = CopyTestAsset("Release", aot: true, "WasmBasicTestApp", "relink_fails", "App"); bool isPublish = true; (string _, string buildOutput) = BuildTemplateProject(info, new BuildProjectOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index c683657fdb2907..bcf11317dba9ff 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -22,7 +22,6 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC public static IEnumerable FlagsOnlyChangeData(bool aot) => ConfigWithAOTData(aot, config: "Release").Multiply( - // ToDo: File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not new object[] { /*cflags*/ "/p:EmccCompileOptimizationFlag=-O1", /*ldflags*/ "" }, new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccLinkOptimizationFlag=-O1" } ).UnwrapItemsAsArrays(); @@ -30,13 +29,10 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC [Theory] [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] + [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void OptimizationFlagChange(string config, bool aot, string cflags, string ldflags) { - string prefix = $"rebuild_flags_{config}"; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_flags", "App"); // force _WasmDevel=false, so we don't get -O0 BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); @@ -68,7 +64,7 @@ public async void OptimizationFlagChange(string config, bool aot, string cflags, var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: info.AOT); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 7d5c9720f76a5d..18db16b57f9fa7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -24,11 +24,7 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelink, bool invariant) { - string prefix = $"rebuild_tasks_{config}"; - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, prefix); - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_tasks", "App"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); var pathsDict = GetFilesTable(info, paths, unchanged: false); @@ -39,13 +35,13 @@ public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelin var originalStat = StatFiles(pathsDict); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Build.Tests.Programs", "NativeRebuildNewAssembly.cs")); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeRebuildNewAssembly.cs")); Rebuild(info, nativeRelink, invariant); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42)); + await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42, TestScenario: "DotnetRun")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 9b641b1426660c..c14fbf600c6332 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -23,10 +23,7 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void SimpleStringChangeInSource(string config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, $"rebuild_simple_{config}"); - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); - + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_simple", "App"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; @@ -39,14 +36,14 @@ public async void SimpleStringChangeInSource(string config, bool aot, bool nativ var originalStat = StatFiles(pathsDict); - ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "Wasm.Buid.Tests.Programs", "SimpleSourceChange.cs")); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SimpleSourceChange.cs")); // Rebuild Rebuild(info, nativeRelink, invariant); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 55)); + await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 55)); } } } From 1c81cfef658c17d85ce09eb2026df06a600f576e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:49:26 +0000 Subject: [PATCH 056/104] Speed up BuildPublishTests. --- .../Wasm.Build.Tests/BuildPublishTests.cs | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 284990819ad14b..e60d99d070069a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -80,10 +80,7 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) [BuildAndRun(config: "Release", aot: true)] public async Task BuildThenPublishWithAOT(string config, bool aot) { - ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot, "build_publish"); - - UpdateBrowserProgramFile(); - UpdateBrowserMainJs(); + ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_publish", "App"); bool isPublish = false; (_, string output) = BuildTemplateProject(info, @@ -105,12 +102,12 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) Assert.False(firstBuildStat["pinvoke.o"].Exists); Assert.False(firstBuildStat[$"{mainDll}.bc"].Exists); - CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info, output); + CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info.ProjectName, output); if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) throw new XunitException($"Test bug: could not get the build product in the cache"); - RunOptions runOptions = new(info.Configuration, ExpectedExitCode: 42); + RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); @@ -136,7 +133,7 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) IDictionary publishStat = StatFiles(pathsDict); Assert.True(publishStat["pinvoke.o"].Exists); Assert.True(publishStat[$"{mainDll}.bc"].Exists); - CheckOutputForNativeBuild(expectAOT: true, expectRelinking: isPublish, info, output); + CheckOutputForNativeBuild(expectAOT: true, expectRelinking: isPublish, info.ProjectName, output); // source maps are created for build but not for publish, make sure CompareStat won't expect them in publish: pathsDict["dotnet.js.map"] = (pathsDict["dotnet.js.map"].fullPath, unchanged: false); @@ -159,18 +156,17 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) var secondBuildStat = StatFiles(pathsDict); // no relinking, or AOT - CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info, output); + CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info.ProjectName, output); // no native files changed pathsDict.UpdateTo(unchanged: true); CompareStat(publishStat, secondBuildStat, pathsDict); } - void CheckOutputForNativeBuild(bool expectAOT, bool expectRelinking, ProjectInfo buildArgs, string buildOutput) + void CheckOutputForNativeBuild(bool expectAOT, bool expectRelinking, string projectName, string buildOutput) { - string projectNameCore = buildArgs.ProjectName.Replace(s_unicodeChars, ""); - TestUtils.AssertMatches(@$"{projectNameCore}\S+.dll -> {projectNameCore}\S+.dll.bc", buildOutput, contains: expectAOT); - TestUtils.AssertMatches(@$"{projectNameCore}\S+.dll.bc -> {projectNameCore}\S+.dll.o", buildOutput, contains: expectAOT); + TestUtils.AssertMatches(@$"{projectName}.dll -> {projectName}.dll.bc", buildOutput, contains: expectAOT); + TestUtils.AssertMatches(@$"{projectName}.dll.bc -> {projectName}.dll.o", buildOutput, contains: expectAOT); TestUtils.AssertMatches("pinvoke.c -> pinvoke.o", buildOutput, contains: expectRelinking || expectAOT); } } From 04d395d9ad23eb2b4b614ae5f9b0585dfd26e8d0 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 15 Nov 2024 13:34:14 +0000 Subject: [PATCH 057/104] Remove methods that are not used anymore. --- .../Blazor/BlazorWasmTestBase.cs | 51 ---- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 279 ------------------ .../Templates/WasmTemplateTestsBase.cs | 16 - 3 files changed, 346 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 08bd4b40961fa3..75c528f7c387ca 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -154,57 +154,6 @@ public string CreateBlazorWasmTemplateProject(string id) ); } - protected (CommandResult, string) BlazorPublish(BuildProjectOptions options, params string[] extraArgs) - { - if (options.WarnAsError) - extraArgs = extraArgs.Append("/warnaserror").ToArray(); - - (CommandResult res, string logPath) = BlazorBuildInternal(options.Id, options.Configuration, publish: true, setWasmDevel: false, expectSuccess: options.ExpectSuccess, extraArgs); - - if (options.ExpectSuccess && options.AssertAppBundle) - { - // Because we do relink in Release publish by default - if (options.Configuration == "Release") - options = options with { ExpectedFileType = NativeFilesType.Relinked }; - - AssertBundle(res.Output, options with { IsPublish = true }); - } - - return (res, logPath); - } - - protected (CommandResult res, string logPath) BlazorBuildInternal( - string id, - string config, - bool publish = false, - bool setWasmDevel = true, // always used with false - bool expectSuccess = true, - params string[] extraArgs) - { - try - { - return BuildProjectWithoutAssert( - new BuildProjectOptions( - id, - config, - GetBlazorBinFrameworkDir(config, forPublish: publish), - UseCache: false, - IsPublish: publish, - ExpectSuccess: expectSuccess), - extraArgs.Concat(new[] - { - "-p:BlazorEnableCompression=false", // use it in BuildTemplateProject overload - setWasmDevel ? "-p:_WasmDevel=true" : string.Empty - }).ToArray()); - } - catch (XunitException xe) - { - if (xe.Message.Contains("error CS1001: Identifier expected")) - Utils.DirectoryCopy(_projectDir!, Path.Combine(s_buildEnv.LogRootPath, id), testOutput: _testOutput); - throw; - } - } - public void AssertBundle(string buildOutput, BuildProjectOptions buildOptions) { if (IsUsingWorkloads) diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 9e1d2d0de73724..68917c7eca2c12 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -221,155 +221,6 @@ private string GetBinlogMessageContext(TextNode node) return string.Empty; } - protected string RunAndTestWasmApp(ProjectInfo buildArgs, - string id, - string frameworkDir, - Action? test = null, - string? buildDir = null, - int expectedExitCode = 0, - string? args = null, - Dictionary? envVars = null, - string targetFramework = DefaultTargetFramework, - string? extraXHarnessMonoArgs = null, - string? extraXHarnessArgs = null, - string jsRelativePath = "test-main.js", - string environmentLocale = DefaultEnvironmentLocale) - { - buildDir ??= _projectDir; - envVars ??= new(); - envVars["XHARNESS_DISABLE_COLORED_OUTPUT"] = "true"; - if (buildArgs.AOT) - { - envVars["MONO_LOG_LEVEL"] = "debug"; - envVars["MONO_LOG_MASK"] = "aot"; - } - - if (s_buildEnv.EnvVars != null) - { - foreach (var kvp in s_buildEnv.EnvVars) - envVars[kvp.Key] = kvp.Value; - } - - string bundleDir = Path.Combine(frameworkDir, ".."); - IHostRunner hostRunner = new BrowserHostRunner(); - - // Use wasm-console.log to get the xharness output for non-browser cases - string testCommand = hostRunner.GetTestCommand(); - XHarnessArgsOptions options = new(jsRelativePath, environmentLocale); - string xharnessArgs = s_isWindows ? hostRunner.GetXharnessArgsWindowsOS(options) : hostRunner.GetXharnessArgsOtherOS(options); - bool useWasmConsoleOutput = hostRunner.UseWasmConsoleOutput(); - - extraXHarnessArgs += " " + xharnessArgs; - - string testLogPath = Path.Combine(_logPath, "chrome"); - string output = RunWithXHarness( - testCommand, - testLogPath, - buildArgs.ProjectName, - bundleDir, - _testOutput, - envVars: envVars, - expectedAppExitCode: expectedExitCode, - extraXHarnessArgs: extraXHarnessArgs, - appArgs: args, - extraXHarnessMonoArgs: extraXHarnessMonoArgs, - useWasmConsoleOutput: useWasmConsoleOutput - ); - - TestUtils.AssertSubstring("AOT: image 'System.Private.CoreLib' found.", output, contains: buildArgs.AOT); - - if (s_isWindows && buildArgs.ProjectName.Contains(s_unicodeChars)) - { - // unicode chars in output on Windows are decoded in unknown way, so finding utf8 string is more complicated - string projectNameCore = buildArgs.ProjectName.Replace(s_unicodeChars, ""); - TestUtils.AssertMatches(@$"AOT: image '{projectNameCore}\S+' found.", output, contains: buildArgs.AOT); - } - else - { - TestUtils.AssertSubstring($"AOT: image '{buildArgs.ProjectName}' found.", output, contains: buildArgs.AOT); - } - - if (test != null) - test(output); - - return output; - } - - protected static string RunWithXHarness(string testCommand, string testLogPath, string projectName, string bundleDir, - ITestOutputHelper _testOutput, IDictionary? envVars = null, - int expectedAppExitCode = 0, int xharnessExitCode = 0, string? extraXHarnessArgs = null, - string? appArgs = null, string? extraXHarnessMonoArgs = null, bool useWasmConsoleOutput = false) - { - _testOutput.WriteLine($"============== {testCommand} ============="); - Directory.CreateDirectory(testLogPath); - - StringBuilder args = new(); - args.Append(s_xharnessRunnerCommand); - args.Append($" {testCommand}"); - args.Append($" --app=."); - args.Append($" --output-directory={testLogPath}"); - args.Append($" --expected-exit-code={expectedAppExitCode}"); - args.Append($" {extraXHarnessArgs ?? string.Empty}"); - args.Append(" --browser-arg=--disable-gpu"); - args.Append(" --pageLoadStrategy=none"); - - // `/.dockerenv` - is to check if this is running in a codespace - if (File.Exists("/.dockerenv")) - args.Append(" --browser-arg=--no-sandbox"); - - args.Append(" -- "); - if (extraXHarnessMonoArgs != null) - { - args.Append($" {extraXHarnessMonoArgs}"); - } - // App arguments - if (envVars != null) - { - var setenv = string.Join(' ', envVars - .Where(ev => ev.Key != "PATH") - .Select(kvp => $"\"--setenv={kvp.Key}={kvp.Value}\"").ToArray()); - args.Append($" {setenv}"); - } - - args.Append($" --run {projectName}.dll"); - args.Append($" {appArgs ?? string.Empty}"); - - _testOutput.WriteLine(string.Empty); - _testOutput.WriteLine($"---------- Running with {testCommand} ---------"); - var (exitCode, output) = RunProcess(s_buildEnv.DotNet, _testOutput, - args: args.ToString(), - workingDir: bundleDir, - envVars: envVars, - label: testCommand, - timeoutMs: s_defaultPerTestTimeoutMs); - - File.WriteAllText(Path.Combine(testLogPath, $"xharness.log"), output); - if (useWasmConsoleOutput) - { - string wasmConsolePath = Path.Combine(testLogPath, "wasm-console.log"); - try - { - if (File.Exists(wasmConsolePath)) - output = File.ReadAllText(wasmConsolePath); - else - _testOutput.WriteLine($"Warning: Could not find {wasmConsolePath}. Ignoring."); - } - catch (IOException ioex) - { - _testOutput.WriteLine($"Warning: Could not read {wasmConsolePath}: {ioex}"); - } - } - - if (exitCode != xharnessExitCode) - { - _testOutput.WriteLine($"Exit code: {exitCode}"); - if (exitCode != expectedAppExitCode) - throw new XunitException($"[{testCommand}] Exit code, expected {expectedAppExitCode} but got {exitCode} for command: {args}"); - } - - return output; - } - [MemberNotNull(nameof(_projectDir), nameof(_logPath))] protected void InitPaths(string id) { @@ -419,135 +270,6 @@ protected static string GetNuGetConfigWithLocalPackagesPath(string templatePath, return contents.Replace(s_nugetInsertionTag, $@""); } - - public static (int exitCode, string buildOutput) RunProcess(string path, - ITestOutputHelper _testOutput, - string args = "", - IDictionary? envVars = null, - string? workingDir = null, - string? label = null, - int? timeoutMs = null) - { - var t = RunProcessAsync(path, _testOutput, args, envVars, workingDir, label, timeoutMs); - t.Wait(); - return t.Result; - } - - public static async Task<(int exitCode, string buildOutput)> RunProcessAsync(string path, - ITestOutputHelper _testOutput, - string args = "", - IDictionary? envVars = null, - string? workingDir = null, - string? label = null, - int? timeoutMs = null) - { - _testOutput.WriteLine($"Running {path} {args}"); - _testOutput.WriteLine($"WorkingDirectory: {workingDir}"); - StringBuilder outputBuilder = new(); - object syncObj = new(); - - var processStartInfo = new ProcessStartInfo - { - FileName = path, - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardError = true, - RedirectStandardOutput = true, - Arguments = args, - }; - - if (workingDir == null || !Directory.Exists(workingDir)) - throw new Exception($"Working directory {workingDir} not found"); - - if (workingDir != null) - processStartInfo.WorkingDirectory = workingDir; - - if (envVars != null) - { - if (envVars.Count > 0) - _testOutput.WriteLine("Setting environment variables for execution:"); - - foreach (KeyValuePair envVar in envVars) - { - processStartInfo.EnvironmentVariables[envVar.Key] = envVar.Value; - _testOutput.WriteLine($"\t{envVar.Key} = {envVar.Value}"); - } - - // runtime repo sets this, which interferes with the tests - processStartInfo.RemoveEnvironmentVariables("MSBuildSDKsPath"); - } - - Process process = new(); - process.StartInfo = processStartInfo; - process.EnableRaisingEvents = true; - - // AutoResetEvent resetEvent = new (false); - // process.Exited += (_, _) => { _testOutput.WriteLine ($"- exited called"); resetEvent.Set(); }; - - if (!process.Start()) - throw new ArgumentException("No process was started: process.Start() return false."); - - try - { - DataReceivedEventHandler logStdErr = (sender, e) => LogData($"[{label}-stderr]", e.Data); - DataReceivedEventHandler logStdOut = (sender, e) => LogData($"[{label}]", e.Data); - - process.ErrorDataReceived += logStdErr; - process.OutputDataReceived += logStdOut; - process.BeginOutputReadLine(); - process.BeginErrorReadLine(); - - using CancellationTokenSource cts = new(); - cts.CancelAfter(timeoutMs ?? s_defaultPerTestTimeoutMs); - - await process.WaitForExitAsync(cts.Token); - - if (cts.IsCancellationRequested) - { - // process didn't exit - process.Kill(entireProcessTree: true); - lock (syncObj) - { - var lastLines = outputBuilder.ToString().Split('\r', '\n').TakeLast(20); - throw new XunitException($"Process timed out. Last 20 lines of output:{Environment.NewLine}{string.Join(Environment.NewLine, lastLines)}"); - } - } - - // this will ensure that all the async event handling has completed - // and should be called after process.WaitForExit(int) - // https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexit?view=net-5.0#System_Diagnostics_Process_WaitForExit_System_Int32_ - process.WaitForExit(); - - process.ErrorDataReceived -= logStdErr; - process.OutputDataReceived -= logStdOut; - process.CancelErrorRead(); - process.CancelOutputRead(); - - lock (syncObj) - { - var exitCode = process.ExitCode; - return (process.ExitCode, outputBuilder.ToString().Trim('\r', '\n')); - } - } - catch (Exception ex) - { - _testOutput.WriteLine($"-- exception -- {ex}"); - throw; - } - - void LogData(string label, string? message) - { - lock (syncObj) - { - if (message != null) - { - _testOutput.WriteLine($"{label} {message}"); - } - outputBuilder.AppendLine($"{label} {message}"); - } - } - } - public static string AddItemsPropertiesToProject(string projectFile, string? extraProperties = null, string? extraItems = null, string? insertAtEnd = null) { if (!File.Exists(projectFile)) @@ -593,7 +315,6 @@ public void Dispose() public static string GetRandomId() => TestUtils.FixupSymbolName(Path.GetRandomFileName()); - protected static string GetSkiaSharpReferenceItems() => @" diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 9b8c83e15b47e7..e73cadad5635ac 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -113,7 +113,6 @@ private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyze AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); } - public virtual (string projectDir, string buildOutput) BuildTemplateProject( ProjectInfo projectInfo, BuildProjectOptions buildOptions, @@ -192,21 +191,6 @@ protected void DeleteFile(string pathRelativeToProjectDir) } } - protected void RemoveContentsFromProjectFile(string pathRelativeToProjectDir, string afterMarker, string beforeMarker) - { - var path = Path.Combine(_projectDir!, pathRelativeToProjectDir); - string text = File.ReadAllText(path); - int start = text.IndexOf(afterMarker); - int end = text.IndexOf(beforeMarker, start); - if (start == -1 || end == -1) - throw new XunitException($"Start or end marker not found in '{path}'"); - start += afterMarker.Length; - text = text.Remove(start, end - start); - // separate the markers with a new line - text = text.Insert(start, "\n"); - File.WriteAllText(path, text); - } - protected void UpdateBrowserMainJs(string targetFramework = DefaultTargetFramework, string runtimeAssetsRelativePath = DefaultRuntimeAssetsRelativePath) { string mainJsPath = Path.Combine(_projectDir!, "wwwroot", "main.js"); From 62f0f8c24247de5f07a4e96dd2b6a74572913546 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 15 Nov 2024 14:50:38 +0000 Subject: [PATCH 058/104] Nit review changes. --- .../Blazor/BlazorWasmTestBase.cs | 16 +++---- .../Blazor/BuildPublishTests.cs | 14 +++--- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 4 +- .../Blazor/SimpleMultiThreadedTests.cs | 8 ++-- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 4 +- .../Blazor/WorkloadRequiredTests.cs | 8 ++-- .../BrowserStructures/BuildProduct.cs | 4 +- .../SharedBuildPerTestClassFixture.cs | 12 ++--- ...BuildProjectOptions.cs => BuildOptions.cs} | 5 +- .../Wasm.Build.Tests/BuildPublishTests.cs | 34 ++++++------- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 2 +- .../Common/AssertBundleOptions.cs | 2 +- .../wasm/Wasm.Build.Tests/ConfigSrcTests.cs | 21 -------- .../HybridGlobalizationTests.cs | 4 +- src/mono/wasm/Wasm.Build.Tests/IcuTests.cs | 4 +- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 4 +- .../InvariantGlobalizationTests.cs | 4 +- .../InvariantTimezoneTests.cs | 4 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 4 +- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 16 +++---- .../Wasm.Build.Tests/NativeLibraryTests.cs | 16 +++---- .../NativeRebuildTestsBase.cs | 17 ++++--- .../NoopNativeRebuildTest.cs | 4 +- .../OptimizationFlagChangeTests.cs | 4 +- .../PInvokeTableGeneratorTests.cs | 48 +++++++++---------- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 14 +++--- .../SatelliteAssembliesTests.cs | 12 ++--- .../wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 4 +- .../Templates/NativeBuildTests.cs | 8 ++-- .../Templates/WasmTemplateTests.cs | 30 ++++++------ .../Templates/WasmTemplateTestsBase.cs | 6 +-- .../TestAppScenarios/AppSettingsTests.cs | 4 +- .../TestAppScenarios/DebugLevelTests.cs | 4 +- .../TestAppScenarios/DownloadThenInitTests.cs | 4 +- .../TestAppScenarios/InterpPgoTests.cs | 4 +- .../TestAppScenarios/LazyLoadingTests.cs | 8 ++-- .../LibraryInitializerTests.cs | 8 ++-- .../MaxParallelDownloadsTests.cs | 4 +- .../TestAppScenarios/MemoryTests.cs | 8 ++-- .../TestAppScenarios/ModuleConfigTests.cs | 16 +++---- .../TestAppScenarios/SatelliteLoadingTests.cs | 8 ++-- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 4 +- .../WasmNativeDefaultsTests.cs | 4 +- .../WasmRunOutOfAppBundleTests.cs | 4 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 8 ++-- .../WasmSdkBasedProjectProvider.cs | 4 +- 46 files changed, 204 insertions(+), 225 deletions(-) rename src/mono/wasm/Wasm.Build.Tests/{BuildProjectOptions.cs => BuildOptions.cs} (90%) delete mode 100644 src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 75c528f7c387ca..917d3a4d39fbc2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -58,9 +58,9 @@ protected override void OnAfterRender(bool firstRender) } }; - public override (string projectDir, string buildOutput) BuildTemplateProject( + public override (string projectDir, string buildOutput) BuildProject( ProjectInfo projectInfo, - BuildProjectOptions buildOptions, + BuildOptions buildOptions, params string[] extraArgs) { try @@ -69,7 +69,7 @@ public override (string projectDir, string buildOutput) BuildTemplateProject( ? new[] { "-p:BlazorEnableCompression=false", "/warnaserror" } : new[] { "-p:BlazorEnableCompression=false" }; - (string projectDir, string buildOutput) = base.BuildTemplateProject( + (string projectDir, string buildOutput) = base.BuildProject( projectInfo, buildOptions with { AssertAppBundle = false }, extraArgs.Concat(additionalOptiont).ToArray()); @@ -126,8 +126,8 @@ public string CreateBlazorWasmTemplateProject(string id) ProjectInfo info, bool isNativeBuild = false, bool useCache = true, params string[] extraArgs) { bool isPublish = false; - return BuildTemplateProject(info, - new BuildProjectOptions( + return BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), @@ -142,8 +142,8 @@ public string CreateBlazorWasmTemplateProject(string id) ProjectInfo info, bool isNativeBuild = false, bool useCache = true, params string[] extraArgs) { bool isPublish = true; - return BuildTemplateProject(info, - new BuildProjectOptions( + return BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), @@ -154,7 +154,7 @@ public string CreateBlazorWasmTemplateProject(string id) ); } - public void AssertBundle(string buildOutput, BuildProjectOptions buildOptions) + public void AssertBundle(string buildOutput, BuildOptions buildOptions) { if (IsUsingWorkloads) { diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 508c3c5a261544..00ce659a78269b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -70,8 +70,8 @@ public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) BlazorBuild(info); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), @@ -108,14 +108,14 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger //CreateBlazorWasmTemplateProject(id); //// No relinking, no AOT - //BlazorBuild(new BuildProjectOptions(id, config, NativeFilesType.FromRuntimePack); + //BlazorBuild(new BuildOptions(id, config, NativeFilesType.FromRuntimePack); //// AOT=true only for the publish command line, similar to what //// would happen when setting it in Publish dialog for VS - //BlazorPublish(new BuildProjectOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); + //BlazorPublish(new BuildOptions(id, config, expectedFileType: NativeFilesType.AOT, "-p:RunAOTCompilation=true"); //// publish again, no AOT - //BlazorPublish(new BuildProjectOptions(id, config, NativeFilesType.Relinked); + //BlazorPublish(new BuildOptions(id, config, NativeFilesType.Relinked); //} [Theory] @@ -181,8 +181,8 @@ public void BlazorWasm_CannotAOT_InDebug(string config) config, aot: true, "BlazorBasicTestApp", "blazorwasm", "App", extraProperties: "true"); bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index f837b11c615102..fe97056e7a5785 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -59,8 +59,8 @@ public void BlazorWasm_CannotAOT_WithNoTrimming(string config) ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blazorwasm_aot", "App", extraProperties: extraProperties); bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 0cab1b3fec9655..22735ea3567ba6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -31,8 +31,8 @@ public async Task BlazorBuildRunTest(string config) ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazorwasm", "App", extraProperties: extraProperties); bool isPublish = false; string frameworkDir = GetBlazorBinFrameworkDir(info.Configuration, isPublish); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: frameworkDir, @@ -69,8 +69,8 @@ export function onRuntimeReady({ runtimeBuildInfo }) { ); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index 1be2cd20cacb82..8914ac3c7f6536 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -56,8 +56,8 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool a Path.Combine( projectDir, "bin", info.ProjectName, config.ToLower(), "wwwroot", "_framework") : GetBinFrameworkDir(config, isPublish); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: frameworkDir, diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index e6bfe8c17d4346..a80d0d1df248f8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -91,8 +91,8 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bo string allText = File.ReadAllText(counterPath); _testOutput.WriteLine($"Updated counter.razor: {allText}"); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, publish), @@ -134,8 +134,8 @@ private void CheckWorkloadRequired(string config, string extraProperties, bool w
"; ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraProperties: extraProperties, insertAtEnd: insertAtEnd); - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, publish), diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildProduct.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildProduct.cs index 874e76ee5e0412..ba17af588d847a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildProduct.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildProduct.cs @@ -5,9 +5,9 @@ namespace Wasm.Build.Tests; -public record BuildProduct( +public record BuildResult( string ProjectDir, string LogFile, - bool Result, + bool Success, string BuildOutput ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs index 88281954624a55..c764ab6e419a89 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/SharedBuildPerTestClassFixture.cs @@ -14,15 +14,15 @@ namespace Wasm.Build.Tests { public class SharedBuildPerTestClassFixture : IDisposable { - public Dictionary _buildPaths = new(); + public Dictionary _buildPaths = new(); - public void CacheBuild(ProjectInfo buildArgs, BuildProduct product) + public void CacheBuild(ProjectInfo buildArgs, BuildResult result) { - if (product == null) - throw new ArgumentNullException(nameof(product)); + if (result == null) + throw new ArgumentNullException(nameof(result)); if (buildArgs == null) throw new ArgumentNullException(nameof(buildArgs)); - _buildPaths.Add(buildArgs, product); + _buildPaths.Add(buildArgs, result); } public void RemoveFromCache(string buildPath, bool keepDir=true) @@ -35,7 +35,7 @@ public void RemoveFromCache(string buildPath, bool keepDir=true) RemoveDirectory(buildPath); } - public bool TryGetBuildFor(ProjectInfo buildArgs, [NotNullWhen(true)] out BuildProduct? product) + public bool TryGetBuildFor(ProjectInfo buildArgs, [NotNullWhen(true)] out BuildResult? product) => _buildPaths.TryGetValue(buildArgs, out product); public void Dispose() diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BuildOptions.cs similarity index 90% rename from src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs rename to src/mono/wasm/Wasm.Build.Tests/BuildOptions.cs index 6ba7eb8c410379..e85aab2a6c5933 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildProjectOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildOptions.cs @@ -7,10 +7,7 @@ namespace Wasm.Build.Tests; -// Attention: CreateProject that got remved was "true" by default, -// so each build expects to create the app, -// unless stated otherwise -public record BuildProjectOptions +public record BuildOptions ( string Configuration, string Id, diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index e60d99d070069a..b9b2086c4a6d5d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -28,8 +28,8 @@ public void Wasm_CannotAOT_InDebug(string config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "no_aot_in_debug", "App"); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -48,8 +48,8 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_publish", "App"); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -57,15 +57,15 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) IsPublish: isPublish )); - if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); + if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) + throw new XunitException($"Test bug: could not get the build result in the cache"); RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -83,8 +83,8 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_publish", "App"); bool isPublish = false; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -104,20 +104,20 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) CheckOutputForNativeBuild(expectAOT: false, expectRelinking: isPublish, info.ProjectName, output); - if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); + if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) + throw new XunitException($"Test bug: could not get the build result in the cache"); RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); // relink by default for Release+publish isPublish = true; - (_, output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, output) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -143,8 +143,8 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) // second build isPublish = false; - (_, output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, output) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 68917c7eca2c12..93e31527793a7e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -136,7 +136,7 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, } public (CommandResult res, string logPath) BuildProjectWithoutAssert( - BuildProjectOptions buildOptions, + BuildOptions buildOptions, params string[] extraArgs) { string buildType = buildOptions.IsPublish ? "publish" : "build"; diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs index b4867021ed1429..f881c33f6f1974 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs @@ -8,7 +8,7 @@ namespace Wasm.Build.Tests; public record AssertBundleOptions( - BuildProjectOptions BuildOptions, + BuildOptions BuildOptions, bool ExpectSymbolsFile = true, bool AssertIcuAssets = true, bool AssertSymbolsFile = true diff --git a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs deleted file mode 100644 index 233bac1334ee4c..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -// 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 : WasmTemplateTestsBase -{ - public ConfigSrcTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) - { } - - // INFO FOR REVIWER: - // This class can be deleted and will be after your approval. Justification: - // It is testing the --config-src argument, which was supposed to be passed to test-main.js - // but does not make sense in the current form of testing where we are using "dotnet new" templates -} diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 03b7f9fef2e909..69be5cb2dcdf8e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -49,8 +49,8 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is UpdateBrowserMainJs(); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs index f29ac07400c7fe..e6042357f45b79 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs @@ -89,8 +89,8 @@ public void NonExistingCustomFileAssertError(string config, string customIcu, bo ProjectInfo info = CreateIcuProject(config, Template.WasmBrowser, aot: false, "Array.Empty()", extraProperties); bool isPublish = false; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index 64b6b2280343be..c3e50ef87a2be1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -152,8 +152,8 @@ protected async Task PublishAndRunIcuTest( config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); bool isPublish = true; bool triggersNativeBuild = globalizationMode == GlobalizationMode.Invariant; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 37aa53d734b59a..6e38044ea482b3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -54,8 +54,8 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv bool isPublish = true; // invariantGlobalization triggers native build isNativeBuild = isNativeBuild || invariantGlobalization == true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 1f326e731787a5..54ebae2341f9da 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -50,8 +50,8 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian bool isPublish = true; // invariantTimezone triggers native build isNativeBuild = isNativeBuild || invariantTimezone == true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 2cc89232ee1978..17380740612fb8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -55,8 +55,8 @@ async Task TestMainWithArgs(string config, _testOutput.WriteLine ($"-- args: {argsStr}, name: {projectContentsName}"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index a3189542210fd0..50a564a83c7edc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -35,8 +35,8 @@ public async Task SimpleNativeBuild(string config, bool aot) UpdateBrowserMainJs(); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -61,8 +61,8 @@ public void AOTNotSupportedWithNoTrimming(string config, bool aot) UpdateBrowserMainJs(); bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -100,8 +100,8 @@ public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(string config, bool aot insertAtEnd: printFileTypeTarget); bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -126,8 +126,8 @@ public void NativeBuildIsRequired(string config, bool aot) extraProperties: "falsetrue"); bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 58a7cee3a2bf72..7019c511aaf8cd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -33,8 +33,8 @@ public async Task ProjectWithNativeReference(string config, bool aot) DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -62,8 +62,8 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -85,8 +85,8 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -115,8 +115,8 @@ public async Task ProjectWithNativeLibrary(string config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index b5d3b3833966f3..f0be601e033a8d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -56,8 +56,8 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool na extraBuildArgs }; bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -72,10 +72,10 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool na protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal") { - if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); + if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) + throw new XunitException($"Test bug: could not get the build result in the cache"); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); var extraArgs = new string[] { "-p:_WasmDevel=true", @@ -85,10 +85,13 @@ protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, st extraBuildArgs }; + // artificial delay to have new enough timestamps + Thread.Sleep(5000); + bool isNativeBuild = nativeRelink || invariant; bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index ecbed32d3b717b..28885bd8d8ff1c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -46,8 +46,8 @@ public void NativeRelinkFailsWithInvariant() }; ProjectInfo info = CopyTestAsset("Release", aot: true, "WasmBasicTestApp", "relink_fails", "App"); bool isPublish = true; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index bcf11317dba9ff..5201e3b68286e3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -28,8 +28,8 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC [Theory] [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] - [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] - [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] + // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] + // [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void OptimizationFlagChange(string config, bool aot, string cflags, string ldflags) { ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_flags", "App"); diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index d017fb95b42744..a23b927b47e3b0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -87,8 +87,8 @@ public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshal ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "not_blittable", disableRuntimeMarshalling: false, useAutoLayout: true); bool isPublish = false; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -106,8 +106,8 @@ public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshal ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: false, useAutoLayout: false); bool isPublish = false; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -125,8 +125,8 @@ public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMars ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: true, useAutoLayout: true); bool isPublish = false; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -194,8 +194,8 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly UpdateFile(programRelativePath, new Dictionary { { "[assembly: DisableRuntimeMarshalling]", "" } }); } bool isPublish = false; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -337,8 +337,8 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) // libraries do not have framework dirs string hypotheticalFrameworkDir = Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)); string libAssemblyPath = Path.Combine(hypotheticalFrameworkDir, "..", ".."); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, "Library.csproj", // library project does not have it but it's a required parameter. It's not used when assert: false @@ -400,8 +400,8 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) }); // Build a project with ManagedToNativeGenerator task reading icalls from the above library and runtime-icall-table.h - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: frameworkDir, @@ -433,8 +433,8 @@ public async void BuildNativeInNonEnglishCulture(string config, bool aot, string { "LC_ALL", culture }, }; bool isPublish = true; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -468,8 +468,8 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(str int baseArg = 10; GenerateSourceFiles(_projectDir!, baseArg); bool isPublish = aot; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -529,8 +529,8 @@ private string BuildForVariadicFunctionTests(ProjectInfo info, bool isPublish = { string verbosityArg = verbosity == null ? string.Empty : $" -v:{verbosity}"; var extraArgs = new string[] { verbosityArg }; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -552,7 +552,7 @@ private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); bool isPublish = aot; - var buildOptions = new BuildProjectOptions( + var buildOptions = new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -560,7 +560,7 @@ private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), IsPublish: isPublish ); - BuildTemplateProject(info, buildOptions); + BuildProject(info, buildOptions); string objDir = Path.Combine(_projectDir!, "obj", config, buildOptions.TargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); @@ -607,8 +607,8 @@ public void EnsureComInteropCompilesInAOT(string config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "com", "App"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ComInterop.cs")); bool isPublish = aot; - (string libraryDir, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string libraryDir, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -630,8 +630,8 @@ public async void UCOWithSpecialCharacters(string config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index 0a03b7d43795c7..39fd9c3a170fdc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -28,8 +28,8 @@ public async Task NoOpRebuild(string config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild", "App"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -40,10 +40,10 @@ public async Task NoOpRebuild(string config, bool aot) RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42); await RunForPublishWithWebServer(runOptions); - if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); + if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) + throw new XunitException($"Test bug: could not get the build result in the cache"); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); // artificial delay to have new enough timestamps await Task.Delay(5000); @@ -51,8 +51,8 @@ public async Task NoOpRebuild(string config, bool aot) _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); // no-op Rebuild - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index 025143b1a52044..58110a997a00b3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -44,8 +44,8 @@ public async void ResourcesFromMainAssembly(string config, bool aot, bool native CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); bool isPublish = true; - (_, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (_, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)), @@ -91,8 +91,8 @@ public async void ResourcesFromProjectReference(string config, bool aot, bool na File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), ""); NativeFilesType dotnetWasmFileType = nativeRelink ? NativeFilesType.Relinked : aot ? NativeFilesType.AOT : NativeFilesType.FromRuntimePack; bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -117,8 +117,8 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(string config, bool aot) CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index f983436329c590..1942013947e1cf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -23,8 +23,8 @@ protected async Task SignalRPassMessage(string staticWebAssetBasePath, string co { ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SignalRClientTests", "AspNetCoreServer"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index 9732edaf4fb6cb..5d05c6a5bc588d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -48,8 +48,8 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); bool isPublish = false; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -85,8 +85,8 @@ public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter( ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs")); bool isPublish = false; - (string _, string buildOutput) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string buildOutput) = BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 2586dcbf8148e3..251fb612226a40 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -40,8 +40,8 @@ public void BrowserBuildThenPublish(string config) UpdateBrowserMainJs(); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -49,16 +49,16 @@ public void BrowserBuildThenPublish(string config) IsPublish: isPublish )); - if (!_buildContext.TryGetBuildFor(info, out BuildProduct? product)) - throw new XunitException($"Test bug: could not get the build product in the cache"); + if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) + throw new XunitException($"Test bug: could not get the build result in the cache"); - File.Move(product!.LogFile, Path.ChangeExtension(product.LogFile!, ".first.binlog")); + File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -158,8 +158,8 @@ public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(config, isPublish), @@ -204,8 +204,8 @@ public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendR string propsPath = Path.Combine(projectDirectory, "Directory.Build.props"); AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: frameworkDir, @@ -233,8 +233,8 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL bool isPublish = true; string frameworkDir = GetBinFrameworkDir(config, forPublish: true); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: frameworkDir, @@ -314,8 +314,8 @@ public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) bool isPublish = true; string publishPath = GetBinFrameworkDir(config, forPublish: true); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( config, info.ProjectName, BinFrameworkDir: publishPath, diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index e73cadad5635ac..904985411a0030 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -113,9 +113,9 @@ private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyze AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); } - public virtual (string projectDir, string buildOutput) BuildTemplateProject( + public virtual (string projectDir, string buildOutput) BuildProject( ProjectInfo projectInfo, - BuildProjectOptions buildOptions, + BuildOptions buildOptions, params string[] extraArgs) { if (buildOptions.ExtraBuildEnvironmentVariables is null) @@ -127,7 +127,7 @@ public virtual (string projectDir, string buildOutput) BuildTemplateProject( (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(buildOptions, extraArgs); if (buildOptions.UseCache) - _buildContext.CacheBuild(projectInfo, new BuildProduct(_projectDir!, logFilePath, true, res.Output)); + _buildContext.CacheBuild(projectInfo, new BuildResult(_projectDir!, logFilePath, true, res.Output)); if (!buildOptions.ExpectSuccess) { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index 68fd6f12fe07fa..dc4516cd077d68 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -28,8 +28,8 @@ public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicatio string config = "Debug"; ProjectInfo info = CopyTestAsset(config, aot: false, "WasmBasicTestApp", "AppSettingsTest", "App"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index b3683c08564f1f..92fa88f48e6362 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -24,8 +24,8 @@ private void AssertDebugLevel(IReadOnlyCollection result, int value) => Assert.Contains(result, m => m.Contains($"WasmDebugLevel: {value}")); private void BuildPublishProject(ProjectInfo info, bool isPublish = false, params string[] extraArgs) - => BuildTemplateProject(info, - new BuildProjectOptions( + => BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index 4eadf2d5144387..d46acddc917452 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -26,8 +26,8 @@ public async Task NoResourcesReFetchedAfterDownloadFinished(string config) { ProjectInfo info = CopyTestAsset(config, aot: false, "WasmBasicTestApp", "DownloadThenInitTests", "App"); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs index 19fefbc26f709c..1062c34a3a98da 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs @@ -38,8 +38,8 @@ public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(string config) _testOutput.WriteLine("/// Building"); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index ffc7f91aaeb4ae..3f81a9f455dc94 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -33,8 +33,8 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LazyLoadingTests", "App"); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -65,8 +65,8 @@ public async Task FailOnMissingLazyAssembly() string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LazyLoadingTests", "App"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index a5bc1a12324bd5..1e2ec7f3c37578 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -29,8 +29,8 @@ public async Task LoadLibraryInitializer() string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LibraryInitializerTests_LoadLibraryInitializer", "App"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -53,8 +53,8 @@ public async Task AbortStartupOnError() string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LibraryInitializerTests_AbortStartupOnError", "App"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index 3ecf5b92a2904a..0dc621dc89bb2a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -27,8 +27,8 @@ public async Task NeverFetchMoreThanMaxAllowed(string config, string maxParallel { ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "MaxParallelDownloadsTests", "App"); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index ff8365c446682a..6854ae59738f6c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -32,8 +32,8 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop() ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "MemoryTests", "App"); bool isPublish = false; string extraArgs = "-p:EmccMaximumHeapSize=4294901760"; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -59,8 +59,8 @@ public async Task RunSimpleAppWithProfiler() bool isPublish = false; // are are linking all 3 profilers, but below we only initialize log profiler and test it string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index 47f74d84eefdb0..b50e9490e04138 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -28,8 +28,8 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}", "App"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -70,8 +70,8 @@ public async Task OutErrOverrideWorks() string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "ModuleConfigTests_OutErrOverrideWorks", "App"); bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -99,8 +99,8 @@ public async Task OutErrOverrideWorks() public async Task OverrideBootConfigName(string config, bool isPublish) { ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "OverrideBootConfigName", "App"); - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -109,8 +109,8 @@ public async Task OverrideBootConfigName(string config, bool isPublish) )); string[] extraArgs = ["-p:WasmBootConfigFileName=boot.json"]; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 5a795f67cf9257..26755fa63dc37d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -32,8 +32,8 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) string config = "Debug"; ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SatelliteLoadingTests", "App"); bool isPublish = false; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -95,8 +95,8 @@ public async Task LoadSatelliteAssemblyFromReference() .EnsureSuccessful(); // Publish the app and assert - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index d7ffedddabc9a9..e7519cad5193f1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -39,8 +39,8 @@ protected async void TestMain(string projectName, UpdateFile("runtimeconfig.template.json", new Dictionary { { "}\n}", runtimeConfigContents } }); } bool isPublish = true; - BuildTemplateProject(info, - new BuildProjectOptions( + BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 6486a8bfdbdbee..0879da84b90ae3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -212,8 +212,8 @@ public void WithNativeReference(string config, string extraProperties, bool publ insertAtEnd: printValueTarget); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 5ab0da13581783..cf3cde76adab4f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -22,8 +22,8 @@ public async void RunOutOfAppBundle(string config, bool aot) UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); bool isPublish = true; string binFrameworkDir = GetBinFrameworkDir(info.Configuration, isPublish); - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: binFrameworkDir, diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index ece7ba161cd352..11a122d879867e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -31,8 +31,8 @@ public async void Build_NoAOT_ShouldNotRelink(string config, bool aot, bool simd ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_with_workload_no_aot", "App"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); bool isPublish = false; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), @@ -63,8 +63,8 @@ public async void PublishSIMD_AOT(string config, bool aot, bool simd) ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "simd_publish", "App"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); bool isPublish = true; - (string _, string output) = BuildTemplateProject(info, - new BuildProjectOptions( + (string _, string output) = BuildProject(info, + new BuildOptions( info.Configuration, info.ProjectName, BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index bdc5802ea1829e..49d86655703aea 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -69,7 +69,7 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp } - public void AssertBundle(BuildProjectOptions buildOptions) + public void AssertBundle(BuildOptions buildOptions) { AssertBundle(new AssertBundleOptions( BuildOptions: buildOptions, @@ -148,7 +148,7 @@ private void AssertBundle(AssertBundleOptions assertOptions) } } - public void AssertWasmSdkBundle(BuildProjectOptions buildOptions, string? buildOutput = null) + public void AssertWasmSdkBundle(BuildOptions buildOptions, string? buildOutput = null) { if (buildOutput is not null) ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework); From 99a63157cff6b091462f385e38a7dddbb3ee5a04 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:16:33 +0000 Subject: [PATCH 059/104] `BasicTestApp` for blazor and wasm. --- .../Blazor/BlazorWasmTestBase.cs | 6 ++-- .../Blazor/BuildPublishTests.cs | 14 +++++----- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 4 +-- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 4 +-- .../Wasm.Build.Tests/Blazor/MiscTests2.cs | 2 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 4 +-- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 2 +- .../Blazor/NoopNativeRebuildTest.cs | 4 +-- .../Blazor/SimpleMultiThreadedTests.cs | 4 +-- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 6 ++-- .../Blazor/WorkloadRequiredTests.cs | 4 +-- .../BrowserStructures/TestAsset.cs | 5 ++++ .../Wasm.Build.Tests/BuildPublishTests.cs | 6 ++-- .../InvariantGlobalizationTests.cs | 2 +- .../InvariantTimezoneTests.cs | 2 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 2 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 8 +++--- .../FlagsChangeRebuildTest.cs | 2 +- .../NoopNativeRebuildTest.cs | 4 +-- .../OptimizationFlagChangeTests.cs | 2 +- .../ReferenceNewAssemblyRebuildTest.cs | 2 +- .../SimpleSourceChangeRebuildTest.cs | 2 +- .../PInvokeTableGeneratorTests.cs | 28 +++++++++---------- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 2 +- .../SatelliteAssembliesTests.cs | 6 ++-- .../wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 3 +- .../Templates/WasmTemplateTestsBase.cs | 17 +++++------ .../TestAppScenarios/AppSettingsTests.cs | 2 +- .../TestAppScenarios/DebugLevelTests.cs | 25 +++++++---------- .../TestAppScenarios/DownloadThenInitTests.cs | 2 +- .../TestAppScenarios/InterpPgoTests.cs | 2 +- .../TestAppScenarios/LazyLoadingTests.cs | 4 +-- .../LibraryInitializerTests.cs | 4 +-- .../MaxParallelDownloadsTests.cs | 2 +- .../TestAppScenarios/MemoryTests.cs | 4 +-- .../TestAppScenarios/ModuleConfigTests.cs | 6 ++-- .../TestAppScenarios/SatelliteLoadingTests.cs | 4 +-- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 2 +- .../WasmNativeDefaultsTests.cs | 5 ++-- .../WasmRunOutOfAppBundleTests.cs | 2 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 4 +-- 41 files changed, 109 insertions(+), 106 deletions(-) create mode 100644 src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 917d3a4d39fbc2..7db1e9448e8f9c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -18,7 +18,9 @@ namespace Wasm.Build.Tests; public abstract class BlazorWasmTestBase : WasmTemplateTestsBase { - protected readonly WasmSdkBasedProjectProvider _provider; + protected readonly WasmSdkBasedProjectProvider _provider; + protected override TestAsset BasicTestApp => new() { Name = "BlazorBasicTestApp", RunnableProjectSubPath = "App" }; + protected BlazorWasmTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext, new WasmSdkBasedProjectProvider(output, DefaultTargetFrameworkForBlazor)) { @@ -193,7 +195,7 @@ protected ProjectInfo CreateProjectWithNativeReference(string config, bool aot, "; return CopyTestAsset( - config, aot, "BlazorBasicTestApp", "blz_nativeref_aot", "App", extraItems: extraItems, extraProperties: extraProperties); + config, aot, BasicTestApp, "blz_nativeref_aot", extraItems: extraItems, extraProperties: extraProperties); } // Keeping these methods with explicit Build/Publish in the name diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 00ce659a78269b..fcc5549af1cbde 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -28,7 +28,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [InlineData("Release")] public async Task DefaultTemplate_WithoutWorkload(string config) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_workload", "App"); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_workload"); BlazorBuild(info); await RunForBuildWithDotnetRun(new(info.Configuration)); @@ -58,7 +58,7 @@ public static TheoryData TestDataForDefaultTemplate_WithWorkload(b [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_no_aot", "App", appendUnicodeToPath: testUnicode); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_aot", appendUnicodeToPath: testUnicode); BlazorPublish(info); } @@ -66,7 +66,7 @@ public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_aot", "App", appendUnicodeToPath: testUnicode); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_aot", appendUnicodeToPath: testUnicode); BlazorBuild(info); bool isPublish = true; @@ -92,7 +92,7 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger var extraProperty = expectFingerprintOnDotnetJs ? "truetrue" : "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_checkfingerprinting", "App", extraProperties: extraProperty); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_checkfingerprinting", extraProperties: extraProperty); BlazorBuild(info, isNativeBuild: true); BlazorPublish(info, isNativeBuild: true, useCache: false); } @@ -124,7 +124,7 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger public void DefaultTemplate_WithResources_Publish(string config) { string[] cultures = ["ja-JP", "es-ES"]; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_resources", "App"); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_resources"); // Ensure we have the source data we rely on string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); @@ -162,7 +162,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL string extraProperties = "true"; if (!string.IsNullOrEmpty(stripILAfterAOT)) extraProperties += $"{stripILAfterAOT}"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_WasmStripILAfterAOT", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_WasmStripILAfterAOT", extraProperties: extraProperties); BlazorPublish(info); await RunForPublishWithWebServer(new(config)); @@ -178,7 +178,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL public void BlazorWasm_CannotAOT_InDebug(string config) { ProjectInfo info = CopyTestAsset( - config, aot: true, "BlazorBasicTestApp", "blazorwasm", "App", extraProperties: "true"); + config, aot: true, BasicTestApp, "blazorwasm", extraProperties: "true"); bool isPublish = true; (string _, string output) = BuildProject(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index 4cd725df3e7ec3..ea7ed31d61066e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -26,7 +26,7 @@ public CleanTests(ITestOutputHelper output, SharedBuildPerTestClassFixture build public void Blazor_BuildThenClean_NativeRelinking(string config) { string extraProperties = @"<_WasmDevel>truetrue"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean", extraProperties: extraProperties); BlazorBuild(info, isNativeBuild: true); string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); @@ -57,7 +57,7 @@ public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) { string extraProperties = @"<_WasmDevel>true"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "clean_native", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean_native", extraProperties: extraProperties); bool relink = firstBuildNative; BlazorBuild(info, isNativeBuild: relink, extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index 378e02edf38606..ad7b3146a05199 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -32,7 +32,7 @@ public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRel : string.Empty; if (!nativeRelink) extraProperties += "true"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_deploy_on_build", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_deploy_on_build", extraProperties: extraProperties); // build with -p:DeployOnBuild=true, and that will trigger a publish (string _, string buildOutput) = BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:DeployBuild=true"); @@ -54,7 +54,7 @@ public void DefaultTemplate_AOT_InProjectFile(string config) ? ("-O1" + "-O1") : string.Empty; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_aot_prj_file", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_aot_prj_file", extraProperties: extraProperties); // No relinking, no AOT BlazorBuild(info); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs index 46487579e484c2..bdb6d39e9e2a20 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs @@ -52,7 +52,7 @@ public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(string config) private CommandResult PublishForRequiresWorkloadTest(string config, string extraItems="", string extraProperties="") { ProjectInfo info = CopyTestAsset( - config, aot: false, "BlazorBasicTestApp", "needs_workload", "App", extraProperties: extraProperties, extraItems: extraItems); + config, aot: false, BasicTestApp, "needs_workload", extraProperties: extraProperties, extraItems: extraItems); string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index e669c98fb7799e..80f0890cf1c44c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -39,7 +39,7 @@ public async Task WithDllImportInMainAssembly(string config, bool build, bool pu else prefix += "publish"; string extraItems = @""; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraItems: extraItems); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "MyDllImport.cs"), Path.Combine(_projectDir!, "Pages", "MyDllImport.cs")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "mylib.cpp"), Path.Combine(_projectDir!, "mylib.cpp")); UpdateFile(Path.Combine("Pages", "MyDllImport.cs"), new Dictionary { { "##NAMESPACE##", info.ProjectName } }); @@ -77,7 +77,7 @@ public void BugRegression_60479_WithRazorClassLib() string extraItems = @$" "; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blz_razor_lib_top", "App", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_razor_lib_top", extraItems: extraItems); // No relinking, no AOT BlazorBuild(info); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index fe97056e7a5785..78bfbfd966baf1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -56,7 +56,7 @@ public void WithNativeReference_AOTOnCommandLine(string config) public void BlazorWasm_CannotAOT_WithNoTrimming(string config) { string extraProperties = "falsetrue"; - ProjectInfo info = CopyTestAsset(config, aot: true, "BlazorBasicTestApp", "blazorwasm_aot", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blazorwasm_aot", extraProperties: extraProperties); bool isPublish = true; (string _, string output) = BuildProject(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 5bacd05d9ff87f..9a79ea7a0936af 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -24,7 +24,7 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi public void BlazorNoopRebuild(string config) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_rebuild", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_rebuild", extraProperties: extraProperties); BlazorBuild(info, isNativeBuild: true); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), @@ -49,7 +49,7 @@ public void BlazorNoopRebuild(string config) public void BlazorOnlyLinkRebuild(string config) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blz_relink", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_relink", extraProperties: extraProperties); BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:EmccLinkOptimizationFlag=-O2"); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 22735ea3567ba6..f5bfa022780990 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -28,7 +28,7 @@ public SimpleMultiThreadedTests(ITestOutputHelper output, SharedBuildPerTestClas public async Task BlazorBuildRunTest(string config) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazorwasm", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazorwasm", extraProperties: extraProperties); bool isPublish = false; string frameworkDir = GetBlazorBinFrameworkDir(info.Configuration, isPublish); BuildProject(info, @@ -54,7 +54,7 @@ public async Task BlazorBuildRunTest(string config) public async Task BlazorPublishRunTest(string config, bool aot) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot, "BlazorBasicTestApp", "blazor_mt", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_mt", extraProperties: extraProperties); // if (aot) // AddItemsPropertiesToProject(projectFile, "true"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index 8914ac3c7f6536..bb1305aed28f26 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -27,7 +27,7 @@ public SimpleRunTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b [InlineData("Release")] public async Task BlazorBuildRunTest(string config) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazor", "App"); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); BlazorBuild(info); await RunForBuildWithDotnetRun(new(config)); } @@ -39,7 +39,7 @@ public async Task BlazorBuildRunTest(string config) [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) { - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", "blazor", "App"); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); string extraPropertiesForDBP = ""; if (appendRID) extraPropertiesForDBP += "true"; @@ -73,7 +73,7 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool a [InlineData("Release", true)] public async Task BlazorPublishRunTest(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "BlazorBasicTestApp", "blazor_publish", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_publish"); BlazorPublish(info); await RunForPublishWithWebServer(new(config)); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index a80d0d1df248f8..b43add4bfb1976 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -79,7 +79,7 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bo { string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; string extraProperties = invariant ? $"true" : ""; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraProperties: extraProperties); string ccText = "currentCount++;"; // UpdateFile throws if code that is to be replaced does not exist UpdateFile(Path.Combine("Pages", "Counter.razor"), new Dictionary @@ -133,7 +133,7 @@ private void CheckWorkloadRequired(string config, string extraProperties, bool w string insertAtEnd = @" "; - ProjectInfo info = CopyTestAsset(config, aot: false, "BlazorBasicTestApp", prefix, "App", extraProperties: extraProperties, insertAtEnd: insertAtEnd); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraProperties: extraProperties, insertAtEnd: insertAtEnd); (string _, string output) = BuildProject(info, new BuildOptions( info.Configuration, diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs new file mode 100644 index 00000000000000..4fee8b039c8cb8 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs @@ -0,0 +1,5 @@ +public class TestAsset +{ + public string Name { get; init; } + public string RunnableProjectSubPath { get; init; } +} \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index b9b2086c4a6d5d..14d64d7962af4f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -25,7 +25,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [BuildAndRun(config: "Debug", aot: true)] public void Wasm_CannotAOT_InDebug(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "no_aot_in_debug", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "no_aot_in_debug"); bool isPublish = true; (string _, string buildOutput) = BuildProject(info, @@ -45,7 +45,7 @@ public void Wasm_CannotAOT_InDebug(string config, bool aot) [BuildAndRun(config: "Debug")] public async Task BuildThenPublishNoAOT(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_publish", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); bool isPublish = false; BuildProject(info, @@ -80,7 +80,7 @@ public async Task BuildThenPublishNoAOT(string config, bool aot) [BuildAndRun(config: "Release", aot: true)] public async Task BuildThenPublishWithAOT(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_publish", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); bool isPublish = false; (_, string output) = BuildProject(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 6e38044ea482b3..645f3aa458818b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -48,7 +48,7 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv extraProperties = $"{extraProperties}{invariantGlobalization}"; string prefix = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantGlobalization.cs")); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 54ebae2341f9da..8457b2b5880de1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -44,7 +44,7 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian extraProperties = $"{extraProperties}{invariantTimezone}"; string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 17380740612fb8..e885443ff860b6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -48,7 +48,7 @@ async Task TestMainWithArgs(string config, string projectContentsName, string[] args) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", projectNamePrefix, "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, projectNamePrefix); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", projectContentsName)); string argsStr = string.Join(" ", args); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 7019c511aaf8cd..d69eebaaefd5c1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -27,7 +27,7 @@ public async Task ProjectWithNativeReference(string config, bool aot) string extraItems = $""; string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "AppUsingNativeLib-a", "App", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems, extraProperties: extraProperties); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir!, objectFilename)); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); @@ -58,7 +58,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) {GetSkiaSharpReferenceItems()} "; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraItems: extraItems); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); bool isPublish = true; @@ -81,7 +81,7 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) [BuildAndRun(config: "Release", aot: true)] public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "AppUsingBrowserNativeCrypto", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingBrowserNativeCrypto"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); bool isPublish = true; @@ -109,7 +109,7 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) public async Task ProjectWithNativeLibrary(string config, bool aot) { string extraItems = "\n"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "AppUsingNativeLib-a", "App", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index c01e90bf35c711..7e700f770487f4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -33,7 +33,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, string extraCFlags, string extraLDFlags) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_flags", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false); var pathsDict = GetFilesTable(info, paths, unchanged: true); if (extraLDFlags.Length > 0) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 28885bd8d8ff1c..5e4fc7be2acb33 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -21,7 +21,7 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi [MemberData(nameof(NativeBuildData))] public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_noop", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_noop"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); var pathsDict = GetFilesTable(info, paths, unchanged: true); @@ -44,7 +44,7 @@ public void NativeRelinkFailsWithInvariant() $"-p:WasmBuildNative={nativeRelink}", $"-p:InvariantGlobalization=true", }; - ProjectInfo info = CopyTestAsset("Release", aot: true, "WasmBasicTestApp", "relink_fails", "App"); + ProjectInfo info = CopyTestAsset("Release", aot: true, BasicTestApp, "relink_fails"); bool isPublish = true; (string _, string buildOutput) = BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 5201e3b68286e3..58207629be0c25 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -32,7 +32,7 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC // [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void OptimizationFlagChange(string config, bool aot, string cflags, string ldflags) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_flags", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); // force _WasmDevel=false, so we don't get -O0 BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 18db16b57f9fa7..f25236ab015514 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -24,7 +24,7 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_tasks", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_tasks"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); var pathsDict = GetFilesTable(info, paths, unchanged: false); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index c14fbf600c6332..e6ee80c2f8668e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -23,7 +23,7 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void SimpleStringChangeInSource(string config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild_simple", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index a23b927b47e3b0..7458d91e3f2a56 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -144,7 +144,7 @@ public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMars private ProjectInfo PrepreProjectForBlittableTests(string config, bool aot, string prefix, bool disableRuntimeMarshalling, bool useAutoLayout = false) { string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableSameAssembly.cs")); @@ -182,7 +182,7 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly string extraItems = @$""; string libRelativePath = Path.Combine("..", "Library", "Library.cs"); string programRelativePath = Path.Combine("Common", "Program.cs"); - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "blittable_different_library", "App", extraProperties: extraProperties, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blittable_different_library", extraProperties: extraProperties, extraItems: extraItems); ReplaceFile(libRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableDifferentAssembly_Lib.cs")); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableDifferentAssembly.cs")); if (!libraryHasAttribute) @@ -224,7 +224,7 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly public async void DllImportWithFunctionPointers_WarningsAsMessages(string config, bool aot) { string extraProperties = "$(MSBuildWarningsAsMessage);WASM0001"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "fnptr", "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "fnptr", extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); @@ -242,7 +242,7 @@ public async void DllImportWithFunctionPointers_WarningsAsMessages(string config [BuildAndRun()] public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "cb_fnptr", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_fnptr"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); @@ -254,7 +254,7 @@ public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(string c [BuildAndRun()] public async void UnmanagedCallback_InFileType(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "cb_filetype", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_filetype"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackInFile.cs")); @@ -274,7 +274,7 @@ public async void UnmanagedCallback_InFileType(string config, bool aot) [ActiveIssue("RuntimeError: null function or function signature mismatch")] public async void UnmanagedCallersOnly_Namespaced(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "cb_namespace", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_namespace"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackNamespaced.cs")); @@ -328,7 +328,7 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot)
"""; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "icall_enum", "App", insertAtEnd: appendToTheEnd); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "icall_enum", insertAtEnd: appendToTheEnd); // build a library containing icalls with overloaded parameters. ReplaceFile(Path.Combine("..", "Library", "Library.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ICall_Lib.cs")); // temporarily change the project directory to build the library @@ -348,7 +348,7 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) AssertAppBundle: false )); // restore the project directory - _projectDir = Path.Combine(_projectDir!, "..", "App"); + _projectDir = Path.Combine(_projectDir!, ".."); string icallTable = """ @@ -422,7 +422,7 @@ public async void BuildNativeInNonEnglishCulture(string config, bool aot, string string extraItems = @$""; string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "buildNativeNonEng", "App", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "buildNativeNonEng", extraItems: extraItems); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BuildNative.cs")); string cCodeFilename = "simple.c"; @@ -463,7 +463,7 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(str { var extraItems = @""; string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "abi", "App", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); int baseArg = 10; GenerateSourceFiles(_projectDir!, baseArg); @@ -520,7 +520,7 @@ private ProjectInfo PrepreProjectForVariadicFuntion(string config, bool aot, str string objectFilename = "variadic.o"; extraProperties += "true<_WasmDevel>true"; string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraItems: extraItems, extraProperties: extraProperties); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir!, objectFilename)); return info; } @@ -546,7 +546,7 @@ private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) { var extraItems = @""; var extraProperties = "true<_WasmDevel>falsefalse"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "abi", "App", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "AbiRules.cs")); string cCodeFilename = "wasm-abi.c"; File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); @@ -604,7 +604,7 @@ public async void EnsureWasmAbiRulesAreFollowedInInterpreter(string config, bool [ActiveIssue("WasmGenerateAppBundle = false, so _WasmGenerateAppBundle is not triggered. Is the change expected?")] public void EnsureComInteropCompilesInAOT(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "com", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "com"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ComInterop.cs")); bool isPublish = aot; (string libraryDir, string output) = BuildProject(info, @@ -624,7 +624,7 @@ public async void UCOWithSpecialCharacters(string config, bool aot) { var extraProperties = "true"; var extraItems = @""; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "uoc", "App", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "uoc", extraItems: extraItems, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallback.cs")); string cCodeFilename = "local.c"; File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index 39fd9c3a170fdc..44d1c4125b7e52 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -25,7 +25,7 @@ public RebuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bui [BuildAndRun(aot: false, config: "Debug")] public async Task NoOpRebuild(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "rebuild", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); bool isPublish = true; BuildProject(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index 58110a997a00b3..5b902be733fc1e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -39,7 +39,7 @@ public async void ResourcesFromMainAssembly(string config, bool aot, bool native // make ASSERTIONS=1 so that we test with it + $"-O0 -sASSERTIONS=1" + $"-O1"; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); @@ -74,7 +74,7 @@ public async void ResourcesFromProjectReference(string config, bool aot, bool na + $"-O0 -sASSERTIONS=1" + $"-O1"; string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", prefix, "App", extraProperties: extraProperties, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties, extraItems: extraItems); // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't // affect the non-wasm library project File.Move(Path.Combine(_projectDir!, "..", "Directory.Build.props"), Path.Combine(_projectDir!, "Directory.Build.props")); @@ -113,7 +113,7 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(string config, bool aot) -O1 false"; // -O0 can cause aot-instances.dll to blow up, and fail to compile, and it is not really needed here string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "check_sat_asm_not_aot", "App", extraProperties: extraProperties, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "check_sat_asm_not_aot", extraProperties: extraProperties, extraItems: extraItems); CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); bool isPublish = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index 1942013947e1cf..ff4b94905b76d4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -21,7 +21,8 @@ public SignalRTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture protected async Task SignalRPassMessage(string staticWebAssetBasePath, string config, string transport) { - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SignalRClientTests", "AspNetCoreServer"); + TestAsset asset = new() { Name = "WasmBasicTestApp", RunnableProjectSubPath = "AspNetCoreServer" }; + ProjectInfo info = CopyTestAsset(config, false, asset, "SignalRClientTests"); bool isPublish = true; BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 904985411a0030..734af889d59bfb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -19,7 +19,9 @@ namespace Wasm.Build.Tests; public class WasmTemplateTestsBase : BuildTestBase { private readonly WasmSdkBasedProjectProvider _provider; - protected const string DefaultRuntimeAssetsRelativePath = "./_framework/"; + protected const string DefaultRuntimeAssetsRelativePath = "./_framework/"; + protected virtual TestAsset BasicTestApp => new() { Name = "WasmBasicTestApp", RunnableProjectSubPath = "App" }; + public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext, ProjectProviderBase? provider = null) : base(provider ?? new WasmSdkBasedProjectProvider(output, DefaultTargetFramework), output, buildContext) { @@ -80,9 +82,8 @@ public ProjectInfo CreateWasmTemplateProject( protected ProjectInfo CopyTestAsset( string config, bool aot, - string assetDirName, + TestAsset asset, string idPrefix, - string projectDirRelativeToAssetDir = "", bool appendUnicodeToPath = true, bool runAnalyzers = true, string extraProperties = "", @@ -90,14 +91,14 @@ protected ProjectInfo CopyTestAsset( string insertAtEnd = "") { InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue: s_isWindows && aot); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, assetDirName), Path.Combine(_projectDir!)); - if (!string.IsNullOrEmpty(projectDirRelativeToAssetDir)) + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, asset.Name), Path.Combine(_projectDir!)); + if (!string.IsNullOrEmpty(asset.RunnableProjectSubPath)) { - _projectDir = Path.Combine(_projectDir!, projectDirRelativeToAssetDir); + _projectDir = Path.Combine(_projectDir!, asset.RunnableProjectSubPath); } - string projectFilePath = Path.Combine(_projectDir!, $"{assetDirName}.csproj"); + string projectFilePath = Path.Combine(_projectDir!, $"{asset.Name}.csproj"); UpdateProjectFile(projectFilePath, aot, runAnalyzers, extraProperties, extraItems, insertAtEnd); - return new ProjectInfo(config, aot, assetDirName, projectFilePath); + return new ProjectInfo(config, aot, asset.Name, projectFilePath); } private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyzers, string extraProperties, string extraItems, string insertAtEnd) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index dc4516cd077d68..b9286dd9393653 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -26,7 +26,7 @@ public AppSettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicationEnvironment) { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, aot: false, "WasmBasicTestApp", "AppSettingsTest", "App"); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "AppSettingsTest"); bool isPublish = true; BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index 92fa88f48e6362..7c6d0748db0ae7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -43,9 +43,8 @@ public async Task BuildWithDefaultLevel(string configuration) ProjectInfo info = CopyTestAsset( configuration, aot: false, - assetDirName: "WasmBasicTestApp", - idPrefix: "DebugLevelTests_BuildWithDefaultLevel", - projectDirRelativeToAssetDir: "App" + asset: BasicTestApp, + idPrefix: "DebugLevelTests_BuildWithDefaultLevel" ); BuildPublishProject(info); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -63,9 +62,8 @@ public async Task BuildWithExplicitValue(string configuration, int debugLevel) ProjectInfo info = CopyTestAsset( configuration, aot: false, - assetDirName: "WasmBasicTestApp", - idPrefix: "DebugLevelTests_BuildWithExplicitValue", - projectDirRelativeToAssetDir: "App" + asset: BasicTestApp, + idPrefix: "DebugLevelTests_BuildWithExplicitValue" ); BuildPublishProject(info, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -81,9 +79,8 @@ public async Task PublishWithDefaultLevel(string configuration) ProjectInfo info = CopyTestAsset( configuration, aot: false, - assetDirName: "WasmBasicTestApp", - idPrefix: "DebugLevelTests_PublishWithDefaultLevel", - projectDirRelativeToAssetDir: "App" + asset: BasicTestApp, + idPrefix: "DebugLevelTests_PublishWithDefaultLevel" ); BuildPublishProject(info, isPublish: true); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -101,9 +98,8 @@ public async Task PublishWithExplicitValue(string configuration, int debugLevel) ProjectInfo info = CopyTestAsset( configuration, aot: false, - assetDirName: "WasmBasicTestApp", - idPrefix: "DebugLevelTests_PublishWithExplicitValue", - projectDirRelativeToAssetDir: "App" + asset: BasicTestApp, + idPrefix: "DebugLevelTests_PublishWithExplicitValue" ); BuildPublishProject(info, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); @@ -120,9 +116,8 @@ public async Task PublishWithDefaultLevelAndPdbs(string configuration) ProjectInfo info = CopyTestAsset( configuration, aot: false, - assetDirName: "WasmBasicTestApp", - idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs", - projectDirRelativeToAssetDir: "App" + asset: BasicTestApp, + idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs" ); BuildPublishProject(info, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index d46acddc917452..fb85f169d63ce8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -24,7 +24,7 @@ public DownloadThenInitTests(ITestOutputHelper output, SharedBuildPerTestClassFi [InlineData("Release")] public async Task NoResourcesReFetchedAfterDownloadFinished(string config) { - ProjectInfo info = CopyTestAsset(config, aot: false, "WasmBasicTestApp", "DownloadThenInitTests", "App"); + ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "DownloadThenInitTests"); bool isPublish = false; BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs index 1062c34a3a98da..dada329ec3c324 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs @@ -34,7 +34,7 @@ public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(string config) const int iterationCount = 70; _testOutput.WriteLine("/// Creating project"); - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "InterpPgoTest", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "InterpPgoTest"); _testOutput.WriteLine("/// Building"); bool isPublish = false; diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index 3f81a9f455dc94..d860067a76bb03 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -31,7 +31,7 @@ public LazyLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtension, string[] allLazyLoadingTestExtensions) { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LazyLoadingTests", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); bool isPublish = false; BuildProject(info, new BuildOptions( @@ -63,7 +63,7 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi public async Task FailOnMissingLazyAssembly() { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LazyLoadingTests", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); bool isPublish = true; BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index 1e2ec7f3c37578..925d29b4f93dd7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -27,7 +27,7 @@ public LibraryInitializerTests(ITestOutputHelper output, SharedBuildPerTestClass public async Task LoadLibraryInitializer() { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LibraryInitializerTests_LoadLibraryInitializer", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); bool isPublish = true; BuildProject(info, new BuildOptions( @@ -51,7 +51,7 @@ public async Task LoadLibraryInitializer() public async Task AbortStartupOnError() { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "LibraryInitializerTests_AbortStartupOnError", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_AbortStartupOnError"); bool isPublish = true; BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index 0dc621dc89bb2a..f54656e13b8920 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -25,7 +25,7 @@ public MaxParallelDownloadsTests(ITestOutputHelper output, SharedBuildPerTestCla [InlineData("Release", "4")] public async Task NeverFetchMoreThanMaxAllowed(string config, string maxParallelDownloads) { - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "MaxParallelDownloadsTests", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MaxParallelDownloadsTests"); bool isPublish = false; BuildProject(info, new BuildOptions( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index 6854ae59738f6c..32add378a4e34b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -29,7 +29,7 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop_NoWorkload() => public async Task AllocateLargeHeapThenRepeatedlyInterop() { string config = "Release"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "MemoryTests", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MemoryTests"); bool isPublish = false; string extraArgs = "-p:EmccMaximumHeapSize=4294901760"; BuildProject(info, @@ -55,7 +55,7 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop() public async Task RunSimpleAppWithProfiler() { string config = "Release"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "ProfilerTest", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ProfilerTest"); bool isPublish = false; // are are linking all 3 profilers, but below we only initialize log profiler and test it string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index b50e9490e04138..cbce2d2a8fb8a9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -26,7 +26,7 @@ public ModuleConfigTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur public async Task DownloadProgressFinishes(bool failAssemblyDownload) { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}"); bool isPublish = true; BuildProject(info, new BuildOptions( @@ -68,7 +68,7 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) public async Task OutErrOverrideWorks() { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "ModuleConfigTests_OutErrOverrideWorks", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ModuleConfigTests_OutErrOverrideWorks"); bool isPublish = true; BuildProject(info, new BuildOptions( @@ -98,7 +98,7 @@ public async Task OutErrOverrideWorks() [InlineData("Release", false)] public async Task OverrideBootConfigName(string config, bool isPublish) { - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "OverrideBootConfigName", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "OverrideBootConfigName"); BuildProject(info, new BuildOptions( info.Configuration, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 26755fa63dc37d..86eec806b1d88c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -30,7 +30,7 @@ public SatelliteLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFi public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) { string config = "Debug"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SatelliteLoadingTests", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTests"); bool isPublish = false; BuildProject(info, new BuildOptions( @@ -69,7 +69,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) public async Task LoadSatelliteAssemblyFromReference() { string config = "Release"; - ProjectInfo info = CopyTestAsset(config, false, "WasmBasicTestApp", "SatelliteLoadingTestsFromReference", "App"); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTestsFromReference"); bool isPublish = true; // Replace ProjectReference with Reference diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index e7519cad5193f1..3de7140c804c73 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -32,7 +32,7 @@ protected async void TestMain(string projectName, string runtimeConfigContents = "", params string[] extraArgs) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "DotnetRun", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "DotnetRun"); UpdateFile(Path.Combine("Common", "Program.cs"), programText); if (!string.IsNullOrEmpty(runtimeConfigContents)) { diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 0879da84b90ae3..4a4743d3b97a5d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -204,9 +204,8 @@ public void WithNativeReference(string config, string extraProperties, bool publ ProjectInfo info = CopyTestAsset( config, aot, - "WasmBasicTestApp", - projectPrefix, - "App", + BasicTestApp, + projectPrefix, extraProperties: extraProperties, extraItems: extraItems, insertAtEnd: printValueTarget); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index cf3cde76adab4f..c7868f64249997 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -18,7 +18,7 @@ public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestCl [BuildAndRun] public async void RunOutOfAppBundle(string config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "outofappbundle", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "outofappbundle"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); bool isPublish = true; string binFrameworkDir = GetBinFrameworkDir(info.Configuration, isPublish); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 11a122d879867e..9c57d24a512329 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -28,7 +28,7 @@ public WasmSIMDTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bu [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, /* simd */ true })] public async void Build_NoAOT_ShouldNotRelink(string config, bool aot, bool simd) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "build_with_workload_no_aot", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_with_workload_no_aot"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); bool isPublish = false; (string _, string output) = BuildProject(info, @@ -60,7 +60,7 @@ public async void Build_NoAOT_ShouldNotRelink(string config, bool aot, bool simd [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ true, /* simd */ false })] public async void PublishSIMD_AOT(string config, bool aot, bool simd) { - ProjectInfo info = CopyTestAsset(config, aot, "WasmBasicTestApp", "simd_publish", "App"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "simd_publish"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); bool isPublish = true; (string _, string output) = BuildProject(info, From 98129308033689fa66caacd0e33246c06cc32554 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 15 Nov 2024 15:53:46 +0000 Subject: [PATCH 060/104] Remove WASI build errors --- src/mono/wasi/Wasi.Build.Tests/BuildTestBase.cs | 7 +++++++ .../{Common => BrowserStructures}/AssertBundleOptions.cs | 0 2 files changed, 7 insertions(+) rename src/mono/wasm/Wasm.Build.Tests/{Common => BrowserStructures}/AssertBundleOptions.cs (100%) diff --git a/src/mono/wasi/Wasi.Build.Tests/BuildTestBase.cs b/src/mono/wasi/Wasi.Build.Tests/BuildTestBase.cs index 76bc6fed455bea..c05c99d72c8c9e 100644 --- a/src/mono/wasi/Wasi.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasi/Wasi.Build.Tests/BuildTestBase.cs @@ -758,6 +758,13 @@ public record BuildProjectOptions string? TargetFramework = null, IDictionary? ExtraBuildEnvironmentVariables = null ); + + public record AssertBundleOptions( + BuildProjectOptions BuildOptions, + bool ExpectSymbolsFile = true, + bool AssertIcuAssets = true, + bool AssertSymbolsFile = true + ); public enum NativeFilesType { FromRuntimePack, Relinked, AOT }; } diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs similarity index 100% rename from src/mono/wasm/Wasm.Build.Tests/Common/AssertBundleOptions.cs rename to src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs From 75adae8724bcd7c197e4febb6d2eef4af319c5da Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 18 Nov 2024 07:36:10 +0000 Subject: [PATCH 061/104] Fix: too many replacements. --- src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 7458d91e3f2a56..9b6a0922448019 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -348,7 +348,7 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) AssertAppBundle: false )); // restore the project directory - _projectDir = Path.Combine(_projectDir!, ".."); + _projectDir = Path.Combine(_projectDir!, "..", "App"); string icallTable = """ From 18eb807f9ab87c276cb88e1802d5749b8ee5ad4f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:23:17 +0000 Subject: [PATCH 062/104] WIP with feedback - not building correctly yet --- .../AspNetCore/SignalRClientTests.cs | 10 +- .../Blazor/AppsettingsTests.cs | 6 +- .../Blazor/BlazorWasmTestBase.cs | 118 +++++---- .../Blazor/BuildPublishTests.cs | 90 +++---- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 32 ++- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 29 ++- .../Wasm.Build.Tests/Blazor/MiscTests2.cs | 20 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 20 +- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 50 ++-- .../Blazor/NoopNativeRebuildTest.cs | 21 +- .../Blazor/SignalRClientTests.cs | 10 +- .../Blazor/SimpleMultiThreadedTests.cs | 37 +-- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 37 ++- .../Blazor/WorkloadRequiredTests.cs | 39 ++- .../BrowserStructures/AssertBundleOptions.cs | 5 +- .../BrowserStructures/BuildOptions.cs | 49 ++++ .../MSBuildOptions.cs} | 12 +- .../BrowserStructures/PublishOptions.cs | 51 ++++ .../Wasm.Build.Tests/BuildPublishTests.cs | 84 ++----- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 26 +- .../Common/BuildAndRunAttribute.cs | 2 +- .../Wasm.Build.Tests/Common/Configuration.cs | 12 + .../Wasm.Build.Tests/Common/ProjectInfo.cs | 8 +- .../HybridGlobalizationTests.cs | 20 +- .../wasm/Wasm.Build.Tests/IcuShardingTests.cs | 12 +- .../Wasm.Build.Tests/IcuShardingTests2.cs | 6 +- src/mono/wasm/Wasm.Build.Tests/IcuTests.cs | 38 ++- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 24 +- .../InvariantGlobalizationTests.cs | 21 +- .../InvariantTimezoneTests.cs | 18 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 21 +- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 54 +--- .../Wasm.Build.Tests/NativeLibraryTests.cs | 60 +---- .../FlagsChangeRebuildTest.cs | 12 +- .../NativeRebuildTestsBase.cs | 35 +-- .../NoopNativeRebuildTest.cs | 29 +-- .../OptimizationFlagChangeTests.cs | 10 +- .../ReferenceNewAssemblyRebuildTest.cs | 6 +- .../SimpleSourceChangeRebuildTest.cs | 8 +- .../NonWasmTemplateBuildTests.cs | 10 +- .../PInvokeTableGeneratorTests.cs | 234 ++++++------------ .../Wasm.Build.Tests/ProjectProviderBase.cs | 12 +- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 26 +- .../SatelliteAssembliesTests.cs | 43 +--- .../wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 14 +- .../Templates/NativeBuildTests.cs | 32 +-- .../Templates/WasmTemplateTests.cs | 94 ++----- .../Templates/WasmTemplateTestsBase.cs | 74 +++--- .../TestAppScenarios/AppSettingsTests.cs | 12 +- .../TestAppScenarios/DebugLevelTests.cs | 50 ++-- .../TestAppScenarios/DownloadThenInitTests.cs | 15 +- .../TestAppScenarios/InterpPgoTests.cs | 16 +- .../TestAppScenarios/LazyLoadingTests.cs | 26 +- .../LibraryInitializerTests.cs | 24 +- .../MaxParallelDownloadsTests.cs | 18 +- .../TestAppScenarios/MemoryTests.cs | 32 +-- .../TestAppScenarios/ModuleConfigTests.cs | 58 ++--- .../TestAppScenarios/SatelliteLoadingTests.cs | 25 +- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 18 +- .../wasm/Wasm.Build.Tests/WasmBuildAppTest.cs | 16 +- .../WasmNativeDefaultsTests.cs | 80 +++--- .../WasmRunOutOfAppBundleTests.cs | 16 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 35 +-- .../WasmSdkBasedProjectProvider.cs | 23 +- 64 files changed, 816 insertions(+), 1329 deletions(-) create mode 100644 src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildOptions.cs rename src/mono/wasm/Wasm.Build.Tests/{BuildOptions.cs => BrowserStructures/MSBuildOptions.cs} (75%) create mode 100644 src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/AspNetCore/SignalRClientTests.cs b/src/mono/wasm/Wasm.Build.Tests/AspNetCore/SignalRClientTests.cs index 2675e253bcd543..30f3073de9af20 100644 --- a/src/mono/wasm/Wasm.Build.Tests/AspNetCore/SignalRClientTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/AspNetCore/SignalRClientTests.cs @@ -19,10 +19,10 @@ public SignalRClientTests(ITestOutputHelper output, SharedBuildPerTestClassFixtu [ActiveIssue("https://github.com/dotnet/runtime/issues/106807")] [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] - [InlineData("Debug", "LongPolling")] - [InlineData("Release", "LongPolling")] - [InlineData("Debug", "WebSockets")] - [InlineData("Release", "WebSockets")] - public async Task SignalRPassMessageWasmBrowser(string config, string transport) => + [InlineData(Configuration.Debug, "LongPolling")] + [InlineData(Configuration.Release, "LongPolling")] + [InlineData(Configuration.Debug, "WebSockets")] + [InlineData(Configuration.Release, "WebSockets")] + public async Task SignalRPassMessageWasmBrowser(Configuration config, string transport) => await SignalRPassMessage("wasmclient", config, transport); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs index ce7d169926cc5b..dd93dd77c2659a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs @@ -22,7 +22,7 @@ public AppsettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [Fact] public async Task FileInVfs() { - string config = "debug"; + Configuration config = "debug"; ProjectInfo info = CreateWasmTemplateProject(Template.BlazorWasm, config, aot: false, "blazor"); UpdateHomePage(); string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; @@ -39,11 +39,11 @@ var builder } }); - (string _, string buildOutput) = BlazorBuild(info); + (string _, string buildOutput) = BlazorBuild(info, config); bool existsChecked = false; bool contentChecked = false; await RunForBuildWithDotnetRun(new( - info.Configuration, + config, OnConsoleMessage: (_, msg) => { if (msg.Contains("appSettings Exists 'True'")) existsChecked = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 7db1e9448e8f9c..7f1c775401c022 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -18,7 +18,10 @@ namespace Wasm.Build.Tests; public abstract class BlazorWasmTestBase : WasmTemplateTestsBase { - protected readonly WasmSdkBasedProjectProvider _provider; + protected readonly WasmSdkBasedProjectProvider _provider; + private readonly string _blazorExtraBuildArgs = "-p:BlazorEnableCompression=false /warnaserror"; + protected readonly PublishOptions _defaultBlazorPublishOptions = _defaultPublishOptions with { ExtraMSBuildArgs = _blazorExtraBuildArgs }; + private readonly BuildOptions _defaultBlazorBuildOptions = _defaultBlazorBuildOptions with { ExtraMSBuildArgs = _blazorExtraBuildArgs }; protected override TestAsset BasicTestApp => new() { Name = "BlazorBasicTestApp", RunnableProjectSubPath = "App" }; protected BlazorWasmTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) @@ -60,37 +63,6 @@ protected override void OnAfterRender(bool firstRender) } }; - public override (string projectDir, string buildOutput) BuildProject( - ProjectInfo projectInfo, - BuildOptions buildOptions, - params string[] extraArgs) - { - try - { - var additionalOptiont = buildOptions.WarnAsError - ? new[] { "-p:BlazorEnableCompression=false", "/warnaserror" } - : new[] { "-p:BlazorEnableCompression=false" }; - - (string projectDir, string buildOutput) = base.BuildProject( - projectInfo, - buildOptions with { AssertAppBundle = false }, - extraArgs.Concat(additionalOptiont).ToArray()); - - if (buildOptions.ExpectSuccess && buildOptions.AssertAppBundle) - { - AssertBundle(buildOutput, buildOptions); - } - - return (projectDir, buildOutput); - } - catch (XunitException xe) - { - if (xe.Message.Contains("error CS1001: Identifier expected")) - Utils.DirectoryCopy(_projectDir!, _logPath, testOutput: _testOutput); - throw; - } - } - protected void UpdateHomePage() => UpdateFile(Path.Combine("Pages", "Home.razor"), blazorHomePageReplacements); @@ -125,38 +97,59 @@ public string CreateBlazorWasmTemplateProject(string id) } protected (string projectDir, string buildOutput) BlazorBuild( - ProjectInfo info, bool isNativeBuild = false, bool useCache = true, params string[] extraArgs) + ProjectInfo info, Configuration config, MSBuildOptions buildOptions = _defaultBlazorBuildOptions, bool isNativeBuild = false) { - bool isPublish = false; - return BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild), - IsPublish: isPublish, - UseCache: useCache), - extraArgs - ); + try + { + if (publishOptions != _defaultBlazorPublishOptions) + buildOptions = buildOptions with { ExtraMSBuildArgs = $"{buildOptions.ExtraMSBuildArgs} {_blazorExtraBuildArgs}" }; + (string projectDir, string buildOutput) = BuildProject( + info, + config, + buildOptions, + isNativeBuild); + if (buildOptions.ExpectSuccess && buildOptions.AssertAppBundle) + { + AssertBundle(configuration, buildOutput, buildOptions, expectNativeBuild); + } + return (projectDir, buildOutput); + } + catch (XunitException xe) + { + if (xe.Message.Contains("error CS1001: Identifier expected")) + Utils.DirectoryCopy(_projectDir!, _logPath, testOutput: _testOutput); + throw; + } } + protected (string projectDir, string buildOutput) BlazorPublish( - ProjectInfo info, bool isNativeBuild = false, bool useCache = true, params string[] extraArgs) + ProjectInfo info, Configuration config, PublishOptions publishOptions = _defaultBlazorPublishOptions, bool isNativeBuild = false) { - bool isPublish = true; - return BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild), - IsPublish: isPublish, - UseCache: useCache), - extraArgs - ); + try + { + if (publishOptions != _defaultBlazorPublishOptions) + buildOptions = buildOptions with { ExtraMSBuildArgs = $"{buildOptions.ExtraMSBuildArgs} {_blazorExtraBuildArgs}" }; + (string projectDir, string buildOutput) = PublishProject( + info, + config, + publishOptions, + isNativeBuild); + if (publishOptions.ExpectSuccess && publishOptions.AssertAppBundle) + { + AssertBundle(configuration, buildOutput, publishOptions, expectNativeBuild); + } + return (projectDir, buildOutput); + } + catch (XunitException xe) + { + if (xe.Message.Contains("error CS1001: Identifier expected")) + Utils.DirectoryCopy(_projectDir!, _logPath, testOutput: _testOutput); + throw; + } } - public void AssertBundle(string buildOutput, BuildOptions buildOptions) + public void AssertBundle(Configuration config, string buildOutput, MSBuildOptions buildOptions, bool expectNativeBuild) { if (IsUsingWorkloads) { @@ -164,13 +157,14 @@ public void AssertBundle(string buildOutput, BuildOptions buildOptions) ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? DefaultTargetFramework, buildOptions.RuntimeType); } - _provider.AssertBundle(buildOptions); + _provider.AssertBundle(config, buildOptions, expectNativeBuild); if (!buildOptions.IsPublish) return; + var expectedFileType = GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, expectNativeBuild); // Publish specific checks - if (buildOptions.ExpectedFileType == NativeFilesType.AOT) + if (expectedFileType == NativeFilesType.AOT) { // check for this too, so we know the format is correct for the negative // test for jsinterop.webassembly.dll @@ -182,13 +176,13 @@ public void AssertBundle(string buildOutput, BuildOptions buildOptions) string objBuildDir = Path.Combine(_projectDir!, "obj", buildOptions.Configuration, buildOptions.TargetFramework!, "wasm", "for-build"); // Check that we linked only for publish - if (buildOptions.ExpectRelinkDirWhenPublishing) + if (buildOptions is PublishOptions publishOptions && publishOptions.ExpectRelinkDirWhenPublishing) Assert.True(Directory.Exists(objBuildDir), $"Could not find expected {objBuildDir}, which gets created when relinking during Build. This is likely a test authoring error"); else Assert.False(File.Exists(Path.Combine(objBuildDir, "emcc-link.rsp")), $"Found unexpected `emcc-link.rsp` in {objBuildDir}, which gets created when relinking during Build."); } - protected ProjectInfo CreateProjectWithNativeReference(string config, bool aot, string extraProperties) + protected ProjectInfo CreateProjectWithNativeReference(Configuration config, bool aot, string extraProperties) { string extraItems = @$" {GetSkiaSharpReferenceItems()} @@ -210,6 +204,6 @@ public override async Task RunForPublishWithWebServer(RunOptions runO ExecuteAfterLoaded = runOptions.ExecuteAfterLoaded ?? _executeAfterLoaded }); - public string GetBlazorBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFrameworkForBlazor, string? projectDir = null) + public string GetBlazorBinFrameworkDir(Configuration config, bool forPublish, string framework = DefaultTargetFrameworkForBlazor, string? projectDir = null) => _provider.GetBinFrameworkDir(config: config, forPublish: forPublish, framework: framework, projectDir: projectDir); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index fcc5549af1cbde..ffc8c500dd82a3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -24,15 +24,15 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur } [Theory, TestCategory("no-workload")] - [InlineData("Debug")] - [InlineData("Release")] - public async Task DefaultTemplate_WithoutWorkload(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public async Task DefaultTemplate_WithoutWorkload(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_workload"); - BlazorBuild(info); + BlazorBuild(info, config); await RunForBuildWithDotnetRun(new(info.Configuration)); - BlazorPublish(info, useCache: false); + BlazorPublish(info, config, new PublishOptions(UseCache: false)); await RunForPublishWithWebServer(new(info.Configuration)); } @@ -43,66 +43,57 @@ public static TheoryData TestDataForDefaultTemplate_WithWorkload(b if (!isAot) { // AOT does not support managed debugging, is disabled by design - data.Add("Debug", false); - data.Add("Debug", true); + data.Add(Configuration.Debug, false); + data.Add(Configuration.Debug, true); } // [ActiveIssue("https://github.com/dotnet/runtime/issues/103625", TestPlatforms.Windows)] // when running locally the path might be longer than 260 chars and these tests can fail with AOT - data.Add("Release", false); // Release relinks by default - data.Add("Release", true); + data.Add(Configuration.Release, false); // Release relinks by default + data.Add(Configuration.Release, true); return data; } [Theory] [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] - public void DefaultTemplate_NoAOT_WithWorkload(string config, bool testUnicode) + public void DefaultTemplate_NoAOT_WithWorkload(Configuration config, bool testUnicode) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_aot", appendUnicodeToPath: testUnicode); - BlazorPublish(info); + BlazorPublish(info, config); } [Theory] [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] - public void DefaultTemplate_AOT_WithWorkload(string config, bool testUnicode) + public void DefaultTemplate_AOT_WithWorkload(Configuration config, bool testUnicode) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_aot", appendUnicodeToPath: testUnicode); - BlazorBuild(info); - - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: NativeFilesType.AOT, - IsPublish: isPublish, - UseCache: false), - extraArgs: "-p:RunAOTCompilation=true" - ); + BlazorBuild(info, config); + + // NativeFilesType.AOT?? + PublishProject(info, config, PublishOptions(AOT: true, UseCache: false)); } [Theory] - [InlineData("Debug", false)] - [InlineData("Release", false)] - [InlineData("Debug", true)] - [InlineData("Release", true)] - public void DefaultTemplate_CheckFingerprinting(string config, bool expectFingerprintOnDotnetJs) + [InlineData(Configuration.Debug, false)] + [InlineData(Configuration.Release, false)] + [InlineData(Configuration.Debug, true)] + [InlineData(Configuration.Release, true)] + public void DefaultTemplate_CheckFingerprinting(Configuration config, bool expectFingerprintOnDotnetJs) { var extraProperty = expectFingerprintOnDotnetJs ? "truetrue" : "true"; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_checkfingerprinting", extraProperties: extraProperty); - BlazorBuild(info, isNativeBuild: true); - BlazorPublish(info, isNativeBuild: true, useCache: false); + BlazorBuild(info, config, isNativeBuild: true); + BlazorPublish(info, config, new PublishOptions(UseCache: false), isNativeBuild: true); } // Disabling for now - publish folder can have more than one dotnet*hash*js, and not sure // how to pick which one to check, for the test //[Theory] - //[InlineData("Debug")] - //[InlineData("Release")] - //public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(string config) + //[InlineData(Configuration.Debug)] + //[InlineData(Configuration.Release)] + //public void DefaultTemplate_AOT_OnlyWithPublishCommandLine_Then_PublishNoAOT(Configuration config) //{ //string id = $"blz_aot_pub_{config}"; //CreateBlazorWasmTemplateProject(id); @@ -119,9 +110,9 @@ public void DefaultTemplate_CheckFingerprinting(string config, bool expectFinger //} [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void DefaultTemplate_WithResources_Publish(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void DefaultTemplate_WithResources_Publish(Configuration config) { string[] cultures = ["ja-JP", "es-ES"]; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_resources"); @@ -134,11 +125,11 @@ public void DefaultTemplate_WithResources_Publish(string config) Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir!, "resx")); // Build and assert resource dlls - BlazorBuild(info); + BlazorBuild(info, config); AssertResourcesDlls(GetBlazorBinFrameworkDir(config, forPublish: false)); // Publish and assert resource dlls - BlazorPublish(info, useCache: false); + BlazorPublish(info, config, new PublisOptions(UseCache: false)); AssertResourcesDlls(GetBlazorBinFrameworkDir(config, forPublish: true)); void AssertResourcesDlls(string basePath) @@ -158,13 +149,13 @@ void AssertResourcesDlls(string basePath) [InlineData("false", false)] // the other case public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) { - string config = "Release"; + Configuration config = Configuration.Release; string extraProperties = "true"; if (!string.IsNullOrEmpty(stripILAfterAOT)) extraProperties += $"{stripILAfterAOT}"; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_WasmStripILAfterAOT", extraProperties: extraProperties); - BlazorPublish(info); + BlazorPublish(info, config); await RunForPublishWithWebServer(new(config)); string frameworkDir = Path.Combine(_projectDir!, "bin", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); @@ -174,22 +165,13 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL } [Theory] - [InlineData("Debug")] - public void BlazorWasm_CannotAOT_InDebug(string config) + [InlineData(Configuration.Debug)] + public void BlazorWasm_CannotAOT_InDebug(Configuration config) { ProjectInfo info = CopyTestAsset( config, aot: true, BasicTestApp, "blazorwasm", extraProperties: "true"); - bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - ExpectSuccess: false - )); + (string _, string output) = PublishProject(info, config, new PublishOptions(ExpectSuccess: false)); Assert.Contains("AOT is not supported in debug configuration", output); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index ea7ed31d61066e..c61b2e7dd504f4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -21,13 +21,13 @@ public CleanTests(ITestOutputHelper output, SharedBuildPerTestClassFixture build } [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void Blazor_BuildThenClean_NativeRelinking(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void Blazor_BuildThenClean_NativeRelinking(Configuration config) { string extraProperties = @"<_WasmDevel>truetrue"; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean", extraProperties: extraProperties); - BlazorBuild(info, isNativeBuild: true); + BlazorBuild(info, config, isNativeBuild: true); string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); @@ -43,31 +43,37 @@ public void Blazor_BuildThenClean_NativeRelinking(string config) } [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void Blazor_BuildNoNative_ThenBuildNative_ThenClean(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void Blazor_BuildNoNative_ThenBuildNative_ThenClean(Configuration config) => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: false); [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(Configuration config) => Blazor_BuildNativeNonNative_ThenCleanTest(config, firstBuildNative: true); - private void Blazor_BuildNativeNonNative_ThenCleanTest(string config, bool firstBuildNative) + private void Blazor_BuildNativeNonNative_ThenCleanTest(Configuration config, bool firstBuildNative) { string extraProperties = @"<_WasmDevel>true"; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean_native", extraProperties: extraProperties); bool relink = firstBuildNative; - BlazorBuild(info, isNativeBuild: relink, extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); + BlazorBuild(info, + config, + new BuildOptions(ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), + isNativeBuild: relink); string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); if (relink) Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); relink = !firstBuildNative; - BlazorBuild(info, useCache: false, isNativeBuild: relink, extraArgs: relink ? "-p:WasmBuildNative=true" : string.Empty); + BlazorBuild(info, + config, + new BuildOptions(useCache: false, ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), + isNativeBuild: relink); if (relink) Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index ad7b3146a05199..d72d1be8ed1aae 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -19,14 +19,14 @@ public MiscTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildC } [Theory] - [InlineData("Debug", true)] - [InlineData("Debug", false)] - [InlineData("Release", true)] - [InlineData("Release", false)] + [InlineData(Configuration.Debug, true)] + [InlineData(Configuration.Debug, false)] + [InlineData(Configuration.Release, true)] + [InlineData(Configuration.Release, false)] [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] - public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRelink) + public void NativeBuild_WithDeployOnBuild_UsedByVS(Configuration config, bool nativeRelink) { - string extraProperties = config == "Debug" + string extraProperties = config == Configuration.Debug ? ("-O1" + "-O1") : string.Empty; @@ -35,7 +35,10 @@ public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRel ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_deploy_on_build", extraProperties: extraProperties); // build with -p:DeployOnBuild=true, and that will trigger a publish - (string _, string buildOutput) = BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:DeployBuild=true"); + (string _, string buildOutput) = BlazorBuild(info, + config, + new BuildOptions(ExtraMSBuildArgs: "-p:DeployBuild=true"), + isNativeBuild: true); // double check relinking! string substring = "pinvoke.c -> pinvoke.o"; @@ -47,22 +50,22 @@ public void NativeBuild_WithDeployOnBuild_UsedByVS(string config, bool nativeRel } [Theory] - [InlineData("Release")] - public void DefaultTemplate_AOT_InProjectFile(string config) + [InlineData(Configuration.Release)] + public void DefaultTemplate_AOT_InProjectFile(Configuration config) { - string extraProperties = config == "Debug" + string extraProperties = config == Configuration.Debug ? ("-O1" + "-O1") : string.Empty; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_aot_prj_file", extraProperties: extraProperties); // No relinking, no AOT - BlazorBuild(info); + BlazorBuild(info, config); // will aot - BlazorPublish(info, useCache: false); + BlazorPublish(info, config, new PublishOptions(UseCache: false)); // build again - BlazorBuild(info, useCache: false); + BlazorBuild(info, config, new BuildOptions(UseCache: false)); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs index bdb6d39e9e2a20..83c6fef7b990fb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs @@ -17,9 +17,9 @@ public MiscTests2(ITestOutputHelper output, SharedBuildPerTestClassFixture build } [Theory, TestCategory("no-workload")] - [InlineData("Debug")] - [InlineData("Release")] - public void NativeRef_EmitsWarningBecauseItRequiresWorkload(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void NativeRef_EmitsWarningBecauseItRequiresWorkload(Configuration config) { CommandResult res = PublishForRequiresWorkloadTest(config, extraItems: ""); res.EnsureSuccessful(); @@ -27,9 +27,9 @@ public void NativeRef_EmitsWarningBecauseItRequiresWorkload(string config) } [Theory, TestCategory("no-workload")] - [InlineData("Debug")] - [InlineData("Release")] - public void AOT_FailsBecauseItRequiresWorkload(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void AOT_FailsBecauseItRequiresWorkload(Configuration config) { CommandResult res = PublishForRequiresWorkloadTest(config, extraProperties: "true"); Assert.NotEqual(0, res.ExitCode); @@ -37,9 +37,9 @@ public void AOT_FailsBecauseItRequiresWorkload(string config) } [Theory, TestCategory("no-workload")] - [InlineData("Debug")] - [InlineData("Release")] - public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(Configuration config) { CommandResult res = PublishForRequiresWorkloadTest(config, extraProperties: "true", @@ -49,7 +49,7 @@ public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(string config) Assert.Contains("following workloads must be installed: wasm-tools", res.Output); } - private CommandResult PublishForRequiresWorkloadTest(string config, string extraItems="", string extraProperties="") + private CommandResult PublishForRequiresWorkloadTest(Configuration config, string extraItems="", string extraProperties="") { ProjectInfo info = CopyTestAsset( config, aot: false, BasicTestApp, "needs_workload", extraProperties: extraProperties, extraItems: extraItems); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index 80f0890cf1c44c..e5be0bfba2fc25 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -24,11 +24,11 @@ public MiscTests3(ITestOutputHelper output, SharedBuildPerTestClassFixture build } [Theory] - [InlineData("Debug", /*build*/true, /*publish*/false)] - [InlineData("Release", /*build*/true, /*publish*/false)] - [InlineData("Release", /*build*/false, /*publish*/true)] - [InlineData("Release", /*build*/true, /*publish*/true)] - public async Task WithDllImportInMainAssembly(string config, bool build, bool publish) + [InlineData(Configuration.Debug, /*build*/true, /*publish*/false)] + [InlineData(Configuration.Release, /*build*/true, /*publish*/false)] + [InlineData(Configuration.Release, /*build*/false, /*publish*/true)] + [InlineData(Configuration.Release, /*build*/true, /*publish*/true)] + public async Task WithDllImportInMainAssembly(Configuration config, bool build, bool publish) { // Based on https://github.com/dotnet/runtime/issues/59255 string prefix = $"blz_dllimp_{config}_{s_unicodeChars}"; @@ -50,10 +50,10 @@ public async Task WithDllImportInMainAssembly(string config, bool build, bool pu """); if (build) - BlazorBuild(info, isNativeBuild: true); + BlazorBuild(info, config, isNativeBuild: true); if (publish) - BlazorPublish(info, useCache: false, isNativeBuild: true); + BlazorPublish(info, config, new PublishOptions(UseCache: false), isNativeBuild: true); RunOptions runOptions = new(config, Test: TestDllImport); if (publish) @@ -72,7 +72,7 @@ async Task TestDllImport(IPage page) [Fact] public void BugRegression_60479_WithRazorClassLib() { - string config = "Release"; + Configuration config = Configuration.Release; string razorClassLibraryName = "RazorClassLibrary"; string extraItems = @$" @@ -80,10 +80,10 @@ public void BugRegression_60479_WithRazorClassLib() ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_razor_lib_top", extraItems: extraItems); // No relinking, no AOT - BlazorBuild(info); + BlazorBuild(info, config); // will relink - BlazorPublish(info, useCache: false); + BlazorPublish(info, config, new PublishOptions(UseCache: false)); // publish/wwwroot/_framework/blazor.boot.json string frameworkDir = GetBlazorBinFrameworkDir(config, forPublish: true); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index 78bfbfd966baf1..1d27ab35563a34 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -18,56 +18,48 @@ public NativeTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buil } [Theory] - [InlineData("Debug")] - [InlineData("Release")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] - public void WithNativeReference_AOTInProjectFile(string config) + public void WithNativeReference_AOTInProjectFile(Configuration config) { - string extraProperties = config == "Debug" + string extraProperties = config == Configuration.Debug ? ("-O1" + - "-O1") - : string.Empty; - ProjectInfo info = CreateProjectWithNativeReference(config, aot: true, extraProperties: extraProperties); - BlazorBuild(info, isNativeBuild: true); - BlazorPublish(info, useCache: false, isNativeBuild: true); + "-O1" + + "true") + : "true"; + ProjectInfo info = CreateProjectWithNativeReference(extraProperties: extraProperties); + BlazorBuild(info, config, isNativeBuild: true); + BlazorPublish(info, config, new PublishOptions(UseCache: false), isNativeBuild: true); // will relink - BlazorBuild(info, useCache: false, isNativeBuild: true); + BlazorBuild(info, config, new BuilldOptions(UseCache: false), isNativeBuild: true); } [Theory] - [InlineData("Debug")] - [InlineData("Release")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] [ActiveIssue("https://github.com/dotnet/runtime/issues/82725")] - public void WithNativeReference_AOTOnCommandLine(string config) + public void WithNativeReference_AOTOnCommandLine(Configuration config) { - string extraProperties = config == "Debug" + string extraProperties = config == Configuration.Debug ? ("-O1" + "-O1") : string.Empty; ProjectInfo info = CreateProjectWithNativeReference(config, aot: false, extraProperties: extraProperties); - BlazorBuild(info, isNativeBuild: true); - BlazorPublish(info, isNativeBuild: true, extraArgs: "-p:RunAOTCompilation=true"); + BlazorBuild(info, config, isNativeBuild: true); + BlazorPublish(info, config, new PublishOptions(AOT: true), isNativeBuild: true); // no aot! - BlazorPublish(info, isNativeBuild: true); + BlazorPublish(info, config, isNativeBuild: true); } [Theory] - [InlineData("Release")] - public void BlazorWasm_CannotAOT_WithNoTrimming(string config) + [InlineData(Configuration.Release)] + public void BlazorWasm_CannotAOT_WithNoTrimming(Configuration config) { string extraProperties = "falsetrue"; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blazorwasm_aot", extraProperties: extraProperties); - bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - ExpectSuccess: false) - ); + (string _, string output) = PublishProject(info, new BuildOptions(ExpectSuccess: false)); Assert.Contains("AOT is not supported without IL trimming", output); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 9a79ea7a0936af..cbe1df50a64690 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -19,13 +19,13 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi } [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void BlazorNoopRebuild(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void BlazorNoopRebuild(Configuration config) { string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_rebuild", extraProperties: extraProperties); - BlazorBuild(info, isNativeBuild: true); + BlazorBuild(info, config, isNativeBuild: true); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); @@ -36,7 +36,7 @@ public void BlazorNoopRebuild(string config) var originalStat = _provider.StatFiles(pathsDict); // build again - BlazorBuild(info, useCache: false, isNativeBuild: true); + BlazorBuild(info, config, new BuildOptions(UseCache: false), isNativeBuild: true); var newStat = _provider.StatFiles(pathsDict); _provider.CompareStat(originalStat, newStat, pathsDict); @@ -44,13 +44,14 @@ public void BlazorNoopRebuild(string config) [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public void BlazorOnlyLinkRebuild(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void BlazorOnlyLinkRebuild(Configuration config) { string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_relink", extraProperties: extraProperties); - BlazorBuild(info, isNativeBuild: true, extraArgs: "-p:EmccLinkOptimizationFlag=-O2"); + var buildOptions = new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O2"); + BlazorBuild(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O2"), isNativeBuild: true); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); @@ -62,7 +63,7 @@ public void BlazorOnlyLinkRebuild(string config) var originalStat = _provider.StatFiles(pathsDict); // build again - BlazorBuild(info, useCache: false, isNativeBuild: true, extraArgs: "-p:EmccLinkOptimizationFlag=-O1"); + BlazorBuild(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O1", UseCache: false), isNativeBuild: true); var newStat = _provider.StatFiles(pathsDict); _provider.CompareStat(originalStat, newStat, pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SignalRClientTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SignalRClientTests.cs index cf4f938bc1885d..f48472f9b96467 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SignalRClientTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SignalRClientTests.cs @@ -20,11 +20,11 @@ public SignalRClientTests(ITestOutputHelper output, SharedBuildPerTestClassFixtu [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] [ActiveIssue("https://github.com/dotnet/runtime/issues/100445")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" - [InlineData("Debug", "LongPolling")] - [InlineData("Release", "LongPolling")] - [InlineData("Debug", "WebSockets")] - [InlineData("Release", "WebSockets")] - public async Task SignalRPassMessageBlazor(string config, string transport) => + [InlineData(Configuration.Debug, "LongPolling")] + [InlineData(Configuration.Release, "LongPolling")] + [InlineData(Configuration.Debug, "WebSockets")] + [InlineData(Configuration.Release, "WebSockets")] + public async Task SignalRPassMessageBlazor(Configuration config, string transport) => await SignalRPassMessage("blazorclient", config, transport); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index f5bfa022780990..59520ea42bd3f1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -22,24 +22,16 @@ public SimpleMultiThreadedTests(ITestOutputHelper output, SharedBuildPerTestClas // dotnet-run needed for running with *build* so wwwroot has the index.html etc [Theory] - [InlineData("Debug")] - [InlineData("Release")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] [ActiveIssue("run fails with timeout")] - public async Task BlazorBuildRunTest(string config) + public async Task BlazorBuildRunTest(Configuration config) { string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazorwasm", extraProperties: extraProperties); bool isPublish = false; string frameworkDir = GetBlazorBinFrameworkDir(info.Configuration, isPublish); - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: frameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - RuntimeType: RuntimeVariant.MultiThreaded - )); + BuildProject(info, config, new BuildOptions(RuntimeType: RuntimeVariant.MultiThreaded)); // we wan to use "xharness wasm webserver" but from non-publish location string extraArgs = " --web-server-use-cors --web-server-use-cop --web-server-use-https --timeout=15:00:00"; await RunForPublishWithWebServer(new(config, ExtraArgs: extraArgs, CustomBundleDir: Path.Combine(frameworkDir, ".."))); @@ -47,11 +39,11 @@ public async Task BlazorBuildRunTest(string config) [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] [ActiveIssue("https://github.com/dotnet/runtime/issues/100373")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" - // [InlineData("Debug", false)] // ActiveIssue https://github.com/dotnet/runtime/issues/98758 - // [InlineData("Debug", true)] - [InlineData("Release", false)] - // [InlineData("Release", true)] - public async Task BlazorPublishRunTest(string config, bool aot) + // [InlineData(Configuration.Debug, false)] // ActiveIssue https://github.com/dotnet/runtime/issues/98758 + // [InlineData(Configuration.Debug, true)] + [InlineData(Configuration.Release, false)] + // [InlineData(Configuration.Release, true)] + public async Task BlazorPublishRunTest(Configuration config, bool aot) { string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_mt", extraProperties: extraProperties); @@ -68,16 +60,7 @@ export function onRuntimeReady({ runtimeBuildInfo }) { """ ); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - RuntimeType: RuntimeVariant.MultiThreaded - )); + BuildProject(info, config, new PublishOptions(RuntimeType: RuntimeVariant.MultiThreaded, AOT: aot)); bool hasEmittedWasmEnableThreads = false; StringBuilder errorOutput = new(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index bb1305aed28f26..6f7ba0b07aff74 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -23,21 +23,21 @@ public SimpleRunTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b } [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task BlazorBuildRunTest(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public async Task BlazorBuildRunTest(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); - BlazorBuild(info); + BlazorBuild(info, config); await RunForBuildWithDotnetRun(new(config)); } [Theory] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] - public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) + [InlineData(Configuration.Debug, /*appendRID*/ true, /*useArtifacts*/ false)] + [InlineData(Configuration.Debug, /*appendRID*/ true, /*useArtifacts*/ true)] + [InlineData(Configuration.Debug, /*appendRID*/ false, /*useArtifacts*/ true)] + [InlineData(Configuration.Debug, /*appendRID*/ false, /*useArtifacts*/ false)] + public async Task BlazorBuildAndRunForDifferentOutputPaths(Configuration config, bool appendRID, bool useArtifacts) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); string extraPropertiesForDBP = ""; @@ -56,25 +56,18 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(string config, bool a Path.Combine( projectDir, "bin", info.ProjectName, config.ToLower(), "wwwroot", "_framework") : GetBinFrameworkDir(config, isPublish); - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: frameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); + BuildProject(info, config); await RunForBuildWithDotnetRun(new(config)); } [Theory] - [InlineData("Debug", false)] - [InlineData("Release", false)] - [InlineData("Release", true)] - public async Task BlazorPublishRunTest(string config, bool aot) + [InlineData(Configuration.Debug, false)] + [InlineData(Configuration.Release, false)] + [InlineData(Configuration.Release, true)] + public async Task BlazorPublishRunTest(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_publish"); - BlazorPublish(info); + BlazorPublish(info, config); await RunForPublishWithWebServer(new(config)); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index b43add4bfb1976..f934747dcf1a20 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -38,10 +38,10 @@ public static TheoryData SettingDifferentFromValuesInRunti { TheoryData data = new(); - string[] configs = new[] { "Debug", "Release" }; + string[] configs = new[] { Configuration.Debug, Configuration.Release }; foreach (var defaultPair in PropertiesWithTriggerValues) { - foreach (string config in configs) + foreach (Configuration config in configs) { data.Add(config, $"<{defaultPair.propertyName}>{defaultPair.triggerValue}", true); data.Add(config, $"<{defaultPair.propertyName}>{!defaultPair.triggerValue}", false); @@ -53,18 +53,18 @@ public static TheoryData SettingDifferentFromValuesInRunti [Theory, TestCategory("no-workload")] [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] - public void WorkloadRequiredForBuild(string config, string extraProperties, bool workloadNeeded) + public void WorkloadRequiredForBuild(Configuration config, string extraProperties, bool workloadNeeded) => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: false); [Theory, TestCategory("no-workload")] [MemberData(nameof(SettingDifferentFromValuesInRuntimePack))] - public void WorkloadRequiredForPublish(string config, string extraProperties, bool workloadNeeded) + public void WorkloadRequiredForPublish(Configuration config, string extraProperties, bool workloadNeeded) => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: true); public static TheoryData InvariantGlobalizationTestData(bool publish) { TheoryData data = new(); - foreach (string config in new[] { "Debug", "Release" }) + foreach (Configuration config in new[] { Configuration.Debug, Configuration.Release }) { data.Add(config, /*invariant*/ true, /*publish*/ publish); data.Add(config, /*invariant*/ false, /*publish*/ publish); @@ -75,7 +75,7 @@ public static TheoryData InvariantGlobalizationTestData(bool [Theory, TestCategory("no-workload")] [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ true)] - public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bool invariant, bool publish) + public async Task WorkloadNotRequiredForInvariantGlobalization(Configuration config, bool invariant, bool publish) { string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; string extraProperties = invariant ? $"true" : ""; @@ -91,15 +91,10 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bo string allText = File.ReadAllText(counterPath); _testOutput.WriteLine($"Updated counter.razor: {allText}"); - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, publish), - ExpectedFileType: GetExpectedFileType(info, publish), - IsPublish: publish, - GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded - )); + var globalizationMode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; + _ = publish ? + PublishProject(info, config, new PublishOptions(GlobalizationMode: globalizationMode)) : + BuildProject(info, config, new BuildOptions(GlobalizationMode: globalizationMode)); RunOptions runOptions = new(config); RunResult result = publish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); @@ -127,22 +122,16 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(string config, bo } } - private void CheckWorkloadRequired(string config, string extraProperties, bool workloadNeeded, bool publish) + private void CheckWorkloadRequired(Configuration config, string extraProperties, bool workloadNeeded, bool publish) { string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; string insertAtEnd = @" "; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraProperties: extraProperties, insertAtEnd: insertAtEnd); - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBlazorBinFrameworkDir(info.Configuration, publish), - ExpectedFileType: GetExpectedFileType(info, publish), - IsPublish: publish, - ExpectSuccess: false - )); + (string _, string output) = publish ? + PublishProject(info, config, new PublishOptions(ExpectSuccess: false)) : + BuildProject(info, config, new BuildOptions(ExpectSuccess: false)); if (workloadNeeded) { diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs index f881c33f6f1974..1d0430c86562ad 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs @@ -8,8 +8,9 @@ namespace Wasm.Build.Tests; public record AssertBundleOptions( - BuildOptions BuildOptions, + MSBuildOptions BuildOptions, bool ExpectSymbolsFile = true, bool AssertIcuAssets = true, - bool AssertSymbolsFile = true + bool AssertSymbolsFile = true, + NativeFilesType ExpectedFileType ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildOptions.cs new file mode 100644 index 00000000000000..d573405986a9cd --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BuildOptions.cs @@ -0,0 +1,49 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; + +#nullable enable + +namespace Wasm.Build.Tests; + +public record BuildOptions : MSBuildOptions +{ + public BuildOptions( + bool IsPublish = false, + bool AOT = false, + NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, + string TargetFramework = BuildTestBase.DefaultTargetFramework, + GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, + string CustomIcuFile = "", + bool UseCache = true, + bool ExpectSuccess = true, + bool AssertAppBundle = true, + string Label = "", + bool WarnAsError = true, + RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, + IDictionary? ExtraBuildEnvironmentVariables = null, + string BootConfigFileName = "blazor.boot.json", + string NonDefaultFrameworkDir = "", + string ExtraMSBuildArgs = "" + ) : base( + IsPublish, + AOT, + ExpectedFileType, + TargetFramework, + GlobalizationMode, + CustomIcuFile, + UseCache, + ExpectSuccess, + AssertAppBundle, + Label, + WarnAsError, + RuntimeType, + ExtraBuildEnvironmentVariables, + BootConfigFileName, + NonDefaultFrameworkDir, + ExtraMSBuildArgs + ) + { + } +} diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/MSBuildOptions.cs similarity index 75% rename from src/mono/wasm/Wasm.Build.Tests/BuildOptions.cs rename to src/mono/wasm/Wasm.Build.Tests/BrowserStructures/MSBuildOptions.cs index e85aab2a6c5933..24ae96b0745816 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/MSBuildOptions.cs @@ -7,24 +7,22 @@ namespace Wasm.Build.Tests; -public record BuildOptions +public abstract record MSBuildOptions ( - string Configuration, - string Id, - string BinFrameworkDir, + bool IsPublish, + bool AOT = false, NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, string TargetFramework = BuildTestBase.DefaultTargetFramework, GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, - bool IsPublish = true, string CustomIcuFile = "", bool UseCache = true, bool ExpectSuccess = true, bool AssertAppBundle = true, - bool BuildOnlyAfterPublish = true, string Label = "", bool WarnAsError = true, RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, IDictionary? ExtraBuildEnvironmentVariables = null, string BootConfigFileName = "blazor.boot.json", - bool ExpectRelinkDirWhenPublishing = false + string NonDefaultFrameworkDir = "", + string ExtraMSBuildArgs = "" ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs new file mode 100644 index 00000000000000..73b9d3850af18e --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs @@ -0,0 +1,51 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +namespace Wasm.Build.Tests; + +public record PublishOptions : MSBuildOptions +{ + public bool BuildOnlyAfterPublish { get; init; } = true; + public bool ExpectRelinkDirWhenPublishing { get; init; } = false; + + public PublishOptions( + bool IsPublish = true, + bool AOT = false, + NativeFilesType ExpectedFileType = NativeFilesType.FromRuntimePack, + string TargetFramework = BuildTestBase.DefaultTargetFramework, + GlobalizationMode GlobalizationMode = GlobalizationMode.Sharded, + string CustomIcuFile = "", + bool UseCache = true, + bool ExpectSuccess = true, + bool AssertAppBundle = true, + string Label = "", + bool WarnAsError = true, + RuntimeVariant RuntimeType = RuntimeVariant.SingleThreaded, + IDictionary? ExtraBuildEnvironmentVariables = null, + string BootConfigFileName = "blazor.boot.json", + string NonDefaultFrameworkDir = "", + string ExtraMSBuildArgs = "" + ) : base( + IsPublish, + AOT, + ExpectedFileType, + TargetFramework, + GlobalizationMode, + CustomIcuFile, + UseCache, + ExpectSuccess, + AssertAppBundle, + Label, + WarnAsError, + RuntimeType, + ExtraBuildEnvironmentVariables, + BootConfigFileName, + NonDefaultFrameworkDir, + ExtraMSBuildArgs + ) + { + this.IsPublish = IsPublish; + } +} \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 14d64d7962af4f..1b26b087859767 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -22,76 +22,40 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur } [Theory] - [BuildAndRun(config: "Debug", aot: true)] - public void Wasm_CannotAOT_InDebug(string config, bool aot) + [BuildAndRun(config: Configuration.Debug, aot: true)] + public void Wasm_CannotAOT_InDebug(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "no_aot_in_debug"); - - bool isPublish = true; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - ExpectSuccess: false - )); + (string _, string buildOutput) = PublishProject(info, config, PublishOptions(AOT: aot, ExpectSuccess: false)); Assert.Contains("AOT is not supported in debug configuration", buildOutput); } [Theory] - [BuildAndRun(config: "Release")] - [BuildAndRun(config: "Debug")] - public async Task BuildThenPublishNoAOT(string config, bool aot) + [BuildAndRun(config: Configuration.Release)] + [BuildAndRun(config: Configuration.Debug)] + public async Task BuildThenPublishNoAOT(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); - - bool isPublish = false; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); + BuildProject(info, config); if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); - RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun"); + RunOptions runOptions = new(config, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); - isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false - )); + PublishProject(info, config, PublishOptions(UseCache: false)); await RunForPublishWithWebServer(runOptions); } [Theory] - [BuildAndRun(config: "Release", aot: true)] - public async Task BuildThenPublishWithAOT(string config, bool aot) + [BuildAndRun(config: Configuration.Release, aot: true)] + public async Task BuildThenPublishWithAOT(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); bool isPublish = false; - (_, string output) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - Label: "first_build" - )); + (_, string output) = BuildProject(info, config, BuildOptions(Label: "first_build", AOT: aot)); BuildPaths paths = GetBuildPaths(info, forPublish: isPublish); IDictionary pathsDict = @@ -107,7 +71,7 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); - RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun"); + RunOptions runOptions = new(config, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); @@ -116,16 +80,7 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) // relink by default for Release+publish isPublish = true; - (_, output) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false, - Label: "first_publish" - )); + (_, output) = PublishProject(info, config, PublishOptions(Label: "first_publish", UseCache: false, AOT: aot)); // publish has different paths ("for-publish", not "for-build") paths = GetBuildPaths(info, forPublish: isPublish); @@ -143,16 +98,7 @@ public async Task BuildThenPublishWithAOT(string config, bool aot) // second build isPublish = false; - (_, output) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false, - Label: "second_build" - )); + (_, output) = BuildProject(info, config, BuildOptions(Label: "second_build", UseCache: false, AOT: aot)); var secondBuildStat = StatFiles(pathsDict); // no relinking, or AOT diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 93e31527793a7e..4afdd1baa8e2f1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -112,7 +112,7 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, _providerOfBaseType = providerBase; } - public static IEnumerable> ConfigWithAOTData(bool aot, string? config = null) + public static IEnumerable> ConfigWithAOTData(bool aot, Configuration config = Configuration.Release) { if (config == null) { @@ -120,10 +120,10 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, { #if TEST_DEBUG_CONFIG_ALSO // list of each member data - for Debug+@aot - new object?[] { "Debug", aot }.AsEnumerable(), + new object?[] { Configuration.Debug, aot }.AsEnumerable(), #endif // list of each member data - for Release+@aot - new object?[] { "Release", aot }.AsEnumerable() + new object?[] { Configuration.Release, aot }.AsEnumerable() }.AsEnumerable(); } else @@ -136,12 +136,13 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, } public (CommandResult res, string logPath) BuildProjectWithoutAssert( - BuildOptions buildOptions, - params string[] extraArgs) + Configuration configuration, + string projectName, + BuildOptions buildOptions) { string buildType = buildOptions.IsPublish ? "publish" : "build"; string logFileSuffix = string.IsNullOrEmpty(buildOptions.Label) ? string.Empty : buildOptions.Label.Replace(' ', '_') + "-"; - string logFilePath = Path.Combine(_logPath, $"{buildOptions.Id}-{logFileSuffix}{buildType}.binlog"); + string logFilePath = Path.Combine(_logPath, $"{projectName}-{logFileSuffix}{buildType}.binlog"); _testOutput.WriteLine($"{Environment.NewLine}** -------- {buildType} -------- **{Environment.NewLine}"); _testOutput.WriteLine($"Binlog path: {logFilePath}"); @@ -150,10 +151,10 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, { buildType, $"-bl:{logFilePath}", - $"-p:Configuration={buildOptions.Configuration}", + $"-p:Configuration={configuration}", "-nr:false" }; - commandLineArgs.AddRange(extraArgs); + commandLineArgs.AddRange(buildOptions.ExtraMSBuildArgs); if (buildOptions.IsPublish && buildOptions.BuildOnlyAfterPublish) commandLineArgs.Append("-p:WasmBuildOnlyAfterPublish=true"); @@ -195,11 +196,11 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, return (res, logFilePath); } - protected NativeFilesType GetExpectedFileType(ProjectInfo info, bool isPublish, bool isNativeBuild=false) => + protected NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isNativeBuild=false) => isNativeBuild ? NativeFilesType.Relinked : !isPublish ? NativeFilesType.FromRuntimePack : - info.AOT ? NativeFilesType.AOT : - (info.Configuration == "Debug" || !IsUsingWorkloads) ? + isAOT ? NativeFilesType.AOT : + (config == Configuration.Debug || !IsUsingWorkloads) ? NativeFilesType.FromRuntimePack : NativeFilesType.Relinked; @@ -222,7 +223,7 @@ private string GetBinlogMessageContext(TextNode node) } [MemberNotNull(nameof(_projectDir), nameof(_logPath))] - protected void InitPaths(string id) + protected (string, string) InitPaths(string id) { if (_projectDir == null) _projectDir = Path.Combine(BuildEnvironment.TmpPath, id); @@ -234,6 +235,7 @@ protected void InitPaths(string id) Directory.CreateDirectory(_nugetPackagesDir!); Directory.CreateDirectory(_logPath); + return (_logPath, _nugetPackagesDir); } protected void InitProjectDir(string dir, bool addNuGetSourceForLocalPackages = true, string targetFramework = DefaultTargetFramework) diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs index 4ea7785758258b..aaf50541894a1a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs @@ -22,7 +22,7 @@ public class BuildAndRunAttribute : DataAttribute { private readonly IEnumerable _data; - public BuildAndRunAttribute(bool aot=false, string? config=null, params object?[] parameters) + public BuildAndRunAttribute(bool aot=false, Configuration? config=null, params object?[] parameters) { _data = BuildTestBase.ConfigWithAOTData(aot, config) .Multiply(parameters) diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs b/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs new file mode 100644 index 00000000000000..e527f88bc6fc82 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +#nullable enable + +namespace Wasm.Build.Tests; + +public enum Configuration +{ + Release, + Debug, +} diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs b/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs index a2b7b04776e3a0..70fc3cbe426cf8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/ProjectInfo.cs @@ -6,8 +6,10 @@ namespace Wasm.Build.Tests; public record ProjectInfo( - string Configuration, - bool AOT, + // string Configuration, + // bool AOT, string ProjectName, - string ProjectFilePath + string ProjectFilePath, + string LogPath, + string NugetDir ); diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 69be5cb2dcdf8e..9e75a1f3f140e6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -29,16 +29,16 @@ public HybridGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestClas [BuildAndRun(aot: true)] // Expected to find /workspaces/runtime/artifacts/bin/Wasm.Build.Tests/Release/net9.0/linux-x64/wbt artifacts/hybrid_Debug_False_g2xwxpxr_lus_鿀蜒枛遫䡫煉/obj/Debug/net9.0/wasm/for-build/dotnet.globalization.js [ActiveIssue("dotnet.globalization.js not found")] - public async Task AOT_HybridGlobalizationTests(string config, bool aot) + public async Task AOT_HybridGlobalizationTests(Configuration config, bool aot) => await TestHybridGlobalizationTests(config, aot); [Theory] [BuildAndRun(aot: false)] [ActiveIssue("dotnet.globalization.js not found")] - public async Task RelinkingWithoutAOT(string config, bool aot) + public async Task RelinkingWithoutAOT(Configuration config, bool aot) => await TestHybridGlobalizationTests(config, aot, isNativeBuild: true); - private async Task TestHybridGlobalizationTests(string config, bool aot, bool isNativeBuild = false) + private async Task TestHybridGlobalizationTests(Configuration config, bool aot, bool isNativeBuild = false) { string extraProperties = $"true"; if (isNativeBuild) @@ -48,18 +48,8 @@ private async Task TestHybridGlobalizationTests(string config, bool aot, bool is ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "HybridGlobalization.cs")); UpdateBrowserMainJs(); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), - IsPublish: isPublish, - GlobalizationMode: GlobalizationMode.Hybrid - )); - - RunResult output = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + PublishProject(info, config, new PublishOptions(GlobalizationMode: GlobalizationMode.Hybrid), isNativeBuild: isNativeBuild); + RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); Assert.Contains(output.TestOutput, m => m.Contains("HybridGlobalization works, thrown exception as expected")); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs index c2471af7a2b7b7..e3ecb5a48717d0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests.cs @@ -19,14 +19,14 @@ public class IcuShardingTests : IcuTestsBase public IcuShardingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - public static IEnumerable IcuExpectedAndMissingCustomShardTestData(string config) => + public static IEnumerable IcuExpectedAndMissingCustomShardTestData(Configuration config) => from aot in boolOptions from onlyPredefinedCultures in boolOptions // isOnlyPredefinedCultures = true fails with wasmbrowser: https://github.com/dotnet/runtime/issues/108272 where !(onlyPredefinedCultures) select new object[] { config, aot, CustomIcuPath, s_customIcuTestedLocales, onlyPredefinedCultures }; - public static IEnumerable IcuExpectedAndMissingAutomaticShardTestData(string config) + public static IEnumerable IcuExpectedAndMissingAutomaticShardTestData(Configuration config) { var locales = new Dictionary { @@ -40,12 +40,12 @@ from locale in locales } [Theory] - [MemberData(nameof(IcuExpectedAndMissingCustomShardTestData), parameters: new object[] { "Release" })] - public async Task CustomIcuShard(string config, bool aot, string customIcuPath, string customLocales, bool onlyPredefinedCultures) => + [MemberData(nameof(IcuExpectedAndMissingCustomShardTestData), parameters: new object[] { Configuration.Release })] + public async Task CustomIcuShard(Configuration config, bool aot, string customIcuPath, string customLocales, bool onlyPredefinedCultures) => await TestIcuShards(config, Template.WasmBrowser, aot, customIcuPath, customLocales, GlobalizationMode.Custom, onlyPredefinedCultures); [Theory] - [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { "Release" })] - public async Task AutomaticShardSelectionDependingOnEnvLocale(string config, bool aot, string environmentLocale, string testedLocales) => + [MemberData(nameof(IcuExpectedAndMissingAutomaticShardTestData), parameters: new object[] { Configuration.Release })] + public async Task AutomaticShardSelectionDependingOnEnvLocale(Configuration config, bool aot, string environmentLocale, string testedLocales) => await PublishAndRunIcuTest(config, Template.WasmBrowser, aot, testedLocales, GlobalizationMode.Sharded, locale: environmentLocale); } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs index cb6259315e4f54..5e28d2c0627a14 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuShardingTests2.cs @@ -19,7 +19,7 @@ public class IcuShardingTests2 : IcuTestsBase public IcuShardingTests2(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - public static IEnumerable IcuExpectedAndMissingShardFromRuntimePackTestData(string config) + public static IEnumerable IcuExpectedAndMissingShardFromRuntimePackTestData(Configuration config) { var locales = new Dictionary { @@ -37,7 +37,7 @@ from locale in locales } [Theory] - [MemberData(nameof(IcuExpectedAndMissingShardFromRuntimePackTestData), parameters: new object[] { "Release" })] - public async Task DefaultAvailableIcuShardsFromRuntimePack(string config, bool aot, string shardName, string testedLocales) => + [MemberData(nameof(IcuExpectedAndMissingShardFromRuntimePackTestData), parameters: new object[] { Configuration.Release })] + public async Task DefaultAvailableIcuShardsFromRuntimePack(Configuration config, bool aot, string shardName, string testedLocales) => await TestIcuShards(config, Template.WasmBrowser, aot, shardName, testedLocales, GlobalizationMode.Custom); } \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs index e6042357f45b79..825f00e3b9b6f0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTests.cs @@ -19,12 +19,12 @@ public class IcuTests : IcuTestsBase public IcuTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - public static IEnumerable FullIcuWithICustomIcuTestData(string config) => + public static IEnumerable FullIcuWithICustomIcuTestData(Configuration config) => from aot in boolOptions from fullIcu in boolOptions select new object[] { config, aot, fullIcu }; - public static IEnumerable FullIcuWithInvariantTestData(string config) + public static IEnumerable FullIcuWithInvariantTestData(Configuration config) { var locales = new object[][] { @@ -39,7 +39,7 @@ from locale in locales select new object[] { config, aot, locale[0], locale[1], locale[2] }; } - public static IEnumerable IncorrectIcuTestData(string config) + public static IEnumerable IncorrectIcuTestData(Configuration config) { var customFiles = new Dictionary { @@ -52,8 +52,8 @@ public static IEnumerable IncorrectIcuTestData(string config) [Theory] - [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { "Release" })] - public async Task FullIcuFromRuntimePackWithInvariant(string config="Release", bool aot=false, bool invariant=true, bool fullIcu=true, string testedLocales="Array.Empty()") => + [MemberData(nameof(FullIcuWithInvariantTestData), parameters: new object[] { Configuration.Release })] + public async Task FullIcuFromRuntimePackWithInvariant(Configuration config=Configuration.Release, bool aot=false, bool invariant=true, bool fullIcu=true, string testedLocales="Array.Empty()") => await PublishAndRunIcuTest( config, Template.WasmBrowser, @@ -65,8 +65,8 @@ await PublishAndRunIcuTest( $"{invariant}{fullIcu}{aot}"); [Theory] - [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { "Release" })] - public async Task FullIcuFromRuntimePackWithCustomIcu(string config, bool aot, bool fullIcu) + [MemberData(nameof(FullIcuWithICustomIcuTestData), parameters: new object[] { Configuration.Release })] + public async Task FullIcuFromRuntimePackWithCustomIcu(Configuration config, bool aot, bool fullIcu) { string customIcuProperty = "BlazorIcuDataFileName"; string fullIcuProperty = "BlazorWebAssemblyLoadAllGlobalizationData"; @@ -81,27 +81,19 @@ public async Task FullIcuFromRuntimePackWithCustomIcu(string config, bool aot, b } [Theory] - [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { "Release" })] - public void NonExistingCustomFileAssertError(string config, string customIcu, bool isFilenameFormCorrect) + [MemberData(nameof(IncorrectIcuTestData), parameters: new object[] { Configuration.Release })] + public void NonExistingCustomFileAssertError(Configuration config, string customIcu, bool isFilenameFormCorrect) { string customIcuProperty = "BlazorIcuDataFileName"; string extraProperties = $"<{customIcuProperty}>{customIcu}"; ProjectInfo info = CreateIcuProject(config, Template.WasmBrowser, aot: false, "Array.Empty()", extraProperties); - bool isPublish = false; - (string _, string output) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - GlobalizationMode: GlobalizationMode.Custom, - CustomIcuFile: customIcu, - ExpectSuccess: false, - AssertAppBundle: false - )); - + (string _, string output) = BuildProject(info, config, new BuildOptions( + GlobalizationMode: GlobalizationMode.Custom, + CustomIcuFile: customIcu, + ExpectSuccess: false, + AssertAppBundle: false + )); if (isFilenameFormCorrect) { Assert.Contains($"Could not find $({customIcuProperty})={customIcu}, or when used as a path relative to the runtime pack", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index c3e50ef87a2be1..1ac3b00550dba3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -106,7 +106,7 @@ protected string GetProgramText(string testedLocales, bool onlyPredefinedCulture public record Locale(string Code, string? SundayName); "; - protected async Task TestIcuShards(string config, Template templateType, bool aot, string shardName, string testedLocales, GlobalizationMode globalizationMode, bool onlyPredefinedCultures=false) + protected async Task TestIcuShards(Configuration config, Template templateType, bool aot, string shardName, string testedLocales, GlobalizationMode globalizationMode, bool onlyPredefinedCultures=false) { string icuProperty = "BlazorIcuDataFileName"; // https://github.com/dotnet/runtime/issues/94133 // by default, we remove resource strings from an app. ICU tests are checking exception messages contents -> resource string keys are not enough @@ -117,7 +117,7 @@ protected async Task TestIcuShards(string config, Template templateType, bool ao } protected ProjectInfo CreateIcuProject( - string config, + Configuration config, Template templateType, bool aot, string testedLocales, @@ -136,7 +136,7 @@ protected ProjectInfo CreateIcuProject( } protected async Task PublishAndRunIcuTest( - string config, + Configuration config, Template templateType, bool aot, string testedLocales, @@ -150,19 +150,13 @@ protected async Task PublishAndRunIcuTest( { ProjectInfo info = CreateIcuProject( config, templateType, aot, testedLocales, extraProperties, onlyPredefinedCultures); - bool isPublish = true; bool triggersNativeBuild = globalizationMode == GlobalizationMode.Invariant; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, triggersNativeBuild), - IsPublish: isPublish, - GlobalizationMode: globalizationMode, - CustomIcuFile: icuFileName - )); - RunOptions runOptions = new(info.Configuration, Locale: locale, ExpectedExitCode: 42); + (string _, string buildOutput) = PublishProject(info, + config, + new PublishOptions(GlobalizationMode: globalizationMode, CustomIcuFile: icuFileName), + isNativeBuild: triggersNativeBuild); + + RunOptions runOptions = new(config, Locale: locale, ExpectedExitCode: 42); RunResult runOutput = await RunForPublishWithWebServer(runOptions); return $"{buildOutput}\n{runOutput.TestOutput}"; } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 645f3aa458818b..52fd9942b0497a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -25,23 +25,23 @@ public InvariantGlobalizationTests(ITestOutputHelper output, SharedBuildPerTestC new object?[] { null }, new object?[] { false }, new object?[] { true }) - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); // TODO: check that icu bits have been linked out [Theory] [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false })] [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ true })] - public async Task AOT_InvariantGlobalization(string config, bool aot, bool? invariantGlobalization) + public async Task AOT_InvariantGlobalization(Configuration config, bool aot, bool? invariantGlobalization) => await TestInvariantGlobalization(config, aot, invariantGlobalization); // TODO: What else should we use to verify a relinked build? [Theory] [MemberData(nameof(InvariantGlobalizationTestData), parameters: new object[] { /*aot*/ false })] - public async Task RelinkingWithoutAOT(string config, bool aot, bool? invariantGlobalization) + public async Task RelinkingWithoutAOT(Configuration config, bool aot, bool? invariantGlobalization) => await TestInvariantGlobalization(config, aot, invariantGlobalization, isNativeBuild: true); - private async Task TestInvariantGlobalization(string config, bool aot, bool? invariantGlobalization, bool isNativeBuild = false) + private async Task TestInvariantGlobalization(Configuration config, bool aot, bool? invariantGlobalization, bool isNativeBuild = false) { string extraProperties = isNativeBuild ? "true" : ""; if (invariantGlobalization != null) @@ -54,17 +54,10 @@ private async Task TestInvariantGlobalization(string config, bool aot, bool? inv bool isPublish = true; // invariantGlobalization triggers native build isNativeBuild = isNativeBuild || invariantGlobalization == true; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), - IsPublish: isPublish, - GlobalizationMode: invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded - )); + var globalizationMode = invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; + BuildProject(info, config, new BuildOptions(GlobalizationMode: globalizationMode, AOT: aot), isNativeBuild: isNativeBuild); - RunResult output = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); if (invariantGlobalization == true) { Assert.Contains(output.TestOutput, m => m.Contains("Could not create es-ES culture")); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 8457b2b5880de1..4e97c250752311 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -29,15 +29,15 @@ public InvariantTimezoneTests(ITestOutputHelper output, SharedBuildPerTestClassF [Theory] [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false, })] [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ true })] - public async Task AOT_InvariantTimezone(string config, bool aot, bool? invariantTimezone) + public async Task AOT_InvariantTimezone(Configuration config, bool aot, bool? invariantTimezone) => await TestInvariantTimezone(config, aot, invariantTimezone); [Theory] [MemberData(nameof(InvariantTimezoneTestData), parameters: new object[] { /*aot*/ false })] - public async Task RelinkingWithoutAOT(string config, bool aot, bool? invariantTimezone) + public async Task RelinkingWithoutAOT(Configuration config, bool aot, bool? invariantTimezone) => await TestInvariantTimezone(config, aot, invariantTimezone, isNativeBuild: true); - private async Task TestInvariantTimezone(string config, bool aot, bool? invariantTimezone, bool isNativeBuild = false) + private async Task TestInvariantTimezone(Configuration config, bool aot, bool? invariantTimezone, bool isNativeBuild = false) { string extraProperties = isNativeBuild ? "true" : ""; if (invariantTimezone != null) @@ -47,19 +47,11 @@ private async Task TestInvariantTimezone(string config, bool aot, bool? invarian ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); - bool isPublish = true; // invariantTimezone triggers native build isNativeBuild = isNativeBuild || invariantTimezone == true; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), - IsPublish: isPublish - )); + PublishProject(info, config, isNativeBuild: isNativeBuild); - RunResult output = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); Assert.Contains(output.TestOutput, m => m.Contains("UTC BaseUtcOffset is 0")); if (invariantTimezone == true) { diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index e885443ff860b6..04b7039346e1f8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -26,23 +26,23 @@ public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur // ActiveIssue - passing args to the program does not work, possible error in the test logic // new object?[] { new object?[] { "abc", "foobar"} }, new object?[] { new object?[0] }) - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); [Theory] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true })] - public async Task AsyncMainWithArgs(string config, bool aot, string[] args) + public async Task AsyncMainWithArgs(Configuration config, bool aot, string[] args) => await TestMainWithArgs(config, aot, "async_main_with_args", "AsyncMainWithArgs.cs", args); [Theory] [ActiveIssue("ToDo: passing args to the program does not work, possible error in the test logic")] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true })] - public async Task NonAsyncMainWithArgs(string config, bool aot, string[] args) + public async Task NonAsyncMainWithArgs(Configuration config, bool aot, string[] args) => await TestMainWithArgs(config, aot, "non_async_main_args", "SyncMainWithArgs.cs", args); - async Task TestMainWithArgs(string config, + async Task TestMainWithArgs(Configuration config, bool aot, string projectNamePrefix, string projectContentsName, @@ -53,21 +53,12 @@ async Task TestMainWithArgs(string config, string argsStr = string.Join(" ", args); _testOutput.WriteLine ($"-- args: {argsStr}, name: {projectContentsName}"); - - bool isPublish = true; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config, new PublishOptions(AOT: aot)); int argsCount = args.Length; int expectedCode = 42 + argsCount; RunResult output = await RunForPublishWithWebServer( - new(info.Configuration, TestScenario: "DotnetRun", ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); + new(config, TestScenario: "DotnetRun", ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); Assert.Contains(output.TestOutput, m => m.Contains($"args#: {argsCount}")); foreach (var arg in args) Assert.Contains(output.TestOutput, m => m.Contains($"arg: {arg}")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index 50a564a83c7edc..3a96d27382fe3f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -22,7 +22,7 @@ public NativeBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [Theory] [BuildAndRun(aot: false)] - public async Task SimpleNativeBuild(string config, bool aot) + public async Task SimpleNativeBuild(Configuration config, bool aot) { ProjectInfo info = CreateWasmTemplateProject( Template.WasmBrowser, @@ -35,20 +35,13 @@ public async Task SimpleNativeBuild(string config, bool aot) UpdateBrowserMainJs(); bool isPublish = true; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + (string _, string buildOutput) = PublishProject(info, config, isNativeBuild: true); await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); } [Theory] [BuildAndRun(aot: true)] - public void AOTNotSupportedWithNoTrimming(string config, bool aot) + public void AOTNotSupportedWithNoTrimming(Configuration config, bool aot) { ProjectInfo info = CreateWasmTemplateProject( Template.WasmBrowser, @@ -60,22 +53,13 @@ public void AOTNotSupportedWithNoTrimming(string config, bool aot) UpdateBrowserProgramFile(); UpdateBrowserMainJs(); - bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: false), - IsPublish: isPublish, - ExpectSuccess: false - )); + (string _, string output) = PublishProject(info, config, new PublishOptions(ExpectSuccess: false, AOT: aot)); Assert.Contains("AOT is not supported without IL trimming", output); } [Theory] - [BuildAndRun(config: "Release", aot: true)] - public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(string config, bool aot) + [BuildAndRun(config: Configuration.Release, aot: true)] + public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(Configuration config, bool aot) { string printFileTypeTarget = @" @@ -100,23 +84,15 @@ public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(string config, bool aot insertAtEnd: printFileTypeTarget); bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: false), - IsPublish: isPublish - )); - + (string _, string output) = PublishProject(info, config, new PublishOptions(AOT: aot)); if (!output.Contains("** wasm-dis exit code: 0")) throw new XunitException($"Expected to successfully run wasm-dis on System.Private.CoreLib.dll.o ." + " It might fail if it was incorrectly compiled to a bitcode file, instead of wasm."); } [Theory] - [BuildAndRun(config: "Release", aot: true)] - public void NativeBuildIsRequired(string config, bool aot) + [BuildAndRun(config: Configuration.Release, aot: true)] + public void NativeBuildIsRequired(Configuration config, bool aot) { ProjectInfo info = CreateWasmTemplateProject( Template.WasmBrowser, @@ -125,17 +101,7 @@ public void NativeBuildIsRequired(string config, bool aot) "native_build", extraProperties: "falsetrue"); - bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: false), - IsPublish: isPublish, - ExpectSuccess: false - )); - + (string _, string output) = PublishProject(info, config, new PublishOptions(ExpectSuccess: false, AOT: aot)); Assert.Contains("WasmBuildNative is required", output); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index d69eebaaefd5c1..a13828b2c74907 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -20,8 +20,8 @@ public NativeLibraryTests(ITestOutputHelper output, SharedBuildPerTestClassFixtu [Theory] [BuildAndRun(aot: false)] - [BuildAndRun(config: "Release", aot: true)] - public async Task ProjectWithNativeReference(string config, bool aot) + [BuildAndRun(config: Configuration.Release, aot: true)] + public async Task ProjectWithNativeReference(Configuration config, bool aot) { string objectFilename = "native-lib.o"; string extraItems = $""; @@ -32,15 +32,7 @@ public async Task ProjectWithNativeReference(string config, bool aot) Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); - bool isPublish = true; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun")); Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); @@ -49,9 +41,9 @@ public async Task ProjectWithNativeReference(string config, bool aot) [Theory] [BuildAndRun(aot: false)] - [BuildAndRun(config: "Release", aot: true)] + [BuildAndRun(config: Configuration.Release, aot: true)] [ActiveIssue("https://github.com/dotnet/runtime/issues/103566")] - public async Task ProjectUsingSkiaSharp(string config, bool aot) + public async Task ProjectUsingSkiaSharp(Configuration config, bool aot) { string prefix = $"AppUsingSkiaSharp"; string extraItems = @$" @@ -61,39 +53,21 @@ public async Task ProjectUsingSkiaSharp(string config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraItems: extraItems); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); - - RunOptions runOptions = new(info.Configuration, ExtraArgs: "mono.png"); + PublishProject(info, config, new PublishOptions(AOT: aot)); + RunOptions runOptions = new(config, ExtraArgs: "mono.png"); RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("Size: 26462 Height: 599, Width: 499")); } [Theory] [BuildAndRun(aot: false)] - [BuildAndRun(config: "Release", aot: true)] - public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) + [BuildAndRun(config: Configuration.Release, aot: true)] + public async Task ProjectUsingBrowserNativeCrypto(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingBrowserNativeCrypto"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); - bool isPublish = true; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); - + (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot)); RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); string hash = "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105"; @@ -105,8 +79,8 @@ public async Task ProjectUsingBrowserNativeCrypto(string config, bool aot) [Theory] [BuildAndRun(aot: false)] - [BuildAndRun(config: "Release", aot: true)] - public async Task ProjectWithNativeLibrary(string config, bool aot) + [BuildAndRun(config: Configuration.Release, aot: true)] + public async Task ProjectWithNativeLibrary(Configuration config, bool aot) { string extraItems = "\n"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems); @@ -114,15 +88,7 @@ public async Task ProjectWithNativeLibrary(string config, bool aot) DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); - bool isPublish = true; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 7e700f770487f4..d46b51797f09f3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -20,7 +20,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass } public static IEnumerable FlagsChangesForNativeRelinkingData(bool aot) - => ConfigWithAOTData(aot, config: "Release").Multiply( + => ConfigWithAOTData(aot, config: Configuration.Release).Multiply( new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" } // File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not // new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" }, @@ -31,11 +31,11 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ false)] // Found statically linked AOT module: failed // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] - public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, string extraCFlags, string extraLDFlags) + public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool aot, string extraCFlags, string extraLDFlags) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false); - var pathsDict = GetFilesTable(info, paths, unchanged: true); + var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); if (extraLDFlags.Length > 0) pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); @@ -46,7 +46,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, stri string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; string output = Rebuild(info, nativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); - pathsDict = GetFilesTable(info, paths, unchanged: true); + pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); @@ -57,7 +57,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, stri // ldflags: link step args change, so it should trigger relink TestUtils.AssertSubstring("Linking with emcc", output, contains: extraLDFlags.Length > 0); - if (info.AOT) + if (aot) { // ExtraEmccLDFlags does not affect .bc files Assert.DoesNotContain("Compiling assembly bitcode files", output); @@ -65,7 +65,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(string config, bool aot, stri RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, - contains: info.AOT); + contains: aot); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index f0be601e033a8d..19fb53050c002e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -42,7 +42,7 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF => ConfigWithAOTData(aot) .Multiply(new object[] { nativeRelinking, invariant }) // AOT in Debug is switched off - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays().ToList(); } @@ -55,17 +55,10 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool na $"-p:InvariantGlobalization={invariant}", extraBuildArgs }; - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: nativeRelink), - IsPublish: isPublish, - GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded - ), - extraArgs); + PublishProject(info, + config, + new PublishOptions(GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, ExtraMSBuildArgs: extraArgs), + isNativeBuild: nativeRelink); await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); return GetBuildPaths(info, isPublish); } @@ -89,19 +82,11 @@ protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, st Thread.Sleep(5000); bool isNativeBuild = nativeRelink || invariant; - bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild), - IsPublish: isPublish, - GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, - UseCache: false - ), - extraArgs); - + var globalizationMode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; + (string _, string output) = PublishProject(info, + config, + new PublishOptions(globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false), + isNativeBuild: nativeRelink); return output; } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 5e4fc7be2acb33..3f27ccaefbfdc3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -19,12 +19,12 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi [Theory] [MemberData(nameof(NativeBuildData))] - public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativeRelink, bool invariant) + public async void NoOpRebuildForNativeBuilds(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_noop"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); - var pathsDict = GetFilesTable(info, paths, unchanged: true); + var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); var originalStat = StatFiles(pathsDict); Rebuild(info, nativeRelink, invariant); @@ -35,28 +35,13 @@ public async void NoOpRebuildForNativeBuilds(string config, bool aot, bool nativ } [Fact] - public void NativeRelinkFailsWithInvariant() { - bool nativeRelink = false; - var extraArgs = new string[] { - "-p:_WasmDevel=true", - $"-p:WasmBuildNative={nativeRelink}", - $"-p:InvariantGlobalization=true", - }; - ProjectInfo info = CopyTestAsset("Release", aot: true, BasicTestApp, "relink_fails"); - bool isPublish = true; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - IsPublish: isPublish, - GlobalizationMode: GlobalizationMode.Invariant, - ExpectSuccess: false - ), - extraArgs - ); + Configuration config = Configuration.Release; + string extraArgs = "-p:_WasmDevel=true -p:WasmBuildNative=false -p:InvariantGlobalization=true"; + ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "relink_fails"); + var options = new PublishOptions(ExpectSuccess: false, AOT: true, ExtraMSBuildArgs: extraArgs); + PublishProject(info, config, options); Assert.Contains("WasmBuildNative is required because InvariantGlobalization=true, but WasmBuildNative is already set to 'false'", _testOutput.ToString()); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 58207629be0c25..be9a6ab7028b20 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -21,7 +21,7 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC } public static IEnumerable FlagsOnlyChangeData(bool aot) - => ConfigWithAOTData(aot, config: "Release").Multiply( + => ConfigWithAOTData(aot, config: Configuration.Release).Multiply( new object[] { /*cflags*/ "/p:EmccCompileOptimizationFlag=-O1", /*ldflags*/ "" }, new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccLinkOptimizationFlag=-O1" } ).UnwrapItemsAsArrays(); @@ -30,20 +30,20 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] // [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] - public async void OptimizationFlagChange(string config, bool aot, string cflags, string ldflags) + public async void OptimizationFlagChange(Configuration config, bool aot, string cflags, string ldflags) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); // force _WasmDevel=false, so we don't get -O0 BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; - var pathsDict = GetFilesTable(info, paths, unchanged: false); + var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); pathsDict.UpdateTo(unchanged: true, mainAssembly, "icall-table.h", "pinvoke-table.h", "driver-gen.c"); if (cflags.Length == 0) pathsDict.UpdateTo(unchanged: true, "pinvoke.o", "corebindings.o", "driver.o", "runtime.o"); pathsDict.Remove(mainAssembly); - if (info.AOT) + if (aot) { // link optimization flag change affects .bc->.o files too, but // it might result in only *some* files being *changed, @@ -66,6 +66,6 @@ public async void OptimizationFlagChange(string config, bool aot, string cflags, RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, - contains: info.AOT); + contains: aot); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index f25236ab015514..962de4946fbb21 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -22,15 +22,15 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT [Theory] [MemberData(nameof(NativeBuildData))] [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] - public async void ReferenceNewAssembly(string config, bool aot, bool nativeRelink, bool invariant) + public async void ReferenceNewAssembly(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_tasks"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); - var pathsDict = GetFilesTable(info, paths, unchanged: false); + var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); pathsDict.UpdateTo(unchanged: true, "corebindings.o"); pathsDict.UpdateTo(unchanged: true, "driver.o"); - if (!info.AOT) // relinking + if (!aot) // relinking pathsDict.UpdateTo(unchanged: true, "driver-gen.c"); var originalStat = StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index e6ee80c2f8668e..8f2ae719f26c95 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -21,17 +21,17 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [Theory] [MemberData(nameof(NativeBuildData))] [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] - public async void SimpleStringChangeInSource(string config, bool aot, bool nativeRelink, bool invariant) + public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; - var pathsDict = GetFilesTable(info, paths, unchanged: true); + var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); pathsDict.UpdateTo(unchanged: false, mainAssembly); - pathsDict.UpdateTo(unchanged: !info.AOT, "dotnet.native.wasm", "dotnet.native.js"); + pathsDict.UpdateTo(unchanged: !aot, "dotnet.native.wasm", "dotnet.native.js"); - if (info.AOT) + if (aot) pathsDict.UpdateTo(unchanged: false, $"{mainAssembly}.bc", $"{mainAssembly}.o"); var originalStat = StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs index 97af32aaf45721..87d47ca9498df3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs @@ -55,8 +55,8 @@ public NonWasmTemplateBuildTests(ITestOutputHelper output, SharedBuildPerTestCla public static IEnumerable GetTestData() => new IEnumerable[] { - new object?[] { "Debug" }, - new object?[] { "Release" } + new object?[] { Configuration.Debug }, + new object?[] { Configuration.Release } } .AsEnumerable() .MultiplyWithSingleArgs @@ -75,7 +75,7 @@ public NonWasmTemplateBuildTests(ITestOutputHelper output, SharedBuildPerTestCla [Theory, TestCategory("no-workload")] [MemberData(nameof(GetTestData))] - public void NonWasmConsoleBuild_WithoutWorkload(string config, string extraBuildArgs, string targetFramework) + public void NonWasmConsoleBuild_WithoutWorkload(Configuration config, string extraBuildArgs, string targetFramework) => NonWasmConsoleBuild(config, extraBuildArgs, targetFramework, @@ -84,14 +84,14 @@ public void NonWasmConsoleBuild_WithoutWorkload(string config, string extraBuild [Theory] [MemberData(nameof(GetTestData))] - public void NonWasmConsoleBuild_WithWorkload(string config, string extraBuildArgs, string targetFramework) + public void NonWasmConsoleBuild_WithWorkload(Configuration config, string extraBuildArgs, string targetFramework) => NonWasmConsoleBuild(config, extraBuildArgs, targetFramework, // net6 is sdk would be needed to run the app shouldRun: targetFramework == s_latestTargetFramework); - private void NonWasmConsoleBuild(string config, + private void NonWasmConsoleBuild(Configuration config, string extraBuildArgs, string targetFramework, string? directoryBuildTargets = null, diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 9b6a0922448019..ec0c368773e369 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -23,18 +23,18 @@ public PInvokeTableGeneratorTests(ITestOutputHelper output, SharedBuildPerTestCl [Theory] [BuildAndRun(aot: false)] - public async void NativeLibraryWithVariadicFunctions(string config, bool aot) + public async void NativeLibraryWithVariadicFunctions(Configuration config, bool aot) { ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "variadic"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "VariadicFunctions.cs")); - string output = BuildForVariadicFunctionTests(info); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.Matches("warning.*native function.*sum.*varargs", output); Assert.Contains("System.Int32 sum_one(System.Int32)", output); Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -43,17 +43,17 @@ public async void NativeLibraryWithVariadicFunctions(string config, bool aot) [Theory] [BuildAndRun()] - public async void DllImportWithFunctionPointersCompilesWithoutWarning(string config, bool aot) + public async void DllImportWithFunctionPointersCompilesWithoutWarning(Configuration config, bool aot) { ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "fnptr"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportNoWarning.cs")); - string output = BuildForVariadicFunctionTests(info); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -62,17 +62,17 @@ public async void DllImportWithFunctionPointersCompilesWithoutWarning(string con [Theory] [BuildAndRun()] - public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(string config, bool aot) + public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(Configuration config, bool aot) { ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "fnptr_variadic"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportWarning.cs")); - string output = BuildForVariadicFunctionTests(info); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -82,66 +82,42 @@ public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWith [Theory] [BuildAndRun()] public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_NotConsideredBlittable - (string config, bool aot) + (Configuration config, bool aot) { ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "not_blittable", disableRuntimeMarshalling: false, useAutoLayout: true); - bool isPublish = false; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - IsPublish: isPublish, - ExpectSuccess: false - )); + (_, string output) = BuildProject(info, config, new PublishOptions(ExpectSuccess: false, AOT: aot)); Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); } [Theory] [BuildAndRun()] public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_WithStructLayout_ConsideredBlittable - (string config, bool aot) + (Configuration config, bool aot) { ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: false, useAutoLayout: false); - bool isPublish = false; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + (_, string output) = BuildProject(info, config, isNativeBuild: true, AOT: aot); Assert.DoesNotMatch("error.*Parameter.*types.*pinvoke.*.*blittable", output); } [Theory] [BuildAndRun()] public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMarshallingAttribute_ConsideredBlittable - (string config, bool aot) + (Configuration config, bool aot) { ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: true, useAutoLayout: true); - bool isPublish = false; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + (_, string output) = BuildProject(info, config, isNativeBuild: true, AOT: aot); RunResult result = await RunForBuildWithDotnetRun(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); Assert.Contains(result.TestOutput, m => m.Contains("Main running")); } - private ProjectInfo PrepreProjectForBlittableTests(string config, bool aot, string prefix, bool disableRuntimeMarshalling, bool useAutoLayout = false) + private ProjectInfo PrepreProjectForBlittableTests(Configuration config, bool aot, string prefix, bool disableRuntimeMarshalling, bool useAutoLayout = false) { string extraProperties = aot ? string.Empty : "true"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); @@ -164,7 +140,7 @@ private ProjectInfo PrepreProjectForBlittableTests(string config, bool aot, stri return info; } - public static IEnumerable SeparateAssemblyWithDisableMarshallingAttributeTestData(string config) + public static IEnumerable SeparateAssemblyWithDisableMarshallingAttributeTestData(Configuration config) => ConfigWithAOTData(aot: false, config: config).Multiply( new object[] { /*libraryHasAttribute*/ false, /*appHasAttribute*/ false, /*expectSuccess*/ false }, new object[] { /*libraryHasAttribute*/ true, /*appHasAttribute*/ false, /*expectSuccess*/ false }, @@ -173,10 +149,10 @@ private ProjectInfo PrepreProjectForBlittableTests(string config, bool aot, stri ).UnwrapItemsAsArrays(); [Theory] - [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Debug")] - [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: "Release")] + [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: Configuration.Debug)] + [MemberData(nameof(SeparateAssemblyWithDisableMarshallingAttributeTestData), parameters: Configuration.Release)] public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly - (string config, bool aot, bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess) + (Configuration config, bool aot, bool libraryHasAttribute, bool appHasAttribute, bool expectSuccess) { string extraProperties = aot ? string.Empty : "true"; string extraItems = @$""; @@ -193,20 +169,14 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly { UpdateFile(programRelativePath, new Dictionary { { "[assembly: DisableRuntimeMarshalling]", "" } }); } - bool isPublish = false; (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish, - ExpectSuccess: expectSuccess - )); + config, + new BuildOptions(expectSuccess: expectSuccess, AOT: aot), + isNativeBuild: true); if (expectSuccess) { RunResult result = await RunForBuildWithDotnetRun(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -221,17 +191,17 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly [Theory] [BuildAndRun()] - public async void DllImportWithFunctionPointers_WarningsAsMessages(string config, bool aot) + public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration config, bool aot) { string extraProperties = "$(MSBuildWarningsAsMessage);WASM0001"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "fnptr", extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); - string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotContain("warning WASM0001", output); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -240,29 +210,29 @@ public async void DllImportWithFunctionPointers_WarningsAsMessages(string config [Theory] [BuildAndRun()] - public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(string config, bool aot) + public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_fnptr"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); - string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); } [Theory] [BuildAndRun()] - public async void UnmanagedCallback_InFileType(string config, bool aot) + public async void UnmanagedCallback_InFileType(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_filetype"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackInFile.cs")); - string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -272,17 +242,17 @@ public async void UnmanagedCallback_InFileType(string config, bool aot) [Theory] [BuildAndRun()] [ActiveIssue("RuntimeError: null function or function signature mismatch")] - public async void UnmanagedCallersOnly_Namespaced(string config, bool aot) + public async void UnmanagedCallersOnly_Namespaced(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_namespace"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackNamespaced.cs")); - string output = BuildForVariadicFunctionTests(info, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); @@ -300,7 +270,7 @@ public async void UnmanagedCallersOnly_Namespaced(string config, bool aot) [Theory] [BuildAndRun()] - public void IcallWithOverloadedParametersAndEnum(string config, bool aot) + public void IcallWithOverloadedParametersAndEnum(Configuration config, bool aot) { string appendToTheEnd = """ @@ -335,18 +305,9 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) _projectDir = Path.Combine(_projectDir!, "..", "Library"); bool isPublish = false; // libraries do not have framework dirs - string hypotheticalFrameworkDir = Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)); + string hypotheticalFrameworkDir = Path.Combine(GetBinFrameworkDir(config, isPublish)); string libAssemblyPath = Path.Combine(hypotheticalFrameworkDir, "..", ".."); - BuildProject(info, - new BuildOptions( - info.Configuration, - "Library.csproj", - // library project does not have it but it's a required parameter. It's not used when assert: false - BinFrameworkDir: hypotheticalFrameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish, - AssertAppBundle: false - )); + BuildProject(info, config, new BuildOptions(AssertAppBundle: false, AOT: aot)); // restore the project directory _projectDir = Path.Combine(_projectDir!, "..", "App"); @@ -388,7 +349,7 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) _testOutput.WriteLine ("Using WasmAppBuilder.dll from {0}", taskPath); string AddAssembly(string assemblyLocation, string name) => $""; - string frameworkDir = Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)); + string frameworkDir = Path.Combine(GetBinFrameworkDir(config, isPublish)); string appAssemblyPath = Path.Combine(frameworkDir, "..", ".."); string pinvokeReplacement = AddAssembly(appAssemblyPath, "System.Private.CoreLib") + @@ -400,22 +361,13 @@ public void IcallWithOverloadedParametersAndEnum(string config, bool aot) }); // Build a project with ManagedToNativeGenerator task reading icalls from the above library and runtime-icall-table.h - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: frameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish, - UseCache: false - )); - + (_, string output) = BuildProject(info, config, new BuildOptions(UseCache: false, AOT: aot)); Assert.DoesNotMatch(".*warning.*Numbers", output); } [Theory] [BuildAndRun(parameters: new object[] { "tr_TR.UTF-8" })] - public async void BuildNativeInNonEnglishCulture(string config, bool aot, string culture) + public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, string culture) { // Check that we can generate interp tables in non-english cultures // Prompted by https://github.com/dotnet/runtime/issues/71149 @@ -433,18 +385,13 @@ public async void BuildNativeInNonEnglishCulture(string config, bool aot, string { "LC_ALL", culture }, }; bool isPublish = true; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish, - ExtraBuildEnvironmentVariables: extraEnvVars - )); + (_, string output) = PublishProject(info, + config, + new PublishOptions(ExtraBuildEnvironmentVariables: extraEnvVars, AOT: aot), + isNativeBuild: true); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: culture @@ -459,7 +406,7 @@ public async void BuildNativeInNonEnglishCulture(string config, bool aot, string "with.per.iod", "with🚀unicode#" } })] - public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(string config, bool aot, string[] libraryNames) + public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Configuration config, bool aot, string[] libraryNames) { var extraItems = @""; string extraProperties = aot ? string.Empty : "true"; @@ -468,16 +415,11 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(str int baseArg = 10; GenerateSourceFiles(_projectDir!, baseArg); bool isPublish = aot; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + (_, string output) = isPublish ? + PublishProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true): + BuildProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); - var runOptions = new RunOptions(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42); + var runOptions = new RunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); for (int i = 0; i < libraryNames.Length; i ++) @@ -515,7 +457,7 @@ void GenerateSourceFiles(string outputPath, int baseArg) } } - private ProjectInfo PrepreProjectForVariadicFuntion(string config, bool aot, string prefix, string extraProperties = "") + private ProjectInfo PrepreProjectForVariadicFuntion(Configuration config, bool aot, string prefix, string extraProperties = "") { string objectFilename = "variadic.o"; extraProperties += "true<_WasmDevel>true"; @@ -525,24 +467,19 @@ private ProjectInfo PrepreProjectForVariadicFuntion(string config, bool aot, str return info; } - private string BuildForVariadicFunctionTests(ProjectInfo info, bool isPublish = true, string? verbosity = null, bool isNativeBuild = true) + private string PublishForVariadicFunctionTests(ProjectInfo info, Configuration config, bool aot, string? verbosity = null, bool isNativeBuild = true) { string verbosityArg = verbosity == null ? string.Empty : $" -v:{verbosity}"; var extraArgs = new string[] { verbosityArg }; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - // NativeFileReference forces native build - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: isNativeBuild), - IsPublish: isPublish - ), - extraArgs: extraArgs); + // NativeFileReference forces native build + (_, string output) = PublishProject(info, + config, + new PublishOptions(ExtraMSBuildArgs: extraArgs, AOT: aot), + isNativeBuild: isNativeBuild); return output; } - private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) + private async Task EnsureWasmAbiRulesAreFollowed(Configuration config, bool aot) { var extraItems = @""; var extraProperties = "true<_WasmDevel>falsefalse"; @@ -552,15 +489,8 @@ private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); bool isPublish = aot; - var buildOptions = new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - // NativeFileReference forces native build - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish - ); - BuildProject(info, buildOptions); + var options = isPublish ? PublishOptions(AOT: aot) : new BuildOptions(AOT: aot); + (string _, string _) = isPublish ? PublishProject(info, options, isNativeBuild: true) : BuildProject(info, options, isNativeBuild: true); string objDir = Path.Combine(_projectDir!, "obj", config, buildOptions.TargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); @@ -576,7 +506,7 @@ private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) Assert.Contains("float accept_double_struct_and_return_float_struct (double);", pinvokeTable); Assert.Contains("int64_t accept_and_return_i64_struct (int64_t);", pinvokeTable); - var runOptions = new RunOptions(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 3); + var runOptions = new RunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 3); RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); Assert.Contains("l (l)=-1148435428713435121", result.TestOutput); Assert.Contains("s (s)=-1148435428713435121", result.TestOutput); @@ -590,37 +520,33 @@ private async Task EnsureWasmAbiRulesAreFollowed(string config, bool aot) } [Theory] - [BuildAndRun(aot: true, config: "Release")] - public async void EnsureWasmAbiRulesAreFollowedInAOT(string config, bool aot) => + [BuildAndRun(aot: true, config: Configuration.Release)] + public async void EnsureWasmAbiRulesAreFollowedInAOT(Configuration config, bool aot) => await EnsureWasmAbiRulesAreFollowed(config, aot); [Theory] [BuildAndRun(aot: false)] - public async void EnsureWasmAbiRulesAreFollowedInInterpreter(string config, bool aot) => + public async void EnsureWasmAbiRulesAreFollowedInInterpreter(Configuration config, bool aot) => await EnsureWasmAbiRulesAreFollowed(config, aot); [Theory] - [BuildAndRun(aot: true, config: "Release")] + [BuildAndRun(aot: true, config: Configuration.Release)] [ActiveIssue("WasmGenerateAppBundle = false, so _WasmGenerateAppBundle is not triggered. Is the change expected?")] - public void EnsureComInteropCompilesInAOT(string config, bool aot) + public void EnsureComInteropCompilesInAOT(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "com"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ComInterop.cs")); bool isPublish = aot; - (string libraryDir, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish - )); + var options = isPublish ? PublishOptions(AOT: aot) : new BuildOptions(AOT: aot); + (string libraryDir, string output) = isPublish ? + PublishProject(info, options, new PublishOptions(AOT: aot), isNativeBuild) : + BuildProject(info, options, new BuildOptions(AOT: aot), isNativeBuild: true); Assert.Contains("Generated app bundle at " + libraryDir, output); } [Theory] [BuildAndRun(aot: false)] - public async void UCOWithSpecialCharacters(string config, bool aot) + public async void UCOWithSpecialCharacters(Configuration config, bool aot) { var extraProperties = "true"; var extraItems = @""; @@ -629,19 +555,9 @@ public async void UCOWithSpecialCharacters(string config, bool aot) string cCodeFilename = "local.c"; File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - // NativeFileReference forces native build - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish - )); - + PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42 )); diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index d4809d5d4e354d..0e2bf32ae98495 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -275,11 +275,11 @@ public IDictionary StatFiles(IDictionary GetFilesTable(ProjectInfo projectInfo, BuildPaths paths, bool unchanged) + public IDictionary GetFilesTable(string projectName, bool isAOT, BuildPaths paths, bool unchanged) { List files = new() { - Path.Combine(paths.BinDir, "publish", BundleDirName, "_framework", $"{projectInfo.ProjectName}{WasmAssemblyExtension}"), + Path.Combine(paths.BinDir, "publish", BundleDirName, "_framework", $"{projectName}{WasmAssemblyExtension}"), Path.Combine(paths.ObjWasmDir, "driver.o"), Path.Combine(paths.ObjWasmDir, "runtime.o"), Path.Combine(paths.ObjWasmDir, "corebindings.o"), @@ -294,12 +294,12 @@ public IDictionary StatFiles(IDictionary expected, IEnumerable a Assert.Equal(expected, actualFileNames); } - public virtual string GetBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) + public virtual string GetBinFrameworkDir(Configuration config, bool forPublish, string framework, string? projectDir = null) { throw new NotImplementedException(); } diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index 44d1c4125b7e52..7afa38ffff29f4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -22,22 +22,15 @@ public RebuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bui } [Theory] - [BuildAndRun(aot: false, config: "Debug")] - public async Task NoOpRebuild(string config, bool aot) + [BuildAndRun(aot: false, config: Configuration.Debug)] + public async Task NoOpRebuild(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); + PublishProject(info, config); - RunOptions runOptions = new(info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42); + RunOptions runOptions = new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); await RunForPublishWithWebServer(runOptions); if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) @@ -51,16 +44,7 @@ public async Task NoOpRebuild(string config, bool aot) _testOutput.WriteLine($"{Environment.NewLine}Rebuilding with no changes ..{Environment.NewLine}"); // no-op Rebuild - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false - )); - + PublishProject(info, config, new PublishOptions(UseCache: false)); await RunForPublishWithWebServer(runOptions); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index 5b902be733fc1e..86a9e3cd4e4c6a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -25,14 +25,14 @@ public SatelliteAssembliesTests(ITestOutputHelper output, SharedBuildPerTestClas new object?[] { relinking, "es-ES" }, new object?[] { relinking, null }, new object?[] { relinking, "ja-JP" }) - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); [Theory] [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false })] [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true })] [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false })] - public async void ResourcesFromMainAssembly(string config, bool aot, bool nativeRelink, string? argCulture) + public async void ResourcesFromMainAssembly(Configuration config, bool aot, bool nativeRelink, string? argCulture) { string prefix = $"sat_asm_from_main_asm"; string extraProperties = (nativeRelink ? $"true" : string.Empty) @@ -44,16 +44,9 @@ public async void ResourcesFromMainAssembly(string config, bool aot, bool native CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); bool isPublish = true; - (_, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: Path.Combine(GetBinFrameworkDir(info.Configuration, isPublish)), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: nativeRelink), - IsPublish: isPublish - )); + (_, string output) = PublishProject(info, config, new PublishOptions(UseCache: false, AOT: aot), isNativeBuild: nativeRelink); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: argCulture ?? "en-US", @@ -66,7 +59,7 @@ public async void ResourcesFromMainAssembly(string config, bool aot, bool native [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ false })] [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ false, /*relinking*/ true })] [MemberData(nameof(SatelliteAssemblyTestData), parameters: new object[] { /*aot*/ true, /*relinking*/ false })] - public async void ResourcesFromProjectReference(string config, bool aot, bool nativeRelink, string? argCulture) + public async void ResourcesFromProjectReference(Configuration config, bool aot, bool nativeRelink, string? argCulture) { string prefix = $"SatelliteAssemblyFromProjectRef"; string extraProperties = $"{(nativeRelink ? "true" : "false")}" @@ -89,25 +82,18 @@ public async void ResourcesFromProjectReference(string config, bool aot, bool na // The root D.B* should be empty File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.props"), ""); File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), ""); - NativeFilesType dotnetWasmFileType = nativeRelink ? NativeFilesType.Relinked : aot ? NativeFilesType.AOT : NativeFilesType.FromRuntimePack; + // NativeFilesType dotnetWasmFileType = nativeRelink ? NativeFilesType.Relinked : aot ? NativeFilesType.AOT : NativeFilesType.FromRuntimePack; bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: dotnetWasmFileType, - IsPublish: isPublish - )); + PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: nativeRelink); await RunForPublishWithWebServer( - new(Configuration: info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: argCulture ?? "en-US")); + new(Configuration: config, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: argCulture ?? "en-US")); } #pragma warning disable xUnit1026 [Theory] - [BuildAndRun(aot: true, config: "Release")] - public void CheckThatSatelliteAssembliesAreNotAOTed(string config, bool aot) + [BuildAndRun(aot: true, config: Configuration.Release)] + public void CheckThatSatelliteAssembliesAreNotAOTed(Configuration config, bool aot) { string extraProperties = $@"-O1 -O1 @@ -117,14 +103,7 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(string config, bool aot) CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config, new PublishOptions(AOT: aot)); var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) .Select(path => Path.GetFileName(path)) diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index ff4b94905b76d4..e344b15589d049 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -19,21 +19,11 @@ public SignalRTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture { } - protected async Task SignalRPassMessage(string staticWebAssetBasePath, string config, string transport) + protected async Task SignalRPassMessage(string staticWebAssetBasePath, Configuration config, string transport) { TestAsset asset = new() { Name = "WasmBasicTestApp", RunnableProjectSubPath = "AspNetCoreServer" }; ProjectInfo info = CopyTestAsset(config, false, asset, "SignalRClientTests"); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish, - RuntimeType: RuntimeVariant.MultiThreaded, - AssertAppBundle: false - )); + PublishProject(info, config, new PublishOptions(RuntimeType: RuntimeVariant.MultiThreaded, AssertAppBundle: false)); var result = await RunForPublishWithWebServer(new( Configuration: config, diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index 5d05c6a5bc588d..e2a478fca01c00 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -23,7 +23,7 @@ public NativeBuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [InlineData(false)] public void BuildWithUndefinedNativeSymbol(bool allowUndefined) { - string config = "Release"; + Configuration config = Configuration.Release; string code = @" using System; using System.Runtime.InteropServices; @@ -46,17 +46,7 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined) ); UpdateFile("Program.cs", code); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); - - bool isPublish = false; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), - IsPublish: isPublish, - ExpectSuccess: allowUndefined - )); + (string _, string buildOutput) = BuildProject(info, config, new BuildOptions(ExpectSuccess: allowUndefined), isNativeBuild: true); if (!allowUndefined) { @@ -66,9 +56,9 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined) } [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter(Configuration config) { string nativeSourceFilename = "incompatible_type.c"; string extraItems = ""; @@ -84,17 +74,7 @@ public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter( UpdateBrowserMainJs(); ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs")); - bool isPublish = false; - (string _, string buildOutput) = BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, isNativeBuild: true), - IsPublish: isPublish, - AssertAppBundle: false - )); - + (string _, string buildOutput) = BuildProject(info, config, new BuildOptions(AssertAppBundle: false), isNativeBuild: true); var runOutput = await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42)); Assert.Contains("call_needing_marhsal_ilgen got called", runOutput.TestOutput); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 251fb612226a40..2f1b2560c9e807 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -23,9 +23,9 @@ public WasmTemplateTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur } [Theory, TestCategory("no-fingerprinting")] - [InlineData("Debug")] - [InlineData("Release")] - public void BrowserBuildThenPublish(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void BrowserBuildThenPublish(Configuration config) { string atEnd = """ @@ -39,15 +39,7 @@ public void BrowserBuildThenPublish(string config) UpdateBrowserProgramFile(); UpdateBrowserMainJs(); - bool isPublish = false; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); + BuildProject(info, config); if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); @@ -56,16 +48,7 @@ public void BrowserBuildThenPublish(string config) _testOutput.WriteLine($"{Environment.NewLine}Publishing with no changes ..{Environment.NewLine}"); - isPublish = true; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false - )); + PublishProject(info, config, new PublishOptions(UseCache: false)); } public static TheoryData TestDataForAppBundleDir() @@ -91,9 +74,9 @@ void AddTestData(bool runOutsideProjectDirectory) [MemberData(nameof(TestDataForAppBundleDir))] [ActiveIssue("https://github.com/dotnet/runtime/issues/108107")] public async Task RunWithDifferentAppBundleLocations(bool runOutsideProjectDirectory, string extraProperties) - => await BrowserRunTwiceWithAndThenWithoutBuildAsync("Release", extraProperties, runOutsideProjectDirectory); + => await BrowserRunTwiceWithAndThenWithoutBuildAsync(Configuration.Release, extraProperties, runOutsideProjectDirectory); - private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, string extraProperties = "", bool runOutsideProjectDirectory = false) + private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(Configuration config, string extraProperties = "", bool runOutsideProjectDirectory = false) { ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false, "browser", extraProperties: extraProperties); UpdateBrowserProgramFile(); @@ -139,7 +122,7 @@ private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(string config, st [MemberData(nameof(BrowserBuildAndRunTestData))] public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework, string runtimeAssetsRelativePath) { - string config = "Debug"; + Configuration config = Configuration.Debug; string extraProperties = runtimeAssetsRelativePath == DefaultRuntimeAssetsRelativePath ? "" : $"{runtimeAssetsRelativePath}"; @@ -157,27 +140,18 @@ public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework UpdateBrowserProgramFile(); UpdateBrowserMainJs(targetFramework, runtimeAssetsRelativePath); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(config, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false - )); + PublishProject(info, config, new PublishOptions(UseCache: false)); var runOutput = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); Assert.Contains("Hello, Browser!", runOutput.TestOutput); } [Theory] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ false)] - [InlineData("Debug", /*appendRID*/ true, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ true)] - [InlineData("Debug", /*appendRID*/ false, /*useArtifacts*/ false)] - public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendRID, bool useArtifacts) + [InlineData(Configuration.Debug, /*appendRID*/ true, /*useArtifacts*/ false)] + [InlineData(Configuration.Debug, /*appendRID*/ true, /*useArtifacts*/ true)] + [InlineData(Configuration.Debug, /*appendRID*/ false, /*useArtifacts*/ true)] + [InlineData(Configuration.Debug, /*appendRID*/ false, /*useArtifacts*/ false)] + public async Task BuildAndRunForDifferentOutputPaths(Configuration config, bool appendRID, bool useArtifacts) { ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false); UpdateBrowserProgramFile(); @@ -204,15 +178,7 @@ public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendR string propsPath = Path.Combine(projectDirectory, "Directory.Build.props"); AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: frameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); - + BuildProject(info, config, new BuildOptions(NonDefaultFrameworkDir: frameworkDir)); await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42, ExtraArgs: "x y z")); } @@ -221,7 +187,7 @@ public async Task BuildAndRunForDifferentOutputPaths(string config, bool appendR [InlineData("false", false)] // the other case public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectILStripping) { - string config = "Release"; + Configuration config = Configuration.Release; bool aot = true; string extraProperties = "true"; if (!string.IsNullOrEmpty(stripILAfterAOT)) @@ -231,21 +197,13 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL UpdateBrowserProgramFile(); UpdateBrowserMainJs(); - bool isPublish = true; - string frameworkDir = GetBinFrameworkDir(config, forPublish: true); - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: frameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish, - UseCache: false, - AssertAppBundle: false - )); + PublishProject(info, config, new PublishOptions(UseCache: false, AssertAppBundle: false)); await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42)); + string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); + bool isPublish = true; + string frameworkDir = GetBinFrameworkDir(config, forPublish: true); TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); } @@ -307,21 +265,13 @@ internal static void TestWasmStripILAfterAOTOutput(string objBuildDir, string fr [InlineData(true)] public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) { - string config = "Release"; + Configuration config = Configuration.Release; string shouldCopy = copyOutputSymbolsToPublishDirectory.ToString().ToLower(); string extraProperties = $"{shouldCopy}"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false, "publishpdb", extraProperties: extraProperties); - bool isPublish = true; + BuildProject(info, config); string publishPath = GetBinFrameworkDir(config, forPublish: true); - BuildProject(info, - new BuildOptions( - config, - info.ProjectName, - BinFrameworkDir: publishPath, - ExpectedFileType: GetExpectedFileType(info, isPublish), - IsPublish: isPublish - )); AssertFile(".pdb"); AssertFile(".pdb.gz"); AssertFile(".pdb.br"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 734af889d59bfb..249c6b72db8016 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -19,6 +19,8 @@ namespace Wasm.Build.Tests; public class WasmTemplateTestsBase : BuildTestBase { private readonly WasmSdkBasedProjectProvider _provider; + protected readonly PublishOptions _defaultPublishOptions = new PublishOptions(); + protected readonly BuildOptions _defaultBuildOptions = new BuildOptions(); protected const string DefaultRuntimeAssetsRelativePath = "./_framework/"; protected virtual TestAsset BasicTestApp => new() { Name = "WasmBasicTestApp", RunnableProjectSubPath = "App" }; @@ -35,24 +37,24 @@ public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFi { "Hello, Browser!", "TestOutput -> Hello, Browser!" } }; - private string GetProjectName(string idPrefix, string config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) => + private string GetProjectName(string idPrefix, Configuration config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) => avoidAotLongPathIssue ? // https://github.com/dotnet/runtime/issues/103625 $"{GetRandomId()}" : appendUnicodeToPath ? $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; - private string InitProjectLocation(string idPrefix, string config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) + private string InitProjectLocation(string idPrefix, Configuration config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) { string projectName = GetProjectName(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue); - InitPaths(projectName); + (string logPath, string nugetDir) = InitPaths(projectName); InitProjectDir(_projectDir, addNuGetSourceForLocalPackages: true); - return projectName; + return (projectName, logPath, nugetDir); } public ProjectInfo CreateWasmTemplateProject( Template template, - string config, + Configuration config, bool aot, string idPrefix = "wbt", bool appendUnicodeToPath = true, @@ -63,7 +65,8 @@ public ProjectInfo CreateWasmTemplateProject( string extraItems = "", string insertAtEnd = "") { - string projectName = InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); + (string projectName, string logPath, string nugetDir) = + InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath); if (addFrameworkArg) extraArgs += $" -f {DefaultTargetFramework}"; @@ -75,12 +78,12 @@ public ProjectInfo CreateWasmTemplateProject( .EnsureSuccessful(); string projectFilePath = Path.Combine(_projectDir!, $"{projectName}.csproj"); - UpdateProjectFile(projectFilePath, aot, runAnalyzers, extraProperties, extraItems, insertAtEnd); - return new ProjectInfo(config, aot, projectName, projectFilePath); + UpdateProjectFile(projectFilePath, runAnalyzers, extraProperties, extraItems, insertAtEnd); + return new ProjectInfo(projectName, projectFilePath, logPath, nugetDir); } protected ProjectInfo CopyTestAsset( - string config, + Configuration config, bool aot, TestAsset asset, string idPrefix, @@ -90,45 +93,54 @@ protected ProjectInfo CopyTestAsset( string extraItems = "", string insertAtEnd = "") { - InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue: s_isWindows && aot); + (string projectName, string logPath, string nugetDir) = + InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue: s_isWindows && aot); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, asset.Name), Path.Combine(_projectDir!)); if (!string.IsNullOrEmpty(asset.RunnableProjectSubPath)) { _projectDir = Path.Combine(_projectDir!, asset.RunnableProjectSubPath); } string projectFilePath = Path.Combine(_projectDir!, $"{asset.Name}.csproj"); - UpdateProjectFile(projectFilePath, aot, runAnalyzers, extraProperties, extraItems, insertAtEnd); - return new ProjectInfo(config, aot, asset.Name, projectFilePath); + UpdateProjectFile(projectFilePath, runAnalyzers, extraProperties, extraItems, insertAtEnd); + return new ProjectInfo(asset.Name, projectFilePath, logPath, nugetDir); } - private void UpdateProjectFile(string projectFilePath, bool aot, bool runAnalyzers, string extraProperties, string extraItems, string insertAtEnd) + private void UpdateProjectFile(string projectFilePath, bool runAnalyzers, string extraProperties, string extraItems, string insertAtEnd) { - if (aot) - { - extraProperties += $"\ntrue"; - extraProperties += $"\n{s_isWindows}"; - } extraProperties += "true"; if (runAnalyzers) extraProperties += "true"; AddItemsPropertiesToProject(projectFilePath, extraProperties, extraItems, insertAtEnd); } + public virtual (string projectDir, string buildOutput) PublishProject( + ProjectInfo info, + Configuration configuration, + PublishOptions buildOptions = _defaultPublishOptions, + bool expectNativeBuild = false) => + BuildProject(info, configuration, buildOptions, expectNativeBuild); + public virtual (string projectDir, string buildOutput) BuildProject( - ProjectInfo projectInfo, - BuildOptions buildOptions, - params string[] extraArgs) + ProjectInfo info, + Configuration configuration, + MSBuildOptions buildOptions = _defaultBuildOptions, + bool expectNativeBuild = false) { + if (buildOptions.AOT) + { + buildOptions.ExtraMSBuildArgs += "-p:RunAOTCompilation=true -p:EmccVerbose=true"; + } + if (buildOptions.ExtraBuildEnvironmentVariables is null) buildOptions = buildOptions with { ExtraBuildEnvironmentVariables = new Dictionary() }; // TODO: reenable this when the SDK supports targetting net10.0 //buildOptions.ExtraBuildEnvironmentVariables["TreatPreviousAsCurrent"] = "false"; - (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(buildOptions, extraArgs); + (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(configuration, info.ProjectName, buildOptions); if (buildOptions.UseCache) - _buildContext.CacheBuild(projectInfo, new BuildResult(_projectDir!, logFilePath, true, res.Output)); + _buildContext.CacheBuild(info, new BuildResult(_projectDir!, logFilePath, true, res.Output)); if (!buildOptions.ExpectSuccess) { @@ -136,14 +148,14 @@ public virtual (string projectDir, string buildOutput) BuildProject( return (_projectDir!, res.Output); } - if (string.IsNullOrEmpty(buildOptions.BinFrameworkDir)) - { - buildOptions = buildOptions with { BinFrameworkDir = GetBinFrameworkDir(buildOptions.Configuration, buildOptions.IsPublish) }; - } + string frameworkDir = string.IsNullOrEmpty(buildOptions.NonDefaultFrameworkDir) ? + GetBinFrameworkDir(configuration, buildOptions.IsPublish) : + buildOptions.NonDefaultFrameworkDir; + buildOptions = buildOptions with { BinFrameworkDir = frameworkDir }; if (buildOptions.AssertAppBundle) { - _provider.AssertWasmSdkBundle(buildOptions, res.Output); + _provider.AssertWasmSdkBundle(configuration, buildOptions, res.Output, expectNativeBuild); } return (_projectDir!, res.Output); } @@ -325,14 +337,14 @@ void OnErrorMessage(string msg) } } - public string GetBinFrameworkDir(string config, bool forPublish, string framework = DefaultTargetFramework, string? projectDir = null) => + public string GetBinFrameworkDir(Configuration config, bool forPublish, string framework = DefaultTargetFramework, string? projectDir = null) => _provider.GetBinFrameworkDir(config, forPublish, framework, projectDir); public BuildPaths GetBuildPaths(ProjectInfo info, bool forPublish) => _provider.GetBuildPaths(info, forPublish); - public IDictionary GetFilesTable(ProjectInfo info, BuildPaths paths, bool unchanged) => - _provider.GetFilesTable(info, paths, unchanged); + public IDictionary GetFilesTable(string projectName, bool isAOT, BuildPaths paths, bool unchanged) => + _provider.GetFilesTable(projectName, isAOT, paths, unchanged); public IDictionary StatFiles(IDictionary fullpaths) => _provider.StatFiles(fullpaths); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index b9286dd9393653..028162432ed5bd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -25,17 +25,9 @@ public AppSettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [InlineData("Production")] public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicationEnvironment) { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "AppSettingsTest"); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config); RunOptions options = new( info.Configuration, TestScenario: "AppSettingsTest", diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index 7c6d0748db0ae7..6f112baa006a61 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -23,21 +23,9 @@ public DebugLevelTests(ITestOutputHelper output, SharedBuildPerTestClassFixture private void AssertDebugLevel(IReadOnlyCollection result, int value) => Assert.Contains(result, m => m.Contains($"WasmDebugLevel: {value}")); - private void BuildPublishProject(ProjectInfo info, bool isPublish = false, params string[] extraArgs) - => BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - ), - extraArgs: extraArgs - ); - [Theory] - [InlineData("Debug")] - [InlineData("Release")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] public async Task BuildWithDefaultLevel(string configuration) { ProjectInfo info = CopyTestAsset( @@ -46,17 +34,17 @@ public async Task BuildWithDefaultLevel(string configuration) asset: BasicTestApp, idPrefix: "DebugLevelTests_BuildWithDefaultLevel" ); - BuildPublishProject(info); + BuildProject(info, config); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForBuildWithDotnetRun(options); AssertDebugLevel(result.TestOutput, -1); } [Theory] - [InlineData("Debug", 1)] - [InlineData("Release", 1)] - [InlineData("Debug", 0)] - [InlineData("Release", 0)] + [InlineData(Configuration.Debug, 1)] + [InlineData(Configuration.Release, 1)] + [InlineData(Configuration.Debug, 0)] + [InlineData(Configuration.Release, 0)] public async Task BuildWithExplicitValue(string configuration, int debugLevel) { ProjectInfo info = CopyTestAsset( @@ -65,15 +53,15 @@ public async Task BuildWithExplicitValue(string configuration, int debugLevel) asset: BasicTestApp, idPrefix: "DebugLevelTests_BuildWithExplicitValue" ); - BuildPublishProject(info, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); + BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForBuildWithDotnetRun(options); AssertDebugLevel(result.TestOutput, debugLevel); } [Theory] - [InlineData("Debug")] - [InlineData("Release")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] public async Task PublishWithDefaultLevel(string configuration) { ProjectInfo info = CopyTestAsset( @@ -82,17 +70,17 @@ public async Task PublishWithDefaultLevel(string configuration) asset: BasicTestApp, idPrefix: "DebugLevelTests_PublishWithDefaultLevel" ); - BuildPublishProject(info, isPublish: true); + PublishProject(info, config); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, 0); } [Theory] - [InlineData("Debug", 1)] - [InlineData("Release", 1)] - [InlineData("Debug", -1)] - [InlineData("Release", -1)] + [InlineData(Configuration.Debug, 1)] + [InlineData(Configuration.Release, 1)] + [InlineData(Configuration.Debug, -1)] + [InlineData(Configuration.Release, -1)] public async Task PublishWithExplicitValue(string configuration, int debugLevel) { ProjectInfo info = CopyTestAsset( @@ -101,7 +89,7 @@ public async Task PublishWithExplicitValue(string configuration, int debugLevel) asset: BasicTestApp, idPrefix: "DebugLevelTests_PublishWithExplicitValue" ); - BuildPublishProject(info, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); + PublishProject(info, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, debugLevel); @@ -109,8 +97,8 @@ public async Task PublishWithExplicitValue(string configuration, int debugLevel) [Theory] - [InlineData("Debug")] - [InlineData("Release")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] public async Task PublishWithDefaultLevelAndPdbs(string configuration) { ProjectInfo info = CopyTestAsset( @@ -119,7 +107,7 @@ public async Task PublishWithDefaultLevelAndPdbs(string configuration) asset: BasicTestApp, idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs" ); - BuildPublishProject(info, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); + PublishProject(info, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, -1); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index fb85f169d63ce8..8e07b9aa3e7792 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -20,20 +20,13 @@ public DownloadThenInitTests(ITestOutputHelper output, SharedBuildPerTestClassFi } [Theory] - [InlineData("Debug")] - [InlineData("Release")] - public async Task NoResourcesReFetchedAfterDownloadFinished(string config) + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public async Task NoResourcesReFetchedAfterDownloadFinished(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "DownloadThenInitTests"); bool isPublish = false; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + BuildProject(info, config); RunOptions options = new(info.Configuration, TestScenario: "DownloadThenInit"); RunResult result = await RunForBuildWithDotnetRun(options); var resultTestOutput = result.TestOutput.ToList(); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs index dada329ec3c324..17998c96c87619 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs @@ -25,9 +25,9 @@ public InterpPgoTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b [Theory] // Interpreter PGO is not meaningful to enable in debug builds - tiering is inactive there so all methods // would get added to the PGO table instead of just hot ones. - [InlineData("Release")] + [InlineData(Configuration.Release)] [ActiveIssue("https://github.com/dotnet/runtime/issues/105733")] - public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(string config) + public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(Configuration config) { // We need to invoke Greeting enough times to cause BCL code to tier so we can exercise interpreter PGO // Invoking it too many times makes the test meaningfully slower. @@ -37,17 +37,7 @@ public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(string config) ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "InterpPgoTest"); _testOutput.WriteLine("/// Building"); - bool isPublish = false; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - ), - extraArgs: "-p:WasmDebugLevel=0" - ); + BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:WasmDebugLevel=0")); _testOutput.WriteLine("/// Starting server"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index d860067a76bb03..97d8bcb9b6e3da 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -30,19 +30,10 @@ public LazyLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [MemberData(nameof(LoadLazyAssemblyBeforeItIsNeededData))] public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtension, string[] allLazyLoadingTestExtensions) { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); bool isPublish = false; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - ), - extraArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension} -p:TestLazyLoading=true" - ); + BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension} -p:TestLazyLoading=true")); // We are running the app and passing all possible lazy extensions to test matrix of all possibilities. // We don't need to rebuild the application to test how client is trying to load the assembly. @@ -62,19 +53,10 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi [Fact] public async Task FailOnMissingLazyAssembly() { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - ), - extraArgs: $"-p:TestLazyLoading=true" - ); + PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: "-p:TestLazyLoading=true")); RunOptions options = new( info.Configuration, TestScenario: "LazyLoadingTest", diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index 925d29b4f93dd7..92f0dfbfb7f278 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -26,17 +26,9 @@ public LibraryInitializerTests(ITestOutputHelper output, SharedBuildPerTestClass [Fact] public async Task LoadLibraryInitializer() { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config); RunResult result = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "LibraryInitializerTest")); Assert.Collection( result.TestOutput, @@ -50,17 +42,9 @@ public async Task LoadLibraryInitializer() [Fact] public async Task AbortStartupOnError() { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_AbortStartupOnError"); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config); RunOptions options = new( info.Configuration, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index f54656e13b8920..4f2365cd16ad2a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -21,20 +21,12 @@ public MaxParallelDownloadsTests(ITestOutputHelper output, SharedBuildPerTestCla } [Theory] - [InlineData("Release", "1")] - [InlineData("Release", "4")] - public async Task NeverFetchMoreThanMaxAllowed(string config, string maxParallelDownloads) + [InlineData(Configuration.Release, "1")] + [InlineData(Configuration.Release, "4")] + public async Task NeverFetchMoreThanMaxAllowed(Configuration config, string maxParallelDownloads) { - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MaxParallelDownloadsTests"); - bool isPublish = false; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MaxParallelDownloadsTests"); + BuildProject(info, config); RunResult result = await RunForBuildWithDotnetRun(new( info.Configuration, TestScenario: "MaxParallelDownloads", diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index 32add378a4e34b..7d13bac4403190 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -28,22 +28,15 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop_NoWorkload() => [Fact] public async Task AllocateLargeHeapThenRepeatedlyInterop() { - string config = "Release"; + Configuration config = Configuration.Release; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MemoryTests"); bool isPublish = false; string extraArgs = "-p:EmccMaximumHeapSize=4294901760"; BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - // using EmccMaximumHeapSize forces native rebuild - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild: true), - IsPublish: isPublish, - ExpectSuccess: BuildTestBase.IsUsingWorkloads - ), - extraArgs: extraArgs - ); + config, + new BuildOptions(ExtraMSBuildArgs: extraArgs, ExpectSuccess: BuildTestBase.IsUsingWorkloads), + // using EmccMaximumHeapSize forces native rebuild + isNativeBuild: true); if (BuildTestBase.IsUsingWorkloads) { @@ -54,22 +47,13 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop() [Fact] public async Task RunSimpleAppWithProfiler() { - string config = "Release"; + Configuration config = Configuration.Release; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ProfilerTest"); bool isPublish = false; // are are linking all 3 profilers, but below we only initialize log profiler and test it string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish, - AssertAppBundle: false - ), - extraArgs: extraArgs - ); + BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: extraArgs, AssertAppBundle: false), isNativeBuild: true); + var result = await RunForBuildWithDotnetRun(new (Configuration: config, TestScenario: "ProfilerTest")); Regex regex = new Regex(@"Profile data of size (\d+) bytes"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index cbce2d2a8fb8a9..00e3048da8ce3e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -25,17 +25,9 @@ public ModuleConfigTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [InlineData(true)] public async Task DownloadProgressFinishes(bool failAssemblyDownload) { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}"); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config); var result = await RunForPublishWithWebServer(new( Configuration: info.Configuration, @@ -67,20 +59,12 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) [Fact] public async Task OutErrOverrideWorks() { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ModuleConfigTests_OutErrOverrideWorks"); - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + PublishProject(info, config); var result = await RunForPublishWithWebServer(new( - Configuration: "Debug", + Configuration: Configuration.Debug, TestScenario: "OutErrOverrideWorks" )); Assert.True( @@ -94,33 +78,19 @@ public async Task OutErrOverrideWorks() } [Theory] - [InlineData("Release", true)] - [InlineData("Release", false)] - public async Task OverrideBootConfigName(string config, bool isPublish) + [InlineData(Configuration.Release, true)] + [InlineData(Configuration.Release, false)] + public async Task OverrideBootConfigName(Configuration config, bool isPublish) { ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "OverrideBootConfigName"); - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + (string _, string _) = isPublish ? + PublishProject(info, config) : + BuildProject(info, config); string[] extraArgs = ["-p:WasmBootConfigFileName=boot.json"]; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish, - BootConfigFileName: "boot.json", - UseCache: false - ), - extraArgs: extraArgs - ); + (string _, string _) = isPublish ? + PublishProject(info, config, new PublishOptions(BootConfigFileName: "boot.json", UseCache: false, ExtraMSBuildArgs: extraArgs)) : + BuildProject(info, config, new BuildOptions(BootConfigFileName: "boot.json", UseCache: false, ExtraMSBuildArgs: extraArgs)); var runOptions = new RunOptions( Configuration: config, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 86eec806b1d88c..6df1a0b5ccfe06 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -29,17 +29,9 @@ public SatelliteLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFi [InlineData(true)] public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) { - string config = "Debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTests"); - bool isPublish = false; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + BuildProject(info, config); var result = await RunForBuildWithDotnetRun(new( Configuration: info.Configuration, @@ -68,7 +60,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) [Fact] public async Task LoadSatelliteAssemblyFromReference() { - string config = "Release"; + Configuration config = Configuration.Release; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTestsFromReference"); bool isPublish = true; @@ -95,16 +87,9 @@ public async Task LoadSatelliteAssemblyFromReference() .EnsureSuccessful(); // Publish the app and assert - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + BuildProject(info, config); - var result = await RunForPublishWithWebServer(new(Configuration: "Release", TestScenario: "SatelliteAssembliesTest")); + var result = await RunForPublishWithWebServer(new(Configuration: Configuration.Release, TestScenario: "SatelliteAssembliesTest")); Assert.Collection( result.TestOutput, m => Assert.Equal("default: hello", m), diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index 3de7140c804c73..1820acf10eaedc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -15,7 +15,7 @@ public class WasmBuildAppBase : WasmTemplateTestsBase { public static IEnumerable MainMethodTestData(bool aot) => ConfigWithAOTData(aot) - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); public WasmBuildAppBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) @@ -24,7 +24,7 @@ public WasmBuildAppBase(ITestOutputHelper output, SharedBuildPerTestClassFixture protected async void TestMain(string projectName, string programText, - string config, + Configuration config, bool aot, bool isNativeBuild = false, int expectedExitCode = 42, @@ -38,19 +38,9 @@ protected async void TestMain(string projectName, { UpdateFile("runtimeconfig.template.json", new Dictionary { { "}\n}", runtimeConfigContents } }); } - bool isPublish = true; - BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish, isNativeBuild), - IsPublish: isPublish - ), - extraArgs - ); + PublishProject(info, config, new PublishOptions(AOT: aot, ExtraMSBuildArgs: extraArgs), isNativeBuild: isNativeBuild); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: expectedExitCode) ); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs index fd7500f2838828..414c78856a123c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs @@ -20,7 +20,7 @@ public WasmBuildAppTest(ITestOutputHelper output, SharedBuildPerTestClassFixture [Theory] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] - public void TopLevelMain(string config, bool aot) + public void TopLevelMain(Configuration config, bool aot) => TestMain("top_level", @"System.Console.WriteLine(""Hello, World!""); return await System.Threading.Tasks.Task.FromResult(42);", config, aot); @@ -28,7 +28,7 @@ public void TopLevelMain(string config, bool aot) [Theory] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] - public void AsyncMain(string config, bool aot) + public void AsyncMain(Configuration config, bool aot) => TestMain("async_main", @" using System; using System.Threading.Tasks; @@ -44,7 +44,7 @@ public static async Task Main() [Theory] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] - public void NonAsyncMain(string config, bool aot) + public void NonAsyncMain(Configuration config, bool aot) => TestMain("non_async_main", @" using System; using System.Threading.Tasks; @@ -59,7 +59,7 @@ public static int Main() [Theory] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] - public void ExceptionFromMain(string config, bool aot) + public void ExceptionFromMain(Configuration config, bool aot) => TestMain("main_exception", """ using System; using System.Threading.Tasks; @@ -84,12 +84,12 @@ public static int Main() [Theory] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ true })] - public void Bug49588_RegressionTest_AOT(string config, bool aot) + public void Bug49588_RegressionTest_AOT(Configuration config, bool aot) => TestMain("bug49588_aot", s_bug49588_ProgramCS, config, aot); [Theory] [MemberData(nameof(MainMethodTestData), parameters: new object[] { /*aot*/ false })] - public void Bug49588_RegressionTest_NativeRelinking(string config, bool aot) + public void Bug49588_RegressionTest_NativeRelinking(Configuration config, bool aot) => TestMain("bug49588_native_relinking", s_bug49588_ProgramCS, config, aot, extraArgs: "-p:WasmBuildNative=true", isNativeBuild: true); @@ -97,7 +97,7 @@ public void Bug49588_RegressionTest_NativeRelinking(string config, bool aot) [Theory] [BuildAndRun] [ActiveIssue("from some reason we cannot read from the config file")] - public void PropertiesFromRuntimeConfigJson(string config, bool aot) + public void PropertiesFromRuntimeConfigJson(Configuration config, bool aot) => TestMain("runtime_config_json", @" using System; @@ -121,7 +121,7 @@ public void PropertiesFromRuntimeConfigJson(string config, bool aot) [Theory] [BuildAndRun] [ActiveIssue("from some reason we cannot read from the config file")] - public void PropertiesFromCsproj(string config, bool aot) + public void PropertiesFromCsproj(Configuration config, bool aot) => TestMain("csproj_properties", @" using System; diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 4a4743d3b97a5d..7aae0e244fade4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -32,13 +32,13 @@ public static TheoryData SettingDifferentFromV TheoryData data = new(); - string[] configs = new[] { "Debug", "Release" }; + string[] configs = new[] { Configuration.Debug, Configuration.Release }; foreach (var defaultPair in defaults) { - foreach (string config in configs) + foreach (Configuration config in configs) { // Configuration=Release always causes relinking when publishing - bool publishValue = forPublish && config == "Release" ? true : false; + bool publishValue = forPublish && config == Configuration.Release ? true : false; // Setting the default value from the runtime pack shouldn't trigger relinking data.Add(config, $"<{defaultPair.propertyName}>{defaultPair.defaultValueInRuntimePack.ToString().ToLower()}", /*aot*/ false, /*build*/ false, /*publish*/ publishValue); @@ -59,37 +59,37 @@ public static TheoryData DefaultsTestData(bool TheoryData data = new() { /* relink by default for publish+Release */ - { "Release", "", /*aot*/ false, /*build*/ false, /*publish*/ true }, + { Configuration.Release, "", /*aot*/ false, /*build*/ false, /*publish*/ true }, /* NO relink by default for publish+Release, when not trimming */ - { "Release", "false", /*aot*/ false, /*build*/ false, /*publish*/ false }, + { Configuration.Release, "false", /*aot*/ false, /*build*/ false, /*publish*/ false }, /* When not trimming, and no-aot, we don't relink. But WasmNativeStrip=false should still trigger it*/ - // { "Release", "falsefalse", + // { Configuration.Release, "falsefalse", // /*aot*/ false, /*build*/ true, /*publish*/ true } }; if (!forPublish) { /* Debug config, when building does trigger relinking */ - data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ true); + data.Add(Configuration.Debug, "", /*aot*/ false, /*build*/ false, /*publish*/ true); } if (forPublish) { /* NO relink by default for publish+Debug */ - data.Add("Debug", "", /*aot*/ false, /*build*/ false, /*publish*/ false); + data.Add(Configuration.Debug, "", /*aot*/ false, /*build*/ false, /*publish*/ false); /* AOT */ - data.Add("Release", "", /*aot*/ true, /*build*/ false, /*publish*/ true); - data.Add("Debug", "", /*aot*/ true, /*build*/ false, /*publish*/ true); + data.Add(Configuration.Release, "", /*aot*/ true, /*build*/ false, /*publish*/ true); + data.Add(Configuration.Debug, "", /*aot*/ true, /*build*/ false, /*publish*/ true); // FIXME: separate test - // { "Release", "true", + // { Configuration.Release, "true", // /*aot*/ true, /*build*/ true, /*publish*/ true }, /* AOT not affected by trimming */ - data.Add("Release", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); - data.Add("Debug", "false", /*aot*/ true, /*build*/ false, /*publish*/ true); + data.Add(Configuration.Release, "false", /*aot*/ true, /*build*/ false, /*publish*/ true); + data.Add(Configuration.Debug, "false", /*aot*/ true, /*build*/ false, /*publish*/ true); } return data; @@ -99,7 +99,7 @@ public static TheoryData DefaultsTestData(bool [Theory] [MemberData(nameof(DefaultsTestData), parameters: false)] [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: false)] - public void DefaultsWithBuild(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) + public void DefaultsWithBuild(Configuration config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) { (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_build", config, extraProperties, aot, expectWasmBuildNativeForBuild, isPublish: false); @@ -109,7 +109,7 @@ public void DefaultsWithBuild(string config, string extraProperties, bool aot, b [Theory] [MemberData(nameof(DefaultsTestData), parameters: true)] [MemberData(nameof(SettingDifferentFromValuesInRuntimePack), parameters: true)] - public void DefaultsWithPublish(string config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) + public void DefaultsWithPublish(Configuration config, string extraProperties, bool aot, bool expectWasmBuildNativeForBuild, bool expectWasmBuildNativeForPublish) { (string output, string? line) = CheckWasmNativeDefaultValue("native_defaults_publish", config, extraProperties, aot, expectWasmBuildNativeForPublish, isPublish: true); @@ -119,24 +119,24 @@ public void DefaultsWithPublish(string config, string extraProperties, bool aot, public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() { - {"Debug", "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, - {"Release", "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, - {"Debug", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false }, - {"Release", "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } + {Configuration.Debug, "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, + {Configuration.Release, "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, + {Configuration.Debug, "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false }, + {Configuration.Release, "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } }; public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() { - { "Debug", "falsetrue", true, false }, - { "Release", "falsetrue", true, false }, - { "Debug", "truetrue", true, true }, - { "Release", "truetrue", true, true } + { Configuration.Debug, "falsetrue", true, false }, + { Configuration.Release, "falsetrue", true, false }, + { Configuration.Debug, "truetrue", true, true }, + { Configuration.Release, "truetrue", true, true } }; [Theory] [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ false)] [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] - public void WasmNativeStripDefaultWithBuild(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) + public void WasmNativeStripDefaultWithBuild(Configuration config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) { (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, expectedWasmBuildNativeValue, isPublish: false); @@ -150,7 +150,7 @@ public void WasmNativeStripDefaultWithBuild(string config, string extraPropertie [Theory] [MemberData(nameof(SetWasmNativeStripExplicitlyTestData), parameters: /*publish*/ true)] [MemberData(nameof(SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData))] - public void WasmNativeStripDefaultWithPublish(string config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) + public void WasmNativeStripDefaultWithPublish(Configuration config, string extraProperties, bool expectedWasmBuildNativeValue, bool expectedWasmNativeStripValue) { (string output, string? line) = CheckWasmNativeDefaultValue("native_strip_defaults", config, extraProperties, aot: false, expectedWasmBuildNativeValue, isPublish: true); @@ -163,12 +163,12 @@ public void WasmNativeStripDefaultWithPublish(string config, string extraPropert [Theory] /* always relink */ - [InlineData("Debug", "", /*publish*/ false)] - [InlineData("Debug", "", /*publish*/ true)] - [InlineData("Release", "", /*publish*/ false)] - [InlineData("Release", "", /*publish*/ true)] - [InlineData("Release", "false", /*publish*/ true)] - public void WithNativeReference(string config, string extraProperties, bool publish) + [InlineData(Configuration.Debug, "", /*publish*/ false)] + [InlineData(Configuration.Debug, "", /*publish*/ true)] + [InlineData(Configuration.Release, "", /*publish*/ false)] + [InlineData(Configuration.Release, "", /*publish*/ true)] + [InlineData(Configuration.Release, "false", /*publish*/ true)] + public void WithNativeReference(Configuration config, string extraProperties, bool publish) { string nativeLibPath = Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"); string nativeRefItem = @$""; @@ -184,7 +184,7 @@ public void WithNativeReference(string config, string extraProperties, bool publ } private (string, string?) CheckWasmNativeDefaultValue(string projectPrefix, - string config, + Configuration config, string extraProperties, bool aot, bool nativeBuild, @@ -211,15 +211,9 @@ public void WithNativeReference(string config, string extraProperties, bool publ insertAtEnd: printValueTarget); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish, nativeBuild), - IsPublish: isPublish, - ExpectSuccess: false - )); + (string _, string output) = isPublish ? + PublishProject(info, config, new PublishOptions(ExpectSuccess: false, AOT: aot), nativeBuild) : + BuildProject(info, config, new BuildOptions(ExpectSuccess: false, AOT: aot), nativeBuild); Assert.Contains("Stopping the build", output); Match m = s_regex.Match(output); @@ -227,10 +221,10 @@ public void WithNativeReference(string config, string extraProperties, bool publ return (output, m.Success ? m.Groups[0]?.ToString() : null); } - private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasmBuildNative, string config) + private void InferAndCheckPropertyValues(string? line, bool isPublish, bool wasmBuildNative, Configuration config) { bool expectedWasmNativeStripValue; - if (!isPublish && wasmBuildNative && config == "Debug") + if (!isPublish && wasmBuildNative && config == Configuration.Debug) expectedWasmNativeStripValue = false; else expectedWasmNativeStripValue = true; diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index c7868f64249997..feecd0ff68db10 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -16,21 +16,13 @@ public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestCl [Theory] [BuildAndRun] - public async void RunOutOfAppBundle(string config, bool aot) + public async void RunOutOfAppBundle(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "outofappbundle"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); - bool isPublish = true; - string binFrameworkDir = GetBinFrameworkDir(info.Configuration, isPublish); - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: binFrameworkDir, - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - )); + (string _, string output) = PublishProject(info, config, new PublishOptions(AOT: aot)); + string binFrameworkDir = GetBinFrameworkDir(config, isPublish: true); string appBundleDir = Path.Combine(binFrameworkDir, ".."); string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); string indexHtmlPath = Path.Combine(appBundleDir, "index.html"); @@ -47,7 +39,7 @@ public async void RunOutOfAppBundle(string config, bool aot) } RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", CustomBundleDir: outerDir, ExpectedExitCode: 42) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 9c57d24a512329..8f688e7e219b03 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -21,31 +21,22 @@ public WasmSIMDTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bu public static IEnumerable MainMethodSimdTestData(bool aot, bool simd) => ConfigWithAOTData(aot) .Multiply(new object[] { simd }) - .Where(item => !(item.ElementAt(0) is string config && config == "Debug" && item.ElementAt(1) is bool aotValue && aotValue)) + .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); [Theory] [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, /* simd */ true })] - public async void Build_NoAOT_ShouldNotRelink(string config, bool aot, bool simd) + public async void Build_NoAOT_ShouldNotRelink(Configuration config, bool aot, bool simd) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_with_workload_no_aot"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); - bool isPublish = false; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - ), - extraArgs: $"-p:WasmEnableSIMD={simd}" - ); + (string _, string output) = BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:WasmEnableSIMD=true")); + // Confirm that we didn't relink Assert.DoesNotContain("Compiling native assets with emcc", output); RunResult result = await RunForBuildWithDotnetRun(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42) ); @@ -58,24 +49,14 @@ public async void Build_NoAOT_ShouldNotRelink(string config, bool aot, bool simd [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ true, /* simd */ true })] [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, /* simd */ true })] [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ true, /* simd */ false })] - public async void PublishSIMD_AOT(string config, bool aot, bool simd) + public async void PublishSIMD_AOT(Configuration config, bool aot, bool simd) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "simd_publish"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); - bool isPublish = true; - (string _, string output) = BuildProject(info, - new BuildOptions( - info.Configuration, - info.ProjectName, - BinFrameworkDir: GetBinFrameworkDir(info.Configuration, isPublish), - ExpectedFileType: GetExpectedFileType(info, isPublish: isPublish), - IsPublish: isPublish - ), - extraArgs: $"-p:WasmEnableSIMD={simd}" - ); + (string _, string output) = PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: "-p:WasmEnableSIMD=true", AOT: aot)); RunResult result = await RunForPublishWithWebServer(new( - info.Configuration, + config, TestScenario: "DotnetRun", ExpectedExitCode: 42) ); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index 49d86655703aea..a33216e362a917 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -69,13 +69,14 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp } - public void AssertBundle(BuildOptions buildOptions) + public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool expectNativeBuild=false) { AssertBundle(new AssertBundleOptions( BuildOptions: buildOptions, ExpectSymbolsFile: true, AssertIcuAssets: true, - AssertSymbolsFile: false + AssertSymbolsFile: false, + ExpectedFileType: GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, expectNativeBuild) )); } @@ -103,7 +104,7 @@ private void AssertBundle(AssertBundleOptions assertOptions) string runtimeNativeDir = BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.BuildOptions.TargetFramework, assertOptions.BuildOptions.RuntimeType); - string srcDirForNativeFileToCompareAgainst = assertOptions.BuildOptions.ExpectedFileType switch + string srcDirForNativeFileToCompareAgainst = assertOptions.ExpectedFileType switch { NativeFilesType.FromRuntimePack => runtimeNativeDir, NativeFilesType.Relinked => objBuildDir, @@ -148,29 +149,29 @@ private void AssertBundle(AssertBundleOptions assertOptions) } } - public void AssertWasmSdkBundle(BuildOptions buildOptions, string? buildOutput = null) + public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool expectNativeBuild = false, string? buildOutput = null) { if (buildOutput is not null) ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework); - AssertBundle(buildOptions); + AssertBundle(config, buildOptions, expectNativeBuild); } - public BuildPaths GetBuildPaths(ProjectInfo info, bool forPublish) + public BuildPaths GetBuildPaths(Configuration configuration, bool forPublish) { Assert.NotNull(ProjectDir); - string objDir = Path.Combine(ProjectDir, "obj", info.Configuration, _defaultTargetFramework); - string binDir = Path.Combine(ProjectDir, "bin", info.Configuration, _defaultTargetFramework); - string binFrameworkDir = GetBinFrameworkDir(info.Configuration, forPublish, _defaultTargetFramework); + string objDir = Path.Combine(ProjectDir, "obj", configuration, _defaultTargetFramework); + string binDir = Path.Combine(ProjectDir, "bin", configuration, _defaultTargetFramework); + string binFrameworkDir = GetBinFrameworkDir(configuration, forPublish, _defaultTargetFramework); string objWasmDir = Path.Combine(objDir, "wasm", forPublish ? "for-publish" : "for-build"); // for build: we should take from runtime pack? return new BuildPaths(objWasmDir, objDir, binDir, binFrameworkDir); } - public override string GetBinFrameworkDir(string config, bool forPublish, string framework, string? projectDir = null) + public override string GetBinFrameworkDir(Configuration config, bool forPublish, string framework, string? projectDir = null) { EnsureProjectDirIsSet(); - string basePath = Path.Combine(projectDir ?? ProjectDir!, "bin", config, framework); + string basePath = Path.Combine(projectDir ?? ProjectDir!, "bin", config.ToString(), framework); if (forPublish) basePath = Path.Combine(basePath, "publish"); From 99d14a4bdb3db8347401825bc5f747d9c476860a Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 28 Nov 2024 12:37:03 +0000 Subject: [PATCH 063/104] Follow up for feedback - fix the WIP commit. --- .../Blazor/AppsettingsTests.cs | 2 +- .../Blazor/BlazorWasmTestBase.cs | 31 ++++++++++------ .../Blazor/BuildPublishTests.cs | 16 ++++---- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 6 +-- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 6 +-- .../Blazor/NoopNativeRebuildTest.cs | 4 +- .../Blazor/SimpleMultiThreadedTests.cs | 2 +- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 2 +- .../Blazor/WorkloadRequiredTests.cs | 10 ++--- .../BrowserStructures/AssertBundleOptions.cs | 6 ++- .../BrowserStructures/PublishOptions.cs | 2 + .../BrowserStructures/RunOptions.cs | 2 +- .../Wasm.Build.Tests/BuildPublishTests.cs | 18 ++++----- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 16 ++------ .../Common/BuildAndRunAttribute.cs | 2 +- .../Wasm.Build.Tests/Common/Configuration.cs | 1 + .../InvariantGlobalizationTests.cs | 1 - .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 2 - .../FlagsChangeRebuildTest.cs | 6 +-- .../NativeRebuildTestsBase.cs | 25 ++++--------- .../NoopNativeRebuildTest.cs | 6 +-- .../OptimizationFlagChangeTests.cs | 6 +-- .../ReferenceNewAssemblyRebuildTest.cs | 6 +-- .../SimpleSourceChangeRebuildTest.cs | 6 +-- .../PInvokeTableGeneratorTests.cs | 27 +++++++------- .../Wasm.Build.Tests/ProjectProviderBase.cs | 16 ++++---- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 1 - .../SatelliteAssembliesTests.cs | 5 +-- .../Templates/NativeBuildTests.cs | 2 +- .../Templates/WasmTemplateTests.cs | 13 +++---- .../Templates/WasmTemplateTestsBase.cs | 37 +++++++++++-------- .../TestAppScenarios/AppSettingsTests.cs | 2 +- .../TestAppScenarios/DebugLevelTests.cs | 30 +++++++-------- .../TestAppScenarios/DownloadThenInitTests.cs | 3 +- .../TestAppScenarios/LazyLoadingTests.cs | 7 ++-- .../LibraryInitializerTests.cs | 4 +- .../MaxParallelDownloadsTests.cs | 2 +- .../TestAppScenarios/MemoryTests.cs | 2 - .../TestAppScenarios/ModuleConfigTests.cs | 4 +- .../TestAppScenarios/SatelliteLoadingTests.cs | 3 +- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 2 +- .../WasmNativeDefaultsTests.cs | 14 +++---- .../WasmRunOutOfAppBundleTests.cs | 2 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 4 +- .../WasmSdkBasedProjectProvider.cs | 34 ++++++++++++----- 45 files changed, 200 insertions(+), 198 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs index dd93dd77c2659a..97244d76e5f241 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs @@ -22,7 +22,7 @@ public AppsettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture [Fact] public async Task FileInVfs() { - Configuration config = "debug"; + Configuration config = Configuration.Debug; ProjectInfo info = CreateWasmTemplateProject(Template.BlazorWasm, config, aot: false, "blazor"); UpdateHomePage(); string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 7f1c775401c022..1f1d52824dded7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -20,14 +20,16 @@ public abstract class BlazorWasmTestBase : WasmTemplateTestsBase { protected readonly WasmSdkBasedProjectProvider _provider; private readonly string _blazorExtraBuildArgs = "-p:BlazorEnableCompression=false /warnaserror"; - protected readonly PublishOptions _defaultBlazorPublishOptions = _defaultPublishOptions with { ExtraMSBuildArgs = _blazorExtraBuildArgs }; - private readonly BuildOptions _defaultBlazorBuildOptions = _defaultBlazorBuildOptions with { ExtraMSBuildArgs = _blazorExtraBuildArgs }; + protected readonly PublishOptions _defaultBlazorPublishOptions; + private readonly BuildOptions _defaultBlazorBuildOptions; protected override TestAsset BasicTestApp => new() { Name = "BlazorBasicTestApp", RunnableProjectSubPath = "App" }; protected BlazorWasmTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext, new WasmSdkBasedProjectProvider(output, DefaultTargetFrameworkForBlazor)) { _provider = GetProvider(); + _defaultBlazorPublishOptions = _defaultPublishOptions with { ExtraMSBuildArgs = _blazorExtraBuildArgs }; + _defaultBlazorBuildOptions = _defaultBuildOptions with { ExtraMSBuildArgs = _blazorExtraBuildArgs }; } private Dictionary blazorHomePageReplacements = new Dictionary @@ -96,12 +98,15 @@ public string CreateBlazorWasmTemplateProject(string id) return Path.Combine(_projectDir!, $"{id}.csproj"); } + protected (string projectDir, string buildOutput) BlazorBuild(ProjectInfo info, Configuration config, bool isNativeBuild = false) => + BlazorBuild(info, config, _defaultBlazorBuildOptions, isNativeBuild); + protected (string projectDir, string buildOutput) BlazorBuild( - ProjectInfo info, Configuration config, MSBuildOptions buildOptions = _defaultBlazorBuildOptions, bool isNativeBuild = false) + ProjectInfo info, Configuration config, MSBuildOptions buildOptions, bool isNativeBuild = false) { try { - if (publishOptions != _defaultBlazorPublishOptions) + if (buildOptions != _defaultBlazorPublishOptions) buildOptions = buildOptions with { ExtraMSBuildArgs = $"{buildOptions.ExtraMSBuildArgs} {_blazorExtraBuildArgs}" }; (string projectDir, string buildOutput) = BuildProject( info, @@ -110,7 +115,7 @@ public string CreateBlazorWasmTemplateProject(string id) isNativeBuild); if (buildOptions.ExpectSuccess && buildOptions.AssertAppBundle) { - AssertBundle(configuration, buildOutput, buildOptions, expectNativeBuild); + AssertBundle(config, buildOutput, buildOptions, isNativeBuild); } return (projectDir, buildOutput); } @@ -121,15 +126,17 @@ public string CreateBlazorWasmTemplateProject(string id) throw; } } - + + protected (string projectDir, string buildOutput) BlazorPublish(ProjectInfo info, Configuration config, bool isNativeBuild = false) => + BlazorPublish(info, config, _defaultBlazorPublishOptions, isNativeBuild); protected (string projectDir, string buildOutput) BlazorPublish( - ProjectInfo info, Configuration config, PublishOptions publishOptions = _defaultBlazorPublishOptions, bool isNativeBuild = false) + ProjectInfo info, Configuration config, PublishOptions publishOptions, bool isNativeBuild = false) { try { if (publishOptions != _defaultBlazorPublishOptions) - buildOptions = buildOptions with { ExtraMSBuildArgs = $"{buildOptions.ExtraMSBuildArgs} {_blazorExtraBuildArgs}" }; + publishOptions = publishOptions with { ExtraMSBuildArgs = $"{publishOptions.ExtraMSBuildArgs} {_blazorExtraBuildArgs}" }; (string projectDir, string buildOutput) = PublishProject( info, config, @@ -137,7 +144,7 @@ public string CreateBlazorWasmTemplateProject(string id) isNativeBuild); if (publishOptions.ExpectSuccess && publishOptions.AssertAppBundle) { - AssertBundle(configuration, buildOutput, publishOptions, expectNativeBuild); + AssertBundle(config, buildOutput, publishOptions, isNativeBuild); } return (projectDir, buildOutput); } @@ -157,12 +164,12 @@ public void AssertBundle(Configuration config, string buildOutput, MSBuildOption ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? DefaultTargetFramework, buildOptions.RuntimeType); } - _provider.AssertBundle(config, buildOptions, expectNativeBuild); + _provider.AssertBundle(config, buildOptions, IsUsingWorkloads, expectNativeBuild); if (!buildOptions.IsPublish) return; - var expectedFileType = GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, expectNativeBuild); + var expectedFileType = _provider.GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, IsUsingWorkloads, expectNativeBuild); // Publish specific checks if (expectedFileType == NativeFilesType.AOT) { @@ -174,7 +181,7 @@ public void AssertBundle(Configuration config, string buildOutput, MSBuildOption Assert.DoesNotContain("Microsoft.JSInterop.WebAssembly.dll -> Microsoft.JSInterop.WebAssembly.dll.bc", buildOutput); } - string objBuildDir = Path.Combine(_projectDir!, "obj", buildOptions.Configuration, buildOptions.TargetFramework!, "wasm", "for-build"); + string objBuildDir = Path.Combine(_projectDir!, "obj", config.ToString(), buildOptions.TargetFramework!, "wasm", "for-build"); // Check that we linked only for publish if (buildOptions is PublishOptions publishOptions && publishOptions.ExpectRelinkDirWhenPublishing) Assert.True(Directory.Exists(objBuildDir), $"Could not find expected {objBuildDir}, which gets created when relinking during Build. This is likely a test authoring error"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index ffc8c500dd82a3..6684e0164dd8a8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -30,16 +30,16 @@ public async Task DefaultTemplate_WithoutWorkload(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_workload"); BlazorBuild(info, config); - await RunForBuildWithDotnetRun(new(info.Configuration)); + await RunForBuildWithDotnetRun(new(config)); BlazorPublish(info, config, new PublishOptions(UseCache: false)); - await RunForPublishWithWebServer(new(info.Configuration)); + await RunForPublishWithWebServer(new(config)); } - public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) + public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) { - var data = new TheoryData(); + var data = new TheoryData(); if (!isAot) { // AOT does not support managed debugging, is disabled by design @@ -70,7 +70,7 @@ public void DefaultTemplate_AOT_WithWorkload(Configuration config, bool testUnic BlazorBuild(info, config); // NativeFilesType.AOT?? - PublishProject(info, config, PublishOptions(AOT: true, UseCache: false)); + PublishProject(info, config, new PublishOptions(AOT: true, UseCache: false)); } [Theory] @@ -129,7 +129,7 @@ public void DefaultTemplate_WithResources_Publish(Configuration config) AssertResourcesDlls(GetBlazorBinFrameworkDir(config, forPublish: false)); // Publish and assert resource dlls - BlazorPublish(info, config, new PublisOptions(UseCache: false)); + BlazorPublish(info, config, new PublishOptions(UseCache: false)); AssertResourcesDlls(GetBlazorBinFrameworkDir(config, forPublish: true)); void AssertResourcesDlls(string basePath) @@ -158,8 +158,8 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL BlazorPublish(info, config); await RunForPublishWithWebServer(new(config)); - string frameworkDir = Path.Combine(_projectDir!, "bin", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); - string objBuildDir = Path.Combine(_projectDir!, "obj", config, BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); + string frameworkDir = Path.Combine(_projectDir!, "bin", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); + string objBuildDir = Path.Combine(_projectDir!, "obj", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); WasmTemplateTests.TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index c61b2e7dd504f4..09d7a6a4a093fb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -29,7 +29,7 @@ public void Blazor_BuildThenClean_NativeRelinking(Configuration config) ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean", extraProperties: extraProperties); BlazorBuild(info, config, isNativeBuild: true); - string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + string relinkDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); string logPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}-clean.binlog"); @@ -65,14 +65,14 @@ private void Blazor_BuildNativeNonNative_ThenCleanTest(Configuration config, boo new BuildOptions(ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), isNativeBuild: relink); - string relinkDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + string relinkDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); if (relink) Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); relink = !firstBuildNative; BlazorBuild(info, config, - new BuildOptions(useCache: false, ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), + new BuildOptions(UseCache: false, ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), isNativeBuild: relink); if (relink) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index 1d27ab35563a34..af41b50fbfae29 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -28,11 +28,11 @@ public void WithNativeReference_AOTInProjectFile(Configuration config) "-O1" + "true") : "true"; - ProjectInfo info = CreateProjectWithNativeReference(extraProperties: extraProperties); + ProjectInfo info = CreateProjectWithNativeReference(config, aot: true, extraProperties: extraProperties); BlazorBuild(info, config, isNativeBuild: true); BlazorPublish(info, config, new PublishOptions(UseCache: false), isNativeBuild: true); // will relink - BlazorBuild(info, config, new BuilldOptions(UseCache: false), isNativeBuild: true); + BlazorBuild(info, config, new BuildOptions(UseCache: false), isNativeBuild: true); } [Theory] @@ -59,7 +59,7 @@ public void BlazorWasm_CannotAOT_WithNoTrimming(Configuration config) string extraProperties = "falsetrue"; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blazorwasm_aot", extraProperties: extraProperties); - (string _, string output) = PublishProject(info, new BuildOptions(ExpectSuccess: false)); + (string _, string output) = BlazorPublish(info, config, new PublishOptions(ExpectSuccess: false)); Assert.Contains("AOT is not supported without IL trimming", output); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index cbe1df50a64690..433ab5b2ea37b4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -30,7 +30,7 @@ public void BlazorNoopRebuild(Configuration config) File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); - string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); + string objDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm"); var pathsDict = _provider.GetFilesTable(true, objDir); pathsDict.Remove("runtime-icall-table.h"); var originalStat = _provider.StatFiles(pathsDict); @@ -56,7 +56,7 @@ public void BlazorOnlyLinkRebuild(Configuration config) File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); - string objDir = Path.Combine(_projectDir!, "obj", config, DefaultTargetFrameworkForBlazor, "wasm"); + string objDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm"); var pathsDict = _provider.GetFilesTable(true, objDir); pathsDict.Remove("runtime-icall-table.h"); pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js", "emcc-link.rsp"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 59520ea42bd3f1..61bc98323ae580 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -30,7 +30,7 @@ public async Task BlazorBuildRunTest(Configuration config) string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazorwasm", extraProperties: extraProperties); bool isPublish = false; - string frameworkDir = GetBlazorBinFrameworkDir(info.Configuration, isPublish); + string frameworkDir = GetBlazorBinFrameworkDir(config, isPublish); BuildProject(info, config, new BuildOptions(RuntimeType: RuntimeVariant.MultiThreaded)); // we wan to use "xharness wasm webserver" but from non-publish location string extraArgs = " --web-server-use-cors --web-server-use-cop --web-server-use-https --timeout=15:00:00"; diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index 6f7ba0b07aff74..e386cef9a8faad 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -54,7 +54,7 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(Configuration config, bool isPublish = false; string frameworkDir = useArtifacts ? Path.Combine( - projectDir, "bin", info.ProjectName, config.ToLower(), "wwwroot", "_framework") : + projectDir, "bin", info.ProjectName, config.ToString().ToLower(), "wwwroot", "_framework") : GetBinFrameworkDir(config, isPublish); BuildProject(info, config); await RunForBuildWithDotnetRun(new(config)); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index f934747dcf1a20..5c93c28a5e7631 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -34,11 +34,11 @@ public WorkloadRequiredTests(ITestOutputHelper output, SharedBuildPerTestClassFi { } - public static TheoryData SettingDifferentFromValuesInRuntimePack() + public static TheoryData SettingDifferentFromValuesInRuntimePack() { - TheoryData data = new(); + TheoryData data = new(); - string[] configs = new[] { Configuration.Debug, Configuration.Release }; + var configs = new[] { Configuration.Debug, Configuration.Release }; foreach (var defaultPair in PropertiesWithTriggerValues) { foreach (Configuration config in configs) @@ -61,9 +61,9 @@ public void WorkloadRequiredForBuild(Configuration config, string extraPropertie public void WorkloadRequiredForPublish(Configuration config, string extraProperties, bool workloadNeeded) => CheckWorkloadRequired(config, extraProperties, workloadNeeded, publish: true); - public static TheoryData InvariantGlobalizationTestData(bool publish) + public static TheoryData InvariantGlobalizationTestData(bool publish) { - TheoryData data = new(); + TheoryData data = new(); foreach (Configuration config in new[] { Configuration.Debug, Configuration.Release }) { data.Add(config, /*invariant*/ true, /*publish*/ publish); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs index 1d0430c86562ad..c2fd74e11bf6d5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/AssertBundleOptions.cs @@ -8,9 +8,11 @@ namespace Wasm.Build.Tests; public record AssertBundleOptions( + Configuration Configuration, MSBuildOptions BuildOptions, + NativeFilesType ExpectedFileType, + string BinFrameworkDir, bool ExpectSymbolsFile = true, bool AssertIcuAssets = true, - bool AssertSymbolsFile = true, - NativeFilesType ExpectedFileType + bool AssertSymbolsFile = true ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs index 73b9d3850af18e..4341373d8ccdc4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.Generic; + #nullable enable namespace Wasm.Build.Tests; diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index 41fc3d9f7dbc2b..c22f20ce6a8e5b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -11,7 +11,7 @@ namespace Wasm.Build.Tests; public record RunOptions ( - string Configuration, + Configuration Configuration, RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, bool CheckCounter = true, diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 1b26b087859767..9737dcb1db8f4d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -26,7 +26,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur public void Wasm_CannotAOT_InDebug(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "no_aot_in_debug"); - (string _, string buildOutput) = PublishProject(info, config, PublishOptions(AOT: aot, ExpectSuccess: false)); + (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot, ExpectSuccess: false)); Assert.Contains("AOT is not supported in debug configuration", buildOutput); } @@ -44,7 +44,7 @@ public async Task BuildThenPublishNoAOT(Configuration config, bool aot) RunOptions runOptions = new(config, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); - PublishProject(info, config, PublishOptions(UseCache: false)); + PublishProject(info, config, new PublishOptions(UseCache: false)); await RunForPublishWithWebServer(runOptions); } @@ -55,11 +55,11 @@ public async Task BuildThenPublishWithAOT(Configuration config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); bool isPublish = false; - (_, string output) = BuildProject(info, config, BuildOptions(Label: "first_build", AOT: aot)); + (_, string output) = BuildProject(info, config, new BuildOptions(Label: "first_build", AOT: aot)); - BuildPaths paths = GetBuildPaths(info, forPublish: isPublish); + BuildPaths paths = GetBuildPaths(config, forPublish: isPublish); IDictionary pathsDict = - GetFilesTable(info, paths, unchanged: false); + GetFilesTable(info.ProjectName, aot, paths, unchanged: false); string mainDll = $"{info.ProjectName}.dll"; var firstBuildStat = StatFiles(pathsDict); @@ -80,11 +80,11 @@ public async Task BuildThenPublishWithAOT(Configuration config, bool aot) // relink by default for Release+publish isPublish = true; - (_, output) = PublishProject(info, config, PublishOptions(Label: "first_publish", UseCache: false, AOT: aot)); + (_, output) = PublishProject(info, config, new PublishOptions(Label: "first_publish", UseCache: false, AOT: aot)); // publish has different paths ("for-publish", not "for-build") - paths = GetBuildPaths(info, forPublish: isPublish); - pathsDict = GetFilesTable(info, paths, unchanged: false); + paths = GetBuildPaths(config, forPublish: isPublish); + pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); IDictionary publishStat = StatFiles(pathsDict); Assert.True(publishStat["pinvoke.o"].Exists); Assert.True(publishStat[$"{mainDll}.bc"].Exists); @@ -98,7 +98,7 @@ public async Task BuildThenPublishWithAOT(Configuration config, bool aot) // second build isPublish = false; - (_, output) = BuildProject(info, config, BuildOptions(Label: "second_build", UseCache: false, AOT: aot)); + (_, output) = BuildProject(info, config, new BuildOptions(Label: "second_build", UseCache: false, AOT: aot)); var secondBuildStat = StatFiles(pathsDict); // no relinking, or AOT diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 4afdd1baa8e2f1..f81cc9dc5a0c42 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -112,9 +112,9 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, _providerOfBaseType = providerBase; } - public static IEnumerable> ConfigWithAOTData(bool aot, Configuration config = Configuration.Release) + public static IEnumerable> ConfigWithAOTData(bool aot, Configuration config = Configuration.Undefined) { - if (config == null) + if (config == Configuration.Undefined) { return new IEnumerable[] { @@ -138,7 +138,7 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, public (CommandResult res, string logPath) BuildProjectWithoutAssert( Configuration configuration, string projectName, - BuildOptions buildOptions) + MSBuildOptions buildOptions) { string buildType = buildOptions.IsPublish ? "publish" : "build"; string logFileSuffix = string.IsNullOrEmpty(buildOptions.Label) ? string.Empty : buildOptions.Label.Replace(' ', '_') + "-"; @@ -156,7 +156,7 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, }; commandLineArgs.AddRange(buildOptions.ExtraMSBuildArgs); - if (buildOptions.IsPublish && buildOptions.BuildOnlyAfterPublish) + if (buildOptions.IsPublish && buildOptions is PublishOptions po && po.BuildOnlyAfterPublish) commandLineArgs.Append("-p:WasmBuildOnlyAfterPublish=true"); using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) @@ -196,14 +196,6 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, return (res, logFilePath); } - protected NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isNativeBuild=false) => - isNativeBuild ? NativeFilesType.Relinked : - !isPublish ? NativeFilesType.FromRuntimePack : - isAOT ? NativeFilesType.AOT : - (config == Configuration.Debug || !IsUsingWorkloads) ? - NativeFilesType.FromRuntimePack : - NativeFilesType.Relinked; - private string GetBinlogMessageContext(TextNode node) { var currentNode = node; diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs index aaf50541894a1a..125b5e368f7f6d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs @@ -22,7 +22,7 @@ public class BuildAndRunAttribute : DataAttribute { private readonly IEnumerable _data; - public BuildAndRunAttribute(bool aot=false, Configuration? config=null, params object?[] parameters) + public BuildAndRunAttribute(bool aot=false, Configuration config=Configuration.Undefined, params object?[] parameters) { _data = BuildTestBase.ConfigWithAOTData(aot, config) .Multiply(parameters) diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs b/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs index e527f88bc6fc82..151d21bbdcc6b5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/Configuration.cs @@ -9,4 +9,5 @@ public enum Configuration { Release, Debug, + Undefined } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 52fd9942b0497a..e2ac2d6ff0cdaa 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -51,7 +51,6 @@ private async Task TestInvariantGlobalization(Configuration config, bool aot, bo ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantGlobalization.cs")); - bool isPublish = true; // invariantGlobalization triggers native build isNativeBuild = isNativeBuild || invariantGlobalization == true; var globalizationMode = invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index 3a96d27382fe3f..4187b7af0f7903 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -34,7 +34,6 @@ public async Task SimpleNativeBuild(Configuration config, bool aot) UpdateBrowserProgramFile(); UpdateBrowserMainJs(); - bool isPublish = true; (string _, string buildOutput) = PublishProject(info, config, isNativeBuild: true); await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); } @@ -83,7 +82,6 @@ public void IntermediateBitcodeToObjectFilesAreNotLLVMIR(Configuration config, b "bc_to_o", insertAtEnd: printFileTypeTarget); - bool isPublish = true; (string _, string output) = PublishProject(info, config, new PublishOptions(AOT: aot)); if (!output.Contains("** wasm-dis exit code: 0")) throw new XunitException($"Expected to successfully run wasm-dis on System.Private.CoreLib.dll.o ." diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index d46b51797f09f3..a839fa39e622f1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -34,7 +34,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool aot, string extraCFlags, string extraLDFlags) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); - BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); if (extraLDFlags.Length > 0) pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); @@ -44,7 +44,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool ao // Rebuild string mainAssembly = $"{info.ProjectName}.dll"; string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; - string output = Rebuild(info, nativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); + string output = Rebuild(info, config, nativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); var newStat = StatFiles(pathsDict); @@ -63,7 +63,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool ao Assert.DoesNotContain("Compiling assembly bitcode files", output); } - RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); + RunResult runOutput = await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: aot); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index 19fb53050c002e..eeb8b769565403 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -46,37 +46,26 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF .UnwrapItemsAsArrays().ToList(); } - internal async Task FirstNativeBuildAndRun(ProjectInfo info, bool nativeRelink, bool invariant, string extraBuildArgs="") + internal async Task FirstNativeBuildAndRun(ProjectInfo info, Configuration config, bool nativeRelink, bool invariant, string extraBuildArgs="") { bool isNativeBuild = nativeRelink || invariant; - var extraArgs = new string[] { - "-p:_WasmDevel=true", - $"-p:WasmBuildNative={nativeRelink}", - $"-p:InvariantGlobalization={invariant}", - extraBuildArgs - }; + var extraArgs = $"-p:_WasmDevel=true -p:WasmBuildNative={nativeRelink} -p:InvariantGlobalization={invariant} {extraBuildArgs}"; PublishProject(info, config, new PublishOptions(GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, ExtraMSBuildArgs: extraArgs), isNativeBuild: nativeRelink); - await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); - return GetBuildPaths(info, isPublish); + await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun")); + return GetBuildPaths(config, forPublish: true); } - protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal") + protected string Rebuild(ProjectInfo info, Configuration config, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal") { if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); - var extraArgs = new string[] { - "-p:_WasmDevel=true", - $"-p:WasmBuildNative={nativeRelink}", - $"-p:InvariantGlobalization={invariant}", - $"-v:{verbosity}", - extraBuildArgs - }; + var extraArgs = $"-p:_WasmDevel=true -p:WasmBuildNative={nativeRelink} -p:InvariantGlobalization={invariant} -v:{verbosity} {extraBuildArgs}"; // artificial delay to have new enough timestamps Thread.Sleep(5000); @@ -85,7 +74,7 @@ protected string Rebuild(ProjectInfo info, bool nativeRelink, bool invariant, st var globalizationMode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; (string _, string output) = PublishProject(info, config, - new PublishOptions(globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false), + new PublishOptions(GlobalizationMode: globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false), isNativeBuild: nativeRelink); return output; } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 3f27ccaefbfdc3..bafc656fee9433 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -22,16 +22,16 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi public async void NoOpRebuildForNativeBuilds(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_noop"); - BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); var originalStat = StatFiles(pathsDict); - Rebuild(info, nativeRelink, invariant); + Rebuild(info, config, nativeRelink, invariant); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "DotnetRun")); + await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun")); } [Fact] diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index be9a6ab7028b20..821e302a3cc056 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -34,7 +34,7 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); // force _WasmDevel=false, so we don't get -O0 - BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); @@ -60,11 +60,11 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string // Rebuild - string output = Rebuild(info, nativeRelink: true, invariant: false, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); + string output = Rebuild(info, config, nativeRelink: true, invariant: false, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - RunResult runOutput = await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun")); + RunResult runOutput = await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: aot); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 962de4946fbb21..b371554da0579f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -25,7 +25,7 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT public async void ReferenceNewAssembly(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_tasks"); - BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); pathsDict.UpdateTo(unchanged: true, "corebindings.o"); @@ -37,11 +37,11 @@ public async void ReferenceNewAssembly(Configuration config, bool aot, bool nati ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeRebuildNewAssembly.cs")); - Rebuild(info, nativeRelink, invariant); + Rebuild(info, config, nativeRelink, invariant); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (info.Configuration, ExpectedExitCode: 42, TestScenario: "DotnetRun")); + await RunForPublishWithWebServer(new (config, ExpectedExitCode: 42, TestScenario: "DotnetRun")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 8f2ae719f26c95..6370b941362d9d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -24,7 +24,7 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); - BuildPaths paths = await FirstNativeBuildAndRun(info, nativeRelink, invariant); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); @@ -39,11 +39,11 @@ public async void SimpleStringChangeInSource(Configuration config, bool aot, boo ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SimpleSourceChange.cs")); // Rebuild - Rebuild(info, nativeRelink, invariant); + Rebuild(info, config, nativeRelink, invariant); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (info.Configuration, TestScenario: "DotnetRun", ExpectedExitCode: 55)); + await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun", ExpectedExitCode: 55)); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index ec0c368773e369..1ab31a35a5defc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -97,7 +97,7 @@ public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshal { ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: false, useAutoLayout: false); - (_, string output) = BuildProject(info, config, isNativeBuild: true, AOT: aot); + (_, string output) = BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); Assert.DoesNotMatch("error.*Parameter.*types.*pinvoke.*.*blittable", output); } @@ -108,7 +108,7 @@ public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMars { ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: true, useAutoLayout: true); - (_, string output) = BuildProject(info, config, isNativeBuild: true, AOT: aot); + (_, string output) = BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); RunResult result = await RunForBuildWithDotnetRun(new( config, TestScenario: "DotnetRun", @@ -171,7 +171,7 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly } (_, string output) = BuildProject(info, config, - new BuildOptions(expectSuccess: expectSuccess, AOT: aot), + new BuildOptions(ExpectSuccess: expectSuccess, AOT: aot), isNativeBuild: true); if (expectSuccess) { @@ -384,7 +384,7 @@ public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, { "LANG", culture }, { "LC_ALL", culture }, }; - bool isPublish = true; + (_, string output) = PublishProject(info, config, new PublishOptions(ExtraBuildEnvironmentVariables: extraEnvVars, AOT: aot), @@ -416,8 +416,8 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Con GenerateSourceFiles(_projectDir!, baseArg); bool isPublish = aot; (_, string output) = isPublish ? - PublishProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true): - BuildProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); + PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true): + BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); var runOptions = new RunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); @@ -470,11 +470,10 @@ private ProjectInfo PrepreProjectForVariadicFuntion(Configuration config, bool a private string PublishForVariadicFunctionTests(ProjectInfo info, Configuration config, bool aot, string? verbosity = null, bool isNativeBuild = true) { string verbosityArg = verbosity == null ? string.Empty : $" -v:{verbosity}"; - var extraArgs = new string[] { verbosityArg }; // NativeFileReference forces native build (_, string output) = PublishProject(info, config, - new PublishOptions(ExtraMSBuildArgs: extraArgs, AOT: aot), + new PublishOptions(ExtraMSBuildArgs: verbosityArg, AOT: aot), isNativeBuild: isNativeBuild); return output; } @@ -489,10 +488,11 @@ private async Task EnsureWasmAbiRulesAreFollowed(Configuration config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); bool isPublish = aot; - var options = isPublish ? PublishOptions(AOT: aot) : new BuildOptions(AOT: aot); - (string _, string _) = isPublish ? PublishProject(info, options, isNativeBuild: true) : BuildProject(info, options, isNativeBuild: true); + (string _, string _) = isPublish ? + PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true) : + BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); - string objDir = Path.Combine(_projectDir!, "obj", config, buildOptions.TargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); + string objDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); // Verify that the right signature was added for the pinvoke. We can't determine this by examining the m2n file // FIXME: Not possible in in-process mode for some reason, even with verbosity at "diagnostic" @@ -537,10 +537,9 @@ public void EnsureComInteropCompilesInAOT(Configuration config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "com"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ComInterop.cs")); bool isPublish = aot; - var options = isPublish ? PublishOptions(AOT: aot) : new BuildOptions(AOT: aot); (string libraryDir, string output) = isPublish ? - PublishProject(info, options, new PublishOptions(AOT: aot), isNativeBuild) : - BuildProject(info, options, new BuildOptions(AOT: aot), isNativeBuild: true); + PublishProject(info, config, new PublishOptions(AOT: aot)) : + BuildProject(info, config, new BuildOptions(AOT: aot)); Assert.Contains("Generated app bundle at " + libraryDir, output); } diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index 0e2bf32ae98495..2a577f8671fa77 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -49,10 +49,10 @@ public IReadOnlyDictionary AssertBasicBundle(AssertBundl EnsureProjectDirIsSet(); var dotnetFiles = FindAndAssertDotnetFiles(assertOptions); - TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, + TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, new[] { "System.Private.CoreLib.dll" }, expectToExist: IsFingerprintingEnabled ? false : !BuildTestBase.UseWebcil); - TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, + TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, new[] { "System.Private.CoreLib.wasm" }, expectToExist: IsFingerprintingEnabled ? false : BuildTestBase.UseWebcil); @@ -81,7 +81,7 @@ public IReadOnlyDictionary AssertBasicBundle(AssertBundl public IReadOnlyDictionary FindAndAssertDotnetFiles(AssertBundleOptions assertOptions) { EnsureProjectDirIsSet(); - return FindAndAssertDotnetFiles(binFrameworkDir: assertOptions.BuildOptions.BinFrameworkDir, + return FindAndAssertDotnetFiles(binFrameworkDir: assertOptions.BinFrameworkDir, expectFingerprintOnDotnetJs: IsFingerprintingOnDotnetJsEnabled, superSet: GetAllKnownDotnetFilesToFingerprintMap(assertOptions), expected: GetDotNetFilesExpectedSet(assertOptions)); @@ -364,13 +364,13 @@ public static void AssertRuntimePackPath(string buildOutput, string targetFramew public static void AssertDotNetJsSymbols(AssertBundleOptions assertOptions) { - TestUtils.AssertFilesExist(assertOptions.BuildOptions.BinFrameworkDir, new[] { "dotnet.native.js.symbols" }, expectToExist: assertOptions.ExpectSymbolsFile); + TestUtils.AssertFilesExist(assertOptions.BinFrameworkDir, new[] { "dotnet.native.js.symbols" }, expectToExist: assertOptions.ExpectSymbolsFile); if (assertOptions.BuildOptions.ExpectedFileType == NativeFilesType.FromRuntimePack) { TestUtils.AssertFile( Path.Combine(BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.BuildOptions.TargetFramework, assertOptions.BuildOptions.RuntimeType), "dotnet.native.js.symbols"), - Path.Combine(assertOptions.BuildOptions.BinFrameworkDir, "dotnet.native.js.symbols"), + Path.Combine(assertOptions.BinFrameworkDir, "dotnet.native.js.symbols"), same: true); } } @@ -406,9 +406,9 @@ public void AssertIcuAssets(AssertBundleOptions assertOptions, BootJsonData boot throw new NotImplementedException($"Unknown {nameof(assertOptions.BuildOptions.GlobalizationMode)} = {assertOptions.BuildOptions.GlobalizationMode}"); } - IEnumerable actual = Directory.EnumerateFiles(assertOptions.BuildOptions.BinFrameworkDir, "icudt*dat"); + IEnumerable actual = Directory.EnumerateFiles(assertOptions.BinFrameworkDir, "icudt*dat"); if (assertOptions.BuildOptions.GlobalizationMode == GlobalizationMode.Hybrid) - actual = actual.Union(Directory.EnumerateFiles(assertOptions.BuildOptions.BinFrameworkDir, "segmentation-rules*json")); + actual = actual.Union(Directory.EnumerateFiles(assertOptions.BinFrameworkDir, "segmentation-rules*json")); if (IsFingerprintingEnabled) { @@ -445,7 +445,7 @@ private BootJsonData GetBootJson(string bootJsonPath) public BootJsonData AssertBootJson(AssertBundleOptions options) { EnsureProjectDirIsSet(); - string bootJsonPath = Path.Combine(options.BuildOptions.BinFrameworkDir, options.BuildOptions.BootConfigFileName); + string bootJsonPath = Path.Combine(options.BinFrameworkDir, options.BuildOptions.BootConfigFileName); BootJsonData bootJson = GetBootJson(bootJsonPath); string spcExpectedFilename = $"System.Private.CoreLib{WasmAssemblyExtension}"; diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index 7afa38ffff29f4..95873beb8e3df4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -27,7 +27,6 @@ public async Task NoOpRebuild(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); - bool isPublish = true; PublishProject(info, config); RunOptions runOptions = new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index 86a9e3cd4e4c6a..e51842e4ca1fa7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -43,7 +43,6 @@ public async void ResourcesFromMainAssembly(Configuration config, bool aot, bool Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); - bool isPublish = true; (_, string output) = PublishProject(info, config, new PublishOptions(UseCache: false, AOT: aot), isNativeBuild: nativeRelink); RunResult result = await RunForPublishWithWebServer(new( config, @@ -83,7 +82,7 @@ public async void ResourcesFromProjectReference(Configuration config, bool aot, File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.props"), ""); File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), ""); // NativeFilesType dotnetWasmFileType = nativeRelink ? NativeFilesType.Relinked : aot ? NativeFilesType.AOT : NativeFilesType.FromRuntimePack; - bool isPublish = true; + PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: nativeRelink); await RunForPublishWithWebServer( @@ -102,7 +101,7 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(Configuration config, bool a ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "check_sat_asm_not_aot", extraProperties: extraProperties, extraItems: extraItems); CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); - bool isPublish = true; + PublishProject(info, config, new PublishOptions(AOT: aot)); var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index e2a478fca01c00..cf03c43cc5ca8e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -75,7 +75,7 @@ public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter( ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs")); (string _, string buildOutput) = BuildProject(info, config, new BuildOptions(AssertAppBundle: false), isNativeBuild: true); - var runOutput = await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42)); + var runOutput = await RunForBuildWithDotnetRun(new(config, ExpectedExitCode: 42)); Assert.Contains("call_needing_marhsal_ilgen got called", runOutput.TestOutput); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 2f1b2560c9e807..1af9ef45454ea0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -142,7 +142,7 @@ public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework PublishProject(info, config, new PublishOptions(UseCache: false)); - var runOutput = await RunForPublishWithWebServer(new(info.Configuration, ExpectedExitCode: 42)); + var runOutput = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); Assert.Contains("Hello, Browser!", runOutput.TestOutput); } @@ -161,8 +161,7 @@ public async Task BuildAndRunForDifferentOutputPaths(Configuration config, bool string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath) ?? ""; // browser app does not allow appending RID string frameworkDir = useArtifacts ? - Path.Combine( - projectDirectory, "bin", info.ProjectName, config.ToLower(), "wwwroot", "_framework") : + Path.Combine(projectDirectory, "bin", info.ProjectName, config.ToString().ToLower(), "wwwroot", "_framework") : GetBinFrameworkDir(config, isPublish); string extraPropertiesForDBP = string.Empty; @@ -179,7 +178,7 @@ public async Task BuildAndRunForDifferentOutputPaths(Configuration config, bool AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); BuildProject(info, config, new BuildOptions(NonDefaultFrameworkDir: frameworkDir)); - await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42, ExtraArgs: "x y z")); + await RunForBuildWithDotnetRun(new(config, ExpectedExitCode: 42, ExtraArgs: "x y z")); } [Theory] @@ -198,11 +197,11 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL UpdateBrowserMainJs(); PublishProject(info, config, new PublishOptions(UseCache: false, AssertAppBundle: false)); - await RunForBuildWithDotnetRun(new(info.Configuration, ExpectedExitCode: 42)); + await RunForBuildWithDotnetRun(new(config, ExpectedExitCode: 42)); string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; - string objBuildDir = Path.Combine(projectDirectory, "obj", config, BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); - bool isPublish = true; + string objBuildDir = Path.Combine(projectDirectory, "obj", config.ToString(), BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); + string frameworkDir = GetBinFrameworkDir(config, forPublish: true); TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 249c6b72db8016..34e2586f3cb669 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -44,7 +44,7 @@ private string GetProjectName(string idPrefix, Configuration config, bool aot, b $"{idPrefix}_{config}_{aot}_{GetRandomId()}_{s_unicodeChars}" : $"{idPrefix}_{config}_{aot}_{GetRandomId()}"; - private string InitProjectLocation(string idPrefix, Configuration config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) + private (string projectName, string logPath, string nugetDir) InitProjectLocation(string idPrefix, Configuration config, bool aot, bool appendUnicodeToPath, bool avoidAotLongPathIssue = false) { string projectName = GetProjectName(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue); (string logPath, string nugetDir) = InitPaths(projectName); @@ -116,19 +116,31 @@ private void UpdateProjectFile(string projectFilePath, bool runAnalyzers, string public virtual (string projectDir, string buildOutput) PublishProject( ProjectInfo info, Configuration configuration, - PublishOptions buildOptions = _defaultPublishOptions, - bool expectNativeBuild = false) => - BuildProject(info, configuration, buildOptions, expectNativeBuild); + bool isNativeBuild = false) => + BuildProject(info, configuration, _defaultPublishOptions, isNativeBuild); + + public virtual (string projectDir, string buildOutput) PublishProject( + ProjectInfo info, + Configuration configuration, + PublishOptions publishOptions, + bool isNativeBuild = false) => + BuildProject(info, configuration, publishOptions, isNativeBuild); public virtual (string projectDir, string buildOutput) BuildProject( ProjectInfo info, Configuration configuration, - MSBuildOptions buildOptions = _defaultBuildOptions, - bool expectNativeBuild = false) + bool isNativeBuild = false) => + BuildProject(info, configuration, _defaultBuildOptions, isNativeBuild); + + public virtual (string projectDir, string buildOutput) BuildProject( + ProjectInfo info, + Configuration configuration, + MSBuildOptions buildOptions, + bool isNativeBuild = false) { if (buildOptions.AOT) { - buildOptions.ExtraMSBuildArgs += "-p:RunAOTCompilation=true -p:EmccVerbose=true"; + buildOptions = buildOptions with { ExtraMSBuildArgs = $"{buildOptions.ExtraMSBuildArgs} -p:RunAOTCompilation=true -p:EmccVerbose=true" }; } if (buildOptions.ExtraBuildEnvironmentVariables is null) @@ -148,14 +160,9 @@ public virtual (string projectDir, string buildOutput) BuildProject( return (_projectDir!, res.Output); } - string frameworkDir = string.IsNullOrEmpty(buildOptions.NonDefaultFrameworkDir) ? - GetBinFrameworkDir(configuration, buildOptions.IsPublish) : - buildOptions.NonDefaultFrameworkDir; - buildOptions = buildOptions with { BinFrameworkDir = frameworkDir }; - if (buildOptions.AssertAppBundle) { - _provider.AssertWasmSdkBundle(configuration, buildOptions, res.Output, expectNativeBuild); + _provider.AssertWasmSdkBundle(configuration, buildOptions, IsUsingWorkloads, isNativeBuild, res.Output); } return (_projectDir!, res.Output); } @@ -340,8 +347,8 @@ void OnErrorMessage(string msg) public string GetBinFrameworkDir(Configuration config, bool forPublish, string framework = DefaultTargetFramework, string? projectDir = null) => _provider.GetBinFrameworkDir(config, forPublish, framework, projectDir); - public BuildPaths GetBuildPaths(ProjectInfo info, bool forPublish) => - _provider.GetBuildPaths(info, forPublish); + public BuildPaths GetBuildPaths(Configuration config, bool forPublish) => + _provider.GetBuildPaths(config, forPublish); public IDictionary GetFilesTable(string projectName, bool isAOT, BuildPaths paths, bool unchanged) => _provider.GetFilesTable(projectName, isAOT, paths, unchanged); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index 028162432ed5bd..f426bc97a14295 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -29,7 +29,7 @@ public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicatio ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "AppSettingsTest"); PublishProject(info, config); RunOptions options = new( - info.Configuration, + config, TestScenario: "AppSettingsTest", BrowserQueryString: new Dictionary { ["applicationEnvironment"] = applicationEnvironment } ); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index 6f112baa006a61..888e838caedb84 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -26,7 +26,7 @@ private void AssertDebugLevel(IReadOnlyCollection result, int value) [Theory] [InlineData(Configuration.Debug)] [InlineData(Configuration.Release)] - public async Task BuildWithDefaultLevel(string configuration) + public async Task BuildWithDefaultLevel(Configuration configuration) { ProjectInfo info = CopyTestAsset( configuration, @@ -34,8 +34,8 @@ public async Task BuildWithDefaultLevel(string configuration) asset: BasicTestApp, idPrefix: "DebugLevelTests_BuildWithDefaultLevel" ); - BuildProject(info, config); - RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BuildProject(info, configuration); + RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForBuildWithDotnetRun(options); AssertDebugLevel(result.TestOutput, -1); } @@ -45,7 +45,7 @@ public async Task BuildWithDefaultLevel(string configuration) [InlineData(Configuration.Release, 1)] [InlineData(Configuration.Debug, 0)] [InlineData(Configuration.Release, 0)] - public async Task BuildWithExplicitValue(string configuration, int debugLevel) + public async Task BuildWithExplicitValue(Configuration configuration, int debugLevel) { ProjectInfo info = CopyTestAsset( configuration, @@ -53,8 +53,8 @@ public async Task BuildWithExplicitValue(string configuration, int debugLevel) asset: BasicTestApp, idPrefix: "DebugLevelTests_BuildWithExplicitValue" ); - BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); - RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BuildProject(info, configuration, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); + RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForBuildWithDotnetRun(options); AssertDebugLevel(result.TestOutput, debugLevel); } @@ -62,7 +62,7 @@ public async Task BuildWithExplicitValue(string configuration, int debugLevel) [Theory] [InlineData(Configuration.Debug)] [InlineData(Configuration.Release)] - public async Task PublishWithDefaultLevel(string configuration) + public async Task PublishWithDefaultLevel(Configuration configuration) { ProjectInfo info = CopyTestAsset( configuration, @@ -70,8 +70,8 @@ public async Task PublishWithDefaultLevel(string configuration) asset: BasicTestApp, idPrefix: "DebugLevelTests_PublishWithDefaultLevel" ); - PublishProject(info, config); - RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + PublishProject(info, configuration); + RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, 0); } @@ -81,7 +81,7 @@ public async Task PublishWithDefaultLevel(string configuration) [InlineData(Configuration.Release, 1)] [InlineData(Configuration.Debug, -1)] [InlineData(Configuration.Release, -1)] - public async Task PublishWithExplicitValue(string configuration, int debugLevel) + public async Task PublishWithExplicitValue(Configuration configuration, int debugLevel) { ProjectInfo info = CopyTestAsset( configuration, @@ -89,8 +89,8 @@ public async Task PublishWithExplicitValue(string configuration, int debugLevel) asset: BasicTestApp, idPrefix: "DebugLevelTests_PublishWithExplicitValue" ); - PublishProject(info, isPublish: true, extraArgs: $"-p:WasmDebugLevel={debugLevel}"); - RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + PublishProject(info, configuration, new PublishOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); + RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, debugLevel); } @@ -99,7 +99,7 @@ public async Task PublishWithExplicitValue(string configuration, int debugLevel) [Theory] [InlineData(Configuration.Debug)] [InlineData(Configuration.Release)] - public async Task PublishWithDefaultLevelAndPdbs(string configuration) + public async Task PublishWithDefaultLevelAndPdbs(Configuration configuration) { ProjectInfo info = CopyTestAsset( configuration, @@ -107,8 +107,8 @@ public async Task PublishWithDefaultLevelAndPdbs(string configuration) asset: BasicTestApp, idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs" ); - PublishProject(info, isPublish: true, extraArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true"); - RunOptions options = new(info.Configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + PublishProject(info, configuration, new PublishOptions(ExtraMSBuildArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true")); + RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, -1); } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index 8e07b9aa3e7792..8cba16d9e272b6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -25,9 +25,8 @@ public DownloadThenInitTests(ITestOutputHelper output, SharedBuildPerTestClassFi public async Task NoResourcesReFetchedAfterDownloadFinished(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "DownloadThenInitTests"); - bool isPublish = false; BuildProject(info, config); - RunOptions options = new(info.Configuration, TestScenario: "DownloadThenInit"); + RunOptions options = new(config, TestScenario: "DownloadThenInit"); RunResult result = await RunForBuildWithDotnetRun(options); var resultTestOutput = result.TestOutput.ToList(); int index = resultTestOutput.FindIndex(s => s.Contains("download finished")); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index 97d8bcb9b6e3da..45fa898a340497 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -32,7 +32,6 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi { Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); - bool isPublish = false; BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension} -p:TestLazyLoading=true")); // We are running the app and passing all possible lazy extensions to test matrix of all possibilities. @@ -40,7 +39,7 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi foreach (var clientLazyLoadingTestExtension in allLazyLoadingTestExtensions) { RunResult result = await RunForBuildWithDotnetRun(new( - info.Configuration, + config, TestScenario: "LazyLoadingTest", BrowserQueryString: new Dictionary { ["lazyLoadingTestExtension"] = clientLazyLoadingTestExtension } )); @@ -55,10 +54,10 @@ public async Task FailOnMissingLazyAssembly() { Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); - bool isPublish = true; + PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: "-p:TestLazyLoading=true")); RunOptions options = new( - info.Configuration, + config, TestScenario: "LazyLoadingTest", BrowserQueryString: new Dictionary { ["loadRequiredAssembly"] = "false" }, ExpectedExitCode: 1); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index 92f0dfbfb7f278..ff3786a35b711b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -29,7 +29,7 @@ public async Task LoadLibraryInitializer() Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); PublishProject(info, config); - RunResult result = await RunForPublishWithWebServer(new(info.Configuration, TestScenario: "LibraryInitializerTest")); + RunResult result = await RunForPublishWithWebServer(new(config, TestScenario: "LibraryInitializerTest")); Assert.Collection( result.TestOutput, m => Assert.Equal("LIBRARY_INITIALIZER_TEST = 1", m) @@ -47,7 +47,7 @@ public async Task AbortStartupOnError() PublishProject(info, config); RunOptions options = new( - info.Configuration, + config, TestScenario: "LibraryInitializerTest", BrowserQueryString: new Dictionary { ["throwError"] = "true" }, ExpectedExitCode: 1); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index 4f2365cd16ad2a..b95813596d03c7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -28,7 +28,7 @@ public async Task NeverFetchMoreThanMaxAllowed(Configuration config, string maxP ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MaxParallelDownloadsTests"); BuildProject(info, config); RunResult result = await RunForBuildWithDotnetRun(new( - info.Configuration, + config, TestScenario: "MaxParallelDownloads", BrowserQueryString: new Dictionary { ["maxParallelDownloads"] = maxParallelDownloads } )); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index 7d13bac4403190..0b4d4fff774030 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -30,7 +30,6 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop() { Configuration config = Configuration.Release; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MemoryTests"); - bool isPublish = false; string extraArgs = "-p:EmccMaximumHeapSize=4294901760"; BuildProject(info, config, @@ -49,7 +48,6 @@ public async Task RunSimpleAppWithProfiler() { Configuration config = Configuration.Release; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ProfilerTest"); - bool isPublish = false; // are are linking all 3 profilers, but below we only initialize log profiler and test it string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: extraArgs, AssertAppBundle: false), isNativeBuild: true); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index 00e3048da8ce3e..82f44f2fccc289 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -30,7 +30,7 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) PublishProject(info, config); var result = await RunForPublishWithWebServer(new( - Configuration: info.Configuration, + Configuration: config, TestScenario: "DownloadResourceProgressTest", BrowserQueryString: new Dictionary { ["failAssemblyDownload"] = failAssemblyDownload.ToString().ToLowerInvariant() } )); @@ -87,7 +87,7 @@ public async Task OverrideBootConfigName(Configuration config, bool isPublish) PublishProject(info, config) : BuildProject(info, config); - string[] extraArgs = ["-p:WasmBootConfigFileName=boot.json"]; + string extraArgs = "-p:WasmBootConfigFileName=boot.json"; (string _, string _) = isPublish ? PublishProject(info, config, new PublishOptions(BootConfigFileName: "boot.json", UseCache: false, ExtraMSBuildArgs: extraArgs)) : BuildProject(info, config, new BuildOptions(BootConfigFileName: "boot.json", UseCache: false, ExtraMSBuildArgs: extraArgs)); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 6df1a0b5ccfe06..cb876878b70442 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -34,7 +34,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) BuildProject(info, config); var result = await RunForBuildWithDotnetRun(new( - Configuration: info.Configuration, + Configuration: config, TestScenario: "SatelliteAssembliesTest", BrowserQueryString: new Dictionary { ["loadAllSatelliteResources"] = loadAllSatelliteResources.ToString().ToLowerInvariant() } )); @@ -62,7 +62,6 @@ public async Task LoadSatelliteAssemblyFromReference() { Configuration config = Configuration.Release; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTestsFromReference"); - bool isPublish = true; // Replace ProjectReference with Reference var appCsprojPath = Path.Combine(_projectDir!, "WasmBasicTestApp.csproj"); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index 1820acf10eaedc..682be41af5d414 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -30,7 +30,7 @@ protected async void TestMain(string projectName, int expectedExitCode = 42, string expectedOutput = "Hello, World!", string runtimeConfigContents = "", - params string[] extraArgs) + string extraArgs = "") { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "DotnetRun"); UpdateFile(Path.Combine("Common", "Program.cs"), programText); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index 7aae0e244fade4..b68f56adba94fb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -19,7 +19,7 @@ public WasmNativeDefaultsTests(ITestOutputHelper output, SharedBuildPerTestClass { } - public static TheoryData SettingDifferentFromValuesInRuntimePack(bool forPublish) + public static TheoryData SettingDifferentFromValuesInRuntimePack(bool forPublish) { List<(string propertyName, bool defaultValueInRuntimePack)> defaults = new() { @@ -30,9 +30,9 @@ public static TheoryData SettingDifferentFromV // ("WasmNativeStrip", true) -- tested separately because it has special handling in targets }; - TheoryData data = new(); + TheoryData data = new(); - string[] configs = new[] { Configuration.Debug, Configuration.Release }; + var configs = new[] { Configuration.Debug, Configuration.Release }; foreach (var defaultPair in defaults) { foreach (Configuration config in configs) @@ -54,9 +54,9 @@ public static TheoryData SettingDifferentFromV return data; } - public static TheoryData DefaultsTestData(bool forPublish) + public static TheoryData DefaultsTestData(bool forPublish) { - TheoryData data = new() + TheoryData data = new() { /* relink by default for publish+Release */ { Configuration.Release, "", /*aot*/ false, /*build*/ false, /*publish*/ true }, @@ -117,7 +117,7 @@ public void DefaultsWithPublish(Configuration config, string extraProperties, bo } #pragma warning restore xunit1026 - public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() + public static TheoryData SetWasmNativeStripExplicitlyTestData(bool publish) => new() { {Configuration.Debug, "true", /*wasmBuildNative*/ false, /*wasmNativeStrip*/ true }, {Configuration.Release, "true", /*wasmBuildNative*/ publish, /*wasmNativeStrip*/ true }, @@ -125,7 +125,7 @@ public void DefaultsWithPublish(Configuration config, string extraProperties, bo {Configuration.Release, "false", /*wasmBuildNative*/ true, /*wasmNativeStrip*/ false } }; - public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() + public static TheoryData SetWasmNativeStripExplicitlyWithWasmBuildNativeTestData() => new() { { Configuration.Debug, "falsetrue", true, false }, { Configuration.Release, "falsetrue", true, false }, diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index feecd0ff68db10..cd70bf29a4ce38 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -22,7 +22,7 @@ public async void RunOutOfAppBundle(Configuration config, bool aot) UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); (string _, string output) = PublishProject(info, config, new PublishOptions(AOT: aot)); - string binFrameworkDir = GetBinFrameworkDir(config, isPublish: true); + string binFrameworkDir = GetBinFrameworkDir(config, forPublish: true); string appBundleDir = Path.Combine(binFrameworkDir, ".."); string outerDir = Path.GetFullPath(Path.Combine(appBundleDir, "..")); string indexHtmlPath = Path.Combine(appBundleDir, "index.html"); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 8f688e7e219b03..90b020b7d925e1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -30,7 +30,7 @@ public async void Build_NoAOT_ShouldNotRelink(Configuration config, bool aot, bo { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_with_workload_no_aot"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); - (string _, string output) = BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:WasmEnableSIMD=true")); + (string _, string output) = BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmEnableSIMD={simd}")); // Confirm that we didn't relink Assert.DoesNotContain("Compiling native assets with emcc", output); @@ -53,7 +53,7 @@ public async void PublishSIMD_AOT(Configuration config, bool aot, bool simd) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "simd_publish"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); - (string _, string output) = PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: "-p:WasmEnableSIMD=true", AOT: aot)); + (string _, string output) = PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: $"-p:WasmEnableSIMD={simd}", AOT: aot)); RunResult result = await RunForPublishWithWebServer(new( config, diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index a33216e362a917..735d61e18c4f43 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -68,15 +68,28 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp return res; } - - public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool expectNativeBuild=false) + public NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isUsingWorkloads, bool isNativeBuild=false) => + isNativeBuild ? NativeFilesType.Relinked : + !isPublish ? NativeFilesType.FromRuntimePack : + isAOT ? NativeFilesType.AOT : + (config == Configuration.Debug || !isUsingWorkloads) ? + NativeFilesType.FromRuntimePack : + NativeFilesType.Relinked; + + public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool expectNativeBuild=false) { + string frameworkDir = string.IsNullOrEmpty(buildOptions.NonDefaultFrameworkDir) ? + GetBinFrameworkDir(config, buildOptions.IsPublish, _defaultTargetFramework) : + buildOptions.NonDefaultFrameworkDir; + AssertBundle(new AssertBundleOptions( + config, BuildOptions: buildOptions, + ExpectedFileType: GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, isUsingWorkloads, expectNativeBuild), + BinFrameworkDir: frameworkDir, ExpectSymbolsFile: true, AssertIcuAssets: true, - AssertSymbolsFile: false, - ExpectedFileType: GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, expectNativeBuild) + AssertSymbolsFile: false )); } @@ -86,7 +99,7 @@ private void AssertBundle(AssertBundleOptions assertOptions) if (assertOptions.BuildOptions.IsPublish) { - string publishPath = Path.GetFullPath(Path.Combine(assertOptions.BuildOptions.BinFrameworkDir, "..", "..")); + string publishPath = Path.GetFullPath(Path.Combine(assertOptions.BinFrameworkDir, "..", "..")); Assert.Equal("publish", Path.GetFileName(publishPath)); var dlls = Directory.EnumerateFiles(publishPath, "*.dll"); @@ -100,7 +113,7 @@ private void AssertBundle(AssertBundleOptions assertOptions) return; // Compare files with the runtime pack - string objBuildDir = Path.Combine(ProjectDir!, "obj", assertOptions.BuildOptions.Configuration, assertOptions.BuildOptions.TargetFramework, "wasm", assertOptions.BuildOptions.IsPublish ? "for-publish" : "for-build"); + string objBuildDir = Path.Combine(ProjectDir!, "obj", assertOptions.Configuration.ToString(), assertOptions.BuildOptions.TargetFramework, "wasm", assertOptions.BuildOptions.IsPublish ? "for-publish" : "for-build"); string runtimeNativeDir = BuildTestBase.s_buildEnv.GetRuntimeNativeDir(assertOptions.BuildOptions.TargetFramework, assertOptions.BuildOptions.RuntimeType); @@ -149,18 +162,19 @@ private void AssertBundle(AssertBundleOptions assertOptions) } } - public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool expectNativeBuild = false, string? buildOutput = null) + public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool expectNativeBuild = false, string? buildOutput = null) { if (buildOutput is not null) ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework); - AssertBundle(config, buildOptions, expectNativeBuild); + AssertBundle(config, buildOptions, isUsingWorkloads, expectNativeBuild); } public BuildPaths GetBuildPaths(Configuration configuration, bool forPublish) { Assert.NotNull(ProjectDir); - string objDir = Path.Combine(ProjectDir, "obj", configuration, _defaultTargetFramework); - string binDir = Path.Combine(ProjectDir, "bin", configuration, _defaultTargetFramework); + string configStr = configuration.ToString(); + string objDir = Path.Combine(ProjectDir, "obj", configStr, _defaultTargetFramework); + string binDir = Path.Combine(ProjectDir, "bin", configStr, _defaultTargetFramework); string binFrameworkDir = GetBinFrameworkDir(configuration, forPublish, _defaultTargetFramework); string objWasmDir = Path.Combine(objDir, "wasm", forPublish ? "for-publish" : "for-build"); From 565ad73aeffc066bf0ccc7b8978c320e7d7a8e54 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 28 Nov 2024 13:10:48 +0000 Subject: [PATCH 064/104] Feedback: non-nullable _projectDir. --- .../Blazor/BlazorWasmTestBase.cs | 10 +++---- .../Blazor/BuildPublishTests.cs | 6 ++--- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 10 +++---- .../Wasm.Build.Tests/Blazor/MiscTests2.cs | 2 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 4 +-- .../Blazor/NoopNativeRebuildTest.cs | 4 +-- .../Blazor/WorkloadRequiredTests.cs | 2 +- .../wasm/Wasm.Build.Tests/BuildTestBase.cs | 6 ++--- .../Wasm.Build.Tests/NativeLibraryTests.cs | 12 ++++----- .../NonWasmTemplateBuildTests.cs | 2 +- .../PInvokeTableGeneratorTests.cs | 18 ++++++------- .../SatelliteAssembliesTests.cs | 16 ++++++------ .../Templates/NativeBuildTests.cs | 4 +-- .../Templates/WasmTemplateTests.cs | 2 +- .../Templates/WasmTemplateTestsBase.cs | 26 +++++++++---------- .../TestAppScenarios/InterpPgoTests.cs | 4 +-- .../TestAppScenarios/SatelliteLoadingTests.cs | 4 +-- 17 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 1f1d52824dded7..04c2fb535d8aae 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -90,12 +90,12 @@ public string CreateBlazorWasmTemplateProject(string id) { InitBlazorWasmProjectDir(id); using DotNetCommand dotnetCommand = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); - CommandResult result = dotnetCommand.WithWorkingDirectory(_projectDir!) + CommandResult result = dotnetCommand.WithWorkingDirectory(_projectDir) .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) .ExecuteWithCapturedOutput("new blazorwasm") .EnsureSuccessful(); - return Path.Combine(_projectDir!, $"{id}.csproj"); + return Path.Combine(_projectDir, $"{id}.csproj"); } protected (string projectDir, string buildOutput) BlazorBuild(ProjectInfo info, Configuration config, bool isNativeBuild = false) => @@ -122,7 +122,7 @@ public string CreateBlazorWasmTemplateProject(string id) catch (XunitException xe) { if (xe.Message.Contains("error CS1001: Identifier expected")) - Utils.DirectoryCopy(_projectDir!, _logPath, testOutput: _testOutput); + Utils.DirectoryCopy(_projectDir, _logPath, testOutput: _testOutput); throw; } } @@ -151,7 +151,7 @@ public string CreateBlazorWasmTemplateProject(string id) catch (XunitException xe) { if (xe.Message.Contains("error CS1001: Identifier expected")) - Utils.DirectoryCopy(_projectDir!, _logPath, testOutput: _testOutput); + Utils.DirectoryCopy(_projectDir, _logPath, testOutput: _testOutput); throw; } } @@ -181,7 +181,7 @@ public void AssertBundle(Configuration config, string buildOutput, MSBuildOption Assert.DoesNotContain("Microsoft.JSInterop.WebAssembly.dll -> Microsoft.JSInterop.WebAssembly.dll.bc", buildOutput); } - string objBuildDir = Path.Combine(_projectDir!, "obj", config.ToString(), buildOptions.TargetFramework!, "wasm", "for-build"); + string objBuildDir = Path.Combine(_projectDir, "obj", config.ToString(), buildOptions.TargetFramework!, "wasm", "for-build"); // Check that we linked only for publish if (buildOptions is PublishOptions publishOptions && publishOptions.ExpectRelinkDirWhenPublishing) Assert.True(Directory.Exists(objBuildDir), $"Could not find expected {objBuildDir}, which gets created when relinking during Build. This is likely a test authoring error"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 6684e0164dd8a8..9d74410b7e3847 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -122,7 +122,7 @@ public void DefaultTemplate_WithResources_Publish(Configuration config) foreach (string culture in cultures) Assert.True(File.Exists(Path.Combine(resxSourcePath, $"words.{culture}.resx"))); - Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir!, "resx")); + Utils.DirectoryCopy(resxSourcePath, Path.Combine(_projectDir, "resx")); // Build and assert resource dlls BlazorBuild(info, config); @@ -158,8 +158,8 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL BlazorPublish(info, config); await RunForPublishWithWebServer(new(config)); - string frameworkDir = Path.Combine(_projectDir!, "bin", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); - string objBuildDir = Path.Combine(_projectDir!, "obj", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); + string frameworkDir = Path.Combine(_projectDir, "bin", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); + string objBuildDir = Path.Combine(_projectDir, "obj", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); WasmTemplateTests.TestWasmStripILAfterAOTOutput(objBuildDir, frameworkDir, expectILStripping, _testOutput); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index 09d7a6a4a093fb..f1e86957bf8331 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -29,12 +29,12 @@ public void Blazor_BuildThenClean_NativeRelinking(Configuration config) ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean", extraProperties: extraProperties); BlazorBuild(info, config, isNativeBuild: true); - string relinkDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + string relinkDir = Path.Combine(_projectDir, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); string logPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}-clean.binlog"); using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); + .WithWorkingDirectory(_projectDir); cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") .EnsureSuccessful(); @@ -65,7 +65,7 @@ private void Blazor_BuildNativeNonNative_ThenCleanTest(Configuration config, boo new BuildOptions(ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), isNativeBuild: relink); - string relinkDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); + string relinkDir = Path.Combine(_projectDir, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); if (relink) Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); @@ -80,8 +80,8 @@ private void Blazor_BuildNativeNonNative_ThenCleanTest(Configuration config, boo string logPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}-clean.binlog"); using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); - cmd.WithEnvironmentVariable("NUGET_PACKAGES", _projectDir!) + .WithWorkingDirectory(_projectDir); + cmd.WithEnvironmentVariable("NUGET_PACKAGES", _projectDir) .ExecuteWithCapturedOutput("build", "-t:Clean", $"-p:Configuration={config}", $"-bl:{logPath}") .EnsureSuccessful(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs index 83c6fef7b990fb..7996543e35ec31 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs @@ -56,7 +56,7 @@ private CommandResult PublishForRequiresWorkloadTest(Configuration config, strin string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); - return cmd.WithWorkingDirectory(_projectDir!) + return cmd.WithWorkingDirectory(_projectDir) .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) .ExecuteWithCapturedOutput("publish", $"-bl:{publishLogPath}", diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index e5be0bfba2fc25..e0ec338eaf66d9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -40,8 +40,8 @@ public async Task WithDllImportInMainAssembly(Configuration config, bool build, prefix += "publish"; string extraItems = @""; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraItems: extraItems); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "MyDllImport.cs"), Path.Combine(_projectDir!, "Pages", "MyDllImport.cs")); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "mylib.cpp"), Path.Combine(_projectDir!, "mylib.cpp")); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "MyDllImport.cs"), Path.Combine(_projectDir, "Pages", "MyDllImport.cs")); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "mylib.cpp"), Path.Combine(_projectDir, "mylib.cpp")); UpdateFile(Path.Combine("Pages", "MyDllImport.cs"), new Dictionary { { "##NAMESPACE##", info.ProjectName } }); BlazorAddRazorButton("cpp_add", """ diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 433ab5b2ea37b4..92157b76caaafb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -30,7 +30,7 @@ public void BlazorNoopRebuild(Configuration config) File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); - string objDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm"); + string objDir = Path.Combine(_projectDir, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm"); var pathsDict = _provider.GetFilesTable(true, objDir); pathsDict.Remove("runtime-icall-table.h"); var originalStat = _provider.StatFiles(pathsDict); @@ -56,7 +56,7 @@ public void BlazorOnlyLinkRebuild(Configuration config) File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); - string objDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm"); + string objDir = Path.Combine(_projectDir, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm"); var pathsDict = _provider.GetFilesTable(true, objDir); pathsDict.Remove("runtime-icall-table.h"); pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js", "emcc-link.rsp"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index 5c93c28a5e7631..45ed789ef50e10 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -87,7 +87,7 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(Configuration con { ccText, $"{ccText}\nTestInvariantCulture();" }, { "private int currentCount = 0;", $"{s_invariantCultureMethodForBlazor}" } }); - string counterPath = Path.Combine(_projectDir!, "Pages", "Counter.razor"); + string counterPath = Path.Combine(_projectDir, "Pages", "Counter.razor"); string allText = File.ReadAllText(counterPath); _testOutput.WriteLine($"Updated counter.razor: {allText}"); diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 491dac731410ba..a8f36495f9032d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -67,9 +67,9 @@ public static string GetNuGetConfigPathFor(string targetFramework) public TProvider GetProvider() where TProvider : ProjectProviderBase => (TProvider)_providerOfBaseType; - protected string? _projectDir + protected string _projectDir { - get => _providerOfBaseType.ProjectDir; + get => _providerOfBaseType.ProjectDir!; set => _providerOfBaseType.ProjectDir = value; } @@ -160,7 +160,7 @@ public BuildTestBase(ProjectProviderBase providerBase, ITestOutputHelper output, commandLineArgs.Append("-p:WasmBuildOnlyAfterPublish=true"); using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); + .WithWorkingDirectory(_projectDir); cmd.WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) .WithEnvironmentVariables(buildOptions.ExtraBuildEnvironmentVariables); if (UseWBTOverridePackTargets && s_buildEnv.IsWorkload) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index a13828b2c74907..521b9d510209cd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -28,9 +28,9 @@ public async Task ProjectWithNativeReference(Configuration config, bool aot) string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems, extraProperties: extraProperties); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir!, objectFilename)); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); - DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir, objectFilename)); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir, overwrite: true); + DeleteFile(Path.Combine(_projectDir, "Common", "Program.cs")); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun")); @@ -84,9 +84,9 @@ public async Task ProjectWithNativeLibrary(Configuration config, bool aot) { string extraItems = "\n"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir!, overwrite: true); - DeleteFile(Path.Combine(_projectDir!, "Common", "Program.cs")); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir!, "native-lib.o")); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir, overwrite: true); + DeleteFile(Path.Combine(_projectDir, "Common", "Program.cs")); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); diff --git a/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs index f6ea17aed0c34e..f383864a4b4de7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NonWasmTemplateBuildTests.cs @@ -113,7 +113,7 @@ private void NonWasmConsoleBuild(Configuration config, File.WriteAllText(Path.Combine(_projectDir, "Directory.Build.targets"), directoryBuildTargets); using ToolCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false) - .WithWorkingDirectory(_projectDir!); + .WithWorkingDirectory(_projectDir); cmd.ExecuteWithCapturedOutput("new console --no-restore") .EnsureSuccessful(); diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 1ab31a35a5defc..26795dc6f224c1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -302,14 +302,14 @@ public void IcallWithOverloadedParametersAndEnum(Configuration config, bool aot) // build a library containing icalls with overloaded parameters. ReplaceFile(Path.Combine("..", "Library", "Library.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ICall_Lib.cs")); // temporarily change the project directory to build the library - _projectDir = Path.Combine(_projectDir!, "..", "Library"); + _projectDir = Path.Combine(_projectDir, "..", "Library"); bool isPublish = false; // libraries do not have framework dirs string hypotheticalFrameworkDir = Path.Combine(GetBinFrameworkDir(config, isPublish)); string libAssemblyPath = Path.Combine(hypotheticalFrameworkDir, "..", ".."); BuildProject(info, config, new BuildOptions(AssertAppBundle: false, AOT: aot)); // restore the project directory - _projectDir = Path.Combine(_projectDir!, "..", "App"); + _projectDir = Path.Combine(_projectDir, "..", "App"); string icallTable = """ @@ -320,7 +320,7 @@ public void IcallWithOverloadedParametersAndEnum(Configuration config, bool aot) ] """; - UpdateFile(Path.Combine(_projectDir!, "runtime-icall-table.h"), icallTable); + UpdateFile(Path.Combine(_projectDir, "runtime-icall-table.h"), icallTable); string tasksDir = Path.Combine(s_buildEnv.WorkloadPacksDir, "Microsoft.NET.Runtime.WebAssembly.Sdk", @@ -378,7 +378,7 @@ public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BuildNative.cs")); string cCodeFilename = "simple.c"; - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir, cCodeFilename)); var extraEnvVars = new Dictionary { { "LANG", culture }, @@ -413,7 +413,7 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Con ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); int baseArg = 10; - GenerateSourceFiles(_projectDir!, baseArg); + GenerateSourceFiles(_projectDir, baseArg); bool isPublish = aot; (_, string output) = isPublish ? PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true): @@ -463,7 +463,7 @@ private ProjectInfo PrepreProjectForVariadicFuntion(Configuration config, bool a extraProperties += "true<_WasmDevel>true"; string extraItems = $""; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraItems: extraItems, extraProperties: extraProperties); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir!, objectFilename)); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir, objectFilename)); return info; } @@ -485,14 +485,14 @@ private async Task EnsureWasmAbiRulesAreFollowed(Configuration config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "AbiRules.cs")); string cCodeFilename = "wasm-abi.c"; - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir, cCodeFilename)); bool isPublish = aot; (string _, string _) = isPublish ? PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true) : BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); - string objDir = Path.Combine(_projectDir!, "obj", config.ToString(), DefaultTargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); + string objDir = Path.Combine(_projectDir, "obj", config.ToString(), DefaultTargetFramework, "wasm", isPublish ? "for-publish" : "for-build"); // Verify that the right signature was added for the pinvoke. We can't determine this by examining the m2n file // FIXME: Not possible in in-process mode for some reason, even with verbosity at "diagnostic" @@ -552,7 +552,7 @@ public async void UCOWithSpecialCharacters(Configuration config, bool aot) ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "uoc", extraItems: extraItems, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallback.cs")); string cCodeFilename = "local.c"; - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir!, cCodeFilename)); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir, cCodeFilename)); PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); RunResult result = await RunForPublishWithWebServer(new( diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index e51842e4ca1fa7..e4643dee6f416d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -40,7 +40,7 @@ public async void ResourcesFromMainAssembly(Configuration config, bool aot, bool + $"-O0 -sASSERTIONS=1" + $"-O1"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir!, "resx")); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir, "resx")); CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); (_, string output) = PublishProject(info, config, new PublishOptions(UseCache: false, AOT: aot), isNativeBuild: nativeRelink); @@ -69,18 +69,18 @@ public async void ResourcesFromProjectReference(Configuration config, bool aot, ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties, extraItems: extraItems); // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't // affect the non-wasm library project - File.Move(Path.Combine(_projectDir!, "..", "Directory.Build.props"), Path.Combine(_projectDir!, "Directory.Build.props")); - File.Move(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), Path.Combine(_projectDir!, "Directory.Build.targets")); + File.Move(Path.Combine(_projectDir, "..", "Directory.Build.props"), Path.Combine(_projectDir, "Directory.Build.props")); + File.Move(Path.Combine(_projectDir, "..", "Directory.Build.targets"), Path.Combine(_projectDir, "Directory.Build.targets")); if (UseWBTOverridePackTargets) - File.Move(Path.Combine(BuildEnvironment.TestDataPath, "WasmOverridePacks.targets"), Path.Combine(_projectDir!, "WasmOverridePacks.targets")); + File.Move(Path.Combine(BuildEnvironment.TestDataPath, "WasmOverridePacks.targets"), Path.Combine(_projectDir, "WasmOverridePacks.targets")); Utils.DirectoryCopy( Path.Combine(BuildEnvironment.TestAssetsPath, "SatelliteAssemblyFromProjectRef/LibraryWithResources"), - Path.Combine(_projectDir!, "..", "LibraryWithResources")); + Path.Combine(_projectDir, "..", "LibraryWithResources")); CreateProgramForCultureTest("LibraryWithResources.resx.words", "LibraryWithResources.Class1"); // move src/mono/wasm/testassets/SatelliteAssemblyFromProjectRef/LibraryWithResources to the test project // The root D.B* should be empty - File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.props"), ""); - File.WriteAllText(Path.Combine(_projectDir!, "..", "Directory.Build.targets"), ""); + File.WriteAllText(Path.Combine(_projectDir, "..", "Directory.Build.props"), ""); + File.WriteAllText(Path.Combine(_projectDir, "..", "Directory.Build.targets"), ""); // NativeFilesType dotnetWasmFileType = nativeRelink ? NativeFilesType.Relinked : aot ? NativeFilesType.AOT : NativeFilesType.FromRuntimePack; PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: nativeRelink); @@ -104,7 +104,7 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(Configuration config, bool a PublishProject(info, config, new PublishOptions(AOT: aot)); - var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir!, "obj"), "*.dll.bc", SearchOption.AllDirectories) + var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir, "obj"), "*.dll.bc", SearchOption.AllDirectories) .Select(path => Path.GetFileName(path)) .ToArray(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index cf03c43cc5ca8e..af0470fbbe560f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -45,7 +45,7 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined) extraProperties: extraProperties ); UpdateFile("Program.cs", code); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir!, "undefined_xyz.c")); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir, "undefined_xyz.c")); (string _, string buildOutput) = BuildProject(info, config, new BuildOptions(ExpectSuccess: allowUndefined), isNativeBuild: true); if (!allowUndefined) @@ -70,7 +70,7 @@ public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter( extraItems: extraItems ); string nativeCode = "void call_needing_marhsal_ilgen(void *x) {}"; - File.WriteAllText(path: Path.Combine(_projectDir!, nativeSourceFilename), nativeCode); + File.WriteAllText(path: Path.Combine(_projectDir, nativeSourceFilename), nativeCode); UpdateBrowserMainJs(); ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs")); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 1af9ef45454ea0..05a7630614d059 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -82,7 +82,7 @@ private async Task BrowserRunTwiceWithAndThenWithoutBuildAsync(Configuration con UpdateBrowserProgramFile(); UpdateBrowserMainJs(); - string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir!; + string workingDir = runOutsideProjectDirectory ? BuildEnvironment.TmpPath : _projectDir; { using var runCommand = new RunCommand(s_buildEnv, _testOutput) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 34e2586f3cb669..66ce500084315e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -72,12 +72,12 @@ public ProjectInfo CreateWasmTemplateProject( extraArgs += $" -f {DefaultTargetFramework}"; using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput, useDefaultArgs: false); - CommandResult result = cmd.WithWorkingDirectory(_projectDir!) + CommandResult result = cmd.WithWorkingDirectory(_projectDir) .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) .ExecuteWithCapturedOutput($"new {template.ToString().ToLower()} {extraArgs}") .EnsureSuccessful(); - string projectFilePath = Path.Combine(_projectDir!, $"{projectName}.csproj"); + string projectFilePath = Path.Combine(_projectDir, $"{projectName}.csproj"); UpdateProjectFile(projectFilePath, runAnalyzers, extraProperties, extraItems, insertAtEnd); return new ProjectInfo(projectName, projectFilePath, logPath, nugetDir); } @@ -95,12 +95,12 @@ protected ProjectInfo CopyTestAsset( { (string projectName, string logPath, string nugetDir) = InitProjectLocation(idPrefix, config, aot, appendUnicodeToPath, avoidAotLongPathIssue: s_isWindows && aot); - Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, asset.Name), Path.Combine(_projectDir!)); + Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, asset.Name), Path.Combine(_projectDir)); if (!string.IsNullOrEmpty(asset.RunnableProjectSubPath)) { - _projectDir = Path.Combine(_projectDir!, asset.RunnableProjectSubPath); + _projectDir = Path.Combine(_projectDir, asset.RunnableProjectSubPath); } - string projectFilePath = Path.Combine(_projectDir!, $"{asset.Name}.csproj"); + string projectFilePath = Path.Combine(_projectDir, $"{asset.Name}.csproj"); UpdateProjectFile(projectFilePath, runAnalyzers, extraProperties, extraItems, insertAtEnd); return new ProjectInfo(asset.Name, projectFilePath, logPath, nugetDir); } @@ -152,19 +152,19 @@ public virtual (string projectDir, string buildOutput) BuildProject( (CommandResult res, string logFilePath) = BuildProjectWithoutAssert(configuration, info.ProjectName, buildOptions); if (buildOptions.UseCache) - _buildContext.CacheBuild(info, new BuildResult(_projectDir!, logFilePath, true, res.Output)); + _buildContext.CacheBuild(info, new BuildResult(_projectDir, logFilePath, true, res.Output)); if (!buildOptions.ExpectSuccess) { res.EnsureFailed(); - return (_projectDir!, res.Output); + return (_projectDir, res.Output); } if (buildOptions.AssertAppBundle) { _provider.AssertWasmSdkBundle(configuration, buildOptions, IsUsingWorkloads, isNativeBuild, res.Output); } - return (_projectDir!, res.Output); + return (_projectDir, res.Output); } private string StringReplaceWithAssert(string oldContent, string oldValue, string newValue) @@ -181,7 +181,7 @@ protected void UpdateBrowserProgramFile() => protected void UpdateFile(string pathRelativeToProjectDir, Dictionary replacements) { - var path = Path.Combine(_projectDir!, pathRelativeToProjectDir); + var path = Path.Combine(_projectDir, pathRelativeToProjectDir); string text = File.ReadAllText(path); foreach (var replacement in replacements) { @@ -192,7 +192,7 @@ protected void UpdateFile(string pathRelativeToProjectDir, Dictionary RunForPublishWithWebServer(RunOptions runOp private async Task BrowserRun(RunOptions runOptions) => runOptions.Host switch { RunHost.DotnetRun => - await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir!, runOptions), + await BrowserRunTest($"run -c {runOptions.Configuration} --no-build", _projectDir, runOptions), RunHost.WebServer => await BrowserRunTest($"{s_xharnessRunnerCommand} wasm webserver --app=. --web-server-use-default-files", diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs index 17998c96c87619..4af9d131db8d5e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs @@ -44,9 +44,9 @@ public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(Configuration config // Create a single browser instance and single context to host all our pages. // If we don't do this, each page will have its own unique cache and the table won't be loaded. using var runCommand = new RunCommand(s_buildEnv, _testOutput) - .WithWorkingDirectory(_projectDir!); + .WithWorkingDirectory(_projectDir); await using var runner = new BrowserRunner(_testOutput); - var url = await runner.StartServerAndGetUrlAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{_projectDir!}\" --forward-console"); + var url = await runner.StartServerAndGetUrlAsync(runCommand, $"run --no-silent -c {config} --no-build --project \"{_projectDir}\" --forward-console"); url = $"{url}?test=InterpPgoTest&iterationCount={iterationCount}"; _testOutput.WriteLine($"/// Spawning browser at URL {url}"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index cb876878b70442..196ea84672dc21 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -64,7 +64,7 @@ public async Task LoadSatelliteAssemblyFromReference() ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTestsFromReference"); // Replace ProjectReference with Reference - var appCsprojPath = Path.Combine(_projectDir!, "WasmBasicTestApp.csproj"); + var appCsprojPath = Path.Combine(_projectDir, "WasmBasicTestApp.csproj"); var appCsproj = XDocument.Load(appCsprojPath); var projectReference = appCsproj.Descendants("ProjectReference").Where(pr => pr.Attribute("Include")?.Value?.Contains("ResourceLibrary") ?? false).Single(); @@ -78,7 +78,7 @@ public async Task LoadSatelliteAssemblyFromReference() appCsproj.Save(appCsprojPath); // Build the library - var libraryCsprojPath = Path.GetFullPath(Path.Combine(_projectDir!, "..", "ResourceLibrary")); + var libraryCsprojPath = Path.GetFullPath(Path.Combine(_projectDir, "..", "ResourceLibrary")); using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); CommandResult res = cmd.WithWorkingDirectory(libraryCsprojPath) .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) From e5abb4afd007aa265863e5192c7531cffbbc5eba Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:32:58 +0000 Subject: [PATCH 065/104] Fix wasi build. --- .../Wasm.Build.Tests/Common/BuildAndRunAttribute.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs index 125b5e368f7f6d..609834bc6bf6a2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Common/BuildAndRunAttribute.cs @@ -22,13 +22,23 @@ public class BuildAndRunAttribute : DataAttribute { private readonly IEnumerable _data; + +#if TARGET_WASI + // remove when wasi is refectored and use Configuration + public BuildAndRunAttribute(bool aot=false, string? config=null, params object?[] parameters) + { + _data = BuildTestBase.ConfigWithAOTData(aot, config) + .Multiply(parameters) + .UnwrapItemsAsArrays().ToList(); + } +#else public BuildAndRunAttribute(bool aot=false, Configuration config=Configuration.Undefined, params object?[] parameters) { _data = BuildTestBase.ConfigWithAOTData(aot, config) .Multiply(parameters) .UnwrapItemsAsArrays().ToList(); } - +#endif public override IEnumerable GetData(MethodInfo testMethod) => _data; } } From f875a23144b98d11157d577665961c67814147a9 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 28 Nov 2024 15:31:09 +0000 Subject: [PATCH 066/104] Feedback: cleanup `RunOptions`. --- .../Blazor/AppsettingsTests.cs | 2 +- .../Blazor/BlazorRunOptions.cs | 55 +++++++++++++++++++ .../Blazor/BlazorWasmTestBase.cs | 2 +- .../Blazor/BuildPublishTests.cs | 6 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 2 +- .../Blazor/SimpleMultiThreadedTests.cs | 4 +- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 6 +- .../Blazor/WorkloadRequiredTests.cs | 2 +- .../BrowserStructures/BrowserRunOptions.cs | 50 +++++++++++++++++ .../BrowserStructures/PublishOptions.cs | 10 +++- .../BrowserStructures/RunOptions.cs | 7 +-- .../Wasm.Build.Tests/BuildPublishTests.cs | 4 +- .../HybridGlobalizationTests.cs | 2 +- .../wasm/Wasm.Build.Tests/IcuTestsBase.cs | 2 +- .../InvariantGlobalizationTests.cs | 2 +- .../InvariantTimezoneTests.cs | 2 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 2 +- .../wasm/Wasm.Build.Tests/NativeBuildTests.cs | 2 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 10 ++-- .../FlagsChangeRebuildTest.cs | 2 +- .../NativeRebuildTestsBase.cs | 2 +- .../NoopNativeRebuildTest.cs | 2 +- .../OptimizationFlagChangeTests.cs | 2 +- .../ReferenceNewAssemblyRebuildTest.cs | 2 +- .../SimpleSourceChangeRebuildTest.cs | 2 +- .../PInvokeTableGeneratorTests.cs | 24 ++++---- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 2 +- .../SatelliteAssembliesTests.cs | 5 +- .../wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 2 +- .../Templates/NativeBuildTests.cs | 2 +- .../Templates/WasmTemplateTests.cs | 6 +- .../Templates/WasmTemplateTestsBase.cs | 8 +-- .../TestAppScenarios/AppSettingsTests.cs | 2 +- .../TestAppScenarios/DebugLevelTests.cs | 10 ++-- .../TestAppScenarios/DownloadThenInitTests.cs | 2 +- .../TestAppScenarios/LazyLoadingTests.cs | 4 +- .../LibraryInitializerTests.cs | 4 +- .../MaxParallelDownloadsTests.cs | 2 +- .../TestAppScenarios/MemoryTests.cs | 8 ++- .../TestAppScenarios/ModuleConfigTests.cs | 6 +- .../TestAppScenarios/SatelliteLoadingTests.cs | 4 +- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 2 +- .../WasmRunOutOfAppBundleTests.cs | 2 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 4 +- 44 files changed, 195 insertions(+), 88 deletions(-) create mode 100644 src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs index 97244d76e5f241..fa47fc4b458717 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/AppsettingsTests.cs @@ -42,7 +42,7 @@ var builder (string _, string buildOutput) = BlazorBuild(info, config); bool existsChecked = false; bool contentChecked = false; - await RunForBuildWithDotnetRun(new( + await RunForBuildWithDotnetRun(new BlazorRunOptions( config, OnConsoleMessage: (_, msg) => { if (msg.Contains("appSettings Exists 'True'")) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs new file mode 100644 index 00000000000000..851f08a10d4356 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs @@ -0,0 +1,55 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Playwright; + +#nullable enable + +namespace Wasm.Build.Tests; +public record BlazorRunOptions : RunOptions +{ + public bool CheckCounter { get; init; } + public Func? Test { get; init; } + + public BlazorRunOptions( + Configuration Configuration, + RunHost Host = RunHost.DotnetRun, + bool DetectRuntimeFailures = true, + Dictionary? ServerEnvironment = null, + Dictionary? BrowserQueryString = null, + Action? OnConsoleMessage = null, + Action? OnServerMessage = null, + Action? OnErrorMessage = null, + string ExtraArgs = "", + string BrowserPath = "", + string Locale = "en-US", + int? ExpectedExitCode = 0, + string CustomBundleDir = "", + bool CheckCounter = true, + Func? Test = null, + Func? ExecuteAfterLoaded = null + ) : base( + Configuration, + Host, + DetectRuntimeFailures, + ServerEnvironment, + BrowserQueryString, + OnConsoleMessage, + OnServerMessage, + OnErrorMessage, + ExtraArgs, + BrowserPath, + Locale, + ExpectedExitCode, + CustomBundleDir, + ExecuteAfterLoaded + ) + { + this.CheckCounter = CheckCounter; + this.Test = Test; + } +} + diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 04c2fb535d8aae..b09adbda6956c6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -52,7 +52,7 @@ protected override void OnAfterRender(bool firstRender) private Func? _executeAfterLoaded = async (runOptions, page) => { - if (runOptions.CheckCounter) + if (runOptions is BlazorRunOptions bro && bro.CheckCounter) { await page.Locator("text=Counter").ClickAsync(); var txt = await page.Locator("p[role='status']").InnerHTMLAsync(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 9d74410b7e3847..0d1becc5e6c5a2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -30,10 +30,10 @@ public async Task DefaultTemplate_WithoutWorkload(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_workload"); BlazorBuild(info, config); - await RunForBuildWithDotnetRun(new(config)); + await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); BlazorPublish(info, config, new PublishOptions(UseCache: false)); - await RunForPublishWithWebServer(new(config)); + await RunForPublishWithWebServer(new BlazorRunOptions(config)); } @@ -156,7 +156,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_WasmStripILAfterAOT", extraProperties: extraProperties); BlazorPublish(info, config); - await RunForPublishWithWebServer(new(config)); + await RunForPublishWithWebServer(new BlazorRunOptions(config)); string frameworkDir = Path.Combine(_projectDir, "bin", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "publish", "wwwroot", "_framework"); string objBuildDir = Path.Combine(_projectDir, "obj", config.ToString(), BuildTestBase.DefaultTargetFrameworkForBlazor, "wasm", "for-publish"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index e0ec338eaf66d9..ee9ecc4eb6b28f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -55,7 +55,7 @@ public async Task WithDllImportInMainAssembly(Configuration config, bool build, if (publish) BlazorPublish(info, config, new PublishOptions(UseCache: false), isNativeBuild: true); - RunOptions runOptions = new(config, Test: TestDllImport); + BlazorRunOptions runOptions = new(config, Test: TestDllImport); if (publish) await RunForPublishWithWebServer(runOptions); else diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 61bc98323ae580..341642bbaa59d3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -34,7 +34,7 @@ public async Task BlazorBuildRunTest(Configuration config) BuildProject(info, config, new BuildOptions(RuntimeType: RuntimeVariant.MultiThreaded)); // we wan to use "xharness wasm webserver" but from non-publish location string extraArgs = " --web-server-use-cors --web-server-use-cop --web-server-use-https --timeout=15:00:00"; - await RunForPublishWithWebServer(new(config, ExtraArgs: extraArgs, CustomBundleDir: Path.Combine(frameworkDir, ".."))); + await RunForPublishWithWebServer(new BlazorRunOptions(config, ExtraArgs: extraArgs, CustomBundleDir: Path.Combine(frameworkDir, ".."))); } [ConditionalTheory(typeof(BuildTestBase), nameof(IsWorkloadWithMultiThreadingForDefaultFramework))] @@ -65,7 +65,7 @@ export function onRuntimeReady({ runtimeBuildInfo }) { bool hasEmittedWasmEnableThreads = false; StringBuilder errorOutput = new(); await RunForPublishWithWebServer( - runOptions: new RunOptions( + runOptions: new BlazorRunOptions( Configuration: config, ExtraArgs: "--web-server-use-cors --web-server-use-cop", OnConsoleMessage: (type, message) => diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index e386cef9a8faad..bf23b8b56a4cdd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -29,7 +29,7 @@ public async Task BlazorBuildRunTest(Configuration config) { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); BlazorBuild(info, config); - await RunForBuildWithDotnetRun(new(config)); + await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); } [Theory] @@ -57,7 +57,7 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(Configuration config, projectDir, "bin", info.ProjectName, config.ToString().ToLower(), "wwwroot", "_framework") : GetBinFrameworkDir(config, isPublish); BuildProject(info, config); - await RunForBuildWithDotnetRun(new(config)); + await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); } [Theory] @@ -68,6 +68,6 @@ public async Task BlazorPublishRunTest(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_publish"); BlazorPublish(info, config); - await RunForPublishWithWebServer(new(config)); + await RunForPublishWithWebServer(new BlazorRunOptions(config)); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index 45ed789ef50e10..c2abbec0e019ba 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -96,7 +96,7 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(Configuration con PublishProject(info, config, new PublishOptions(GlobalizationMode: globalizationMode)) : BuildProject(info, config, new BuildOptions(GlobalizationMode: globalizationMode)); - RunOptions runOptions = new(config); + BlazorRunOptions runOptions = new(config); RunResult result = publish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); if (invariant) diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs new file mode 100644 index 00000000000000..e5988d556bd305 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs @@ -0,0 +1,50 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Playwright; + +#nullable enable + +namespace Wasm.Build.Tests; + +public record BrowserRunOptions : RunOptions +{ + public string? TestScenario { get; init; } + + public BrowserRunOptions( + Configuration Configuration, + RunHost Host = RunHost.DotnetRun, + bool DetectRuntimeFailures = true, + Dictionary? ServerEnvironment = null, + Dictionary? BrowserQueryString = null, + Action? OnConsoleMessage = null, + Action? OnServerMessage = null, + Action? OnErrorMessage = null, + string ExtraArgs = "", + string BrowserPath = "", + string Locale = "en-US", + int? ExpectedExitCode = 0, + string CustomBundleDir = "", + string? TestScenario = null + ) : base( + Configuration, + Host, + DetectRuntimeFailures, + ServerEnvironment, + BrowserQueryString, + OnConsoleMessage, + OnServerMessage, + OnErrorMessage, + ExtraArgs, + BrowserPath, + Locale, + ExpectedExitCode, + CustomBundleDir + ) + { + this.TestScenario = TestScenario; + } +} diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs index 4341373d8ccdc4..92516a9b3e7e22 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/PublishOptions.cs @@ -9,8 +9,8 @@ namespace Wasm.Build.Tests; public record PublishOptions : MSBuildOptions { - public bool BuildOnlyAfterPublish { get; init; } = true; - public bool ExpectRelinkDirWhenPublishing { get; init; } = false; + public bool BuildOnlyAfterPublish { get; init; } + public bool ExpectRelinkDirWhenPublishing { get; init; } public PublishOptions( bool IsPublish = true, @@ -28,7 +28,9 @@ public PublishOptions( IDictionary? ExtraBuildEnvironmentVariables = null, string BootConfigFileName = "blazor.boot.json", string NonDefaultFrameworkDir = "", - string ExtraMSBuildArgs = "" + string ExtraMSBuildArgs = "", + bool BuildOnlyAfterPublish = true, + bool ExpectRelinkDirWhenPublishing = false ) : base( IsPublish, AOT, @@ -49,5 +51,7 @@ public PublishOptions( ) { this.IsPublish = IsPublish; + this.BuildOnlyAfterPublish = BuildOnlyAfterPublish; + this.ExpectRelinkDirWhenPublishing = ExpectRelinkDirWhenPublishing; } } \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index c22f20ce6a8e5b..6fcfb36c34ebb1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -9,15 +9,13 @@ #nullable enable namespace Wasm.Build.Tests; -public record RunOptions +public abstract record RunOptions ( Configuration Configuration, RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, - bool CheckCounter = true, + Dictionary? ServerEnvironment = null, - Func? Test = null, - string? TestScenario = null, Dictionary? BrowserQueryString = null, Action? OnConsoleMessage = null, Action? OnServerMessage = null, @@ -27,7 +25,6 @@ public record RunOptions string Locale = "en-US", int? ExpectedExitCode = 0, string CustomBundleDir = "", - Func? ExecuteAfterLoaded = null ); diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 9737dcb1db8f4d..273a95f92ed3c8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -41,7 +41,7 @@ public async Task BuildThenPublishNoAOT(Configuration config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); - RunOptions runOptions = new(config, TestScenario: "DotnetRun"); + BrowserRunOptions runOptions = new(config, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); PublishProject(info, config, new PublishOptions(UseCache: false)); @@ -71,7 +71,7 @@ public async Task BuildThenPublishWithAOT(Configuration config, bool aot) if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); - RunOptions runOptions = new(config, TestScenario: "DotnetRun"); + BrowserRunOptions runOptions = new(config, TestScenario: "DotnetRun"); await RunForBuildWithDotnetRun(runOptions); File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); diff --git a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs index 9e75a1f3f140e6..2e5614a136e9de 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HybridGlobalizationTests.cs @@ -49,7 +49,7 @@ private async Task TestHybridGlobalizationTests(Configuration config, bool aot, UpdateBrowserMainJs(); PublishProject(info, config, new PublishOptions(GlobalizationMode: GlobalizationMode.Hybrid), isNativeBuild: isNativeBuild); - RunResult output = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, ExpectedExitCode: 42)); Assert.Contains(output.TestOutput, m => m.Contains("HybridGlobalization works, thrown exception as expected")); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index 1ac3b00550dba3..3b1fcdd5d10e4e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -156,7 +156,7 @@ protected async Task PublishAndRunIcuTest( new PublishOptions(GlobalizationMode: globalizationMode, CustomIcuFile: icuFileName), isNativeBuild: triggersNativeBuild); - RunOptions runOptions = new(config, Locale: locale, ExpectedExitCode: 42); + BrowserRunOptions runOptions = new(config, Locale: locale, ExpectedExitCode: 42); RunResult runOutput = await RunForPublishWithWebServer(runOptions); return $"{buildOutput}\n{runOutput.TestOutput}"; } diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index e2ac2d6ff0cdaa..c4e03ffad6a92c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -56,7 +56,7 @@ private async Task TestInvariantGlobalization(Configuration config, bool aot, bo var globalizationMode = invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; BuildProject(info, config, new BuildOptions(GlobalizationMode: globalizationMode, AOT: aot), isNativeBuild: isNativeBuild); - RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); if (invariantGlobalization == true) { Assert.Contains(output.TestOutput, m => m.Contains("Could not create es-ES culture")); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 4e97c250752311..1750bcf5a19ca0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -51,7 +51,7 @@ private async Task TestInvariantTimezone(Configuration config, bool aot, bool? i isNativeBuild = isNativeBuild || invariantTimezone == true; PublishProject(info, config, isNativeBuild: isNativeBuild); - RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); Assert.Contains(output.TestOutput, m => m.Contains("UTC BaseUtcOffset is 0")); if (invariantTimezone == true) { diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 04b7039346e1f8..cb9be29b45447c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -58,7 +58,7 @@ async Task TestMainWithArgs(Configuration config, int argsCount = args.Length; int expectedCode = 42 + argsCount; RunResult output = await RunForPublishWithWebServer( - new(config, TestScenario: "DotnetRun", ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); + new BrowserRunOptions(config, TestScenario: "DotnetRun", ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); Assert.Contains(output.TestOutput, m => m.Contains($"args#: {argsCount}")); foreach (var arg in args) Assert.Contains(output.TestOutput, m => m.Contains($"arg: {arg}")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs index 4187b7af0f7903..87b6c0cf0929ec 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeBuildTests.cs @@ -35,7 +35,7 @@ public async Task SimpleNativeBuild(Configuration config, bool aot) UpdateBrowserMainJs(); (string _, string buildOutput) = PublishProject(info, config, isNativeBuild: true); - await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); + await RunForPublishWithWebServer(new BrowserRunOptions(config, ExpectedExitCode: 42)); } [Theory] diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index 521b9d510209cd..ed5bfcf60dabb7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -33,7 +33,7 @@ public async Task ProjectWithNativeReference(Configuration config, bool aot) DeleteFile(Path.Combine(_projectDir, "Common", "Program.cs")); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); - RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun")); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); Assert.Contains(output.TestOutput, m => m.Contains("from pinvoke: 142")); @@ -54,8 +54,8 @@ public async Task ProjectUsingSkiaSharp(Configuration config, bool aot) ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); PublishProject(info, config, new PublishOptions(AOT: aot)); - RunOptions runOptions = new(config, ExtraArgs: "mono.png"); - RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); + BrowserRunOptions runOptions = new(config, ExtraArgs: "mono.png"); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("Size: 26462 Height: 599, Width: 499")); } @@ -68,7 +68,7 @@ public async Task ProjectUsingBrowserNativeCrypto(Configuration config, bool aot ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot)); - RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); string hash = "Hashed: 24 95 141 179 34 113 254 37 245 97 166 252 147 139 46 38 67 6 236 48 78 218 81 128 7 209 118 72 38 56 25 105"; Assert.Contains(output.TestOutput, m => m.Contains(hash)); @@ -89,7 +89,7 @@ public async Task ProjectWithNativeLibrary(Configuration config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); - RunResult output = await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); + RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 0)); Assert.Contains(output.TestOutput, m => m.Contains("print_line: 100")); Assert.Contains(output.TestOutput, m => m.Contains("from pinvoke: 142")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index a839fa39e622f1..389d158888b3f6 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -63,7 +63,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool ao Assert.DoesNotContain("Compiling assembly bitcode files", output); } - RunResult runOutput = await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun")); + RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: aot); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index eeb8b769565403..8e9abcd881d12e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -54,7 +54,7 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, Configu config, new PublishOptions(GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, ExtraMSBuildArgs: extraArgs), isNativeBuild: nativeRelink); - await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun")); + await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); return GetBuildPaths(config, forPublish: true); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index bafc656fee9433..1c4bc1f6068dfa 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -31,7 +31,7 @@ public async void NoOpRebuildForNativeBuilds(Configuration config, bool aot, boo var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new(config, TestScenario: "DotnetRun")); + await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); } [Fact] diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 821e302a3cc056..61e0d7a0361ef0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -64,7 +64,7 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - RunResult runOutput = await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun")); + RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, contains: aot); } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index b371554da0579f..8309427e584403 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -41,7 +41,7 @@ public async void ReferenceNewAssembly(Configuration config, bool aot, bool nati var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (config, ExpectedExitCode: 42, TestScenario: "DotnetRun")); + await RunForPublishWithWebServer(new BrowserRunOptions(config, ExpectedExitCode: 42, TestScenario: "DotnetRun")); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 6370b941362d9d..9c1fa4a0b3e9da 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -43,7 +43,7 @@ public async void SimpleStringChangeInSource(Configuration config, bool aot, boo var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); - await RunForPublishWithWebServer(new (config, TestScenario: "DotnetRun", ExpectedExitCode: 55)); + await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 55)); } } } diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 26795dc6f224c1..bf2b830ee26e2d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -33,7 +33,7 @@ public async void NativeLibraryWithVariadicFunctions(Configuration config, bool Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -52,7 +52,7 @@ public async void DllImportWithFunctionPointersCompilesWithoutWarning(Configurat Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -71,7 +71,7 @@ public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWith Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -109,7 +109,7 @@ public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMars ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "blittable", disableRuntimeMarshalling: true, useAutoLayout: true); (_, string output) = BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); - RunResult result = await RunForBuildWithDotnetRun(new( + RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -175,7 +175,7 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly isNativeBuild: true); if (expectSuccess) { - RunResult result = await RunForBuildWithDotnetRun(new( + RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -200,7 +200,7 @@ public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotContain("warning WASM0001", output); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -231,7 +231,7 @@ public async void UnmanagedCallback_InFileType(Configuration config, bool aot) string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -251,7 +251,7 @@ public async void UnmanagedCallersOnly_Namespaced(Configuration config, bool aot string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 @@ -390,7 +390,7 @@ public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, new PublishOptions(ExtraBuildEnvironmentVariables: extraEnvVars, AOT: aot), isNativeBuild: true); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42, @@ -419,7 +419,7 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Con PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true): BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); - var runOptions = new RunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); + var runOptions = new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); for (int i = 0; i < libraryNames.Length; i ++) @@ -506,7 +506,7 @@ private async Task EnsureWasmAbiRulesAreFollowed(Configuration config, bool aot) Assert.Contains("float accept_double_struct_and_return_float_struct (double);", pinvokeTable); Assert.Contains("int64_t accept_and_return_i64_struct (int64_t);", pinvokeTable); - var runOptions = new RunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 3); + var runOptions = new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 3); RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); Assert.Contains("l (l)=-1148435428713435121", result.TestOutput); Assert.Contains("s (s)=-1148435428713435121", result.TestOutput); @@ -555,7 +555,7 @@ public async void UCOWithSpecialCharacters(Configuration config, bool aot) File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir, cCodeFilename)); PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42 diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index 95873beb8e3df4..afc0528fdc5d37 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -29,7 +29,7 @@ public async Task NoOpRebuild(Configuration config, bool aot) UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); PublishProject(info, config); - RunOptions runOptions = new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); + BrowserRunOptions runOptions = new(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); await RunForPublishWithWebServer(runOptions); if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index e4643dee6f416d..70bf872d1e0bd3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -44,7 +44,7 @@ public async void ResourcesFromMainAssembly(Configuration config, bool aot, bool CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); (_, string output) = PublishProject(info, config, new PublishOptions(UseCache: false, AOT: aot), isNativeBuild: nativeRelink); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42, @@ -86,7 +86,7 @@ public async void ResourcesFromProjectReference(Configuration config, bool aot, PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: nativeRelink); await RunForPublishWithWebServer( - new(Configuration: config, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: argCulture ?? "en-US")); + new BrowserRunOptions(Configuration: config, TestScenario: "DotnetRun", ExpectedExitCode: 42, Locale: argCulture ?? "en-US")); } #pragma warning disable xUnit1026 @@ -101,7 +101,6 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(Configuration config, bool a ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "check_sat_asm_not_aot", extraProperties: extraProperties, extraItems: extraItems); CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); - PublishProject(info, config, new PublishOptions(AOT: aot)); var bitCodeFileNames = Directory.GetFileSystemEntries(Path.Combine(_projectDir, "obj"), "*.dll.bc", SearchOption.AllDirectories) diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index e344b15589d049..afa549f189699c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -25,7 +25,7 @@ protected async Task SignalRPassMessage(string staticWebAssetBasePath, Configura ProjectInfo info = CopyTestAsset(config, false, asset, "SignalRClientTests"); PublishProject(info, config, new PublishOptions(RuntimeType: RuntimeVariant.MultiThreaded, AssertAppBundle: false)); - var result = await RunForPublishWithWebServer(new( + var result = await RunForPublishWithWebServer(new BrowserRunOptions( Configuration: config, ServerEnvironment: new Dictionary { ["ASPNETCORE_ENVIRONMENT"] = "Development" }, BrowserPath: staticWebAssetBasePath, diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index af0470fbbe560f..8d5dee2edf910c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -75,7 +75,7 @@ public async Task ProjectWithDllImportsRequiringMarshalIlGen_ArrayTypeParameter( ReplaceFile("Program.cs", Path.Combine(BuildEnvironment.TestAssetsPath, "marshal_ilgen_test.cs")); (string _, string buildOutput) = BuildProject(info, config, new BuildOptions(AssertAppBundle: false), isNativeBuild: true); - var runOutput = await RunForBuildWithDotnetRun(new(config, ExpectedExitCode: 42)); + var runOutput = await RunForBuildWithDotnetRun(new BrowserRunOptions(config, ExpectedExitCode: 42)); Assert.Contains("call_needing_marhsal_ilgen got called", runOutput.TestOutput); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 05a7630614d059..3cf38f42fc4ca9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -142,7 +142,7 @@ public async Task BrowserBuildAndRun(string extraNewArgs, string targetFramework PublishProject(info, config, new PublishOptions(UseCache: false)); - var runOutput = await RunForPublishWithWebServer(new(config, ExpectedExitCode: 42)); + var runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, ExpectedExitCode: 42)); Assert.Contains("Hello, Browser!", runOutput.TestOutput); } @@ -178,7 +178,7 @@ public async Task BuildAndRunForDifferentOutputPaths(Configuration config, bool AddItemsPropertiesToProject(propsPath, extraPropertiesForDBP); BuildProject(info, config, new BuildOptions(NonDefaultFrameworkDir: frameworkDir)); - await RunForBuildWithDotnetRun(new(config, ExpectedExitCode: 42, ExtraArgs: "x y z")); + await RunForBuildWithDotnetRun(new BrowserRunOptions(config, ExpectedExitCode: 42, ExtraArgs: "x y z")); } [Theory] @@ -197,7 +197,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL UpdateBrowserMainJs(); PublishProject(info, config, new PublishOptions(UseCache: false, AssertAppBundle: false)); - await RunForBuildWithDotnetRun(new(config, ExpectedExitCode: 42)); + await RunForBuildWithDotnetRun(new BrowserRunOptions(config, ExpectedExitCode: 42)); string projectDirectory = Path.GetDirectoryName(info.ProjectFilePath)!; string objBuildDir = Path.Combine(projectDirectory, "obj", config.ToString(), BuildTestBase.DefaultTargetFramework, "wasm", "for-publish"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 66ce500084315e..dd5b4889f75658 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -271,8 +271,8 @@ private async Task BrowserRunTest(string runArgs, ToolCommand cmd = runCommand.WithWorkingDirectory(workingDirectory); var query = runOptions.BrowserQueryString ?? new Dictionary(); - if (!string.IsNullOrEmpty(runOptions.TestScenario)) - query.Add("test", runOptions.TestScenario); + if (runOptions is BrowserRunOptions browserOp && !string.IsNullOrEmpty(browserOp.TestScenario)) + query.Add("test", browserOp.TestScenario); var queryString = query.Any() ? "?" + string.Join("&", query.Select(kvp => $"{kvp.Key}={kvp.Value}")) : ""; List testOutput = new(); @@ -296,8 +296,8 @@ private async Task BrowserRunTest(string runArgs, await runOptions.ExecuteAfterLoaded(runOptions, page); } - if (runOptions.Test is not null) - await runOptions.Test(page); + if (runOptions is BlazorRunOptions blazorOp && blazorOp.Test is not null) + await blazorOp.Test(page); _testOutput.WriteLine($"Waiting for additional 10secs to see if any errors are reported"); int exitCode = await runner.WaitForExitMessageAsync(TimeSpan.FromSeconds(10)); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index f426bc97a14295..0768b437d52b98 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -28,7 +28,7 @@ public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicatio Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "AppSettingsTest"); PublishProject(info, config); - RunOptions options = new( + BrowserRunOptions options = new( config, TestScenario: "AppSettingsTest", BrowserQueryString: new Dictionary { ["applicationEnvironment"] = applicationEnvironment } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index 888e838caedb84..480336a0af4bbf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -35,7 +35,7 @@ public async Task BuildWithDefaultLevel(Configuration configuration) idPrefix: "DebugLevelTests_BuildWithDefaultLevel" ); BuildProject(info, configuration); - RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BrowserRunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForBuildWithDotnetRun(options); AssertDebugLevel(result.TestOutput, -1); } @@ -54,7 +54,7 @@ public async Task BuildWithExplicitValue(Configuration configuration, int debugL idPrefix: "DebugLevelTests_BuildWithExplicitValue" ); BuildProject(info, configuration, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); - RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BrowserRunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForBuildWithDotnetRun(options); AssertDebugLevel(result.TestOutput, debugLevel); } @@ -71,7 +71,7 @@ public async Task PublishWithDefaultLevel(Configuration configuration) idPrefix: "DebugLevelTests_PublishWithDefaultLevel" ); PublishProject(info, configuration); - RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BrowserRunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, 0); } @@ -90,7 +90,7 @@ public async Task PublishWithExplicitValue(Configuration configuration, int debu idPrefix: "DebugLevelTests_PublishWithExplicitValue" ); PublishProject(info, configuration, new PublishOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); - RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BrowserRunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, debugLevel); } @@ -108,7 +108,7 @@ public async Task PublishWithDefaultLevelAndPdbs(Configuration configuration) idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs" ); PublishProject(info, configuration, new PublishOptions(ExtraMSBuildArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true")); - RunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); + BrowserRunOptions options = new(configuration, TestScenario: "DebugLevelTest", ExpectedExitCode: 42); RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, -1); } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index 8cba16d9e272b6..9c382ca7b954e8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -26,7 +26,7 @@ public async Task NoResourcesReFetchedAfterDownloadFinished(Configuration config { ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "DownloadThenInitTests"); BuildProject(info, config); - RunOptions options = new(config, TestScenario: "DownloadThenInit"); + BrowserRunOptions options = new(config, TestScenario: "DownloadThenInit"); RunResult result = await RunForBuildWithDotnetRun(options); var resultTestOutput = result.TestOutput.ToList(); int index = resultTestOutput.FindIndex(s => s.Contains("download finished")); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index 45fa898a340497..0b1faa2cdad72f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -38,7 +38,7 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi // We don't need to rebuild the application to test how client is trying to load the assembly. foreach (var clientLazyLoadingTestExtension in allLazyLoadingTestExtensions) { - RunResult result = await RunForBuildWithDotnetRun(new( + RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "LazyLoadingTest", BrowserQueryString: new Dictionary { ["lazyLoadingTestExtension"] = clientLazyLoadingTestExtension } @@ -56,7 +56,7 @@ public async Task FailOnMissingLazyAssembly() ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: "-p:TestLazyLoading=true")); - RunOptions options = new( + BrowserRunOptions options = new( config, TestScenario: "LazyLoadingTest", BrowserQueryString: new Dictionary { ["loadRequiredAssembly"] = "false" }, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index ff3786a35b711b..b38b3c7b74ef2d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -29,7 +29,7 @@ public async Task LoadLibraryInitializer() Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); PublishProject(info, config); - RunResult result = await RunForPublishWithWebServer(new(config, TestScenario: "LibraryInitializerTest")); + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "LibraryInitializerTest")); Assert.Collection( result.TestOutput, m => Assert.Equal("LIBRARY_INITIALIZER_TEST = 1", m) @@ -46,7 +46,7 @@ public async Task AbortStartupOnError() ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_AbortStartupOnError"); PublishProject(info, config); - RunOptions options = new( + BrowserRunOptions options = new( config, TestScenario: "LibraryInitializerTest", BrowserQueryString: new Dictionary { ["throwError"] = "true" }, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index b95813596d03c7..72b227f8c7048a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -27,7 +27,7 @@ public async Task NeverFetchMoreThanMaxAllowed(Configuration config, string maxP { ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MaxParallelDownloadsTests"); BuildProject(info, config); - RunResult result = await RunForBuildWithDotnetRun(new( + RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "MaxParallelDownloads", BrowserQueryString: new Dictionary { ["maxParallelDownloads"] = maxParallelDownloads } diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index 0b4d4fff774030..4aa5bfb84a7609 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -39,7 +39,10 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop() if (BuildTestBase.IsUsingWorkloads) { - await RunForBuildWithDotnetRun(new (Configuration: config, TestScenario: "AllocateLargeHeapThenInterop")); + await RunForBuildWithDotnetRun(new BrowserRunOptions( + Configuration: config, + TestScenario: "AllocateLargeHeapThenInterop" + )); } } @@ -52,8 +55,7 @@ public async Task RunSimpleAppWithProfiler() string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: extraArgs, AssertAppBundle: false), isNativeBuild: true); - - var result = await RunForBuildWithDotnetRun(new (Configuration: config, TestScenario: "ProfilerTest")); + var result = await RunForBuildWithDotnetRun(new BrowserRunOptions(Configuration: config, TestScenario: "ProfilerTest")); Regex regex = new Regex(@"Profile data of size (\d+) bytes"); var match = result.TestOutput .Select(line => regex.Match(line)) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index 82f44f2fccc289..6fa87acec3b4e2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -29,7 +29,7 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}"); PublishProject(info, config); - var result = await RunForPublishWithWebServer(new( + var result = await RunForPublishWithWebServer(new BrowserRunOptions( Configuration: config, TestScenario: "DownloadResourceProgressTest", BrowserQueryString: new Dictionary { ["failAssemblyDownload"] = failAssemblyDownload.ToString().ToLowerInvariant() } @@ -63,7 +63,7 @@ public async Task OutErrOverrideWorks() ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ModuleConfigTests_OutErrOverrideWorks"); PublishProject(info, config); - var result = await RunForPublishWithWebServer(new( + var result = await RunForPublishWithWebServer(new BrowserRunOptions( Configuration: Configuration.Debug, TestScenario: "OutErrOverrideWorks" )); @@ -92,7 +92,7 @@ public async Task OverrideBootConfigName(Configuration config, bool isPublish) PublishProject(info, config, new PublishOptions(BootConfigFileName: "boot.json", UseCache: false, ExtraMSBuildArgs: extraArgs)) : BuildProject(info, config, new BuildOptions(BootConfigFileName: "boot.json", UseCache: false, ExtraMSBuildArgs: extraArgs)); - var runOptions = new RunOptions( + var runOptions = new BrowserRunOptions( Configuration: config, TestScenario: "OverrideBootConfigName" ); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 196ea84672dc21..5d8b940dbc4cf5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -33,7 +33,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTests"); BuildProject(info, config); - var result = await RunForBuildWithDotnetRun(new( + var result = await RunForBuildWithDotnetRun(new BrowserRunOptions( Configuration: config, TestScenario: "SatelliteAssembliesTest", BrowserQueryString: new Dictionary { ["loadAllSatelliteResources"] = loadAllSatelliteResources.ToString().ToLowerInvariant() } @@ -88,7 +88,7 @@ public async Task LoadSatelliteAssemblyFromReference() // Publish the app and assert BuildProject(info, config); - var result = await RunForPublishWithWebServer(new(Configuration: Configuration.Release, TestScenario: "SatelliteAssembliesTest")); + var result = await RunForPublishWithWebServer(new BrowserRunOptions(Configuration: Configuration.Release, TestScenario: "SatelliteAssembliesTest")); Assert.Collection( result.TestOutput, m => Assert.Equal("default: hello", m), diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index 682be41af5d414..b21cd2bcaf4108 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -39,7 +39,7 @@ protected async void TestMain(string projectName, UpdateFile("runtimeconfig.template.json", new Dictionary { { "}\n}", runtimeConfigContents } }); } PublishProject(info, config, new PublishOptions(AOT: aot, ExtraMSBuildArgs: extraArgs), isNativeBuild: isNativeBuild); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: expectedExitCode) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index cd70bf29a4ce38..5ea039ae469daa 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -38,7 +38,7 @@ public async void RunOutOfAppBundle(Configuration config, bool aot) File.WriteAllText(indexHtmlPath, html); } - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", CustomBundleDir: outerDir, diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 90b020b7d925e1..4bdfcbfa2b9daa 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -35,7 +35,7 @@ public async void Build_NoAOT_ShouldNotRelink(Configuration config, bool aot, bo // Confirm that we didn't relink Assert.DoesNotContain("Compiling native assets with emcc", output); - RunResult result = await RunForBuildWithDotnetRun(new( + RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42) @@ -55,7 +55,7 @@ public async void PublishSIMD_AOT(Configuration config, bool aot, bool simd) UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); (string _, string output) = PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: $"-p:WasmEnableSIMD={simd}", AOT: aot)); - RunResult result = await RunForPublishWithWebServer(new( + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", ExpectedExitCode: 42) From 3360519a26749f83a75c82e52411f4dc49cea3f3 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:42:53 +0000 Subject: [PATCH 067/104] Fix `SimpleRunTests`. --- src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index bf23b8b56a4cdd..4456252b1e211d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -56,7 +56,7 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(Configuration config, Path.Combine( projectDir, "bin", info.ProjectName, config.ToString().ToLower(), "wwwroot", "_framework") : GetBinFrameworkDir(config, isPublish); - BuildProject(info, config); + BuildProject(info, config, new BuildOptions(NonDefaultFrameworkDir: frameworkDir)); await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); } From 53104bac06c1df88a39859756b7f76d66e18064e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:45:48 +0000 Subject: [PATCH 068/104] Fix `WasmTemplateTests` --- src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs index 3cf38f42fc4ca9..3716b8d80006b5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTests.cs @@ -269,7 +269,7 @@ public void PublishPdb(bool copyOutputSymbolsToPublishDirectory) string extraProperties = $"{shouldCopy}"; ProjectInfo info = CreateWasmTemplateProject(Template.WasmBrowser, config, aot: false, "publishpdb", extraProperties: extraProperties); - BuildProject(info, config); + PublishProject(info, config); string publishPath = GetBinFrameworkDir(config, forPublish: true); AssertFile(".pdb"); AssertFile(".pdb.gz"); From 456a6c97a169dd5d7e31393f7a6ecc672e1ecece Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:51:25 +0000 Subject: [PATCH 069/104] Fix `InvariantGlobalizationTests` --- src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index c4e03ffad6a92c..ee8c0e2681bec2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -54,7 +54,7 @@ private async Task TestInvariantGlobalization(Configuration config, bool aot, bo // invariantGlobalization triggers native build isNativeBuild = isNativeBuild || invariantGlobalization == true; var globalizationMode = invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; - BuildProject(info, config, new BuildOptions(GlobalizationMode: globalizationMode, AOT: aot), isNativeBuild: isNativeBuild); + PublishProject(info, config, new PublishOptions(GlobalizationMode: globalizationMode, AOT: aot), isNativeBuild: isNativeBuild); RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); if (invariantGlobalization == true) From 5cdf29b44c91d12cefb86910e14667dabf46090e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 09:58:53 +0000 Subject: [PATCH 070/104] Fix `PInvokeTableGeneratorTests` --- src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index bf2b830ee26e2d..ce499b7ea037a1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -86,7 +86,7 @@ public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshal { ProjectInfo info = PrepreProjectForBlittableTests( config, aot, "not_blittable", disableRuntimeMarshalling: false, useAutoLayout: true); - (_, string output) = BuildProject(info, config, new PublishOptions(ExpectSuccess: false, AOT: aot)); + (_, string output) = BuildProject(info, config, new BuildOptions(ExpectSuccess: false, AOT: aot)); Assert.Matches("error.*Parameter.*types.*pinvoke.*.*blittable", output); } From d26c17c9da750a1456bc8705ef6df4f88cdf380e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 14:56:46 +0000 Subject: [PATCH 071/104] Fix `SatelliteAssembliesTests` and other test that require 3 states of `WasmBuildNative` --- .../Wasm.Build.Tests/SatelliteAssembliesTests.cs | 2 +- .../Templates/WasmTemplateTestsBase.cs | 8 ++++---- .../WasmSdkBasedProjectProvider.cs | 14 +++++++------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index 70bf872d1e0bd3..f7b9b52d82ab90 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -43,7 +43,7 @@ public async void ResourcesFromMainAssembly(Configuration config, bool aot, bool Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir, "resx")); CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); - (_, string output) = PublishProject(info, config, new PublishOptions(UseCache: false, AOT: aot), isNativeBuild: nativeRelink); + (_, string output) = PublishProject(info, config, new PublishOptions(UseCache: false, AOT: aot), isNativeBuild: nativeRelink ? true : null); RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( config, TestScenario: "DotnetRun", diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index dd5b4889f75658..dc61ff64b1f7e4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -116,27 +116,27 @@ private void UpdateProjectFile(string projectFilePath, bool runAnalyzers, string public virtual (string projectDir, string buildOutput) PublishProject( ProjectInfo info, Configuration configuration, - bool isNativeBuild = false) => + bool? isNativeBuild = null) => // null for WasmBuildNative unset BuildProject(info, configuration, _defaultPublishOptions, isNativeBuild); public virtual (string projectDir, string buildOutput) PublishProject( ProjectInfo info, Configuration configuration, PublishOptions publishOptions, - bool isNativeBuild = false) => + bool? isNativeBuild = null) => BuildProject(info, configuration, publishOptions, isNativeBuild); public virtual (string projectDir, string buildOutput) BuildProject( ProjectInfo info, Configuration configuration, - bool isNativeBuild = false) => + bool? isNativeBuild = null) => // null for WasmBuildNative unset BuildProject(info, configuration, _defaultBuildOptions, isNativeBuild); public virtual (string projectDir, string buildOutput) BuildProject( ProjectInfo info, Configuration configuration, MSBuildOptions buildOptions, - bool isNativeBuild = false) + bool? isNativeBuild = null) { if (buildOptions.AOT) { diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index 735d61e18c4f43..908369300c098f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -68,15 +68,15 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp return res; } - public NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isUsingWorkloads, bool isNativeBuild=false) => - isNativeBuild ? NativeFilesType.Relinked : + public NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isUsingWorkloads, bool? isNativeBuild=null) => !isPublish ? NativeFilesType.FromRuntimePack : isAOT ? NativeFilesType.AOT : - (config == Configuration.Debug || !isUsingWorkloads) ? - NativeFilesType.FromRuntimePack : - NativeFilesType.Relinked; + isNativeBuild == true ? NativeFilesType.Relinked : + isNativeBuild == false ? NativeFilesType.FromRuntimePack : + (config == Configuration.Release) ? NativeFilesType.Relinked : + NativeFilesType.FromRuntimePack; - public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool expectNativeBuild=false) + public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool? expectNativeBuild = null) { string frameworkDir = string.IsNullOrEmpty(buildOptions.NonDefaultFrameworkDir) ? GetBinFrameworkDir(config, buildOptions.IsPublish, _defaultTargetFramework) : @@ -162,7 +162,7 @@ private void AssertBundle(AssertBundleOptions assertOptions) } } - public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool expectNativeBuild = false, string? buildOutput = null) + public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool? expectNativeBuild = null, string? buildOutput = null) { if (buildOutput is not null) ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework); From 160797b1ecc5c7b0aefe7ac5803cb38b2e325784 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:01:45 +0000 Subject: [PATCH 072/104] Fix `SatelliteLoadingTests` --- .../Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 5d8b940dbc4cf5..632d8d3147a203 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -86,7 +86,7 @@ public async Task LoadSatelliteAssemblyFromReference() .EnsureSuccessful(); // Publish the app and assert - BuildProject(info, config); + PublishProject(info, config); var result = await RunForPublishWithWebServer(new BrowserRunOptions(Configuration: Configuration.Release, TestScenario: "SatelliteAssembliesTest")); Assert.Collection( From bd66cf11987c1a5a52c1ecb0cfe1185bd8cb0183 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 17:48:19 +0000 Subject: [PATCH 073/104] `RebuildTests` fix after introducing figerprinting. --- .../SimpleSourceChangeRebuildTest.cs | 6 +-- .../Wasm.Build.Tests/ProjectProviderBase.cs | 50 +++++++++++++++++++ .../Templates/WasmTemplateTestsBase.cs | 4 ++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 9c1fa4a0b3e9da..6c09eadfbc0223 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -20,10 +20,10 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [Theory] [MemberData(nameof(NativeBuildData))] - [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] + // [ActiveIssue(aot: True "Cannot find key named WasmBasicTestApp.wasm.bc in the dict")] public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); + ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; @@ -40,7 +40,7 @@ public async void SimpleStringChangeInSource(Configuration config, bool aot, boo // Rebuild Rebuild(info, config, nativeRelink, invariant); - var newStat = StatFiles(pathsDict); + var newStat = StatFilesAfterChange(pathsDict); CompareStat(originalStat, newStat, pathsDict); await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 55)); diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index 2a577f8671fa77..c6436b4faf50eb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -263,6 +263,56 @@ public IDictionary StatFiles(IDictionary StatFilesAfterChange(IDictionary pathsDict) + { + if (!IsFingerprintingEnabled) + return StatFiles(pathsDict); + + // files are expected to be fingerprinted, so we cannot rely on the paths that come with pathsDict, an update is needed + Dictionary table = new(); + foreach (var fileInfo in pathsDict) + { + string file = fileInfo.Value.fullPath; + string nameNoFingerprinting = fileInfo.Key; + string[] filesMatchingName = GetFilesMatchingNameConsideringFingerprinting(file, nameNoFingerprinting); + if (filesMatchingName.Length > 1) + { + string? fileMatch = filesMatchingName.FirstOrDefault(f => f != file); + if (fileMatch != null) + { + table.Add(nameNoFingerprinting, new FileStat(FullPath: fileMatch, Exists: true, LastWriteTimeUtc: File.GetLastWriteTimeUtc(fileMatch), Length: new FileInfo(fileMatch).Length)); + } + } + if (filesMatchingName.Length == 0 || (filesMatchingName.Length == 1 && !File.Exists(file))) + { + table.Add(nameNoFingerprinting, new FileStat(FullPath: file, Exists: false, LastWriteTimeUtc: DateTime.MinValue, Length: 0)); + } + if (filesMatchingName.Length == 1 && File.Exists(file)) + { + table.Add(nameNoFingerprinting, new FileStat(FullPath: file, Exists: true, LastWriteTimeUtc: File.GetLastWriteTimeUtc(file), Length: new FileInfo(file).Length)); + } + } + return table; + } + + private string[] GetFilesMatchingNameConsideringFingerprinting(string filePath, string nameNoFingerprinting) + { + var directory = Path.GetDirectoryName(filePath); + if (directory == null) + return Array.Empty(); + + string fileNameWithoutExtensionAndFingerprinting = Path.GetFileNameWithoutExtension(nameNoFingerprinting); + string fileExtension = Path.GetExtension(filePath); + + // search for files that match the name in the directory, skipping fingerprinting + string[] files = Directory.GetFiles(directory, $"{fileNameWithoutExtensionAndFingerprinting}*{fileExtension}"); + + // filter files with a single fingerprint segment, e.g. "dotnet*.js" should not catch "dotnet.native.d1au9i.js" but should catch "dotnet.js" + string pattern = $@"^{Regex.Escape(fileNameWithoutExtensionAndFingerprinting)}(\.[^.]+)?{Regex.Escape(fileExtension)}$"; + var tmp = files.Where(f => Regex.IsMatch(Path.GetFileName(f), pattern)).ToArray(); + return tmp; + } + public IDictionary GetFilesTable(bool unchanged, params string[] baseDirs) { var dict = new Dictionary(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index dc61ff64b1f7e4..272d1e818116af 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -356,6 +356,10 @@ public BuildPaths GetBuildPaths(Configuration config, bool forPublish) => public IDictionary StatFiles(IDictionary fullpaths) => _provider.StatFiles(fullpaths); + // 2nd and next stats with fingerprinting require updated statistics + public IDictionary StatFilesAfterChange(IDictionary fullpaths) => + _provider.StatFilesAfterChange(fullpaths); + public void CompareStat(IDictionary oldStat, IDictionary newStat, IDictionary expected) => _provider.CompareStat(oldStat, newStat, expected); } From 7d8690c72495e10323511bf27e0ca7dec0f0a94e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:02:05 +0000 Subject: [PATCH 074/104] AOT: true fails. More investigation needed. --- .../NativeRebuildTests/SimpleSourceChangeRebuildTest.cs | 2 +- src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 6c09eadfbc0223..0d5361fb0673b2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -20,7 +20,7 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [Theory] [MemberData(nameof(NativeBuildData))] - // [ActiveIssue(aot: True "Cannot find key named WasmBasicTestApp.wasm.bc in the dict")] + // [ActiveIssue(aot: True "Expected changed file: dotnet.native.wasm, dotnet.native.js, WasmBasicTestApp.wasm.bc, WasmBasicTestApp.wasm.o")] public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index c6436b4faf50eb..1a8e88e1272a25 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -348,11 +348,11 @@ private string[] GetFilesMatchingNameConsideringFingerprinting(string filePath, { files.AddRange(new[] { - Path.Combine(paths.ObjWasmDir, $"{projectName}.dll.bc"), - Path.Combine(paths.ObjWasmDir, $"{projectName}.dll.o"), + Path.Combine(paths.ObjWasmDir, $"{projectName}{WasmAssemblyExtension}.bc"), + Path.Combine(paths.ObjWasmDir, $"{projectName}{WasmAssemblyExtension}.o"), - Path.Combine(paths.ObjWasmDir, "System.Private.CoreLib.dll.bc"), - Path.Combine(paths.ObjWasmDir, "System.Private.CoreLib.dll.o"), + Path.Combine(paths.ObjWasmDir, $"System.Private.CoreLib{WasmAssemblyExtension}.bc"), + Path.Combine(paths.ObjWasmDir, $"System.Private.CoreLib{WasmAssemblyExtension}.o"), }); } From 786ece36ab8f42a5ed5ac7ee0e02c7eeaafe4916 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 29 Nov 2024 18:18:37 +0000 Subject: [PATCH 075/104] `ReferenceNewAssemblyRebuildTest` fix. AOT: rue, more investigation needed. --- .../NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 8309427e584403..9568ceef9ae0e7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -21,7 +21,7 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT [Theory] [MemberData(nameof(NativeBuildData))] - [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] + // [ActiveIssue(aot: True "Expected changed file: ...")] public async void ReferenceNewAssembly(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_tasks"); @@ -38,7 +38,7 @@ public async void ReferenceNewAssembly(Configuration config, bool aot, bool nati ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeRebuildNewAssembly.cs")); Rebuild(info, config, nativeRelink, invariant); - var newStat = StatFiles(pathsDict); + var newStat = StatFilesAfterChange(pathsDict); CompareStat(originalStat, newStat, pathsDict); await RunForPublishWithWebServer(new BrowserRunOptions(config, ExpectedExitCode: 42, TestScenario: "DotnetRun")); From b47933675eb4be8204039fad775070471dc9a280 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 09:25:14 +0000 Subject: [PATCH 076/104] Fix no-worklod tests: 1) do not double-assert `AssertRuntimePackPath` in blazor 2) `AssertRuntimePackPath` is correct only when workload is there 3) NativeBuild should allow undefined in blazor tests as well. --- .../Blazor/BlazorWasmTestBase.cs | 16 +++++----------- .../WasmSdkBasedProjectProvider.cs | 15 +++++++++------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index b09adbda6956c6..02403fc44f4c76 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -98,11 +98,11 @@ public string CreateBlazorWasmTemplateProject(string id) return Path.Combine(_projectDir, $"{id}.csproj"); } - protected (string projectDir, string buildOutput) BlazorBuild(ProjectInfo info, Configuration config, bool isNativeBuild = false) => + protected (string projectDir, string buildOutput) BlazorBuild(ProjectInfo info, Configuration config, bool? isNativeBuild = null) => BlazorBuild(info, config, _defaultBlazorBuildOptions, isNativeBuild); protected (string projectDir, string buildOutput) BlazorBuild( - ProjectInfo info, Configuration config, MSBuildOptions buildOptions, bool isNativeBuild = false) + ProjectInfo info, Configuration config, MSBuildOptions buildOptions, bool? isNativeBuild = null) { try { @@ -156,20 +156,14 @@ public string CreateBlazorWasmTemplateProject(string id) } } - public void AssertBundle(Configuration config, string buildOutput, MSBuildOptions buildOptions, bool expectNativeBuild) + public void AssertBundle(Configuration config, string buildOutput, MSBuildOptions buildOptions, bool? isNativeBuild = null) { - if (IsUsingWorkloads) - { - // In no-workload case, the path would be from a restored nuget - ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? DefaultTargetFramework, buildOptions.RuntimeType); - } - - _provider.AssertBundle(config, buildOptions, IsUsingWorkloads, expectNativeBuild); + _provider.AssertBundle(config, buildOptions, IsUsingWorkloads, isNativeBuild); if (!buildOptions.IsPublish) return; - var expectedFileType = _provider.GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, IsUsingWorkloads, expectNativeBuild); + var expectedFileType = _provider.GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, IsUsingWorkloads, isNativeBuild); // Publish specific checks if (expectedFileType == NativeFilesType.AOT) { diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index 908369300c098f..c4aa923d3697b3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -76,7 +76,7 @@ public NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, boo (config == Configuration.Release) ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack; - public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool? expectNativeBuild = null) + public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool? isNativeBuild = null) { string frameworkDir = string.IsNullOrEmpty(buildOptions.NonDefaultFrameworkDir) ? GetBinFrameworkDir(config, buildOptions.IsPublish, _defaultTargetFramework) : @@ -85,7 +85,7 @@ public void AssertBundle(Configuration config, MSBuildOptions buildOptions, bool AssertBundle(new AssertBundleOptions( config, BuildOptions: buildOptions, - ExpectedFileType: GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, isUsingWorkloads, expectNativeBuild), + ExpectedFileType: GetExpectedFileType(config, buildOptions.AOT, buildOptions.IsPublish, isUsingWorkloads, isNativeBuild), BinFrameworkDir: frameworkDir, ExpectSymbolsFile: true, AssertIcuAssets: true, @@ -162,11 +162,14 @@ private void AssertBundle(AssertBundleOptions assertOptions) } } - public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool? expectNativeBuild = null, string? buildOutput = null) + public void AssertWasmSdkBundle(Configuration config, MSBuildOptions buildOptions, bool isUsingWorkloads, bool? isNativeBuild = null, string? buildOutput = null) { - if (buildOutput is not null) - ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework); - AssertBundle(config, buildOptions, isUsingWorkloads, expectNativeBuild); + if (isUsingWorkloads && buildOutput is not null) + { + // In no-workload case, the path would be from a restored nuget + ProjectProviderBase.AssertRuntimePackPath(buildOutput, buildOptions.TargetFramework ?? _defaultTargetFramework, buildOptions.RuntimeType); + } + AssertBundle(config, buildOptions, isUsingWorkloads, isNativeBuild); } public BuildPaths GetBuildPaths(Configuration configuration, bool forPublish) From 188a274c1a40ae875bf871dfa063d4d9431e6ea2 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 10:09:36 +0000 Subject: [PATCH 077/104] Fix `NativeBuildTests` - AppBundle was not asserted here originally. --- src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs index 8d5dee2edf910c..b1f892901d13d4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/NativeBuildTests.cs @@ -46,7 +46,8 @@ public void BuildWithUndefinedNativeSymbol(bool allowUndefined) ); UpdateFile("Program.cs", code); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "undefined-symbol.c"), Path.Combine(_projectDir, "undefined_xyz.c")); - (string _, string buildOutput) = BuildProject(info, config, new BuildOptions(ExpectSuccess: allowUndefined), isNativeBuild: true); + var buildOptions = new BuildOptions(ExpectSuccess: allowUndefined, AssertAppBundle: false); + (string _, string buildOutput) = BuildProject(info, config, buildOptions, isNativeBuild: true); if (!allowUndefined) { From 6a3e7706d05948be808dfe64fb303f89a3989476 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 10:33:15 +0000 Subject: [PATCH 078/104] Fix `DefaultTemplate_AOT_InProjectFile`: AOT arg was missing. --- src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index d72d1be8ed1aae..721197dfcd3795 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -54,16 +54,17 @@ public void NativeBuild_WithDeployOnBuild_UsedByVS(Configuration config, bool na public void DefaultTemplate_AOT_InProjectFile(Configuration config) { string extraProperties = config == Configuration.Debug - ? ("-O1" + + ? ("true" + + "-O1" + "-O1") - : string.Empty; + : "true"; ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_aot_prj_file", extraProperties: extraProperties); // No relinking, no AOT BlazorBuild(info, config); // will aot - BlazorPublish(info, config, new PublishOptions(UseCache: false)); + BlazorPublish(info, config, new PublishOptions(UseCache: false, AOT: true)); // build again BlazorBuild(info, config, new BuildOptions(UseCache: false)); From 46e83e7335740ad1d6a056e37bdd2ea4915d072e Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 12:02:37 +0000 Subject: [PATCH 079/104] Avoid double asserts. --- .../wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 02403fc44f4c76..24adeead0ba689 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -115,6 +115,7 @@ public string CreateBlazorWasmTemplateProject(string id) isNativeBuild); if (buildOptions.ExpectSuccess && buildOptions.AssertAppBundle) { + // additional blazor-only assert, basic assert is done in BuildProject AssertBundle(config, buildOutput, buildOptions, isNativeBuild); } return (projectDir, buildOutput); @@ -127,11 +128,11 @@ public string CreateBlazorWasmTemplateProject(string id) } } - protected (string projectDir, string buildOutput) BlazorPublish(ProjectInfo info, Configuration config, bool isNativeBuild = false) => + protected (string projectDir, string buildOutput) BlazorPublish(ProjectInfo info, Configuration config, bool? isNativeBuild = null) => BlazorPublish(info, config, _defaultBlazorPublishOptions, isNativeBuild); protected (string projectDir, string buildOutput) BlazorPublish( - ProjectInfo info, Configuration config, PublishOptions publishOptions, bool isNativeBuild = false) + ProjectInfo info, Configuration config, PublishOptions publishOptions, bool? isNativeBuild = null) { try { @@ -144,6 +145,7 @@ public string CreateBlazorWasmTemplateProject(string id) isNativeBuild); if (publishOptions.ExpectSuccess && publishOptions.AssertAppBundle) { + // additional blazor-only assert, basic assert is done in PublishProject AssertBundle(config, buildOutput, publishOptions, isNativeBuild); } return (projectDir, buildOutput); @@ -158,8 +160,6 @@ public string CreateBlazorWasmTemplateProject(string id) public void AssertBundle(Configuration config, string buildOutput, MSBuildOptions buildOptions, bool? isNativeBuild = null) { - _provider.AssertBundle(config, buildOptions, IsUsingWorkloads, isNativeBuild); - if (!buildOptions.IsPublish) return; From c23f523e9cc495934119d25c3273b38f11cd5ee9 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 12:05:06 +0000 Subject: [PATCH 080/104] Fix expected file order. --- .../wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index c4aa923d3697b3..f704af99e69000 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -69,10 +69,10 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp } public NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isUsingWorkloads, bool? isNativeBuild=null) => - !isPublish ? NativeFilesType.FromRuntimePack : - isAOT ? NativeFilesType.AOT : - isNativeBuild == true ? NativeFilesType.Relinked : + isNativeBuild == true ? NativeFilesType.Relinked : // precedence over build/publish check: build with -p:WasmBuildNative=true should use relinked isNativeBuild == false ? NativeFilesType.FromRuntimePack : + !isPublish ? NativeFilesType.FromRuntimePack : // precedence over AOT check: build with AOT should use runtime pack + isAOT ? NativeFilesType.AOT : (config == Configuration.Release) ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack; From c969abd6d838e7f716a0468e9ed588e7ca75a027 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 12:06:02 +0000 Subject: [PATCH 081/104] Revert 7d8690c72495e10323511bf27e0ca7dec0f0a94e#diff-39b3592b9f7579ad67bde4932529579b17cc743ad6706e2939ea92ce094a14ec --- .../NativeRebuildTests/SimpleSourceChangeRebuildTest.cs | 4 ++-- src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 0d5361fb0673b2..3b0e5d42fe33c0 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -20,7 +20,7 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [Theory] [MemberData(nameof(NativeBuildData))] - // [ActiveIssue(aot: True "Expected changed file: dotnet.native.wasm, dotnet.native.js, WasmBasicTestApp.wasm.bc, WasmBasicTestApp.wasm.o")] + // [ActiveIssue(aot: True "Expected changed file: dotnet.native.wasm, dotnet.native.js, WasmBasicTestApp.dll.bc, WasmBasicTestApp.dll.o")] public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); @@ -32,7 +32,7 @@ public async void SimpleStringChangeInSource(Configuration config, bool aot, boo pathsDict.UpdateTo(unchanged: !aot, "dotnet.native.wasm", "dotnet.native.js"); if (aot) - pathsDict.UpdateTo(unchanged: false, $"{mainAssembly}.bc", $"{mainAssembly}.o"); + pathsDict.UpdateTo(unchanged: false, $"{info.ProjectName}.dll.bc", $"{info.ProjectName}.dll.o"); var originalStat = StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index 1a8e88e1272a25..f680b6754e4745 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -348,11 +348,11 @@ private string[] GetFilesMatchingNameConsideringFingerprinting(string filePath, { files.AddRange(new[] { - Path.Combine(paths.ObjWasmDir, $"{projectName}{WasmAssemblyExtension}.bc"), - Path.Combine(paths.ObjWasmDir, $"{projectName}{WasmAssemblyExtension}.o"), + Path.Combine(paths.ObjWasmDir, $"{projectName}.dll.bc"), + Path.Combine(paths.ObjWasmDir, $"{projectName}.dll.o"), - Path.Combine(paths.ObjWasmDir, $"System.Private.CoreLib{WasmAssemblyExtension}.bc"), - Path.Combine(paths.ObjWasmDir, $"System.Private.CoreLib{WasmAssemblyExtension}.o"), + Path.Combine(paths.ObjWasmDir, $"System.Private.CoreLib.dll.bc"), + Path.Combine(paths.ObjWasmDir, $"System.Private.CoreLib.dll.o"), }); } From 68c9299d8a6aac892992630fd317705a340c53c7 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 14:35:55 +0000 Subject: [PATCH 082/104] Fix cases that keep NativeBuild undefined. --- .../wasm/Wasm.Build.Tests/Blazor/CleanTests.cs | 2 +- src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs | 2 +- .../InvariantGlobalizationTests.cs | 15 +++++++++++---- .../Wasm.Build.Tests/InvariantTimezoneTests.cs | 16 +++++++++++----- .../PInvokeTableGeneratorTests.cs | 9 ++++----- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index f1e86957bf8331..19a257f98c4395 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -73,7 +73,7 @@ private void Blazor_BuildNativeNonNative_ThenCleanTest(Configuration config, boo BlazorBuild(info, config, new BuildOptions(UseCache: false, ExtraMSBuildArgs: relink ? "-p:WasmBuildNative=true" : string.Empty), - isNativeBuild: relink); + isNativeBuild: relink ? true : null); if (relink) Assert.True(Directory.Exists(relinkDir), $"Could not find expected relink dir: {relinkDir}"); diff --git a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs index 3b1fcdd5d10e4e..1bf7e100314e5b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/IcuTestsBase.cs @@ -154,7 +154,7 @@ protected async Task PublishAndRunIcuTest( (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(GlobalizationMode: globalizationMode, CustomIcuFile: icuFileName), - isNativeBuild: triggersNativeBuild); + isNativeBuild: triggersNativeBuild ? true : null); BrowserRunOptions runOptions = new(config, Locale: locale, ExpectedExitCode: 42); RunResult runOutput = await RunForPublishWithWebServer(runOptions); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index ee8c0e2681bec2..7c2c9d29cd401a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -41,18 +41,25 @@ public async Task AOT_InvariantGlobalization(Configuration config, bool aot, boo public async Task RelinkingWithoutAOT(Configuration config, bool aot, bool? invariantGlobalization) => await TestInvariantGlobalization(config, aot, invariantGlobalization, isNativeBuild: true); - private async Task TestInvariantGlobalization(Configuration config, bool aot, bool? invariantGlobalization, bool isNativeBuild = false) + private async Task TestInvariantGlobalization(Configuration config, bool aot, bool? invariantGlobalization, bool? isNativeBuild = null) { - string extraProperties = isNativeBuild ? "true" : ""; + string extraProperties = isNativeBuild == true ? "true" : ""; if (invariantGlobalization != null) + { extraProperties = $"{extraProperties}{invariantGlobalization}"; + } + if (invariantGlobalization == true) + { + if (isNativeBuild == false) + throw new System.ArgumentException("InvariantGlobalization=true requires a native build"); + // -p:InvariantGlobalization=true triggers native build, isNativeBuild is not undefined anymore + isNativeBuild = true; + } string prefix = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantGlobalization.cs")); - // invariantGlobalization triggers native build - isNativeBuild = isNativeBuild || invariantGlobalization == true; var globalizationMode = invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; PublishProject(info, config, new PublishOptions(GlobalizationMode: globalizationMode, AOT: aot), isNativeBuild: isNativeBuild); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 1750bcf5a19ca0..0d9856347bae90 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -37,18 +37,24 @@ public async Task AOT_InvariantTimezone(Configuration config, bool aot, bool? in public async Task RelinkingWithoutAOT(Configuration config, bool aot, bool? invariantTimezone) => await TestInvariantTimezone(config, aot, invariantTimezone, isNativeBuild: true); - private async Task TestInvariantTimezone(Configuration config, bool aot, bool? invariantTimezone, bool isNativeBuild = false) + private async Task TestInvariantTimezone(Configuration config, bool aot, bool? invariantTimezone, bool? isNativeBuild = null) { - string extraProperties = isNativeBuild ? "true" : ""; + string extraProperties = isNativeBuild == true ? "true" : ""; if (invariantTimezone != null) + { extraProperties = $"{extraProperties}{invariantTimezone}"; + } + if (invariantTimezone == true) + { + if (isNativeBuild == false) + throw new System.ArgumentException("InvariantTimezone=true requires a native build"); + // -p:InvariantTimezone=true triggers native build, isNativeBuild is not undefined anymore + isNativeBuild = true; + } string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); - - // invariantTimezone triggers native build - isNativeBuild = isNativeBuild || invariantTimezone == true; PublishProject(info, config, isNativeBuild: isNativeBuild); RunResult output = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42)); diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index ce499b7ea037a1..be7746de914592 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -197,7 +197,7 @@ public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "fnptr", extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); - string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.DoesNotContain("warning WASM0001", output); RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( @@ -216,7 +216,7 @@ public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(Configur string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); - string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); } @@ -228,7 +228,7 @@ public async void UnmanagedCallback_InFileType(Configuration config, bool aot) string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackInFile.cs")); - string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( @@ -241,14 +241,13 @@ public async void UnmanagedCallback_InFileType(Configuration config, bool aot) [Theory] [BuildAndRun()] - [ActiveIssue("RuntimeError: null function or function signature mismatch")] public async void UnmanagedCallersOnly_Namespaced(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_namespace"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackNamespaced.cs")); - string output = PublishForVariadicFunctionTests(info, config, aot, isNativeBuild: false); + string output = PublishForVariadicFunctionTests(info, config, aot); Assert.DoesNotMatch(".*(warning|error).*>[A-Z0-9]+__Foo", output); RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( From f90eb7404736acd6194c77ab701cf908179f6a9d Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 14:36:47 +0000 Subject: [PATCH 083/104] Fix `SatelliteAssembliesTests`: correct order of `ExpectedFileType` --- src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs index f704af99e69000..c04d0bf50c2f65 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSdkBasedProjectProvider.cs @@ -70,9 +70,9 @@ protected override IReadOnlySet GetDotNetFilesExpectedSet(AssertBundleOp public NativeFilesType GetExpectedFileType(Configuration config, bool isAOT, bool isPublish, bool isUsingWorkloads, bool? isNativeBuild=null) => isNativeBuild == true ? NativeFilesType.Relinked : // precedence over build/publish check: build with -p:WasmBuildNative=true should use relinked - isNativeBuild == false ? NativeFilesType.FromRuntimePack : !isPublish ? NativeFilesType.FromRuntimePack : // precedence over AOT check: build with AOT should use runtime pack - isAOT ? NativeFilesType.AOT : + isAOT ? NativeFilesType.AOT : // precedence over -p:WasmBuildNative=false check: publish with AOT relinks regardless of WasmBuildNative value + isNativeBuild == false ? NativeFilesType.FromRuntimePack : (config == Configuration.Release) ? NativeFilesType.Relinked : NativeFilesType.FromRuntimePack; From 2f945fd09beaee9836c45fc50de97abf866cc2c8 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:31:09 +0000 Subject: [PATCH 084/104] `WasmGenerateAppBundle=false` when workloads used (set in workload manifest). The check is incorrect in the current process of testing. --- src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index be7746de914592..734155a3396261 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -530,7 +530,6 @@ public async void EnsureWasmAbiRulesAreFollowedInInterpreter(Configuration confi [Theory] [BuildAndRun(aot: true, config: Configuration.Release)] - [ActiveIssue("WasmGenerateAppBundle = false, so _WasmGenerateAppBundle is not triggered. Is the change expected?")] public void EnsureComInteropCompilesInAOT(Configuration config, bool aot) { ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "com"); @@ -539,7 +538,6 @@ public void EnsureComInteropCompilesInAOT(Configuration config, bool aot) (string libraryDir, string output) = isPublish ? PublishProject(info, config, new PublishOptions(AOT: aot)) : BuildProject(info, config, new BuildOptions(AOT: aot)); - Assert.Contains("Generated app bundle at " + libraryDir, output); } [Theory] From 333d8cedc80cf229b078bfdcfcc84b1cb4f718bc Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 15:48:25 +0000 Subject: [PATCH 085/104] Feedback: store all assets in `testAsset` class. --- .../Blazor/BlazorWasmTestBase.cs | 3 +-- .../Blazor/BuildPublishTests.cs | 14 +++++----- .../Wasm.Build.Tests/Blazor/CleanTests.cs | 4 +-- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 4 +-- .../Wasm.Build.Tests/Blazor/MiscTests2.cs | 2 +- .../Wasm.Build.Tests/Blazor/MiscTests3.cs | 4 +-- .../Wasm.Build.Tests/Blazor/NativeRefTests.cs | 2 +- .../Blazor/NoopNativeRebuildTest.cs | 4 +-- .../Blazor/SimpleMultiThreadedTests.cs | 4 +-- .../Wasm.Build.Tests/Blazor/SimpleRunTests.cs | 6 ++--- .../Blazor/WorkloadRequiredTests.cs | 4 +-- .../BrowserStructures/TestAsset.cs | 2 ++ .../Wasm.Build.Tests/BuildPublishTests.cs | 6 ++--- .../InvariantGlobalizationTests.cs | 2 +- .../InvariantTimezoneTests.cs | 2 +- .../Wasm.Build.Tests/MainWithArgsTests.cs | 2 +- .../Wasm.Build.Tests/NativeLibraryTests.cs | 8 +++--- .../FlagsChangeRebuildTest.cs | 2 +- .../NoopNativeRebuildTest.cs | 4 +-- .../OptimizationFlagChangeTests.cs | 2 +- .../ReferenceNewAssemblyRebuildTest.cs | 2 +- .../SimpleSourceChangeRebuildTest.cs | 2 +- .../PInvokeTableGeneratorTests.cs | 26 +++++++++---------- .../wasm/Wasm.Build.Tests/RebuildTests.cs | 2 +- .../SatelliteAssembliesTests.cs | 6 ++--- .../Templates/WasmTemplateTestsBase.cs | 5 ++-- .../TestAppScenarios/AppSettingsTests.cs | 2 +- .../TestAppScenarios/DebugLevelTests.cs | 10 +++---- .../TestAppScenarios/DownloadThenInitTests.cs | 2 +- .../TestAppScenarios/InterpPgoTests.cs | 2 +- .../TestAppScenarios/LazyLoadingTests.cs | 4 +-- .../LibraryInitializerTests.cs | 4 +-- .../MaxParallelDownloadsTests.cs | 2 +- .../TestAppScenarios/MemoryTests.cs | 4 +-- .../TestAppScenarios/ModuleConfigTests.cs | 6 ++--- .../TestAppScenarios/SatelliteLoadingTests.cs | 4 +-- .../wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 2 +- .../WasmNativeDefaultsTests.cs | 2 +- .../WasmRunOutOfAppBundleTests.cs | 2 +- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 4 +-- 40 files changed, 87 insertions(+), 87 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index 24adeead0ba689..fcb2464ea29e32 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -22,7 +22,6 @@ public abstract class BlazorWasmTestBase : WasmTemplateTestsBase private readonly string _blazorExtraBuildArgs = "-p:BlazorEnableCompression=false /warnaserror"; protected readonly PublishOptions _defaultBlazorPublishOptions; private readonly BuildOptions _defaultBlazorBuildOptions; - protected override TestAsset BasicTestApp => new() { Name = "BlazorBasicTestApp", RunnableProjectSubPath = "App" }; protected BlazorWasmTestBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext, new WasmSdkBasedProjectProvider(output, DefaultTargetFrameworkForBlazor)) @@ -190,7 +189,7 @@ protected ProjectInfo CreateProjectWithNativeReference(Configuration config, boo "; return CopyTestAsset( - config, aot, BasicTestApp, "blz_nativeref_aot", extraItems: extraItems, extraProperties: extraProperties); + config, aot, TestAsset.BlazorBasicTestApp, "blz_nativeref_aot", extraItems: extraItems, extraProperties: extraProperties); } // Keeping these methods with explicit Build/Publish in the name diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 0d1becc5e6c5a2..119842d72d3383 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -28,7 +28,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [InlineData(Configuration.Release)] public async Task DefaultTemplate_WithoutWorkload(Configuration config) { - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_workload"); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_no_workload"); BlazorBuild(info, config); await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); @@ -58,7 +58,7 @@ public static TheoryData TestDataForDefaultTemplate_WithWor [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { false })] public void DefaultTemplate_NoAOT_WithWorkload(Configuration config, bool testUnicode) { - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_no_aot", appendUnicodeToPath: testUnicode); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_no_aot", appendUnicodeToPath: testUnicode); BlazorPublish(info, config); } @@ -66,7 +66,7 @@ public void DefaultTemplate_NoAOT_WithWorkload(Configuration config, bool testUn [MemberData(nameof(TestDataForDefaultTemplate_WithWorkload), parameters: new object[] { true })] public void DefaultTemplate_AOT_WithWorkload(Configuration config, bool testUnicode) { - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_aot", appendUnicodeToPath: testUnicode); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_aot", appendUnicodeToPath: testUnicode); BlazorBuild(info, config); // NativeFilesType.AOT?? @@ -83,7 +83,7 @@ public void DefaultTemplate_CheckFingerprinting(Configuration config, bool expec var extraProperty = expectFingerprintOnDotnetJs ? "truetrue" : "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_checkfingerprinting", extraProperties: extraProperty); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_checkfingerprinting", extraProperties: extraProperty); BlazorBuild(info, config, isNativeBuild: true); BlazorPublish(info, config, new PublishOptions(UseCache: false), isNativeBuild: true); } @@ -115,7 +115,7 @@ public void DefaultTemplate_CheckFingerprinting(Configuration config, bool expec public void DefaultTemplate_WithResources_Publish(Configuration config) { string[] cultures = ["ja-JP", "es-ES"]; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_resources"); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_resources"); // Ensure we have the source data we rely on string resxSourcePath = Path.Combine(BuildEnvironment.TestAssetsPath, "resx"); @@ -153,7 +153,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL string extraProperties = "true"; if (!string.IsNullOrEmpty(stripILAfterAOT)) extraProperties += $"{stripILAfterAOT}"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_WasmStripILAfterAOT", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blz_WasmStripILAfterAOT", extraProperties: extraProperties); BlazorPublish(info, config); await RunForPublishWithWebServer(new BlazorRunOptions(config)); @@ -169,7 +169,7 @@ public async Task Test_WasmStripILAfterAOT(string stripILAfterAOT, bool expectIL public void BlazorWasm_CannotAOT_InDebug(Configuration config) { ProjectInfo info = CopyTestAsset( - config, aot: true, BasicTestApp, "blazorwasm", extraProperties: "true"); + config, aot: true, TestAsset.BlazorBasicTestApp, "blazorwasm", extraProperties: "true"); (string _, string output) = PublishProject(info, config, new PublishOptions(ExpectSuccess: false)); Assert.Contains("AOT is not supported in debug configuration", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs index 19a257f98c4395..2d9a8baa260f7a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/CleanTests.cs @@ -26,7 +26,7 @@ public CleanTests(ITestOutputHelper output, SharedBuildPerTestClassFixture build public void Blazor_BuildThenClean_NativeRelinking(Configuration config) { string extraProperties = @"<_WasmDevel>truetrue"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "clean", extraProperties: extraProperties); BlazorBuild(info, config, isNativeBuild: true); string relinkDir = Path.Combine(_projectDir, "obj", config.ToString(), DefaultTargetFrameworkForBlazor, "wasm", "for-build"); @@ -57,7 +57,7 @@ public void Blazor_BuildNative_ThenBuildNonNative_ThenClean(Configuration config private void Blazor_BuildNativeNonNative_ThenCleanTest(Configuration config, bool firstBuildNative) { string extraProperties = @"<_WasmDevel>true"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "clean_native", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "clean_native", extraProperties: extraProperties); bool relink = firstBuildNative; BlazorBuild(info, diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index 721197dfcd3795..7ef7a13f3437a7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -32,7 +32,7 @@ public void NativeBuild_WithDeployOnBuild_UsedByVS(Configuration config, bool na : string.Empty; if (!nativeRelink) extraProperties += "true"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_deploy_on_build", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blz_deploy_on_build", extraProperties: extraProperties); // build with -p:DeployOnBuild=true, and that will trigger a publish (string _, string buildOutput) = BlazorBuild(info, @@ -58,7 +58,7 @@ public void DefaultTemplate_AOT_InProjectFile(Configuration config) "-O1" + "-O1") : "true"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_aot_prj_file", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blz_aot_prj_file", extraProperties: extraProperties); // No relinking, no AOT BlazorBuild(info, config); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs index 7996543e35ec31..cfa4d7107e766d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs @@ -52,7 +52,7 @@ public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(Configuration confi private CommandResult PublishForRequiresWorkloadTest(Configuration config, string extraItems="", string extraProperties="") { ProjectInfo info = CopyTestAsset( - config, aot: false, BasicTestApp, "needs_workload", extraProperties: extraProperties, extraItems: extraItems); + config, aot: false, TestAsset.BlazorBasicTestApp, "needs_workload", extraProperties: extraProperties, extraItems: extraItems); string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs index ee9ecc4eb6b28f..698772dca75932 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs @@ -39,7 +39,7 @@ public async Task WithDllImportInMainAssembly(Configuration config, bool build, else prefix += "publish"; string extraItems = @""; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, prefix, extraItems: extraItems); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "MyDllImport.cs"), Path.Combine(_projectDir, "Pages", "MyDllImport.cs")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "mylib.cpp"), Path.Combine(_projectDir, "mylib.cpp")); UpdateFile(Path.Combine("Pages", "MyDllImport.cs"), new Dictionary { { "##NAMESPACE##", info.ProjectName } }); @@ -77,7 +77,7 @@ public void BugRegression_60479_WithRazorClassLib() string extraItems = @$" "; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blz_razor_lib_top", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blz_razor_lib_top", extraItems: extraItems); // No relinking, no AOT BlazorBuild(info, config); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs index af41b50fbfae29..180c1e249c52bf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NativeRefTests.cs @@ -57,7 +57,7 @@ public void WithNativeReference_AOTOnCommandLine(Configuration config) public void BlazorWasm_CannotAOT_WithNoTrimming(Configuration config) { string extraProperties = "falsetrue"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "blazorwasm_aot", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blazorwasm_aot", extraProperties: extraProperties); (string _, string output) = BlazorPublish(info, config, new PublishOptions(ExpectSuccess: false)); Assert.Contains("AOT is not supported without IL trimming", output); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 92157b76caaafb..80e407fb885db2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -24,7 +24,7 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi public void BlazorNoopRebuild(Configuration config) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_rebuild", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_rebuild", extraProperties: extraProperties); BlazorBuild(info, config, isNativeBuild: true); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), @@ -49,7 +49,7 @@ public void BlazorNoopRebuild(Configuration config) public void BlazorOnlyLinkRebuild(Configuration config) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blz_relink", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_relink", extraProperties: extraProperties); var buildOptions = new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O2"); BlazorBuild(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O2"), isNativeBuild: true); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index 341642bbaa59d3..ec039142c861fb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -28,7 +28,7 @@ public SimpleMultiThreadedTests(ITestOutputHelper output, SharedBuildPerTestClas public async Task BlazorBuildRunTest(Configuration config) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazorwasm", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blazorwasm", extraProperties: extraProperties); bool isPublish = false; string frameworkDir = GetBlazorBinFrameworkDir(config, isPublish); BuildProject(info, config, new BuildOptions(RuntimeType: RuntimeVariant.MultiThreaded)); @@ -46,7 +46,7 @@ public async Task BlazorBuildRunTest(Configuration config) public async Task BlazorPublishRunTest(Configuration config, bool aot) { string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_mt", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.BlazorBasicTestApp, "blazor_mt", extraProperties: extraProperties); // if (aot) // AddItemsPropertiesToProject(projectFile, "true"); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs index 4456252b1e211d..e623c6d4efc7e3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleRunTests.cs @@ -27,7 +27,7 @@ public SimpleRunTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b [InlineData(Configuration.Release)] public async Task BlazorBuildRunTest(Configuration config) { - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blazor"); BlazorBuild(info, config); await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); } @@ -39,7 +39,7 @@ public async Task BlazorBuildRunTest(Configuration config) [InlineData(Configuration.Debug, /*appendRID*/ false, /*useArtifacts*/ false)] public async Task BlazorBuildAndRunForDifferentOutputPaths(Configuration config, bool appendRID, bool useArtifacts) { - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "blazor"); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blazor"); string extraPropertiesForDBP = ""; if (appendRID) extraPropertiesForDBP += "true"; @@ -66,7 +66,7 @@ public async Task BlazorBuildAndRunForDifferentOutputPaths(Configuration config, [InlineData(Configuration.Release, true)] public async Task BlazorPublishRunTest(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blazor_publish"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.BlazorBasicTestApp, "blazor_publish"); BlazorPublish(info, config); await RunForPublishWithWebServer(new BlazorRunOptions(config)); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index c2abbec0e019ba..fa2002ecd35e79 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -79,7 +79,7 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(Configuration con { string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; string extraProperties = invariant ? $"true" : ""; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, prefix, extraProperties: extraProperties); string ccText = "currentCount++;"; // UpdateFile throws if code that is to be replaced does not exist UpdateFile(Path.Combine("Pages", "Counter.razor"), new Dictionary @@ -128,7 +128,7 @@ private void CheckWorkloadRequired(Configuration config, string extraProperties, string insertAtEnd = @" "; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, prefix, extraProperties: extraProperties, insertAtEnd: insertAtEnd); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, prefix, extraProperties: extraProperties, insertAtEnd: insertAtEnd); (string _, string output) = publish ? PublishProject(info, config, new PublishOptions(ExpectSuccess: false)) : BuildProject(info, config, new BuildOptions(ExpectSuccess: false)); diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs index 4fee8b039c8cb8..4062b307cbc628 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/TestAsset.cs @@ -2,4 +2,6 @@ public class TestAsset { public string Name { get; init; } public string RunnableProjectSubPath { get; init; } + public static readonly TestAsset WasmBasicTestApp = new() { Name = "WasmBasicTestApp", RunnableProjectSubPath = "App" }; + public static readonly TestAsset BlazorBasicTestApp = new() { Name = "BlazorBasicTestApp", RunnableProjectSubPath = "App" }; } \ No newline at end of file diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs index 273a95f92ed3c8..375b77d3501701 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildPublishTests.cs @@ -25,7 +25,7 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur [BuildAndRun(config: Configuration.Debug, aot: true)] public void Wasm_CannotAOT_InDebug(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "no_aot_in_debug"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "no_aot_in_debug"); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot, ExpectSuccess: false)); Assert.Contains("AOT is not supported in debug configuration", buildOutput); } @@ -35,7 +35,7 @@ public void Wasm_CannotAOT_InDebug(Configuration config, bool aot) [BuildAndRun(config: Configuration.Debug)] public async Task BuildThenPublishNoAOT(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "build_publish"); BuildProject(info, config); if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) @@ -52,7 +52,7 @@ public async Task BuildThenPublishNoAOT(Configuration config, bool aot) [BuildAndRun(config: Configuration.Release, aot: true)] public async Task BuildThenPublishWithAOT(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_publish"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "build_publish"); bool isPublish = false; (_, string output) = BuildProject(info, config, new BuildOptions(Label: "first_build", AOT: aot)); diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs index 7c2c9d29cd401a..28253df6cea2c2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantGlobalizationTests.cs @@ -57,7 +57,7 @@ private async Task TestInvariantGlobalization(Configuration config, bool aot, bo } string prefix = $"invariant_{invariantGlobalization?.ToString() ?? "unset"}"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantGlobalization.cs")); var globalizationMode = invariantGlobalization == true ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; diff --git a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs index 0d9856347bae90..d515dfea8312ae 100644 --- a/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InvariantTimezoneTests.cs @@ -53,7 +53,7 @@ private async Task TestInvariantTimezone(Configuration config, bool aot, bool? i } string prefix = $"invariant_{invariantTimezone?.ToString() ?? "unset"}"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "InvariantTimezone.cs")); PublishProject(info, config, isNativeBuild: isNativeBuild); diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index cb9be29b45447c..5617818551e0f8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -48,7 +48,7 @@ async Task TestMainWithArgs(Configuration config, string projectContentsName, string[] args) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, projectNamePrefix); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, projectNamePrefix); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", projectContentsName)); string argsStr = string.Join(" ", args); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs index ed5bfcf60dabb7..f01fb37c5fe993 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeLibraryTests.cs @@ -27,7 +27,7 @@ public async Task ProjectWithNativeReference(Configuration config, bool aot) string extraItems = $""; string extraProperties = "true"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems, extraProperties: extraProperties); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir, objectFilename)); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir, overwrite: true); DeleteFile(Path.Combine(_projectDir, "Common", "Program.cs")); @@ -50,7 +50,7 @@ public async Task ProjectUsingSkiaSharp(Configuration config, bool aot) {GetSkiaSharpReferenceItems()} "; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraItems: extraItems); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SkiaSharp.cs")); PublishProject(info, config, new PublishOptions(AOT: aot)); @@ -64,7 +64,7 @@ public async Task ProjectUsingSkiaSharp(Configuration config, bool aot) [BuildAndRun(config: Configuration.Release, aot: true)] public async Task ProjectUsingBrowserNativeCrypto(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingBrowserNativeCrypto"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "AppUsingBrowserNativeCrypto"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeCrypto.cs")); (string _, string buildOutput) = PublishProject(info, config, new PublishOptions(AOT: aot)); @@ -83,7 +83,7 @@ public async Task ProjectUsingBrowserNativeCrypto(Configuration config, bool aot public async Task ProjectWithNativeLibrary(Configuration config, bool aot) { string extraItems = "\n"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "AppUsingNativeLib-a", extraItems: extraItems); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "AppUsingNativeLib"), _projectDir, overwrite: true); DeleteFile(Path.Combine(_projectDir, "Common", "Program.cs")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", "native-lib.o"), Path.Combine(_projectDir, "native-lib.o")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 389d158888b3f6..5be3efa64cbe06 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -33,7 +33,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool aot, string extraCFlags, string extraLDFlags) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); if (extraLDFlags.Length > 0) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 1c4bc1f6068dfa..310d163922ffef 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -21,7 +21,7 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi [MemberData(nameof(NativeBuildData))] public async void NoOpRebuildForNativeBuilds(Configuration config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_noop"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_noop"); BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); @@ -39,7 +39,7 @@ public void NativeRelinkFailsWithInvariant() { Configuration config = Configuration.Release; string extraArgs = "-p:_WasmDevel=true -p:WasmBuildNative=false -p:InvariantGlobalization=true"; - ProjectInfo info = CopyTestAsset(config, aot: true, BasicTestApp, "relink_fails"); + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.WasmBasicTestApp, "relink_fails"); var options = new PublishOptions(ExpectSuccess: false, AOT: true, ExtraMSBuildArgs: extraArgs); PublishProject(info, config, options); Assert.Contains("WasmBuildNative is required because InvariantGlobalization=true, but WasmBuildNative is already set to 'false'", _testOutput.ToString()); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 61e0d7a0361ef0..bb6129e0a7c673 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -32,7 +32,7 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC // [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void OptimizationFlagChange(Configuration config, bool aot, string cflags, string ldflags) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_flags"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); // force _WasmDevel=false, so we don't get -O0 BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 9568ceef9ae0e7..f5165b0dffb1f8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -24,7 +24,7 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT // [ActiveIssue(aot: True "Expected changed file: ...")] public async void ReferenceNewAssembly(Configuration config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_tasks"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_tasks"); BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index 3b0e5d42fe33c0..eeeb7659e6ea79 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -23,7 +23,7 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes // [ActiveIssue(aot: True "Expected changed file: dotnet.native.wasm, dotnet.native.js, WasmBasicTestApp.dll.bc, WasmBasicTestApp.dll.o")] public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild_simple"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_simple"); BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 734155a3396261..0f8aa5228abb5a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -120,7 +120,7 @@ public async void UnmanagedStructAndMethodIn_SameAssembly_WithDisableRuntimeMars private ProjectInfo PrepreProjectForBlittableTests(Configuration config, bool aot, string prefix, bool disableRuntimeMarshalling, bool useAutoLayout = false) { string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraProperties: extraProperties); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableSameAssembly.cs")); @@ -158,7 +158,7 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly string extraItems = @$""; string libRelativePath = Path.Combine("..", "Library", "Library.cs"); string programRelativePath = Path.Combine("Common", "Program.cs"); - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "blittable_different_library", extraProperties: extraProperties, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "blittable_different_library", extraProperties: extraProperties, extraItems: extraItems); ReplaceFile(libRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableDifferentAssembly_Lib.cs")); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableDifferentAssembly.cs")); if (!libraryHasAttribute) @@ -194,7 +194,7 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration config, bool aot) { string extraProperties = "$(MSBuildWarningsAsMessage);WASM0001"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "fnptr", extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "fnptr", extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); string output = PublishForVariadicFunctionTests(info, config, aot); @@ -212,7 +212,7 @@ public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration [BuildAndRun()] public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_fnptr"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "cb_fnptr"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); @@ -224,7 +224,7 @@ public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(Configur [BuildAndRun()] public async void UnmanagedCallback_InFileType(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_filetype"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "cb_filetype"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackInFile.cs")); @@ -243,7 +243,7 @@ public async void UnmanagedCallback_InFileType(Configuration config, bool aot) [BuildAndRun()] public async void UnmanagedCallersOnly_Namespaced(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "cb_namespace"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "cb_namespace"); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallbackNamespaced.cs")); @@ -297,7 +297,7 @@ public void IcallWithOverloadedParametersAndEnum(Configuration config, bool aot) """; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "icall_enum", insertAtEnd: appendToTheEnd); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "icall_enum", insertAtEnd: appendToTheEnd); // build a library containing icalls with overloaded parameters. ReplaceFile(Path.Combine("..", "Library", "Library.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ICall_Lib.cs")); // temporarily change the project directory to build the library @@ -373,7 +373,7 @@ public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, string extraItems = @$""; string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "buildNativeNonEng", extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "buildNativeNonEng", extraItems: extraItems); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BuildNative.cs")); string cCodeFilename = "simple.c"; @@ -409,7 +409,7 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Con { var extraItems = @""; string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); int baseArg = 10; GenerateSourceFiles(_projectDir, baseArg); @@ -461,7 +461,7 @@ private ProjectInfo PrepreProjectForVariadicFuntion(Configuration config, bool a string objectFilename = "variadic.o"; extraProperties += "true<_WasmDevel>true"; string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraItems: extraItems, extraProperties: extraProperties); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir, objectFilename)); return info; } @@ -481,7 +481,7 @@ private async Task EnsureWasmAbiRulesAreFollowed(Configuration config, bool aot) { var extraItems = @""; var extraProperties = "true<_WasmDevel>falsefalse"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "AbiRules.cs")); string cCodeFilename = "wasm-abi.c"; File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir, cCodeFilename)); @@ -532,7 +532,7 @@ public async void EnsureWasmAbiRulesAreFollowedInInterpreter(Configuration confi [BuildAndRun(aot: true, config: Configuration.Release)] public void EnsureComInteropCompilesInAOT(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "com"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "com"); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "ComInterop.cs")); bool isPublish = aot; (string libraryDir, string output) = isPublish ? @@ -546,7 +546,7 @@ public async void UCOWithSpecialCharacters(Configuration config, bool aot) { var extraProperties = "true"; var extraItems = @""; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "uoc", extraItems: extraItems, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "uoc", extraItems: extraItems, extraProperties: extraProperties); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "UnmanagedCallback.cs")); string cCodeFilename = "local.c"; File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", cCodeFilename), Path.Combine(_projectDir, cCodeFilename)); diff --git a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs index afc0528fdc5d37..a3b8c189f26531 100644 --- a/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/RebuildTests.cs @@ -25,7 +25,7 @@ public RebuildTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bui [BuildAndRun(aot: false, config: Configuration.Debug)] public async Task NoOpRebuild(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "rebuild"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); PublishProject(info, config); diff --git a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs index f7b9b52d82ab90..c74a21b82d86bc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteAssembliesTests.cs @@ -39,7 +39,7 @@ public async void ResourcesFromMainAssembly(Configuration config, bool aot, bool // make ASSERTIONS=1 so that we test with it + $"-O0 -sASSERTIONS=1" + $"-O1"; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraProperties: extraProperties); Utils.DirectoryCopy(Path.Combine(BuildEnvironment.TestAssetsPath, "resx"), Path.Combine(_projectDir, "resx")); CreateProgramForCultureTest($"{info.ProjectName}.resx.words", "TestClass"); @@ -66,7 +66,7 @@ public async void ResourcesFromProjectReference(Configuration config, bool aot, + $"-O0 -sASSERTIONS=1" + $"-O1"; string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, prefix, extraProperties: extraProperties, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraProperties: extraProperties, extraItems: extraItems); // D.B.* used for wasm projects should be moved next to the wasm project, so it doesn't // affect the non-wasm library project File.Move(Path.Combine(_projectDir, "..", "Directory.Build.props"), Path.Combine(_projectDir, "Directory.Build.props")); @@ -98,7 +98,7 @@ public void CheckThatSatelliteAssembliesAreNotAOTed(Configuration config, bool a -O1 false"; // -O0 can cause aot-instances.dll to blow up, and fail to compile, and it is not really needed here string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "check_sat_asm_not_aot", extraProperties: extraProperties, extraItems: extraItems); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "check_sat_asm_not_aot", extraProperties: extraProperties, extraItems: extraItems); CreateProgramForCultureTest($"{info.ProjectName}.words", "TestClass"); PublishProject(info, config, new PublishOptions(AOT: aot)); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index 272d1e818116af..e41b9ed14502be 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -21,9 +21,8 @@ public class WasmTemplateTestsBase : BuildTestBase private readonly WasmSdkBasedProjectProvider _provider; protected readonly PublishOptions _defaultPublishOptions = new PublishOptions(); protected readonly BuildOptions _defaultBuildOptions = new BuildOptions(); - protected const string DefaultRuntimeAssetsRelativePath = "./_framework/"; - protected virtual TestAsset BasicTestApp => new() { Name = "WasmBasicTestApp", RunnableProjectSubPath = "App" }; - + protected const string DefaultRuntimeAssetsRelativePath = "./_framework/"; + public WasmTemplateTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext, ProjectProviderBase? provider = null) : base(provider ?? new WasmSdkBasedProjectProvider(output, DefaultTargetFramework), output, buildContext) { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index 0768b437d52b98..f19907f74e0e6c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -26,7 +26,7 @@ public AppSettingsTests(ITestOutputHelper output, SharedBuildPerTestClassFixture public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicationEnvironment) { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "AppSettingsTest"); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.WasmBasicTestApp, "AppSettingsTest"); PublishProject(info, config); BrowserRunOptions options = new( config, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs index 480336a0af4bbf..2fe87b45c37427 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs @@ -31,7 +31,7 @@ public async Task BuildWithDefaultLevel(Configuration configuration) ProjectInfo info = CopyTestAsset( configuration, aot: false, - asset: BasicTestApp, + asset: TestAsset.WasmBasicTestApp, idPrefix: "DebugLevelTests_BuildWithDefaultLevel" ); BuildProject(info, configuration); @@ -50,7 +50,7 @@ public async Task BuildWithExplicitValue(Configuration configuration, int debugL ProjectInfo info = CopyTestAsset( configuration, aot: false, - asset: BasicTestApp, + asset: TestAsset.WasmBasicTestApp, idPrefix: "DebugLevelTests_BuildWithExplicitValue" ); BuildProject(info, configuration, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); @@ -67,7 +67,7 @@ public async Task PublishWithDefaultLevel(Configuration configuration) ProjectInfo info = CopyTestAsset( configuration, aot: false, - asset: BasicTestApp, + asset: TestAsset.WasmBasicTestApp, idPrefix: "DebugLevelTests_PublishWithDefaultLevel" ); PublishProject(info, configuration); @@ -86,7 +86,7 @@ public async Task PublishWithExplicitValue(Configuration configuration, int debu ProjectInfo info = CopyTestAsset( configuration, aot: false, - asset: BasicTestApp, + asset: TestAsset.WasmBasicTestApp, idPrefix: "DebugLevelTests_PublishWithExplicitValue" ); PublishProject(info, configuration, new PublishOptions(ExtraMSBuildArgs: $"-p:WasmDebugLevel={debugLevel}")); @@ -104,7 +104,7 @@ public async Task PublishWithDefaultLevelAndPdbs(Configuration configuration) ProjectInfo info = CopyTestAsset( configuration, aot: false, - asset: BasicTestApp, + asset: TestAsset.WasmBasicTestApp, idPrefix: "DebugLevelTests_PublishWithDefaultLevelAndPdbs" ); PublishProject(info, configuration, new PublishOptions(ExtraMSBuildArgs: $"-p:CopyOutputSymbolsToPublishDirectory=true")); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs index 9c382ca7b954e8..a5e0d62b6f40a3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs @@ -24,7 +24,7 @@ public DownloadThenInitTests(ITestOutputHelper output, SharedBuildPerTestClassFi [InlineData(Configuration.Release)] public async Task NoResourcesReFetchedAfterDownloadFinished(Configuration config) { - ProjectInfo info = CopyTestAsset(config, aot: false, BasicTestApp, "DownloadThenInitTests"); + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.WasmBasicTestApp, "DownloadThenInitTests"); BuildProject(info, config); BrowserRunOptions options = new(config, TestScenario: "DownloadThenInit"); RunResult result = await RunForBuildWithDotnetRun(options); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs index 4af9d131db8d5e..29a75667984111 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs @@ -34,7 +34,7 @@ public async Task FirstRunGeneratesTableAndSecondRunLoadsIt(Configuration config const int iterationCount = 70; _testOutput.WriteLine("/// Creating project"); - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "InterpPgoTest"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "InterpPgoTest"); _testOutput.WriteLine("/// Building"); BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:WasmDebugLevel=0")); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index 0b1faa2cdad72f..54f114ba52f69f 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -31,7 +31,7 @@ public LazyLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtension, string[] allLazyLoadingTestExtensions) { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "LazyLoadingTests"); BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:LazyLoadingTestExtension={lazyLoadingTestExtension} -p:TestLazyLoading=true")); // We are running the app and passing all possible lazy extensions to test matrix of all possibilities. @@ -53,7 +53,7 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi public async Task FailOnMissingLazyAssembly() { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LazyLoadingTests"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "LazyLoadingTests"); PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: "-p:TestLazyLoading=true")); BrowserRunOptions options = new( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index b38b3c7b74ef2d..2dfb51ffe7c46d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -27,7 +27,7 @@ public LibraryInitializerTests(ITestOutputHelper output, SharedBuildPerTestClass public async Task LoadLibraryInitializer() { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); PublishProject(info, config); RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "LibraryInitializerTest")); Assert.Collection( @@ -43,7 +43,7 @@ public async Task LoadLibraryInitializer() public async Task AbortStartupOnError() { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "LibraryInitializerTests_AbortStartupOnError"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "LibraryInitializerTests_AbortStartupOnError"); PublishProject(info, config); BrowserRunOptions options = new( diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index 72b227f8c7048a..55e57083c62150 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -25,7 +25,7 @@ public MaxParallelDownloadsTests(ITestOutputHelper output, SharedBuildPerTestCla [InlineData(Configuration.Release, "4")] public async Task NeverFetchMoreThanMaxAllowed(Configuration config, string maxParallelDownloads) { - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MaxParallelDownloadsTests"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "MaxParallelDownloadsTests"); BuildProject(info, config); RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs index 4aa5bfb84a7609..92bb35c711fa19 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs @@ -29,7 +29,7 @@ public async Task AllocateLargeHeapThenRepeatedlyInterop_NoWorkload() => public async Task AllocateLargeHeapThenRepeatedlyInterop() { Configuration config = Configuration.Release; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "MemoryTests"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "MemoryTests"); string extraArgs = "-p:EmccMaximumHeapSize=4294901760"; BuildProject(info, config, @@ -50,7 +50,7 @@ await RunForBuildWithDotnetRun(new BrowserRunOptions( public async Task RunSimpleAppWithProfiler() { Configuration config = Configuration.Release; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ProfilerTest"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "ProfilerTest"); // are are linking all 3 profilers, but below we only initialize log profiler and test it string extraArgs = $"-p:WasmProfilers=\"aot+browser+log\" -p:WasmBuildNative=true"; BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: extraArgs, AssertAppBundle: false), isNativeBuild: true); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index 6fa87acec3b4e2..9e563c2e4944b4 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -26,7 +26,7 @@ public ModuleConfigTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur public async Task DownloadProgressFinishes(bool failAssemblyDownload) { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, $"ModuleConfigTests_DownloadProgressFinishes_{failAssemblyDownload}"); PublishProject(info, config); var result = await RunForPublishWithWebServer(new BrowserRunOptions( @@ -60,7 +60,7 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) public async Task OutErrOverrideWorks() { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "ModuleConfigTests_OutErrOverrideWorks"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "ModuleConfigTests_OutErrOverrideWorks"); PublishProject(info, config); var result = await RunForPublishWithWebServer(new BrowserRunOptions( @@ -82,7 +82,7 @@ public async Task OutErrOverrideWorks() [InlineData(Configuration.Release, false)] public async Task OverrideBootConfigName(Configuration config, bool isPublish) { - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "OverrideBootConfigName"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "OverrideBootConfigName"); (string _, string _) = isPublish ? PublishProject(info, config) : BuildProject(info, config); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 632d8d3147a203..9770cc12f05814 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -30,7 +30,7 @@ public SatelliteLoadingTests(ITestOutputHelper output, SharedBuildPerTestClassFi public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) { Configuration config = Configuration.Debug; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTests"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "SatelliteLoadingTests"); BuildProject(info, config); var result = await RunForBuildWithDotnetRun(new BrowserRunOptions( @@ -61,7 +61,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) public async Task LoadSatelliteAssemblyFromReference() { Configuration config = Configuration.Release; - ProjectInfo info = CopyTestAsset(config, false, BasicTestApp, "SatelliteLoadingTestsFromReference"); + ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "SatelliteLoadingTestsFromReference"); // Replace ProjectReference with Reference var appCsprojPath = Path.Combine(_projectDir, "WasmBasicTestApp.csproj"); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index b21cd2bcaf4108..7c58c71bf5f1c5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -32,7 +32,7 @@ protected async void TestMain(string projectName, string runtimeConfigContents = "", string extraArgs = "") { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "DotnetRun"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "DotnetRun"); UpdateFile(Path.Combine("Common", "Program.cs"), programText); if (!string.IsNullOrEmpty(runtimeConfigContents)) { diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs index b68f56adba94fb..d2c7a16d314e0c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmNativeDefaultsTests.cs @@ -204,7 +204,7 @@ public void WithNativeReference(Configuration config, string extraProperties, bo ProjectInfo info = CopyTestAsset( config, aot, - BasicTestApp, + TestAsset.WasmBasicTestApp, projectPrefix, extraProperties: extraProperties, extraItems: extraItems, diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs index 5ea039ae469daa..d5161990bce189 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmRunOutOfAppBundleTests.cs @@ -18,7 +18,7 @@ public WasmRunOutOfAppBundleTests(ITestOutputHelper output, SharedBuildPerTestCl [BuildAndRun] public async void RunOutOfAppBundle(Configuration config, bool aot) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "outofappbundle"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "outofappbundle"); UpdateFile(Path.Combine("Common", "Program.cs"), s_mainReturns42); (string _, string output) = PublishProject(info, config, new PublishOptions(AOT: aot)); diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 4bdfcbfa2b9daa..d4008d6af8ecca 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -28,7 +28,7 @@ public WasmSIMDTests(ITestOutputHelper output, SharedBuildPerTestClassFixture bu [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ false, /* simd */ true })] public async void Build_NoAOT_ShouldNotRelink(Configuration config, bool aot, bool simd) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "build_with_workload_no_aot"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "build_with_workload_no_aot"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); (string _, string output) = BuildProject(info, config, new BuildOptions(ExtraMSBuildArgs: $"-p:WasmEnableSIMD={simd}")); @@ -51,7 +51,7 @@ public async void Build_NoAOT_ShouldNotRelink(Configuration config, bool aot, bo [MemberData(nameof(MainMethodSimdTestData), parameters: new object[] { /*aot*/ true, /* simd */ false })] public async void PublishSIMD_AOT(Configuration config, bool aot, bool simd) { - ProjectInfo info = CopyTestAsset(config, aot, BasicTestApp, "simd_publish"); + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "simd_publish"); UpdateFile(Path.Combine("Common", "Program.cs"), s_simdProgramText); (string _, string output) = PublishProject(info, config, new PublishOptions(ExtraMSBuildArgs: $"-p:WasmEnableSIMD={simd}", AOT: aot)); From 8914f9b2c5f12c633631b87b045b2c585bb126bc Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 2 Dec 2024 17:45:11 +0000 Subject: [PATCH 086/104] Fix `MainWithArgsTests`. Url query can have arg key duplicates -> is better represented by `NameValueCollection` than `Dictionary` --- .../Wasm.Build.Tests/Blazor/BlazorRunOptions.cs | 3 ++- .../BrowserStructures/BrowserRunOptions.cs | 3 ++- .../BrowserStructures/RunOptions.cs | 3 ++- src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs | 13 ++++++------- src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 6 +++++- .../Templates/WasmTemplateTestsBase.cs | 7 +++++-- .../TestAppScenarios/AppSettingsTests.cs | 3 ++- .../TestAppScenarios/LazyLoadingTests.cs | 5 +++-- .../TestAppScenarios/LibraryInitializerTests.cs | 3 ++- .../TestAppScenarios/MaxParallelDownloadsTests.cs | 3 ++- .../TestAppScenarios/ModuleConfigTests.cs | 3 ++- .../TestAppScenarios/SatelliteLoadingTests.cs | 3 ++- 12 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs index 851f08a10d4356..1f8b30e279d8d8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Threading.Tasks; using Microsoft.Playwright; @@ -19,7 +20,7 @@ public BlazorRunOptions( RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, Dictionary? ServerEnvironment = null, - Dictionary? BrowserQueryString = null, + NameValueCollection? BrowserQueryString = null, Action? OnConsoleMessage = null, Action? OnServerMessage = null, Action? OnErrorMessage = null, diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs index e5988d556bd305..f5e951536e760b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Threading.Tasks; using Microsoft.Playwright; @@ -19,7 +20,7 @@ public BrowserRunOptions( RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, Dictionary? ServerEnvironment = null, - Dictionary? BrowserQueryString = null, + NameValueCollection? BrowserQueryString = null, Action? OnConsoleMessage = null, Action? OnServerMessage = null, Action? OnErrorMessage = null, diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index 6fcfb36c34ebb1..d104c376f62da7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Threading.Tasks; using Microsoft.Playwright; @@ -16,7 +17,7 @@ public abstract record RunOptions bool DetectRuntimeFailures = true, Dictionary? ServerEnvironment = null, - Dictionary? BrowserQueryString = null, + NameValueCollection? BrowserQueryString = null, Action? OnConsoleMessage = null, Action? OnServerMessage = null, Action? OnErrorMessage = null, diff --git a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs index 5617818551e0f8..83e79e6955dddf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MainWithArgsTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -22,9 +23,7 @@ public MainWithArgsTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur public static IEnumerable MainWithArgsTestData(bool aot) => ConfigWithAOTData(aot).Multiply( - // ToDo: - // ActiveIssue - passing args to the program does not work, possible error in the test logic - // new object?[] { new object?[] { "abc", "foobar"} }, + new object?[] { new object?[] { "abc", "foobar"} }, new object?[] { new object?[0] }) .Where(item => !(item.ElementAt(0) is Configuration config && config == Configuration.Debug && item.ElementAt(1) is bool aotValue && aotValue)) .UnwrapItemsAsArrays(); @@ -36,7 +35,6 @@ public async Task AsyncMainWithArgs(Configuration config, bool aot, string[] arg => await TestMainWithArgs(config, aot, "async_main_with_args", "AsyncMainWithArgs.cs", args); [Theory] - [ActiveIssue("ToDo: passing args to the program does not work, possible error in the test logic")] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ false })] [MemberData(nameof(MainWithArgsTestData), parameters: new object[] { /*aot*/ true })] public async Task NonAsyncMainWithArgs(Configuration config, bool aot, string[] args) @@ -51,14 +49,15 @@ async Task TestMainWithArgs(Configuration config, ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, projectNamePrefix); ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", projectContentsName)); - string argsStr = string.Join(" ", args); - _testOutput.WriteLine ($"-- args: {argsStr}, name: {projectContentsName}"); + var queryArgs = new NameValueCollection(); + foreach (var arg in args) + queryArgs.Add("arg", arg); PublishProject(info, config, new PublishOptions(AOT: aot)); int argsCount = args.Length; int expectedCode = 42 + argsCount; RunResult output = await RunForPublishWithWebServer( - new BrowserRunOptions(config, TestScenario: "DotnetRun", ExtraArgs: argsStr, ExpectedExitCode: expectedCode)); + new BrowserRunOptions(config, TestScenario: "MainWithArgs", BrowserQueryString: queryArgs, ExpectedExitCode: expectedCode)); Assert.Contains(output.TestOutput, m => m.Contains($"args#: {argsCount}")); foreach (var arg in args) Assert.Contains(output.TestOutput, m => m.Contains($"arg: {arg}")); diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index afa549f189699c..9058cb6631c876 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -5,6 +5,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Collections.Generic; +using System.Collections.Specialized; using Wasm.Build.Tests.TestAppScenarios; using Xunit.Abstractions; using Xunit; @@ -29,7 +30,10 @@ protected async Task SignalRPassMessage(string staticWebAssetBasePath, Configura Configuration: config, ServerEnvironment: new Dictionary { ["ASPNETCORE_ENVIRONMENT"] = "Development" }, BrowserPath: staticWebAssetBasePath, - BrowserQueryString: new Dictionary { ["transport"] = transport, ["message"] = "ping" } )); + BrowserQueryString: new NameValueCollection { + { "transport", transport}, + { "message", "ping" } + })); string testOutput = string.Join("\n", result.TestOutput) ?? ""; Assert.NotEmpty(testOutput); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index e41b9ed14502be..e08ec20e4d4bea 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Text; @@ -269,10 +270,12 @@ private async Task BrowserRunTest(string runArgs, using RunCommand runCommand = new RunCommand(s_buildEnv, _testOutput); ToolCommand cmd = runCommand.WithWorkingDirectory(workingDirectory); - var query = runOptions.BrowserQueryString ?? new Dictionary(); + var query = runOptions.BrowserQueryString ?? new NameValueCollection(); if (runOptions is BrowserRunOptions browserOp && !string.IsNullOrEmpty(browserOp.TestScenario)) query.Add("test", browserOp.TestScenario); - var queryString = query.Any() ? "?" + string.Join("&", query.Select(kvp => $"{kvp.Key}={kvp.Value}")) : ""; + var queryString = query.Count > 0 && query.AllKeys != null + ? "?" + string.Join("&", query.AllKeys.SelectMany(key => query.GetValues(key)?.Select(value => $"{key}={value}") ?? Enumerable.Empty())) + : ""; List testOutput = new(); List consoleOutput = new(); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs index f19907f74e0e6c..bf361120dffac9 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -31,7 +32,7 @@ public async Task LoadAppSettingsBasedOnApplicationEnvironment(string applicatio BrowserRunOptions options = new( config, TestScenario: "AppSettingsTest", - BrowserQueryString: new Dictionary { ["applicationEnvironment"] = applicationEnvironment } + BrowserQueryString: new NameValueCollection { { "applicationEnvironment", applicationEnvironment } } ); RunResult result = await RunForPublishWithWebServer(options); Assert.Contains(result.TestOutput, m => m.Contains("'/appsettings.json' exists 'True'")); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs index 54f114ba52f69f..22c9cb5a24abb1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -41,7 +42,7 @@ public async Task LoadLazyAssemblyBeforeItIsNeeded(string lazyLoadingTestExtensi RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "LazyLoadingTest", - BrowserQueryString: new Dictionary { ["lazyLoadingTestExtension"] = clientLazyLoadingTestExtension } + BrowserQueryString: new NameValueCollection { {"lazyLoadingTestExtension", clientLazyLoadingTestExtension } } )); Assert.True(result.TestOutput.Any(m => m.Contains("FirstName")), "The lazy loading test didn't emit expected message with JSON"); @@ -59,7 +60,7 @@ public async Task FailOnMissingLazyAssembly() BrowserRunOptions options = new( config, TestScenario: "LazyLoadingTest", - BrowserQueryString: new Dictionary { ["loadRequiredAssembly"] = "false" }, + BrowserQueryString: new NameValueCollection { {"loadRequiredAssembly", "false" } }, ExpectedExitCode: 1); RunResult result = await RunForPublishWithWebServer(options); Assert.True(result.ConsoleOutput.Any(m => m.Contains("Could not load file or assembly") && m.Contains("Json")), "The lazy loading test didn't emit expected error message"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs index 2dfb51ffe7c46d..53ca03251b8ddd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Text; @@ -49,7 +50,7 @@ public async Task AbortStartupOnError() BrowserRunOptions options = new( config, TestScenario: "LibraryInitializerTest", - BrowserQueryString: new Dictionary { ["throwError"] = "true" }, + BrowserQueryString: new NameValueCollection { {"throwError", "true" } }, ExpectedExitCode: 1); RunResult result = await RunForPublishWithWebServer(options); Assert.True(result.ConsoleOutput.Any(m => AbortStartupOnErrorRegex().IsMatch(m)), "The library initializer test didn't emit expected error message"); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs index 55e57083c62150..4e3abdd5a0dbcb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Linq; using System.Threading.Tasks; using Xunit.Abstractions; @@ -30,7 +31,7 @@ public async Task NeverFetchMoreThanMaxAllowed(Configuration config, string maxP RunResult result = await RunForBuildWithDotnetRun(new BrowserRunOptions( config, TestScenario: "MaxParallelDownloads", - BrowserQueryString: new Dictionary { ["maxParallelDownloads"] = maxParallelDownloads } + BrowserQueryString: new NameValueCollection { {"maxParallelDownloads", maxParallelDownloads } } )); var resultTestOutput = result.TestOutput.ToList(); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs index 9e563c2e4944b4..d5ab524c9c29d3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -32,7 +33,7 @@ public async Task DownloadProgressFinishes(bool failAssemblyDownload) var result = await RunForPublishWithWebServer(new BrowserRunOptions( Configuration: config, TestScenario: "DownloadResourceProgressTest", - BrowserQueryString: new Dictionary { ["failAssemblyDownload"] = failAssemblyDownload.ToString().ToLowerInvariant() } + BrowserQueryString: new NameValueCollection { {"failAssemblyDownload", failAssemblyDownload.ToString().ToLowerInvariant() } } )); Assert.True( result.TestOutput.Any(m => m.Contains("DownloadResourceProgress: Finished")), diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs index 9770cc12f05814..3e40c434931b97 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.IO; using System.Linq; using System.Text; @@ -36,7 +37,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) var result = await RunForBuildWithDotnetRun(new BrowserRunOptions( Configuration: config, TestScenario: "SatelliteAssembliesTest", - BrowserQueryString: new Dictionary { ["loadAllSatelliteResources"] = loadAllSatelliteResources.ToString().ToLowerInvariant() } + BrowserQueryString: new NameValueCollection { {"loadAllSatelliteResources", loadAllSatelliteResources.ToString().ToLowerInvariant() } } )); var expectedOutput = new List>(); From 6de35c1f2d5d0f74730906d8d2b89d8cb14786a8 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 3 Dec 2024 09:12:26 +0000 Subject: [PATCH 087/104] Fix `WasmBuildAppTest` --- src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs index 7c58c71bf5f1c5..7836ff1a15b3be 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppBase.cs @@ -26,7 +26,7 @@ protected async void TestMain(string projectName, string programText, Configuration config, bool aot, - bool isNativeBuild = false, + bool? isNativeBuild = null, int expectedExitCode = 42, string expectedOutput = "Hello, World!", string runtimeConfigContents = "", From fafdfc06502ccffcfdd27314a9d75b44e14a229f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Tue, 3 Dec 2024 11:33:53 +0000 Subject: [PATCH 088/104] AppBundle was never asserted for size in `OptimizationFlagChangeTests` + use statistics that are fingerprinting insensitive. --- .../NativeRebuildTests/NativeRebuildTestsBase.cs | 8 +++----- .../OptimizationFlagChangeTests.cs | 16 ++++++++++------ .../ReferenceNewAssemblyRebuildTest.cs | 2 +- .../SimpleSourceChangeRebuildTest.cs | 2 +- .../wasm/Wasm.Build.Tests/ProjectProviderBase.cs | 2 +- .../Templates/WasmTemplateTestsBase.cs | 4 ++-- 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index 8e9abcd881d12e..d47e8d4f60d444 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -58,7 +58,7 @@ internal async Task FirstNativeBuildAndRun(ProjectInfo info, Configu return GetBuildPaths(config, forPublish: true); } - protected string Rebuild(ProjectInfo info, Configuration config, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal") + protected string Rebuild(ProjectInfo info, Configuration config, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal", bool assertAppBundle=true) { if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); @@ -72,10 +72,8 @@ protected string Rebuild(ProjectInfo info, Configuration config, bool nativeReli bool isNativeBuild = nativeRelink || invariant; var globalizationMode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; - (string _, string output) = PublishProject(info, - config, - new PublishOptions(GlobalizationMode: globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false), - isNativeBuild: nativeRelink); + var options = new PublishOptions(GlobalizationMode: globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false, AssertAppBundle: assertAppBundle); + (string _, string output) = PublishProject(info, config, options, isNativeBuild: nativeRelink); return output; } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index bb6129e0a7c673..166a54c13ec74d 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -29,12 +29,12 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC [Theory] [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] - // [ActiveIssue("File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not")] public async void OptimizationFlagChange(Configuration config, bool aot, string cflags, string ldflags) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); - // force _WasmDevel=false, so we don't get -O0 - BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false, extraBuildArgs: "/p:_WasmDevel=false"); + // force _WasmDevel=false, so we don't get -O0 but -O2 + string optElevationArg = "/p:_WasmDevel=false"; + BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false, extraBuildArgs: optElevationArg); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); @@ -59,9 +59,13 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string var originalStat = StatFiles(pathsDict); // Rebuild - - string output = Rebuild(info, config, nativeRelink: true, invariant: false, extraBuildArgs: $" {cflags} {ldflags}", verbosity: "normal"); - var newStat = StatFiles(pathsDict); + string output = Rebuild(info, + config, + nativeRelink: true, + invariant: false, + extraBuildArgs: $" {cflags} {ldflags} {optElevationArg}", + assertAppBundle: false); // optimization flags change changes the size of dotnet.native.wasm + var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index f5165b0dffb1f8..88918a61043534 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -38,7 +38,7 @@ public async void ReferenceNewAssembly(Configuration config, bool aot, bool nati ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeRebuildNewAssembly.cs")); Rebuild(info, config, nativeRelink, invariant); - var newStat = StatFilesAfterChange(pathsDict); + var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); await RunForPublishWithWebServer(new BrowserRunOptions(config, ExpectedExitCode: 42, TestScenario: "DotnetRun")); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index eeeb7659e6ea79..fbbf92fc694779 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -40,7 +40,7 @@ public async void SimpleStringChangeInSource(Configuration config, bool aot, boo // Rebuild Rebuild(info, config, nativeRelink, invariant); - var newStat = StatFilesAfterChange(pathsDict); + var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 55)); diff --git a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs index f680b6754e4745..236d8f1901c0d3 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ProjectProviderBase.cs @@ -263,7 +263,7 @@ public IDictionary StatFiles(IDictionary StatFilesAfterChange(IDictionary pathsDict) + public IDictionary StatFilesAfterRebuild(IDictionary pathsDict) { if (!IsFingerprintingEnabled) return StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index e08ec20e4d4bea..e8812246313d91 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -359,8 +359,8 @@ public IDictionary StatFiles(IDictionary StatFilesAfterChange(IDictionary fullpaths) => - _provider.StatFilesAfterChange(fullpaths); + public IDictionary StatFilesAfterRebuild(IDictionary fullpaths) => + _provider.StatFilesAfterRebuild(fullpaths); public void CompareStat(IDictionary oldStat, IDictionary newStat, IDictionary expected) => _provider.CompareStat(oldStat, newStat, expected); From 10a50abe9b24eac22169f3b4fa066040a0740d30 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:37:30 +0000 Subject: [PATCH 089/104] Reading from config is a known issue. --- src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs index 414c78856a123c..996d3a490651b1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmBuildAppTest.cs @@ -96,7 +96,7 @@ public void Bug49588_RegressionTest_NativeRelinking(Configuration config, bool a [Theory] [BuildAndRun] - [ActiveIssue("from some reason we cannot read from the config file")] + [ActiveIssue("https://github.com/dotnet/runtime/issues/97449")] public void PropertiesFromRuntimeConfigJson(Configuration config, bool aot) => TestMain("runtime_config_json", @" @@ -120,7 +120,7 @@ public void PropertiesFromRuntimeConfigJson(Configuration config, bool aot) [Theory] [BuildAndRun] - [ActiveIssue("from some reason we cannot read from the config file")] + [ActiveIssue("https://github.com/dotnet/runtime/issues/97449")] public void PropertiesFromCsproj(Configuration config, bool aot) => TestMain("csproj_properties", @" From a3f19ad1b8c7dd602771aa585550c195bc5ee0e3 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 5 Dec 2024 12:23:32 +0000 Subject: [PATCH 090/104] Fix `SimpleSourceChangeRebuildTest`: pass AOT arg to build methods. --- .../FlagsChangeRebuildTest.cs | 4 +-- .../NativeRebuildTestsBase.cs | 29 ++++++++++++------- .../NoopNativeRebuildTest.cs | 4 +-- .../OptimizationFlagChangeTests.cs | 5 ++-- .../ReferenceNewAssemblyRebuildTest.cs | 6 ++-- .../SimpleSourceChangeRebuildTest.cs | 8 ++--- 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 5be3efa64cbe06..8eb84b0e5455fd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -34,7 +34,7 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool aot, string extraCFlags, string extraLDFlags) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); - BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, aot, requestNativeRelink: true, invariant: false); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); if (extraLDFlags.Length > 0) pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); @@ -44,7 +44,7 @@ public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool ao // Rebuild string mainAssembly = $"{info.ProjectName}.dll"; string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; - string output = Rebuild(info, config, nativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); + string output = Rebuild(info, config, aot, requestNativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); var newStat = StatFiles(pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs index d47e8d4f60d444..2b90d03136bb00 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NativeRebuildTestsBase.cs @@ -46,34 +46,43 @@ public NativeRebuildTestsBase(ITestOutputHelper output, SharedBuildPerTestClassF .UnwrapItemsAsArrays().ToList(); } - internal async Task FirstNativeBuildAndRun(ProjectInfo info, Configuration config, bool nativeRelink, bool invariant, string extraBuildArgs="") + internal async Task FirstNativeBuildAndRun(ProjectInfo info, Configuration config, bool aot, bool requestNativeRelink, bool invariant, string extraBuildArgs="") { - bool isNativeBuild = nativeRelink || invariant; - var extraArgs = $"-p:_WasmDevel=true -p:WasmBuildNative={nativeRelink} -p:InvariantGlobalization={invariant} {extraBuildArgs}"; + var extraArgs = $"-p:_WasmDevel=true {extraBuildArgs}"; + if (requestNativeRelink) + extraArgs += $" -p:WasmBuildNative={requestNativeRelink}"; + if (invariant) + extraArgs += $" -p:InvariantGlobalization={invariant}"; + bool? nativeBuildValue = (requestNativeRelink || invariant) ? true : null; PublishProject(info, config, - new PublishOptions(GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, ExtraMSBuildArgs: extraArgs), - isNativeBuild: nativeRelink); + new PublishOptions(AOT: aot, GlobalizationMode: invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded, ExtraMSBuildArgs: extraArgs), + isNativeBuild: nativeBuildValue); await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); return GetBuildPaths(config, forPublish: true); } - protected string Rebuild(ProjectInfo info, Configuration config, bool nativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal", bool assertAppBundle=true) + protected string Rebuild( + ProjectInfo info, Configuration config, bool aot, bool requestNativeRelink, bool invariant, string extraBuildArgs="", string verbosity="normal", bool assertAppBundle=true) { if (!_buildContext.TryGetBuildFor(info, out BuildResult? result)) throw new XunitException($"Test bug: could not get the build result in the cache"); File.Move(result!.LogFile, Path.ChangeExtension(result.LogFile!, ".first.binlog")); - var extraArgs = $"-p:_WasmDevel=true -p:WasmBuildNative={nativeRelink} -p:InvariantGlobalization={invariant} -v:{verbosity} {extraBuildArgs}"; + var extraArgs = $"-p:_WasmDevel=true -v:{verbosity} {extraBuildArgs}"; + if (requestNativeRelink) + extraArgs += $" -p:WasmBuildNative={requestNativeRelink}"; + if (invariant) + extraArgs += $" -p:InvariantGlobalization={invariant}"; // artificial delay to have new enough timestamps Thread.Sleep(5000); - bool isNativeBuild = nativeRelink || invariant; + bool? nativeBuildValue = (requestNativeRelink || invariant) ? true : null; var globalizationMode = invariant ? GlobalizationMode.Invariant : GlobalizationMode.Sharded; - var options = new PublishOptions(GlobalizationMode: globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false, AssertAppBundle: assertAppBundle); - (string _, string output) = PublishProject(info, config, options, isNativeBuild: nativeRelink); + var options = new PublishOptions(AOT: aot, GlobalizationMode: globalizationMode, ExtraMSBuildArgs: extraArgs, UseCache: false, AssertAppBundle: assertAppBundle); + (string _, string output) = PublishProject(info, config, options, isNativeBuild: nativeBuildValue); return output; } diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs index 310d163922ffef..dada93b41b0701 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/NoopNativeRebuildTest.cs @@ -22,12 +22,12 @@ public NoopNativeRebuildTest(ITestOutputHelper output, SharedBuildPerTestClassFi public async void NoOpRebuildForNativeBuilds(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_noop"); - BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, aot, nativeRelink, invariant); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); var originalStat = StatFiles(pathsDict); - Rebuild(info, config, nativeRelink, invariant); + Rebuild(info, config, aot, nativeRelink, invariant); var newStat = StatFiles(pathsDict); CompareStat(originalStat, newStat, pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 166a54c13ec74d..069ce211fdc8d5 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -34,7 +34,7 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); // force _WasmDevel=false, so we don't get -O0 but -O2 string optElevationArg = "/p:_WasmDevel=false"; - BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink: true, invariant: false, extraBuildArgs: optElevationArg); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, aot, requestNativeRelink: true, invariant: false, extraBuildArgs: optElevationArg); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); @@ -61,7 +61,8 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string // Rebuild string output = Rebuild(info, config, - nativeRelink: true, + aot, + requestNativeRelink: true, invariant: false, extraBuildArgs: $" {cflags} {ldflags} {optElevationArg}", assertAppBundle: false); // optimization flags change changes the size of dotnet.native.wasm diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 88918a61043534..033e7667d99212 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -21,11 +21,11 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT [Theory] [MemberData(nameof(NativeBuildData))] - // [ActiveIssue(aot: True "Expected changed file: ...")] + // [ActiveIssue(aot: True "Expected changed file: driver-gen.c")] public async void ReferenceNewAssembly(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_tasks"); - BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, aot, nativeRelink, invariant); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: false); pathsDict.UpdateTo(unchanged: true, "corebindings.o"); @@ -37,7 +37,7 @@ public async void ReferenceNewAssembly(Configuration config, bool aot, bool nati ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeRebuildNewAssembly.cs")); - Rebuild(info, config, nativeRelink, invariant); + Rebuild(info, config, aot, nativeRelink, invariant); var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs index fbbf92fc694779..e7207e26600664 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/SimpleSourceChangeRebuildTest.cs @@ -20,16 +20,16 @@ public SimpleSourceChangeRebuildTest(ITestOutputHelper output, SharedBuildPerTes [Theory] [MemberData(nameof(NativeBuildData))] - // [ActiveIssue(aot: True "Expected changed file: dotnet.native.wasm, dotnet.native.js, WasmBasicTestApp.dll.bc, WasmBasicTestApp.dll.o")] public async void SimpleStringChangeInSource(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_simple"); - BuildPaths paths = await FirstNativeBuildAndRun(info, config, nativeRelink, invariant); + BuildPaths paths = await FirstNativeBuildAndRun(info, config, aot, nativeRelink, invariant); string mainAssembly = $"{info.ProjectName}{ProjectProviderBase.WasmAssemblyExtension}"; var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); pathsDict.UpdateTo(unchanged: false, mainAssembly); - pathsDict.UpdateTo(unchanged: !aot, "dotnet.native.wasm", "dotnet.native.js"); + bool dotnetFilesSizeUnchanged = !aot; + pathsDict.UpdateTo(unchanged: dotnetFilesSizeUnchanged, "dotnet.native.wasm", "dotnet.native.js"); if (aot) pathsDict.UpdateTo(unchanged: false, $"{info.ProjectName}.dll.bc", $"{info.ProjectName}.dll.o"); @@ -39,7 +39,7 @@ public async void SimpleStringChangeInSource(Configuration config, bool aot, boo ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "SimpleSourceChange.cs")); // Rebuild - Rebuild(info, config, nativeRelink, invariant); + Rebuild(info, config, aot, nativeRelink, invariant, assertAppBundle: dotnetFilesSizeUnchanged); var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); From f86ed8dad3fdd955b086cd1f8e53f8fb28f3f005 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:00:36 +0000 Subject: [PATCH 091/104] Fix `OptimizationFlagChangeTests`: log when requested in the query. --- .../wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs | 2 ++ .../BrowserStructures/BrowserRunOptions.cs | 2 ++ .../Wasm.Build.Tests/BrowserStructures/RunOptions.cs | 1 + .../NativeRebuildTests/OptimizationFlagChangeTests.cs | 6 +++--- .../Templates/WasmTemplateTestsBase.cs | 5 +++++ .../testassets/WasmBasicTestApp/App/wwwroot/main.js | 10 ++++++++++ 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs index 1f8b30e279d8d8..628227edc7c85c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorRunOptions.cs @@ -17,6 +17,7 @@ public record BlazorRunOptions : RunOptions public BlazorRunOptions( Configuration Configuration, + bool AOT = false, RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, Dictionary? ServerEnvironment = null, @@ -34,6 +35,7 @@ public BlazorRunOptions( Func? ExecuteAfterLoaded = null ) : base( Configuration, + AOT, Host, DetectRuntimeFailures, ServerEnvironment, diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs index f5e951536e760b..98b8e9d0aef421 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/BrowserRunOptions.cs @@ -17,6 +17,7 @@ public record BrowserRunOptions : RunOptions public BrowserRunOptions( Configuration Configuration, + bool AOT = false, RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, Dictionary? ServerEnvironment = null, @@ -32,6 +33,7 @@ public BrowserRunOptions( string? TestScenario = null ) : base( Configuration, + AOT, Host, DetectRuntimeFailures, ServerEnvironment, diff --git a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs index d104c376f62da7..df379e86db30cd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BrowserStructures/RunOptions.cs @@ -13,6 +13,7 @@ namespace Wasm.Build.Tests; public abstract record RunOptions ( Configuration Configuration, + bool AOT = false, RunHost Host = RunHost.DotnetRun, bool DetectRuntimeFailures = true, diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs index 069ce211fdc8d5..069b37cd62748e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/OptimizationFlagChangeTests.cs @@ -28,7 +28,7 @@ public OptimizationFlagChangeTests(ITestOutputHelper output, SharedBuildPerTestC [Theory] [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ false)] - // [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] + [MemberData(nameof(FlagsOnlyChangeData), parameters: /*aot*/ true)] public async void OptimizationFlagChange(Configuration config, bool aot, string cflags, string ldflags) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); @@ -69,8 +69,8 @@ public async void OptimizationFlagChange(Configuration config, bool aot, string var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); - RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); - TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, + RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, aot, TestScenario: "DotnetRun")); + TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.ConsoleOutput, contains: aot); } } diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index e8812246313d91..f5d499533139de 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -271,6 +271,11 @@ private async Task BrowserRunTest(string runArgs, ToolCommand cmd = runCommand.WithWorkingDirectory(workingDirectory); var query = runOptions.BrowserQueryString ?? new NameValueCollection(); + if (runOptions.AOT) + { + query.Add("MONO_LOG_LEVEL", "debug"); + query.Add("MONO_LOG_MASK", "aot"); + } if (runOptions is BrowserRunOptions browserOp && !string.IsNullOrEmpty(browserOp.TestScenario)) query.Add("test", browserOp.TestScenario); var queryString = query.Count > 0 && query.AllKeys != null diff --git a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js index 20f300f8867ed4..8a773e2756aaa1 100644 --- a/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js +++ b/src/mono/wasm/testassets/WasmBasicTestApp/App/wwwroot/main.js @@ -26,6 +26,16 @@ dotnet .withExitCodeLogging() .withExitOnUnhandledError(); +const logLevel = params.get("MONO_LOG_LEVEL"); +const logMask = params.get("MONO_LOG_MASK"); +if (logLevel !== null && logMask !== null) { + dotnet.withDiagnosticTracing(true); // enable JavaScript tracing + dotnet.withConfig({environmentVariables: { + "MONO_LOG_LEVEL": logLevel, + "MONO_LOG_MASK": logMask, + }}); +} + // Modify runtime start based on test case switch (testCase) { case "SatelliteAssembliesTest": From 410141a28a5f0d8204098361d78a50bb6b0d0e9b Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 6 Dec 2024 10:14:25 +0000 Subject: [PATCH 092/104] Fix `FlagsChangeRebuildTests`. --- .../FlagsChangeRebuildTest.cs | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs index 8eb84b0e5455fd..76c55cf22287d2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/FlagsChangeRebuildTest.cs @@ -21,22 +21,21 @@ public FlagsChangeRebuildTests(ITestOutputHelper output, SharedBuildPerTestClass public static IEnumerable FlagsChangesForNativeRelinkingData(bool aot) => ConfigWithAOTData(aot, config: Configuration.Release).Multiply( - new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" } - // File sizes don't match: dotnet.native.wasm size should be same as from obj/for-publish but is not - // new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" }, - // new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } + new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "" }, + new object[] { /*cflags*/ "", /*ldflags*/ "/p:EmccExtraLDFlags=-g" }, + new object[] { /*cflags*/ "/p:EmccExtraCFlags=-g", /*ldflags*/ "/p:EmccExtraLDFlags=-g" } ).UnwrapItemsAsArrays(); [Theory] [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ false)] - // Found statically linked AOT module: failed - // [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] + [MemberData(nameof(FlagsChangesForNativeRelinkingData), parameters: /*aot*/ true)] public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool aot, string extraCFlags, string extraLDFlags) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_flags"); BuildPaths paths = await FirstNativeBuildAndRun(info, config, aot, requestNativeRelink: true, invariant: false); var pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); - if (extraLDFlags.Length > 0) + bool dotnetNativeFilesUnchanged = extraLDFlags.Length == 0; + if (!dotnetNativeFilesUnchanged) pathsDict.UpdateTo(unchanged: false, "dotnet.native.wasm", "dotnet.native.js"); var originalStat = StatFiles(pathsDict); @@ -44,10 +43,9 @@ public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool ao // Rebuild string mainAssembly = $"{info.ProjectName}.dll"; string extraBuildArgs = $" {extraCFlags} {extraLDFlags}"; - string output = Rebuild(info, config, aot, requestNativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, verbosity: "normal"); - - pathsDict = GetFilesTable(info.ProjectName, aot, paths, unchanged: true); - var newStat = StatFiles(pathsDict); + string output = Rebuild(info, config, aot, requestNativeRelink: true, invariant: false, extraBuildArgs: extraBuildArgs, assertAppBundle: dotnetNativeFilesUnchanged); + + var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); // cflags: pinvoke get's compiled, but doesn't overwrite pinvoke.o @@ -63,8 +61,8 @@ public async void ExtraEmccFlagsSetButNoRealChange(Configuration config, bool ao Assert.DoesNotContain("Compiling assembly bitcode files", output); } - RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "DotnetRun")); - TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.TestOutput, + RunResult runOutput = await RunForPublishWithWebServer(new BrowserRunOptions(config, aot, TestScenario: "DotnetRun")); + TestUtils.AssertSubstring($"Found statically linked AOT module '{Path.GetFileNameWithoutExtension(mainAssembly)}'", runOutput.ConsoleOutput, contains: aot); } } From f9503c7a4e66caa708d1718b58c444c25e928e45 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:21:56 +0000 Subject: [PATCH 093/104] Fix `ReferenceNewAssemblyRebuildTest`: Json lib was already referenced before the change in the test. Use Cryptography lib instead. --- .../EntryPoints/NativeRebuildNewAssembly.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.cs b/src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.cs index 07083f4b6bbb01..fe96960f5385d9 100644 --- a/src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.cs +++ b/src/mono/wasm/testassets/EntryPoints/NativeRebuildNewAssembly.cs @@ -1,12 +1,17 @@ using System; -using System.Text.Json; +using System.Security.Cryptography; +using System.Text; public class Test { public static int Main() { - string json = "{ \"name\": \"value\" }"; - var jdoc = JsonDocument.Parse($"{json}", new JsonDocumentOptions()); - Console.WriteLine($"json: {jdoc}"); + string input = "Hello, world!"; + using (SHA256 sha256 = SHA256.Create()) + { + byte[] inputBytes = Encoding.UTF8.GetBytes(input); + byte[] hashBytes = sha256.ComputeHash(inputBytes); + Console.WriteLine($"Hash of {input}: {Convert.ToBase64String(hashBytes)}"); + } return 42; } } \ No newline at end of file From 9d153d6044214a5e171592abd900c98e54b2324f Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:32:03 +0000 Subject: [PATCH 094/104] Missing change to the previous commit. --- .../NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs index 033e7667d99212..7f39761591054c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/ReferenceNewAssemblyRebuildTest.cs @@ -21,7 +21,6 @@ public ReferenceNewAssemblyRebuildTest(ITestOutputHelper output, SharedBuildPerT [Theory] [MemberData(nameof(NativeBuildData))] - // [ActiveIssue(aot: True "Expected changed file: driver-gen.c")] public async void ReferenceNewAssembly(Configuration config, bool aot, bool nativeRelink, bool invariant) { ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "rebuild_tasks"); @@ -37,7 +36,7 @@ public async void ReferenceNewAssembly(Configuration config, bool aot, bool nati ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "NativeRebuildNewAssembly.cs")); - Rebuild(info, config, aot, nativeRelink, invariant); + Rebuild(info, config, aot, nativeRelink, invariant, assertAppBundle: !aot); var newStat = StatFilesAfterRebuild(pathsDict); CompareStat(originalStat, newStat, pathsDict); From 25a614fbf60a412181bb5e6f7b51c4aad1f4e574 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Fri, 6 Dec 2024 11:59:10 +0000 Subject: [PATCH 095/104] Keep blazor workload tests together. --- .../Wasm.Build.Tests/Blazor/BuildPublishTests.cs | 14 -------------- .../Blazor/WorkloadRequiredTests.cs | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 119842d72d3383..961ba71e824ce1 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -23,20 +23,6 @@ public BuildPublishTests(ITestOutputHelper output, SharedBuildPerTestClassFixtur _enablePerTestCleanup = true; } - [Theory, TestCategory("no-workload")] - [InlineData(Configuration.Debug)] - [InlineData(Configuration.Release)] - public async Task DefaultTemplate_WithoutWorkload(Configuration config) - { - ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_no_workload"); - BlazorBuild(info, config); - await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); - - BlazorPublish(info, config, new PublishOptions(UseCache: false)); - await RunForPublishWithWebServer(new BlazorRunOptions(config)); - } - - public static TheoryData TestDataForDefaultTemplate_WithWorkload(bool isAot) { var data = new TheoryData(); diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index fa2002ecd35e79..92c13e8e06f413 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -72,6 +72,20 @@ public static TheoryData InvariantGlobalizationTestDa return data; } + [Theory, TestCategory("no-workload")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public async Task DefaultTemplate_WithoutWorkload(Configuration config) + { + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_no_workload"); + BlazorBuild(info, config); + await RunForBuildWithDotnetRun(new BlazorRunOptions(config)); + + BlazorPublish(info, config, new PublishOptions(UseCache: false)); + await RunForPublishWithWebServer(new BlazorRunOptions(config)); + } + + [Theory, TestCategory("no-workload")] [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ true)] From 61890b962a86ad7b087cfd82b405076dcdf19fa7 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 6 Dec 2024 16:29:57 +0100 Subject: [PATCH 096/104] Fix: `PInvokeTableGeneratorTests` on Windows. --- .../Wasm.Build.Tests/PInvokeTableGeneratorTests.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 0f8aa5228abb5a..6d79c0c3b0aa72 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -123,7 +123,7 @@ private ProjectInfo PrepreProjectForBlittableTests(Configuration config, bool ao ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraProperties: extraProperties); string programRelativePath = Path.Combine("Common", "Program.cs"); ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "BittableSameAssembly.cs")); - + var replacements = new Dictionary { }; if (!disableRuntimeMarshalling) { @@ -259,8 +259,8 @@ public async void UnmanagedCallersOnly_Namespaced(Configuration config, bool aot Assert.Contains("B.Conflict.C", result.TestOutput); if (OperatingSystem.IsWindows()) { // Windows console unicode support is not great - Assert.Contains("A.Conflict.C_", result.TestOutput); - Assert.Contains("B.Conflict.C_", result.TestOutput); + Assert.Contains(result.TestOutput, m => m.Contains("A.Conflict.C_")); + Assert.Contains(result.TestOutput, m => m.Contains("B.Conflict.C_")); } else { Assert.Contains("A.Conflict.C_\U0001F412", result.TestOutput); Assert.Contains("B.Conflict.C_\U0001F412", result.TestOutput); @@ -309,7 +309,7 @@ public void IcallWithOverloadedParametersAndEnum(Configuration config, bool aot) BuildProject(info, config, new BuildOptions(AssertAppBundle: false, AOT: aot)); // restore the project directory _projectDir = Path.Combine(_projectDir, "..", "App"); - + string icallTable = """ [ @@ -346,7 +346,7 @@ public void IcallWithOverloadedParametersAndEnum(Configuration config, bool aot) throw new FileNotFoundException($"Could not find WasmAppBuilder.dll in {tasksDir}"); _testOutput.WriteLine ("Using WasmAppBuilder.dll from {0}", taskPath); - + string AddAssembly(string assemblyLocation, string name) => $""; string frameworkDir = Path.Combine(GetBinFrameworkDir(config, isPublish)); string appAssemblyPath = Path.Combine(frameworkDir, "..", ".."); @@ -383,7 +383,7 @@ public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, { "LANG", culture }, { "LC_ALL", culture }, }; - + (_, string output) = PublishProject(info, config, new PublishOptions(ExtraBuildEnvironmentVariables: extraEnvVars, AOT: aot), @@ -410,7 +410,7 @@ public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Con var extraItems = @""; string extraProperties = aot ? string.Empty : "true"; ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); - + int baseArg = 10; GenerateSourceFiles(_projectDir, baseArg); bool isPublish = aot; From 52c12b3a45bef4520055da3cccbcb9b683b330de Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 6 Dec 2024 16:36:54 +0100 Subject: [PATCH 097/104] Move all no-workload blazor tests to one class. --- .../scenarios/BuildWasmAppsJobsList.txt | 1 - .../Wasm.Build.Tests/Blazor/MiscTests2.cs | 65 ------------------- .../Blazor/WorkloadRequiredTests.cs | 47 ++++++++++++++ 3 files changed, 47 insertions(+), 66 deletions(-) delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs diff --git a/eng/testing/scenarios/BuildWasmAppsJobsList.txt b/eng/testing/scenarios/BuildWasmAppsJobsList.txt index f94f6fbcaa6c1d..2580c7e7aacf3e 100644 --- a/eng/testing/scenarios/BuildWasmAppsJobsList.txt +++ b/eng/testing/scenarios/BuildWasmAppsJobsList.txt @@ -10,7 +10,6 @@ Wasm.Build.Tests.Blazor.BuildPublishTests Wasm.Build.Tests.Blazor.SimpleRunTests Wasm.Build.Tests.Blazor.CleanTests Wasm.Build.Tests.Blazor.MiscTests -Wasm.Build.Tests.Blazor.MiscTests2 Wasm.Build.Tests.Blazor.MiscTests3 Wasm.Build.Tests.Blazor.NativeTests Wasm.Build.Tests.Blazor.NoopNativeRebuildTest diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs deleted file mode 100644 index cfa4d7107e766d..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests2.cs +++ /dev/null @@ -1,65 +0,0 @@ -// 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.Blazor; - -public class MiscTests2 : BlazorWasmTestBase -{ - public MiscTests2(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(output, buildContext) - { - } - - [Theory, TestCategory("no-workload")] - [InlineData(Configuration.Debug)] - [InlineData(Configuration.Release)] - public void NativeRef_EmitsWarningBecauseItRequiresWorkload(Configuration config) - { - CommandResult res = PublishForRequiresWorkloadTest(config, extraItems: ""); - res.EnsureSuccessful(); - Assert.Matches("warning : .*but the native references won't be linked in", res.Output); - } - - [Theory, TestCategory("no-workload")] - [InlineData(Configuration.Debug)] - [InlineData(Configuration.Release)] - public void AOT_FailsBecauseItRequiresWorkload(Configuration config) - { - CommandResult res = PublishForRequiresWorkloadTest(config, extraProperties: "true"); - Assert.NotEqual(0, res.ExitCode); - Assert.Contains("following workloads must be installed: wasm-tools", res.Output); - } - - [Theory, TestCategory("no-workload")] - [InlineData(Configuration.Debug)] - [InlineData(Configuration.Release)] - public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(Configuration config) - { - CommandResult res = PublishForRequiresWorkloadTest(config, - extraProperties: "true", - extraItems: ""); - - Assert.NotEqual(0, res.ExitCode); - Assert.Contains("following workloads must be installed: wasm-tools", res.Output); - } - - private CommandResult PublishForRequiresWorkloadTest(Configuration config, string extraItems="", string extraProperties="") - { - ProjectInfo info = CopyTestAsset( - config, aot: false, TestAsset.BlazorBasicTestApp, "needs_workload", extraProperties: extraProperties, extraItems: extraItems); - - string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); - using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); - return cmd.WithWorkingDirectory(_projectDir) - .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) - .ExecuteWithCapturedOutput("publish", - $"-bl:{publishLogPath}", - $"-p:Configuration={config}"); - } -} diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs index 92c13e8e06f413..9dbf10ac2a365e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/WorkloadRequiredTests.cs @@ -85,6 +85,39 @@ public async Task DefaultTemplate_WithoutWorkload(Configuration config) await RunForPublishWithWebServer(new BlazorRunOptions(config)); } + [Theory, TestCategory("no-workload")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void NativeRef_EmitsWarningBecauseItRequiresWorkload(Configuration config) + { + CommandResult res = PublishForRequiresWorkloadTest(config, extraItems: ""); + res.EnsureSuccessful(); + Assert.Matches("warning : .*but the native references won't be linked in", res.Output); + } + + [Theory, TestCategory("no-workload")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void AOT_FailsBecauseItRequiresWorkload(Configuration config) + { + CommandResult res = PublishForRequiresWorkloadTest(config, extraProperties: "true"); + Assert.NotEqual(0, res.ExitCode); + Assert.Contains("following workloads must be installed: wasm-tools", res.Output); + } + + [Theory, TestCategory("no-workload")] + [InlineData(Configuration.Debug)] + [InlineData(Configuration.Release)] + public void AOT_And_NativeRef_FailBecauseTheyRequireWorkload(Configuration config) + { + CommandResult res = PublishForRequiresWorkloadTest(config, + extraProperties: "true", + extraItems: ""); + + Assert.NotEqual(0, res.ExitCode); + Assert.Contains("following workloads must be installed: wasm-tools", res.Output); + } + [Theory, TestCategory("no-workload")] [MemberData(nameof(InvariantGlobalizationTestData), parameters: /*publish*/ false)] @@ -136,6 +169,20 @@ public async Task WorkloadNotRequiredForInvariantGlobalization(Configuration con } } + private CommandResult PublishForRequiresWorkloadTest(Configuration config, string extraItems="", string extraProperties="") + { + ProjectInfo info = CopyTestAsset( + config, aot: false, TestAsset.BlazorBasicTestApp, "needs_workload", extraProperties: extraProperties, extraItems: extraItems); + + string publishLogPath = Path.Combine(s_buildEnv.LogRootPath, info.ProjectName, $"{info.ProjectName}.binlog"); + using DotNetCommand cmd = new DotNetCommand(s_buildEnv, _testOutput); + return cmd.WithWorkingDirectory(_projectDir) + .WithEnvironmentVariable("NUGET_PACKAGES", _nugetPackagesDir) + .ExecuteWithCapturedOutput("publish", + $"-bl:{publishLogPath}", + $"-p:Configuration={config}"); + } + private void CheckWorkloadRequired(Configuration config, string extraProperties, bool workloadNeeded, bool publish) { string prefix = $"props_req_workload_{(publish ? "publish" : "build")}"; From b72048a93df616180858fffdae45b11c7831b176 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 6 Dec 2024 16:38:27 +0100 Subject: [PATCH 098/104] Use more meaningful name for `MiscTests3`. --- .../{MiscTests3.cs => DllImportTests.cs} | 35 ++----------------- .../wasm/Wasm.Build.Tests/Blazor/MiscTests.cs | 34 ++++++++++++++++++ 2 files changed, 36 insertions(+), 33 deletions(-) rename src/mono/wasm/Wasm.Build.Tests/Blazor/{MiscTests3.cs => DllImportTests.cs} (69%) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs similarity index 69% rename from src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs rename to src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs index 698772dca75932..b80f26d35cd0dd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests3.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs @@ -15,9 +15,9 @@ namespace Wasm.Build.Tests.Blazor; -public class MiscTests3 : BlazorWasmTestBase +public class DllImportTests : BlazorWasmTestBase { - public MiscTests3(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) + public DllImportTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { _enablePerTestCleanup = true; @@ -69,37 +69,6 @@ async Task TestDllImport(IPage page) } } - [Fact] - public void BugRegression_60479_WithRazorClassLib() - { - Configuration config = Configuration.Release; - string razorClassLibraryName = "RazorClassLibrary"; - string extraItems = @$" - - "; - ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blz_razor_lib_top", extraItems: extraItems); - - // No relinking, no AOT - BlazorBuild(info, config); - - // will relink - BlazorPublish(info, config, new PublishOptions(UseCache: false)); - - // publish/wwwroot/_framework/blazor.boot.json - string frameworkDir = GetBlazorBinFrameworkDir(config, forPublish: true); - string bootJson = Path.Combine(frameworkDir, "blazor.boot.json"); - - Assert.True(File.Exists(bootJson), $"Could not find {bootJson}"); - var jdoc = JsonDocument.Parse(File.ReadAllText(bootJson)); - if (!jdoc.RootElement.TryGetProperty("resources", out JsonElement resValue) || - !resValue.TryGetProperty("lazyAssembly", out JsonElement lazyVal)) - { - throw new XunitException($"Could not find resources.lazyAssembly object in {bootJson}"); - } - - Assert.True(lazyVal.EnumerateObject().Select(jp => jp.Name).FirstOrDefault(f => f.StartsWith(razorClassLibraryName)) != null); - } - private void BlazorAddRazorButton(string buttonText, string customCode, string methodName = "test") => UpdateFile(Path.Combine("Pages", "Counter.razor"), new Dictionary { { diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs index 7ef7a13f3437a7..9ef748b8678081 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/MiscTests.cs @@ -3,8 +3,11 @@ using System; using System.IO; +using System.Linq; +using System.Text.Json; using Xunit; using Xunit.Abstractions; +using Xunit.Sdk; #nullable enable @@ -69,4 +72,35 @@ public void DefaultTemplate_AOT_InProjectFile(Configuration config) // build again BlazorBuild(info, config, new BuildOptions(UseCache: false)); } + + [Fact] + public void BugRegression_60479_WithRazorClassLib() + { + Configuration config = Configuration.Release; + string razorClassLibraryName = "RazorClassLibrary"; + string extraItems = @$" + + "; + ProjectInfo info = CopyTestAsset(config, aot: true, TestAsset.BlazorBasicTestApp, "blz_razor_lib_top", extraItems: extraItems); + + // No relinking, no AOT + BlazorBuild(info, config); + + // will relink + BlazorPublish(info, config, new PublishOptions(UseCache: false)); + + // publish/wwwroot/_framework/blazor.boot.json + string frameworkDir = GetBlazorBinFrameworkDir(config, forPublish: true); + string bootJson = Path.Combine(frameworkDir, "blazor.boot.json"); + + Assert.True(File.Exists(bootJson), $"Could not find {bootJson}"); + var jdoc = JsonDocument.Parse(File.ReadAllText(bootJson)); + if (!jdoc.RootElement.TryGetProperty("resources", out JsonElement resValue) || + !resValue.TryGetProperty("lazyAssembly", out JsonElement lazyVal)) + { + throw new XunitException($"Could not find resources.lazyAssembly object in {bootJson}"); + } + + Assert.True(lazyVal.EnumerateObject().Select(jp => jp.Name).FirstOrDefault(f => f.StartsWith(razorClassLibraryName)) != null); + } } From 6267705c32cf87c480992131ae5860f6c5518c92 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 6 Dec 2024 17:16:46 +0100 Subject: [PATCH 099/104] `PInvokeTableGeneratorTests` takes 2-3 times more time than average WBT class, divide it. --- .../scenarios/BuildWasmAppsJobsList.txt | 3 +- .../wasm/Wasm.Build.Tests/DllImportTests.cs | 181 ++++++++++++++++++ .../PInvokeTableGeneratorTests.cs | 171 +---------------- .../PInvokeTableGeneratorTestsBase.cs | 35 ++++ 4 files changed, 219 insertions(+), 171 deletions(-) create mode 100644 src/mono/wasm/Wasm.Build.Tests/DllImportTests.cs create mode 100644 src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTestsBase.cs diff --git a/eng/testing/scenarios/BuildWasmAppsJobsList.txt b/eng/testing/scenarios/BuildWasmAppsJobsList.txt index 2580c7e7aacf3e..31f54edb084d71 100644 --- a/eng/testing/scenarios/BuildWasmAppsJobsList.txt +++ b/eng/testing/scenarios/BuildWasmAppsJobsList.txt @@ -10,7 +10,7 @@ Wasm.Build.Tests.Blazor.BuildPublishTests Wasm.Build.Tests.Blazor.SimpleRunTests Wasm.Build.Tests.Blazor.CleanTests Wasm.Build.Tests.Blazor.MiscTests -Wasm.Build.Tests.Blazor.MiscTests3 +Wasm.Build.Tests.Blazor.DllImportTests Wasm.Build.Tests.Blazor.NativeTests Wasm.Build.Tests.Blazor.NoopNativeRebuildTest Wasm.Build.Tests.Blazor.WorkloadRequiredTests @@ -19,6 +19,7 @@ Wasm.Build.Tests.Blazor.IcuShardingTests Wasm.Build.Tests.Blazor.SignalRClientTests Wasm.Build.Tests.BuildPublishTests Wasm.Build.Tests.ConfigSrcTests +Wasm.Build.Tests.DllImportTests Wasm.Build.Tests.HybridGlobalizationTests Wasm.Build.Tests.IcuShardingTests Wasm.Build.Tests.IcuShardingTests2 diff --git a/src/mono/wasm/Wasm.Build.Tests/DllImportTests.cs b/src/mono/wasm/Wasm.Build.Tests/DllImportTests.cs new file mode 100644 index 00000000000000..8f5dfcf0d9b7e3 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/DllImportTests.cs @@ -0,0 +1,181 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +#nullable enable + +namespace Wasm.Build.Tests +{ + public class DllImportTests : PInvokeTableGeneratorTestsBase + { + public DllImportTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) + : base(output, buildContext) + { + } + + [Theory] + [BuildAndRun(aot: false)] + public async void NativeLibraryWithVariadicFunctions(Configuration config, bool aot) + { + ProjectInfo info = PrepareProjectForVariadicFunction(config, aot, "variadic"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "VariadicFunctions.cs")); + string output = PublishForVariadicFunctionTests(info, config, aot); + Assert.Matches("warning.*native function.*sum.*varargs", output); + Assert.Contains("System.Int32 sum_one(System.Int32)", output); + Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); + Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); + + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( + config, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public async void DllImportWithFunctionPointersCompilesWithoutWarning(Configuration config, bool aot) + { + ProjectInfo info = PrepareProjectForVariadicFunction(config, aot, "fnptr"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportNoWarning.cs")); + string output = PublishForVariadicFunctionTests(info, config, aot); + + Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); + Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); + + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( + config, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(Configuration config, bool aot) + { + ProjectInfo info = PrepareProjectForVariadicFunction(config, aot, "fnptr_variadic"); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportWarning.cs")); + string output = PublishForVariadicFunctionTests(info, config, aot); + + Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); + Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); + + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( + config, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration config, bool aot) + { + string extraProperties = "$(MSBuildWarningsAsMessage);WASM0001"; + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "fnptr", extraProperties: extraProperties); + ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); + + string output = PublishForVariadicFunctionTests(info, config, aot); + Assert.DoesNotContain("warning WASM0001", output); + + RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( + config, + TestScenario: "DotnetRun", + ExpectedExitCode: 42 + )); + Assert.Contains("Main running", result.TestOutput); + } + + [Theory] + [BuildAndRun()] + public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(Configuration config, bool aot) + { + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "cb_fnptr"); + string programRelativePath = Path.Combine("Common", "Program.cs"); + ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); + UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); + string output = PublishForVariadicFunctionTests(info, config, aot); + Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); + } + + [Theory] + [BuildAndRun(parameters: new object[] { new object[] { + "with-hyphen", + "with#hash-and-hyphen", + "with.per.iod", + "with🚀unicode#" + } })] + public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Configuration config, bool aot, string[] libraryNames) + { + var extraItems = @""; + string extraProperties = aot ? string.Empty : "true"; + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); + + int baseArg = 10; + GenerateSourceFiles(_projectDir, baseArg); + bool isPublish = aot; + (_, string output) = isPublish ? + PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true): + BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); + + var runOptions = new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); + RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); + + for (int i = 0; i < libraryNames.Length; i ++) + { + Assert.Contains($"square_{i}: {(i + baseArg) * (i + baseArg)}", result.TestOutput); + } + + void GenerateSourceFiles(string outputPath, int baseArg) + { + StringBuilder csBuilder = new($@" + using System; + using System.Runtime.InteropServices; + "); + + StringBuilder dllImportsBuilder = new(); + for (int i = 0; i < libraryNames.Length; i ++) + { + dllImportsBuilder.AppendLine($"[DllImport(\"{libraryNames[i]}\")] static extern int square_{i}(int x);"); + csBuilder.AppendLine($@"Console.WriteLine($""TestOutput -> square_{i}: {{square_{i}({i + baseArg})}}"");"); + + string nativeCode = $@" + #include + + int square_{i}(int x) + {{ + return x * x; + }}"; + File.WriteAllText(Path.Combine(outputPath, $"{libraryNames[i]}.c"), nativeCode); + } + + csBuilder.AppendLine("return 42;"); + csBuilder.Append(dllImportsBuilder); + + UpdateFile(Path.Combine("Common", "Program.cs"), csBuilder.ToString()); + } + } + + private ProjectInfo PrepareProjectForVariadicFunction(Configuration config, bool aot, string prefix, string extraProperties = "") + { + string objectFilename = "variadic.o"; + extraProperties += "true<_WasmDevel>true"; + string extraItems = $""; + ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraItems: extraItems, extraProperties: extraProperties); + File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir, objectFilename)); + return info; + } + } +} diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs index 6d79c0c3b0aa72..bd1b23f3a88764 100644 --- a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTests.cs @@ -14,71 +14,13 @@ namespace Wasm.Build.Tests { - public class PInvokeTableGeneratorTests : WasmTemplateTestsBase + public class PInvokeTableGeneratorTests : PInvokeTableGeneratorTestsBase { public PInvokeTableGeneratorTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) : base(output, buildContext) { } - [Theory] - [BuildAndRun(aot: false)] - public async void NativeLibraryWithVariadicFunctions(Configuration config, bool aot) - { - ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "variadic"); - ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "VariadicFunctions.cs")); - string output = PublishForVariadicFunctionTests(info, config, aot); - Assert.Matches("warning.*native function.*sum.*varargs", output); - Assert.Contains("System.Int32 sum_one(System.Int32)", output); - Assert.Contains("System.Int32 sum_two(System.Int32, System.Int32)", output); - Assert.Contains("System.Int32 sum_three(System.Int32, System.Int32, System.Int32)", output); - - RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( - config, - TestScenario: "DotnetRun", - ExpectedExitCode: 42 - )); - Assert.Contains("Main running", result.TestOutput); - } - - [Theory] - [BuildAndRun()] - public async void DllImportWithFunctionPointersCompilesWithoutWarning(Configuration config, bool aot) - { - ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "fnptr"); - ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportNoWarning.cs")); - string output = PublishForVariadicFunctionTests(info, config, aot); - - Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); - Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - - RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( - config, - TestScenario: "DotnetRun", - ExpectedExitCode: 42 - )); - Assert.Contains("Main running", result.TestOutput); - } - - [Theory] - [BuildAndRun()] - public async void DllImportWithFunctionPointers_ForVariadicFunction_CompilesWithWarning(Configuration config, bool aot) - { - ProjectInfo info = PrepreProjectForVariadicFuntion(config, aot, "fnptr_variadic"); - ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "DllImportWarning.cs")); - string output = PublishForVariadicFunctionTests(info, config, aot); - - Assert.DoesNotMatch("warning\\sWASM0001.*Could\\snot\\sget\\spinvoke.*Parsing\\sfunction\\spointer\\stypes", output); - Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*using_sum_one.*because.*function\\spointer", output); - - RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( - config, - TestScenario: "DotnetRun", - ExpectedExitCode: 42 - )); - Assert.Contains("Main running", result.TestOutput); - } - [Theory] [BuildAndRun()] public void UnmanagedStructAndMethodIn_SameAssembly_WithoutDisableRuntimeMarshallingAttribute_NotConsideredBlittable @@ -188,38 +130,6 @@ public async void UnmanagedStructsAreConsideredBlittableFromDifferentAssembly } } - - [Theory] - [BuildAndRun()] - public async void DllImportWithFunctionPointers_WarningsAsMessages(Configuration config, bool aot) - { - string extraProperties = "$(MSBuildWarningsAsMessage);WASM0001"; - ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "fnptr", extraProperties: extraProperties); - ReplaceFile(Path.Combine("Common", "Program.cs"), Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); - - string output = PublishForVariadicFunctionTests(info, config, aot); - Assert.DoesNotContain("warning WASM0001", output); - - RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions( - config, - TestScenario: "DotnetRun", - ExpectedExitCode: 42 - )); - Assert.Contains("Main running", result.TestOutput); - } - - [Theory] - [BuildAndRun()] - public void UnmanagedCallback_WithFunctionPointers_CompilesWithWarnings(Configuration config, bool aot) - { - ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "cb_fnptr"); - string programRelativePath = Path.Combine("Common", "Program.cs"); - ReplaceFile(programRelativePath, Path.Combine(BuildEnvironment.TestAssetsPath, "EntryPoints", "PInvoke", "FunctionPointers.cs")); - UpdateFile(programRelativePath, new Dictionary { { "[DllImport(\"someting\")]", "[UnmanagedCallersOnly]" } }); - string output = PublishForVariadicFunctionTests(info, config, aot); - Assert.DoesNotMatch("warning\\sWASM0001.*Skipping.*Test::SomeFunction1.*because.*function\\spointer", output); - } - [Theory] [BuildAndRun()] public async void UnmanagedCallback_InFileType(Configuration config, bool aot) @@ -398,85 +308,6 @@ public async void BuildNativeInNonEnglishCulture(Configuration config, bool aot, Assert.Contains("square: 25", result.TestOutput); } - [Theory] - [BuildAndRun(parameters: new object[] { new object[] { - "with-hyphen", - "with#hash-and-hyphen", - "with.per.iod", - "with🚀unicode#" - } })] - public async void CallIntoLibrariesWithNonAlphanumericCharactersInTheirNames(Configuration config, bool aot, string[] libraryNames) - { - var extraItems = @""; - string extraProperties = aot ? string.Empty : "true"; - ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, "abi", extraItems: extraItems, extraProperties: extraProperties); - - int baseArg = 10; - GenerateSourceFiles(_projectDir, baseArg); - bool isPublish = aot; - (_, string output) = isPublish ? - PublishProject(info, config, new PublishOptions(AOT: aot), isNativeBuild: true): - BuildProject(info, config, new BuildOptions(AOT: aot), isNativeBuild: true); - - var runOptions = new BrowserRunOptions(config, TestScenario: "DotnetRun", ExpectedExitCode: 42); - RunResult result = isPublish ? await RunForPublishWithWebServer(runOptions) : await RunForBuildWithDotnetRun(runOptions); - - for (int i = 0; i < libraryNames.Length; i ++) - { - Assert.Contains($"square_{i}: {(i + baseArg) * (i + baseArg)}", result.TestOutput); - } - - void GenerateSourceFiles(string outputPath, int baseArg) - { - StringBuilder csBuilder = new($@" - using System; - using System.Runtime.InteropServices; - "); - - StringBuilder dllImportsBuilder = new(); - for (int i = 0; i < libraryNames.Length; i ++) - { - dllImportsBuilder.AppendLine($"[DllImport(\"{libraryNames[i]}\")] static extern int square_{i}(int x);"); - csBuilder.AppendLine($@"Console.WriteLine($""TestOutput -> square_{i}: {{square_{i}({i + baseArg})}}"");"); - - string nativeCode = $@" - #include - - int square_{i}(int x) - {{ - return x * x; - }}"; - File.WriteAllText(Path.Combine(outputPath, $"{libraryNames[i]}.c"), nativeCode); - } - - csBuilder.AppendLine("return 42;"); - csBuilder.Append(dllImportsBuilder); - - UpdateFile(Path.Combine("Common", "Program.cs"), csBuilder.ToString()); - } - } - - private ProjectInfo PrepreProjectForVariadicFuntion(Configuration config, bool aot, string prefix, string extraProperties = "") - { - string objectFilename = "variadic.o"; - extraProperties += "true<_WasmDevel>true"; - string extraItems = $""; - ProjectInfo info = CopyTestAsset(config, aot, TestAsset.WasmBasicTestApp, prefix, extraItems: extraItems, extraProperties: extraProperties); - File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "native-libs", objectFilename), Path.Combine(_projectDir, objectFilename)); - return info; - } - - private string PublishForVariadicFunctionTests(ProjectInfo info, Configuration config, bool aot, string? verbosity = null, bool isNativeBuild = true) - { - string verbosityArg = verbosity == null ? string.Empty : $" -v:{verbosity}"; - // NativeFileReference forces native build - (_, string output) = PublishProject(info, - config, - new PublishOptions(ExtraMSBuildArgs: verbosityArg, AOT: aot), - isNativeBuild: isNativeBuild); - return output; - } - private async Task EnsureWasmAbiRulesAreFollowed(Configuration config, bool aot) { var extraItems = @""; diff --git a/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTestsBase.cs new file mode 100644 index 00000000000000..983cd4742c8bd0 --- /dev/null +++ b/src/mono/wasm/Wasm.Build.Tests/PInvokeTableGeneratorTestsBase.cs @@ -0,0 +1,35 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; +using Xunit.Abstractions; + +#nullable enable + +namespace Wasm.Build.Tests +{ + public class PInvokeTableGeneratorTestsBase : WasmTemplateTestsBase + { + public PInvokeTableGeneratorTestsBase(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) + : base(output, buildContext) + { + } + + protected string PublishForVariadicFunctionTests(ProjectInfo info, Configuration config, bool aot, string? verbosity = null, bool isNativeBuild = true) + { + string verbosityArg = verbosity == null ? string.Empty : $" -v:{verbosity}"; + // NativeFileReference forces native build + (_, string output) = PublishProject(info, + config, + new PublishOptions(ExtraMSBuildArgs: verbosityArg, AOT: aot), + isNativeBuild: isNativeBuild); + return output; + } + } +} From 83073082eb61ab9d2ebf5d8bc101052e0a60e500 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Fri, 6 Dec 2024 17:57:57 +0100 Subject: [PATCH 100/104] Disable test failing on Windows. --- .../Wasm.Build.Tests/Blazor/DllImportTests.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs index b80f26d35cd0dd..48cb35d332c9a2 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/DllImportTests.cs @@ -23,11 +23,23 @@ public DllImportTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b _enablePerTestCleanup = true; } + public static TheoryData DllImportTheoryData() + { + var data = new TheoryData(); + data.Add(Configuration.Debug, /*build*/true, /*publish*/false); + data.Add(Configuration.Release, /*build*/true, /*publish*/false); + data.Add(Configuration.Release, /*build*/false, /*publish*/true); + + // ActiveIssue("https://github.com/dotnet/runtime/issues/110482") + if (!s_isWindows) + { + data.Add(Configuration.Release, /*build*/true, /*publish*/true); + } + return data; + } + [Theory] - [InlineData(Configuration.Debug, /*build*/true, /*publish*/false)] - [InlineData(Configuration.Release, /*build*/true, /*publish*/false)] - [InlineData(Configuration.Release, /*build*/false, /*publish*/true)] - [InlineData(Configuration.Release, /*build*/true, /*publish*/true)] + [MemberData(nameof(DllImportTheoryData))] public async Task WithDllImportInMainAssembly(Configuration config, bool build, bool publish) { // Based on https://github.com/dotnet/runtime/issues/59255 From 651aa6f257c7d0af4fddad23e2bc3912ee66c5e3 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 9 Dec 2024 10:15:07 +0000 Subject: [PATCH 101/104] Block the timeouting test with exisiting issue. --- .../wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs index ec039142c861fb..ce948e9a4a2dc7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/SimpleMultiThreadedTests.cs @@ -24,7 +24,7 @@ public SimpleMultiThreadedTests(ITestOutputHelper output, SharedBuildPerTestClas [Theory] [InlineData(Configuration.Debug)] [InlineData(Configuration.Release)] - [ActiveIssue("run fails with timeout")] + [ActiveIssue("https://github.com/dotnet/runtime/issues/100373")] // to be fixed by: "https://github.com/dotnet/aspnetcore/issues/54365" public async Task BlazorBuildRunTest(Configuration config) { string extraProperties = "true"; From 3268520da21157502f58604db36205b6c0e74f9b Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz <32700855+ilonatommy@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:44:53 +0000 Subject: [PATCH 102/104] Try avoiding port collisions in blazor tests run on kestrel. --- .../Blazor/BlazorWasmTestBase.cs | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs index fcb2464ea29e32..060b58639cb347 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BlazorWasmTestBase.cs @@ -194,9 +194,10 @@ protected ProjectInfo CreateProjectWithNativeReference(Configuration config, boo // Keeping these methods with explicit Build/Publish in the name // so in the test code it is evident which is being run! - public override async Task RunForBuildWithDotnetRun(RunOptions runOptions) - => await base.RunForBuildWithDotnetRun(runOptions with { - ExecuteAfterLoaded = runOptions.ExecuteAfterLoaded ?? _executeAfterLoaded + public override async Task RunForBuildWithDotnetRun(RunOptions runOptions) => + await base.RunForBuildWithDotnetRun(runOptions with { + ExecuteAfterLoaded = runOptions.ExecuteAfterLoaded ?? _executeAfterLoaded, + ServerEnvironment = GetServerEnvironmentForBuild(runOptions.ServerEnvironment) }); public override async Task RunForPublishWithWebServer(RunOptions runOptions) @@ -204,6 +205,21 @@ public override async Task RunForPublishWithWebServer(RunOptions runO ExecuteAfterLoaded = runOptions.ExecuteAfterLoaded ?? _executeAfterLoaded }); + private Dictionary? GetServerEnvironmentForBuild(Dictionary? originalServerEnv) + { + var serverEnvironment = new Dictionary(); + if (originalServerEnv != null) + { + foreach (var kvp in originalServerEnv) + { + serverEnvironment.Add(kvp.Key, kvp.Value); + } + } + // avoid "System.IO.IOException: address already in use" + serverEnvironment.Add("ASPNETCORE_URLS", "http://127.0.0.1:0"); + return serverEnvironment; + } + public string GetBlazorBinFrameworkDir(Configuration config, bool forPublish, string framework = DefaultTargetFrameworkForBlazor, string? projectDir = null) => _provider.GetBinFrameworkDir(config: config, forPublish: forPublish, framework: framework, projectDir: projectDir); } From c94e7dde336bfb7035e066e3053a103e268cbc2b Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Thu, 12 Dec 2024 08:25:09 +0100 Subject: [PATCH 103/104] Feedback. --- eng/testing/scenarios/BuildWasmAppsJobsList.txt | 16 ++++++++-------- .../{TestAppScenarios => }/AppSettingsTests.cs | 2 +- .../Blazor/NoopNativeRebuildTest.cs | 2 +- .../{TestAppScenarios => }/DebugLevelTests.cs | 2 +- .../DownloadThenInitTests.cs | 2 +- .../{TestAppScenarios => }/InterpPgoTests.cs | 2 +- .../{TestAppScenarios => }/LazyLoadingTests.cs | 2 +- .../LibraryInitializerTests.cs | 6 +++--- .../MaxParallelDownloadsTests.cs | 2 +- .../{TestAppScenarios => }/MemoryTests.cs | 2 +- .../{TestAppScenarios => }/ModuleConfigTests.cs | 2 +- .../SatelliteLoadingTests.cs | 4 ++-- .../wasm/Wasm.Build.Tests/SignalRTestsBase.cs | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/AppSettingsTests.cs (97%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/DebugLevelTests.cs (99%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/DownloadThenInitTests.cs (97%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/InterpPgoTests.cs (99%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/LazyLoadingTests.cs (98%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/LibraryInitializerTests.cs (92%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/MaxParallelDownloadsTests.cs (97%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/MemoryTests.cs (98%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/ModuleConfigTests.cs (99%) rename src/mono/wasm/Wasm.Build.Tests/{TestAppScenarios => }/SatelliteLoadingTests.cs (98%) diff --git a/eng/testing/scenarios/BuildWasmAppsJobsList.txt b/eng/testing/scenarios/BuildWasmAppsJobsList.txt index 31f54edb084d71..3c98d16812753b 100644 --- a/eng/testing/scenarios/BuildWasmAppsJobsList.txt +++ b/eng/testing/scenarios/BuildWasmAppsJobsList.txt @@ -3,7 +3,7 @@ Wasm.Build.NativeRebuild.Tests.NoopNativeRebuildTest Wasm.Build.NativeRebuild.Tests.OptimizationFlagChangeTests Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest Wasm.Build.NativeRebuild.Tests.SimpleSourceChangeRebuildTest -Wasm.Build.Tests.TestAppScenarios.InterpPgoTests +Wasm.Build.Tests.InterpPgoTests Wasm.Build.Templates.Tests.NativeBuildTests Wasm.Build.Tests.Blazor.AppsettingsTests Wasm.Build.Tests.Blazor.BuildPublishTests @@ -33,13 +33,13 @@ Wasm.Build.Tests.NonWasmTemplateBuildTests Wasm.Build.Tests.PInvokeTableGeneratorTests Wasm.Build.Tests.RebuildTests Wasm.Build.Tests.SatelliteAssembliesTests -Wasm.Build.Tests.TestAppScenarios.AppSettingsTests -Wasm.Build.Tests.TestAppScenarios.DownloadThenInitTests -Wasm.Build.Tests.TestAppScenarios.LazyLoadingTests -Wasm.Build.Tests.TestAppScenarios.LibraryInitializerTests -Wasm.Build.Tests.TestAppScenarios.SatelliteLoadingTests -Wasm.Build.Tests.TestAppScenarios.ModuleConfigTests -Wasm.Build.Tests.TestAppScenarios.MemoryTests +Wasm.Build.Tests.AppSettingsTests +Wasm.Build.Tests.DownloadThenInitTests +Wasm.Build.Tests.LazyLoadingTests +Wasm.Build.Tests.LibraryInitializerTests +Wasm.Build.Tests.SatelliteLoadingTests +Wasm.Build.Tests.ModuleConfigTests +Wasm.Build.Tests.MemoryTests Wasm.Build.Tests.AspNetCore.SignalRClientTests Wasm.Build.Tests.WasmBuildAppTest Wasm.Build.Tests.WasmNativeDefaultsTests diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs b/src/mono/wasm/Wasm.Build.Tests/AppSettingsTests.cs similarity index 97% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs rename to src/mono/wasm/Wasm.Build.Tests/AppSettingsTests.cs index bf361120dffac9..49eff5165bf0fd 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/AppSettingsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/AppSettingsTests.cs @@ -12,7 +12,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class AppSettingsTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs index 80e407fb885db2..526a4737a29beb 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/NoopNativeRebuildTest.cs @@ -51,7 +51,7 @@ public void BlazorOnlyLinkRebuild(Configuration config) string extraProperties = "true"; ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_relink", extraProperties: extraProperties); var buildOptions = new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O2"); - BlazorBuild(info, config, new BuildOptions(ExtraMSBuildArgs: "-p:EmccLinkOptimizationFlag=-O2"), isNativeBuild: true); + BlazorBuild(info, config, buildOptions, isNativeBuild: true); string projectDir = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(info.ProjectFilePath)))!; File.Move(Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build.binlog"), Path.Combine(s_buildEnv.LogRootPath, projectDir, $"{info.ProjectName}-build-first.binlog")); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs similarity index 99% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs rename to src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs index 2fe87b45c37427..47d1bc3c0426bf 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs @@ -11,7 +11,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class DebugLevelTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs b/src/mono/wasm/Wasm.Build.Tests/DownloadThenInitTests.cs similarity index 97% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs rename to src/mono/wasm/Wasm.Build.Tests/DownloadThenInitTests.cs index a5e0d62b6f40a3..6d8f0a6167602b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/DownloadThenInitTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/DownloadThenInitTests.cs @@ -10,7 +10,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class DownloadThenInitTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs b/src/mono/wasm/Wasm.Build.Tests/InterpPgoTests.cs similarity index 99% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs rename to src/mono/wasm/Wasm.Build.Tests/InterpPgoTests.cs index 29a75667984111..4af6f409aeedb7 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/InterpPgoTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/InterpPgoTests.cs @@ -13,7 +13,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class InterpPgoTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/LazyLoadingTests.cs similarity index 98% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs rename to src/mono/wasm/Wasm.Build.Tests/LazyLoadingTests.cs index 22c9cb5a24abb1..65011962374221 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LazyLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/LazyLoadingTests.cs @@ -12,7 +12,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class LazyLoadingTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs similarity index 92% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs rename to src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs index 53ca03251b8ddd..b60bf5c858f31b 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs @@ -15,7 +15,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public partial class LibraryInitializerTests : WasmTemplateTestsBase { @@ -27,7 +27,7 @@ public LibraryInitializerTests(ITestOutputHelper output, SharedBuildPerTestClass [Fact] public async Task LoadLibraryInitializer() { - Configuration config = Configuration.Debug; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "LibraryInitializerTests_LoadLibraryInitializer"); PublishProject(info, config); RunResult result = await RunForPublishWithWebServer(new BrowserRunOptions(config, TestScenario: "LibraryInitializerTest")); @@ -43,7 +43,7 @@ public async Task LoadLibraryInitializer() [Fact] public async Task AbortStartupOnError() { - Configuration config = Configuration.Debug; + Configuration config = Configuration.Debug; ProjectInfo info = CopyTestAsset(config, false, TestAsset.WasmBasicTestApp, "LibraryInitializerTests_AbortStartupOnError"); PublishProject(info, config); diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs b/src/mono/wasm/Wasm.Build.Tests/MaxParallelDownloadsTests.cs similarity index 97% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs rename to src/mono/wasm/Wasm.Build.Tests/MaxParallelDownloadsTests.cs index 4e3abdd5a0dbcb..5c7c13c9b7db2a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MaxParallelDownloadsTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MaxParallelDownloadsTests.cs @@ -12,7 +12,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class MaxParallelDownloadsTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs b/src/mono/wasm/Wasm.Build.Tests/MemoryTests.cs similarity index 98% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs rename to src/mono/wasm/Wasm.Build.Tests/MemoryTests.cs index 92bb35c711fa19..39d7f5be61c5d8 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/MemoryTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/MemoryTests.cs @@ -11,7 +11,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class MemoryTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs b/src/mono/wasm/Wasm.Build.Tests/ModuleConfigTests.cs similarity index 99% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs rename to src/mono/wasm/Wasm.Build.Tests/ModuleConfigTests.cs index d5ab524c9c29d3..a825a1dadbac92 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/ModuleConfigTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ModuleConfigTests.cs @@ -12,7 +12,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class ModuleConfigTests : WasmTemplateTestsBase { diff --git a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs b/src/mono/wasm/Wasm.Build.Tests/SatelliteLoadingTests.cs similarity index 98% rename from src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs rename to src/mono/wasm/Wasm.Build.Tests/SatelliteLoadingTests.cs index 3e40c434931b97..1dcd957811738c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/TestAppScenarios/SatelliteLoadingTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SatelliteLoadingTests.cs @@ -16,7 +16,7 @@ #nullable enable -namespace Wasm.Build.Tests.TestAppScenarios; +namespace Wasm.Build.Tests; public class SatelliteLoadingTests : WasmTemplateTestsBase { @@ -35,7 +35,7 @@ public async Task LoadSatelliteAssembly(bool loadAllSatelliteResources) BuildProject(info, config); var result = await RunForBuildWithDotnetRun(new BrowserRunOptions( - Configuration: config, + Configuration: config, TestScenario: "SatelliteAssembliesTest", BrowserQueryString: new NameValueCollection { {"loadAllSatelliteResources", loadAllSatelliteResources.ToString().ToLowerInvariant() } } )); diff --git a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs index 9058cb6631c876..5987db9992f1bc 100644 --- a/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/SignalRTestsBase.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using System.Collections.Generic; using System.Collections.Specialized; -using Wasm.Build.Tests.TestAppScenarios; +using Wasm.Build.Tests; using Xunit.Abstractions; using Xunit; #nullable enable From 2f6c3b91953a12a83f068582079ea41dc03bf650 Mon Sep 17 00:00:00 2001 From: Ilona Tomkowicz Date: Thu, 12 Dec 2024 08:40:19 +0100 Subject: [PATCH 104/104] Removal of files and comments that were supposed to be deleted after approval. --- .../scenarios/BuildWasmAppsJobsList.txt | 2 - .../Blazor/BuildPublishTests.cs | 1 - .../Blazor/IcuShardingTests.cs | 26 ------------ .../wasm/Wasm.Build.Tests/Blazor/IcuTests.cs | 26 ------------ .../HostRunner/BrowserHostRunner.cs | 40 ------------------- .../HostRunner/IHostRunner.cs | 16 -------- 6 files changed, 111 deletions(-) delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs delete mode 100644 src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs diff --git a/eng/testing/scenarios/BuildWasmAppsJobsList.txt b/eng/testing/scenarios/BuildWasmAppsJobsList.txt index cb92b9abd9f4cc..8df77ea901da48 100644 --- a/eng/testing/scenarios/BuildWasmAppsJobsList.txt +++ b/eng/testing/scenarios/BuildWasmAppsJobsList.txt @@ -14,8 +14,6 @@ Wasm.Build.Tests.Blazor.DllImportTests Wasm.Build.Tests.Blazor.NativeTests Wasm.Build.Tests.Blazor.NoopNativeRebuildTest Wasm.Build.Tests.Blazor.WorkloadRequiredTests -Wasm.Build.Tests.Blazor.IcuTests -Wasm.Build.Tests.Blazor.IcuShardingTests Wasm.Build.Tests.Blazor.SignalRClientTests Wasm.Build.Tests.BuildPublishTests Wasm.Build.Tests.ConfigSrcTests diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs index 961ba71e824ce1..56364a1a09c390 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Blazor/BuildPublishTests.cs @@ -55,7 +55,6 @@ public void DefaultTemplate_AOT_WithWorkload(Configuration config, bool testUnic ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.BlazorBasicTestApp, "blz_aot", appendUnicodeToPath: testUnicode); BlazorBuild(info, config); - // NativeFilesType.AOT?? PublishProject(info, config, new PublishOptions(AOT: true, UseCache: false)); } diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs deleted file mode 100644 index a9238a8a4ec67b..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuShardingTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.IO; -using Xunit; -using Xunit.Abstractions; -using Xunit.Sdk; -using System.Collections.Generic; -using System.Threading.Tasks; - -#nullable enable - -namespace Wasm.Build.Tests.Blazor; - -// these tests only check if correct ICU files got copied -public class IcuShardingTests : BlazorWasmTestBase -{ - public IcuShardingTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(output, buildContext) {} - - // FOR REVIEWER: - // These tests are not specific for Blazor, they are testing ICU mechanisms that are commond for all apps using browser SDK - // From this reason, tests in this file are duplicates of IcuShardingTests.cs and IcuShardingTests2.cs in mono/wasm/Wasm.Build.Tests - // This file will get removed after approval of the PR -} diff --git a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs b/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs deleted file mode 100644 index e462b7e82c9da4..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/Blazor/IcuTests.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.IO; -using Xunit; -using Xunit.Abstractions; -using Xunit.Sdk; -using System.Collections.Generic; -using System.Threading.Tasks; - -#nullable enable - -namespace Wasm.Build.Tests.Blazor; - -// these tests only check if correct ICU files got copied -public class IcuTests : BlazorWasmTestBase -{ - public IcuTests(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext) - : base(output, buildContext) {} - - // FOR REVIEWER: - // These tests are not specific for Blazor, they are testing ICU mechanisms that are commond for all apps using browser SDK - // From this reason, tests in this file are duplicates of IcuTests.cs and HybridGlobalizationTests.cs in mono/wasm/Wasm.Build.Tests - // This file will get removed after approval of the PR -} diff --git a/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs b/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs deleted file mode 100644 index 228840b0d83046..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/HostRunner/BrowserHostRunner.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -namespace Wasm.Build.Tests; - -using System; -using System.IO; - -public class BrowserHostRunner : IHostRunner -{ - private static string? s_binaryPathArg; - private static string BinaryPathArg - { - get - { - if (s_binaryPathArg is null) - { - if (!string.IsNullOrEmpty(EnvironmentVariables.ChromePathForTests)) - { - if (!File.Exists(EnvironmentVariables.ChromePathForTests)) - throw new Exception($"Cannot find CHROME_PATH_FOR_TESTS={EnvironmentVariables.ChromePathForTests}"); - s_binaryPathArg = $" --browser-path=\"{EnvironmentVariables.ChromePathForTests}\""; - } - else - { - s_binaryPathArg = ""; - } - } - return s_binaryPathArg; - } - } - - - public string GetTestCommand() => "wasm test-browser"; - public string GetXharnessArgsWindowsOS(XHarnessArgsOptions options) => $"-v trace -b Chrome --browser-arg=--lang={options.environmentLocale} --web-server-use-cop {BinaryPathArg}"; // Windows: chrome.exe --lang=locale - public string GetXharnessArgsOtherOS(XHarnessArgsOptions options) => $"-v trace -b Chrome --locale={options.environmentLocale} --web-server-use-cop {BinaryPathArg}"; // Linux: LANGUAGE=locale ./chrome - public bool UseWasmConsoleOutput() => false; -} diff --git a/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs b/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs deleted file mode 100644 index 20dfab3eebc6e8..00000000000000 --- a/src/mono/wasm/Wasm.Build.Tests/HostRunner/IHostRunner.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -#nullable enable - -namespace Wasm.Build.Tests; - -public record XHarnessArgsOptions(string jsRelativePath, string environmentLocale); - -interface IHostRunner -{ - string GetTestCommand(); - string GetXharnessArgsWindowsOS(XHarnessArgsOptions options); - string GetXharnessArgsOtherOS(XHarnessArgsOptions options); - bool UseWasmConsoleOutput(); -}