From 578bf033c6c7ba3cc398d1d491ef154290d13b0f Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 12 Aug 2026 09:10:47 -0500 Subject: [PATCH 1/2] [tests] Make DotNetPublish pack assertions deterministic Assert against the reference and runtime pack paths resolved in MSBuild's detailed output instead of relying on filesystem enumeration order. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2e8c3c1d-c95e-4d35-ad95-0ff027d776f0 --- .../Xamarin.Android.Build.Tests/XASdkTests.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs index acafc24fe8a..98bbf2d6060 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs @@ -355,16 +355,13 @@ public void DotNetPublish ([Values] bool isRelease, [ValueSource (nameof(Get_Dot // Only check latest TFM, as previous or preview TFMs will come from NuGet if (dotnetVersion == XABuildConfig.LatestDotNetTargetFramework && !preview) { + var buildOutput = dotnet.LastBuildOutput.ToArray (); var versionString = apiLevel.Minor == 0 ? $"{apiLevel.Major}" : $"{apiLevel.Major}.{apiLevel.Minor}"; - var refDirectory = Directory.GetDirectories (Path.Combine (TestEnvironment.DotNetPreviewPacksDirectory, $"Microsoft.Android.Ref.{versionString}")).LastOrDefault (); - var expectedMonoAndroidRefPath = Path.Combine (refDirectory, "ref", dotnetVersion, "Mono.Android.dll"); - Assert.IsTrue (dotnet.LastBuildOutput.ContainsText (expectedMonoAndroidRefPath), $"Build should be using {expectedMonoAndroidRefPath}"); + AssertUsingPack (buildOutput, $"Microsoft.Android.Ref.{versionString}", "ref", dotnetVersion, "Mono.Android.dll"); var runtimeApiLevel = (apiLevel == XABuildConfig.AndroidDefaultTargetDotnetApiLevel && apiLevel < XABuildConfig.AndroidLatestStableApiLevel) ? XABuildConfig.AndroidLatestStableApiLevel : apiLevel; versionString = runtimeApiLevel.Minor == 0 ? $"{runtimeApiLevel.Major}" : $"{runtimeApiLevel.Major}.{runtimeApiLevel.Minor}"; - var runtimeDirectory = Directory.GetDirectories (Path.Combine (TestEnvironment.DotNetPreviewPacksDirectory, $"Microsoft.Android.Runtime.{versionString}.android")).LastOrDefault (); - var expectedMonoAndroidRuntimePath = Path.Combine (runtimeDirectory, "runtimes", "android", "lib", dotnetVersion, "Mono.Android.dll"); - Assert.IsTrue (dotnet.LastBuildOutput.ContainsText (expectedMonoAndroidRuntimePath), $"Build should be using {expectedMonoAndroidRuntimePath}"); + AssertUsingPack (buildOutput, $"Microsoft.Android.Runtime.{versionString}.android", "runtimes", "android", "lib", dotnetVersion, "Mono.Android.dll"); } var publishDirectory = Path.Combine (Root, projBuilder.ProjectDirectory, proj.OutputPath, runtimeIdentifier, "publish"); @@ -385,6 +382,16 @@ public void DotNetPublish ([Values] bool isRelease, [ValueSource (nameof(Get_Dot } } + static void AssertUsingPack (IEnumerable buildOutput, string packName, params string [] assemblyPath) + { + var packDirectory = Path.Combine (TestEnvironment.DotNetPreviewPacksDirectory, packName); + var assemblyPathSuffix = Path.Combine (assemblyPath); + Assert.That (Directory.EnumerateFiles (packDirectory, "Mono.Android.dll", SearchOption.AllDirectories), + Has.Exactly (1).Matches (path => + path.EndsWith (assemblyPathSuffix, StringComparison.OrdinalIgnoreCase) && buildOutput.ContainsText (path)), + $"Build should use exactly one installed '{packName}' pack."); + } + [Test] [TestCaseSource (nameof (Get_DotNetTargetFrameworks_Data))] public void MauiTargetFramework (string dotnetVersion, string platform, Version apiLevel, AndroidRuntime runtime) From 7581dbab4e57426da9d96a0e6e7ccfd61bc74fce Mon Sep 17 00:00:00 2001 From: Jonathan Peppers Date: Wed, 12 Aug 2026 09:31:18 -0500 Subject: [PATCH 2/2] [tests] Derive asserted pack filename Keep AssertUsingPack generic by deriving its search filename from the supplied assembly path. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2e8c3c1d-c95e-4d35-ad95-0ff027d776f0 --- .../Tests/Xamarin.Android.Build.Tests/XASdkTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs index 98bbf2d6060..e5d6a2fb828 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/XASdkTests.cs @@ -386,7 +386,8 @@ static void AssertUsingPack (IEnumerable buildOutput, string packName, p { var packDirectory = Path.Combine (TestEnvironment.DotNetPreviewPacksDirectory, packName); var assemblyPathSuffix = Path.Combine (assemblyPath); - Assert.That (Directory.EnumerateFiles (packDirectory, "Mono.Android.dll", SearchOption.AllDirectories), + var assemblyFileName = Path.GetFileName (assemblyPathSuffix); + Assert.That (Directory.EnumerateFiles (packDirectory, assemblyFileName, SearchOption.AllDirectories), Has.Exactly (1).Matches (path => path.EndsWith (assemblyPathSuffix, StringComparison.OrdinalIgnoreCase) && buildOutput.ContainsText (path)), $"Build should use exactly one installed '{packName}' pack.");