Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions eng/testing/scenarios/BuildWasmAppsJobsList.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ Wasm.Build.Tests.WasmTemplateTests
Wasm.Build.Tests.WorkloadTests
Wasm.Build.Tests.MT.Blazor.SimpleMultiThreadedTests
Wasm.Build.Tests.TestAppScenarios.DebugLevelTests
Wasm.Build.Tests.DownlevelCheck
74 changes: 74 additions & 0 deletions src/mono/wasm/Wasm.Build.Tests/DownLevelCheck.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;

namespace Wasm.Build.Tests
{
public class DownlevelCheck : BuildTestBase
{
public DownlevelCheck(ITestOutputHelper output, SharedBuildPerTestClassFixture buildContext)
: base(new TestMainJsProjectProvider(output), output, buildContext)
{
}

private const string ProjectTemplate =
"""
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>{TargetFramework}</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
<Target Name="PrintResolveFrameworkReferences" AfterTargets="ResolveFrameworkReferences">
<Message Text="{TestMessage}" Importance="High" />
</Target>
</Project>
""";

private string FormatTestMessage(string version) => $"TEST::TargetingPackVersion::{version}::TEST";

public static IEnumerable<object[]> GetData() => new[]
{
new object[] { "net6.0", DownlevelVersions.PackageVersionNet6 },
new object[] { "net7.0", DownlevelVersions.PackageVersionNet7 },
new object[] { "net8.0", DownlevelVersions.PackageVersionNet8 },
};

[Theory]
[MemberData(nameof(GetData))]
public void TestComputedVersions(string targetFramework, Version computedVersion)
{
string id = $"DownlevelCheck_{targetFramework}_{GetRandomId()}";
string projectContent = ProjectTemplate
.Replace("{TargetFramework}", targetFramework)
.Replace("{TestMessage}", FormatTestMessage("@(ResolvedFrameworkReference->'%(TargetingPackVersion)')"));

InitPaths(id);
InitProjectDir(_projectDir);
File.WriteAllText(Path.Combine(_projectDir, $"{id}.csproj"), projectContent);
File.WriteAllText(Path.Combine(_projectDir, $"Program.cs"), "System.Console.WriteLine(\"Hello, World!\");"); // no-op

(var result, _) = BuildProjectWithoutAssert(id, "Release", new(
AssertAppBundle: false,
CreateProject: false,
Publish: false,
TargetFramework: targetFramework
));

var versionExtractor = new Regex(FormatTestMessage("([0-9]+.[0-9]+.[0-9]+)"));
var match = versionExtractor.Match(result.Output);
Assert.True(match.Success, $"Expected to find a version in the output, but got: {result.Output}");

if (!Version.TryParse(match.Groups[1].Value, out var actualVersion))
Assert.Fail($"Unable to parse version from regex match '{match.Groups[1].Value}'");

Assert.True(actualVersion >= computedVersion, $"Actually used version is lower then computed version in repository: (actually used version) '{actualVersion}' >= (computed version in repository) '{computedVersion}'");
}
}
}
8 changes: 8 additions & 0 deletions src/mono/wasm/Wasm.Build.Tests/DownlevelVersions.cs.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System;

public static class DownlevelVersions
{
public static readonly Version PackageVersionNet6 = Version.Parse("${PackageVersionNet6}");
public static readonly Version PackageVersionNet7 = Version.Parse("${PackageVersionNet7}");
public static readonly Version PackageVersionNet8 = Version.Parse("${PackageVersionNet8}");
}
19 changes: 19 additions & 0 deletions src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.DotNet.Build.Tasks.Templating" Version="$(MicrosoftDotNetBuildTasksTemplatingVersion)" />
<PackageReference Include="Microsoft.Playwright" Version="1.21.0" />
<ProjectReference Include="$(RepoRoot)src\tasks\Microsoft.NET.Sdk.WebAssembly.Pack.Tasks\Microsoft.NET.Sdk.WebAssembly.Pack.Tasks.csproj" />
<Compile Include="$(BrowserProjectRoot)debugger\DebuggerTestSuite\BrowserLocator.cs" />
Expand All @@ -55,6 +56,24 @@
<None Include="data\**\*" Link="data\%(RecursiveDir)%(FileName)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

<Target Name="GenerateVersions" BeforeTargets="CoreCompile">
<PropertyGroup>
<_DownlevelVersionsOutputPath>$(IntermediateOutputPath)\DownlevelVersions.cs</_DownlevelVersionsOutputPath>
</PropertyGroup>
<ItemGroup>
<_DownlevelVersionsProperty Include="PackageVersionNet6" Value="$(PackageVersionNet6)" />
<_DownlevelVersionsProperty Include="PackageVersionNet7" Value="$(PackageVersionNet7)" />
<_DownlevelVersionsProperty Include="PackageVersionNet8" Value="$(PackageVersionNet8)" />
</ItemGroup>
<GenerateFileFromTemplate
TemplateFile="DownlevelVersions.cs.in"
Properties="@(_DownlevelVersionsProperty->'%(Identity)=%(Value)')"
OutputPath="$(_DownlevelVersionsOutputPath)" />
<ItemGroup>
<Compile Include="$(_DownlevelVersionsOutputPath)" />
</ItemGroup>
</Target>

<Target Name="UpdateRunScriptCommands" BeforeTargets="GenerateRunScript" DependsOnTargets="_SetPackageVersionForWorkloadsTesting">
<Error Condition="'$(TestUsingWorkloads)' == 'true' and '$(PackageVersionForWorkloadManifests)' == ''" Text="%24(PackageVersionForWorkloadManifests) is not set. PackageVersion=$(PackageVersion)." />

Expand Down