From fa5ac33bb6096c05411f3cb347a893040201c48a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 17:18:09 +0000 Subject: [PATCH 1/2] Initial plan From 955cb5480055ee80f08f4e089f2b598c78804beb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 May 2026 17:45:15 +0000 Subject: [PATCH 2/2] Add unit tests for PrepareAbiItems MSBuild task Agent-Logs-Url: https://github.com/dotnet/android/sessions/2ef0252b-37ea-41b8-bccc-d6d3598eaf98 Co-authored-by: jonathanpeppers <840039+jonathanpeppers@users.noreply.github.com> --- .../Tasks/PrepareAbiItemsTests.cs | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/PrepareAbiItemsTests.cs diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/PrepareAbiItemsTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/PrepareAbiItemsTests.cs new file mode 100644 index 00000000000..61a443698b1 --- /dev/null +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/PrepareAbiItemsTests.cs @@ -0,0 +1,110 @@ +using NUnit.Framework; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Build.Framework; +using Xamarin.Android.Tasks; + +namespace Xamarin.Android.Build.Tests +{ + [TestFixture] + public class PrepareAbiItemsTests : BaseTest + { + [TestCase ("typemap", "typemaps")] + [TestCase ("environment", "environment")] + [TestCase ("compressed", "compressed_assemblies")] + [TestCase ("jniremap", "jni_remap")] + [TestCase ("marshal_methods", "marshal_methods")] + [TestCase ("runtime_linking", "pinvoke_preserve")] + [TestCase ("jni_init", "jni_init_funcs")] + public void ValidMode_ProducesCorrectBaseName (string mode, string expectedBase) + { + var task = new PrepareAbiItems { + BuildEngine = new MockBuildEngine (TestContext.Out), + BuildTargetAbis = new [] { "arm64-v8a" }, + NativeSourcesDir = "/native/src", + Mode = mode, + Debug = false, + }; + Assert.IsTrue (task.Execute ()); + Assert.IsNotNull (task.AssemblySources); + Assert.AreEqual (1, task.AssemblySources.Length); + Assert.AreEqual ($"/native/src/{expectedBase}.arm64-v8a.ll", task.AssemblySources [0].ItemSpec); + Assert.AreEqual ("arm64-v8a", task.AssemblySources [0].GetMetadata ("abi")); + } + + [TestCase ("TypeMap", "typemaps")] + [TestCase ("TYPEMAP", "typemaps")] + [TestCase ("Environment", "environment")] + [TestCase ("COMPRESSED", "compressed_assemblies")] + [TestCase ("JniRemap", "jni_remap")] + [TestCase ("Marshal_Methods", "marshal_methods")] + [TestCase ("Runtime_Linking", "pinvoke_preserve")] + [TestCase ("JNI_INIT", "jni_init_funcs")] + public void ValidMode_CaseInsensitive (string mode, string expectedBase) + { + var task = new PrepareAbiItems { + BuildEngine = new MockBuildEngine (TestContext.Out), + BuildTargetAbis = new [] { "x86_64" }, + NativeSourcesDir = "/native/src", + Mode = mode, + Debug = false, + }; + Assert.IsTrue (task.Execute ()); + Assert.IsNotNull (task.AssemblySources); + Assert.AreEqual (1, task.AssemblySources.Length); + Assert.AreEqual ($"/native/src/{expectedBase}.x86_64.ll", task.AssemblySources [0].ItemSpec); + } + + [Test] + public void InvalidMode_LogsErrorAndReturnsFalse () + { + var errors = new List (); + var task = new PrepareAbiItems { + BuildEngine = new MockBuildEngine (TestContext.Out, errors), + BuildTargetAbis = new [] { "arm64-v8a" }, + NativeSourcesDir = "/native/src", + Mode = "invalid_mode", + Debug = false, + }; + Assert.IsFalse (task.Execute ()); + Assert.AreEqual (1, errors.Count); + } + + [Test] + public void MultipleAbis_CreatesItemForEachAbi () + { + var abis = new [] { "arm64-v8a", "armeabi-v7a", "x86_64", "x86" }; + var task = new PrepareAbiItems { + BuildEngine = new MockBuildEngine (TestContext.Out), + BuildTargetAbis = abis, + NativeSourcesDir = "/native/src", + Mode = "typemap", + Debug = false, + }; + Assert.IsTrue (task.Execute ()); + Assert.IsNotNull (task.AssemblySources); + Assert.AreEqual (abis.Length, task.AssemblySources.Length); + for (int i = 0; i < abis.Length; i++) { + Assert.AreEqual ($"/native/src/typemaps.{abis [i]}.ll", task.AssemblySources [i].ItemSpec); + Assert.AreEqual (abis [i], task.AssemblySources [i].GetMetadata ("abi")); + } + } + + [Test] + public void SingleAbi_CreatesSingleItem () + { + var task = new PrepareAbiItems { + BuildEngine = new MockBuildEngine (TestContext.Out), + BuildTargetAbis = new [] { "x86" }, + NativeSourcesDir = "/output", + Mode = "environment", + Debug = true, + }; + Assert.IsTrue (task.Execute ()); + Assert.IsNotNull (task.AssemblySources); + Assert.AreEqual (1, task.AssemblySources.Length); + Assert.AreEqual ("/output/environment.x86.ll", task.AssemblySources [0].ItemSpec); + Assert.AreEqual ("x86", task.AssemblySources [0].GetMetadata ("abi")); + } + } +}