diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs index f970281c0e2..a399aecf137 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BindingBuildTest.cs @@ -10,6 +10,7 @@ using Microsoft.Android.Build.Tasks; using Microsoft.Build.Framework; using Xamarin.Tools.Zip; +using Xamarin.Android.Tasks; namespace Xamarin.Android.Build.Tests { @@ -17,11 +18,19 @@ namespace Xamarin.Android.Build.Tests public class BindingBuildTest : BaseTest { [Test] - public void DotNetBuildBinding () + public void DotNetBuildBinding ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var proj = new XamarinAndroidLibraryProject () { + IsRelease = isRelease, EnableDefaultItems = true, }; + proj.SetRuntime (runtime); + // Both transform files should be applied proj.Sources.Add (new AndroidItem.TransformFile ("Transforms.xml") { TextContent = () => @@ -61,16 +70,34 @@ public void DotNetBuildBinding () } } - static object [] ClassParseOptions = new object [] { - new object[] { - /* classParser */ "class-parse", - }, - }; + static IEnumerable Get_ClassParseOptions () + { + var ret = new List (); + + foreach (AndroidRuntime runtime in Enum.GetValues (typeof (AndroidRuntime))) { + AddTestData ("class-parse", runtime); + } + + return ret; + + void AddTestData (string classParser, AndroidRuntime runtime) + { + ret.Add (new object[] { + classParser, + runtime, + }); + } + } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void BindingLibraryIncremental (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void BindingLibraryIncremental (string classParser, AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var targets = new List { "_ExportJarToXml", "GenerateBindings", @@ -81,8 +108,9 @@ public void BindingLibraryIncremental (string classParser) }; var proj = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, }; + proj.SetRuntime (runtime); proj.Jars.Add (new AndroidItem.AndroidLibrary ("Jars\\svg-android.jar") { WebContent = "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/svg-android/svg-android.jar" }); @@ -137,12 +165,17 @@ public void BindingLibraryIncremental (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void CleanBasicBindingLibrary (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void CleanBasicBindingLibrary (string classParser, AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, }; + proj.SetRuntime (runtime); proj.Jars.Add (new AndroidItem.EmbeddedJar ("Jars\\svg-android.jar") { WebContent = "https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/svg-android/svg-android.jar" }); @@ -165,11 +198,15 @@ public void CleanBasicBindingLibrary (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void BuildAarBindingLibraryStandalone (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void BuildAarBindingLibraryStandalone (string classParser, AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, OtherBuildItems = { new AndroidItem.AndroidAsset ("Assets\\asset1.txt") { TextContent = () => "Asset1", @@ -177,6 +214,7 @@ public void BuildAarBindingLibraryStandalone (string classParser) }, } }; + proj.SetRuntime (runtime); proj.Jars.Add (new AndroidItem.AndroidLibrary ("Jars\\material-menu-1.1.0.aar") { WebContent = "https://repo1.maven.org/maven2/com/balysv/material-menu/1.1.0/material-menu-1.1.0.aar" }); @@ -188,12 +226,17 @@ public void BuildAarBindingLibraryStandalone (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void BuildAarBindigLibraryWithNuGetPackageOfJar (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void BuildAarBindigLibraryWithNuGetPackageOfJar (string classParser, AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, }; + proj.SetRuntime (runtime); proj.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\android-crop-1.0.1.aar") { WebContent = "https://repo1.maven.org/maven2/com/soundcloud/android/android-crop/1.0.1/android-crop-1.0.1.aar" }); @@ -211,13 +254,18 @@ public void BuildAarBindigLibraryWithNuGetPackageOfJar (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] + [TestCaseSource (nameof (Get_ClassParseOptions))] [NonParallelizable] - public void BuildLibraryZipBindingLibraryWithAarOfJar (string classParser) + public void BuildLibraryZipBindingLibraryWithAarOfJar (string classParser, AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, }; + proj.SetRuntime (runtime); proj.AndroidClassParser = classParser; proj.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\aFileChooserBinaries.zip") { WebContentFileNameFromAzure = "aFileChooserBinaries.zip" @@ -234,12 +282,17 @@ public void BuildLibraryZipBindingLibraryWithAarOfJar (string classParser) [Test] [Category ("Minor")] - public void BindByteArrayInMethodParameter () + public void BindByteArrayInMethodParameter ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, AndroidClassParser = "class-parse", }; + proj.SetRuntime (runtime); proj.Jars.Add (new AndroidItem.EmbeddedJar ("Jars\\svg-android.jar") { WebContentFileNameFromAzure = "javaBindingIssue.jar" }); @@ -249,13 +302,18 @@ public void BindByteArrayInMethodParameter () } [Test] - public void MergeAndroidManifest () + public void MergeAndroidManifest ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var path = Path.Combine ("temp", TestName); var binding = new XamarinAndroidBindingProject { ProjectName = "AdalBinding", - IsRelease = true, + IsRelease = isRelease, }; + binding.SetRuntime (runtime); binding.AndroidClassParser = "class-parse"; binding.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\adal-1.0.7.aar") { WebContentFileNameFromAzure = "adal-1.0.7.aar" @@ -280,11 +338,15 @@ public void MergeAndroidManifest () } [Test] - public void AnnotationSupport () + public void AnnotationSupport ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } // https://trello.com/c/a36dDVS6/37-support-for-annotations-zip var binding = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, }; binding.AndroidClassParser = "class-parse"; binding.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\mylibrary.aar") { @@ -299,33 +361,47 @@ public void AnnotationSupport () } [Test] - public void BindingCustomJavaApplicationClass () + public void BindingCustomJavaApplicationClass ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, ProjectName = "Binding", }; + binding.SetRuntime (runtime); binding.AndroidClassParser = "class-parse"; - using (var bindingBuilder = CreateDllBuilder ("temp/BindingCustomJavaApplicationClass/MultiDexBinding")) { + string path = Path.Combine ("temp", TestName); + using (var bindingBuilder = CreateDllBuilder (Path.Combine (path, "MultiDexBinding"))) { string multidexJar = Path.Combine (TestEnvironment.AndroidMSBuildDirectory, "android-support-multidex.jar"); binding.Jars.Add (new AndroidItem.EmbeddedJar (() => multidexJar)); bindingBuilder.Build (binding); - var proj = new XamarinAndroidApplicationProject (); + var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, + }; + proj.SetRuntime (runtime); proj.OtherBuildItems.Add (new BuildItem ("ProjectReference", $"..\\MultiDexBinding\\{binding.ProjectName}.csproj")); - using (var b = CreateApkBuilder ("temp/BindingCustomJavaApplicationClass/App")) { + using (var b = CreateApkBuilder (Path.Combine (path, "App"))) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); } } } [Test] - public void BindngFilterUnsupportedNativeAbiLibraries () + public void BindngFilterUnsupportedNativeAbiLibraries ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject () { ProjectName = "Binding", - IsRelease = true, + IsRelease = isRelease, }; + binding.SetRuntime (runtime); binding.AndroidClassParser = "class-parse"; binding.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\mylibrary.aar") { WebContentFileNameFromAzure = "card.io-5.3.0.aar" @@ -334,8 +410,10 @@ public void BindngFilterUnsupportedNativeAbiLibraries () using (var bindingBuilder = CreateDllBuilder (Path.Combine (path, binding.ProjectName))) { Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded"); var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, ProjectName = "App" }; + proj.SetRuntime (runtime); proj.OtherBuildItems.Add (new BuildItem ("ProjectReference", $"..\\{binding.ProjectName}\\{binding.ProjectName}.csproj")); using (var b = CreateApkBuilder (Path.Combine (path, proj.ProjectName))) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); @@ -344,12 +422,17 @@ public void BindngFilterUnsupportedNativeAbiLibraries () } [Test] - public void BindingCheckHiddenFiles () + public void BindingCheckHiddenFiles ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject { ProjectName = "Binding", - IsRelease = true, + IsRelease = isRelease, }; + binding.SetRuntime (runtime); binding.AndroidClassParser = "class-parse"; binding.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\mylibrary.aar") { WebContentFileNameFromAzure = "mylibrary.aar" @@ -361,8 +444,10 @@ public void BindingCheckHiddenFiles () using (var bindingBuilder = CreateDllBuilder (Path.Combine (path, binding.ProjectName))) { Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded"); var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, ProjectName = "App", }; + proj.SetRuntime (runtime); proj.OtherBuildItems.Add (new BuildItem ("ProjectReference", $"..\\{binding.ProjectName}\\{binding.ProjectName}.csproj")); proj.AndroidManifest = $@" @@ -389,10 +474,14 @@ public void BindingCheckHiddenFiles () } [Test] - public void BindingDoNotPackage () + public void BindingDoNotPackage ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, Jars = { new AndroidItem.EmbeddedJar ("Jars\\svg-android.jar") { WebContentFileNameFromAzure = "javaBindingIssue.jar" @@ -403,10 +492,14 @@ public void BindingDoNotPackage () [assembly:DoNotPackage(""svg-android.jar"")] " }; + binding.SetRuntime (runtime); binding.AndroidClassParser = "class-parse"; - using (var bindingBuilder = CreateDllBuilder (Path.Combine ("temp", "BindingDoNotPackage", "Binding"))) { + + string path = Path.Combine ("temp", TestName); + using (var bindingBuilder = CreateDllBuilder (Path.Combine (path, "Binding"))) { Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded"); var proj = new XamarinAndroidApplicationProject () { + IsRelease = isRelease, ProjectName = "App1", OtherBuildItems = { new BuildItem ("ProjectReference", "..\\Binding\\UnnamedProject.csproj") @@ -432,18 +525,24 @@ public void OnUpdate (Java.Lang.Object p0) "} } }; - using (var b = CreateApkBuilder (Path.Combine ("temp", "BindingDoNotPackage", "App"))) { + proj.SetRuntime (runtime); + using (var b = CreateApkBuilder (Path.Combine (path, "App"))) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); } } } [Test] - public void AndroidLibraryPackFalseExcludesJarFromAar () + public void AndroidLibraryPackFalseExcludesJarFromAar ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, }; + binding.SetRuntime (runtime); // Add a jar with Pack='false' - should not be included in AAR binding.OtherBuildItems.Add (new AndroidItem.AndroidLibrary ("Jars\\test-pack-false.jar") { BinaryContent = () => ResourceData.JavaSourceJarTestJar, @@ -476,10 +575,14 @@ public void AndroidLibraryPackFalseExcludesJarFromAar () } [Test] - public void RemoveEventHandlerResolution () + public void RemoveEventHandlerResolution ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject () { - IsRelease = true, + IsRelease = isRelease, Jars = { new AndroidItem.LibraryProjectZip ("Jars\\ActionBarSherlock-4.3.1.zip") { WebContent = "https://github.com/xamarin/monodroid-samples/blob/archived-xamarin/ActionBarSherlock/ActionBarSherlock/Jars/ActionBarSherlock-4.3.1.zip?raw=true" @@ -494,17 +597,24 @@ public void RemoveEventHandlerResolution () Xamarin.ActionbarSherlockBinding.Views ", }; - using (var bindingBuilder = CreateDllBuilder (Path.Combine ("temp", "RemoveEventHandlerResolution", "Binding"))) { + binding.SetRuntime (runtime); + using (var bindingBuilder = CreateDllBuilder (Path.Combine ("temp", TestName, "Binding"))) { Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded"); } } [Test] - public void JavaSourceJar () + public void JavaSourceJar ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var binding = new XamarinAndroidBindingProject () { + IsRelease = isRelease, AndroidClassParser = "class-parse", }; + binding.SetRuntime (runtime); binding.SetProperty ("DocumentationFile", "UnnamedProject.xml"); binding.SetProperty ("AndroidJavadocVerbosity", "full"); using (var bindingBuilder = CreateDllBuilder ()) { @@ -533,9 +643,14 @@ public void JavaSourceJar () } [Test] - public void AppWithSingleJar () + public void AppWithSingleJar ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidApplicationProject { + IsRelease = isRelease, EnableDefaultItems = true, Sources = { new AndroidItem.AndroidLibrary ("Jars\\javaclasses.jar") { @@ -543,8 +658,9 @@ public void AppWithSingleJar () } } }; + proj.SetRuntime (runtime); - var builder = CreateApkBuilder (); + using var builder = CreateApkBuilder (); Assert.IsTrue (builder.Build (proj), "first build should succeed"); Assert.IsTrue (builder.DesignTimeBuild (proj), "Design time build should succeed."); Assert.IsFalse (builder.Output.IsTargetSkipped ("AddBindingsToCompile"), "AddBindingsToCompile should run."); @@ -568,12 +684,18 @@ public void AppWithSingleJar () } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void DesignTimeBuild (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void DesignTimeBuild (string classParser, [Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, AndroidClassParser = classParser }; + proj.SetRuntime (runtime); proj.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\material-menu-1.1.0.aar") { WebContent = "https://repo1.maven.org/maven2/com/balysv/material-menu/1.1.0/material-menu-1.1.0.aar" }); @@ -594,10 +716,15 @@ public void DesignTimeBuild (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void NullableReferenceTypes (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void NullableReferenceTypes (string classParser, [Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, AndroidClassParser = classParser, Jars = { new AndroidItem.EmbeddedJar ("foo.jar") { @@ -605,6 +732,7 @@ public void NullableReferenceTypes (string classParser) } } }; + proj.SetRuntime (runtime); proj.SetProperty ("Nullable", "enable"); using (var b = CreateDllBuilder ()) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); @@ -617,12 +745,17 @@ public void NullableReferenceTypes (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void BindDefaultInterfaceMethods (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void BindDefaultInterfaceMethods (string classParser, [Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject { IsRelease = true, }; + proj.SetRuntime (runtime); // The sources for the .jar is in the jar itself. string classesJarBase64 = @" @@ -674,12 +807,18 @@ public void BindDefaultInterfaceMethods (string classParser) } [Test] - [TestCaseSource (nameof (ClassParseOptions))] - public void NothingToBind (string classParser) + [TestCaseSource (nameof (Get_ClassParseOptions))] + public void NothingToBind (string classParser, [Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, AndroidClassParser = classParser, }; + proj.SetRuntime (runtime); using (var b = CreateDllBuilder ()) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); b.AssertHasNoWarnings (); @@ -687,10 +826,15 @@ public void NothingToBind (string classParser) } [Test] - public void BindingWithAndroidJavaSource () + public void BindingWithAndroidJavaSource ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var path = Path.Combine ("temp", TestName); var lib = new XamarinAndroidBindingProject () { + IsRelease = isRelease, ProjectName = "BindingsProject", AndroidClassParser = "class-parse", Jars = { @@ -716,10 +860,15 @@ public void BindingWithAndroidJavaSource () }, }; + lib.SetRuntime (runtime); + var app = new XamarinAndroidApplicationProject () { + IsRelease = isRelease, ProjectName = "App", References = { new BuildItem.ProjectReference ($"..\\{lib.ProjectName}\\{lib.ProjectName}.csproj", lib.ProjectName, lib.ProjectGuid) } }; + app.SetRuntime (runtime); + using (var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName), cleanupAfterSuccessfulBuild: false)) using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { libBuilder.Verbosity = LoggerVerbosity.Detailed; @@ -757,10 +906,15 @@ public void BindingWithAndroidJavaSource () } [Test] - public void LibraryProjectZipWithLint () + public void LibraryProjectZipWithLint ([Values] AndroidRuntime runtime) { + const bool isRelease = true; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } var path = Path.Combine ("temp", TestName); var lib = new XamarinAndroidBindingProject () { + IsRelease = isRelease, ProjectName = "BindingsProject", AndroidClassParser = "class-parse", Jars = { @@ -770,31 +924,40 @@ public void LibraryProjectZipWithLint () }, MetadataXml = @"" }; + lib.SetRuntime (runtime); + var app = new XamarinAndroidApplicationProject () { + IsRelease = isRelease, ProjectName = "App", - IsRelease = true, LinkTool = "r8", References = { new BuildItem.ProjectReference ($"..\\{lib.ProjectName}\\{lib.ProjectName}.csproj", lib.ProjectName, lib.ProjectGuid) } }; - using (var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName), cleanupAfterSuccessfulBuild: false)) - using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { - Assert.IsTrue (libBuilder.Build (lib), "Library build should have succeeded."); - Assert.IsTrue (appBuilder.Build (app), "App build should have succeeded."); - StringAssertEx.DoesNotContain ("warning : Missing class: com.android.tools.lint.detector.api.Detector", appBuilder.LastBuildOutput, "Build output should contain no warnings about com.android.tools.lint.detector.api.Detector"); - var libraryProjects = Path.Combine (Root, appBuilder.ProjectDirectory, app.IntermediateOutputPath, "lp"); - Assert.IsFalse (Directory.EnumerateFiles (libraryProjects, "lint.jar", SearchOption.AllDirectories).Any (), - "`lint.jar` should not be extracted!"); - } + app.SetRuntime (runtime); + + using var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName), cleanupAfterSuccessfulBuild: false); + using var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName)); + Assert.IsTrue (libBuilder.Build (lib), "Library build should have succeeded."); + Assert.IsTrue (appBuilder.Build (app), "App build should have succeeded."); + StringAssertEx.DoesNotContain ("warning : Missing class: com.android.tools.lint.detector.api.Detector", appBuilder.LastBuildOutput, "Build output should contain no warnings about com.android.tools.lint.detector.api.Detector"); + var libraryProjects = Path.Combine (Root, appBuilder.ProjectDirectory, app.IntermediateOutputPath, "lp"); + Assert.IsFalse (Directory.EnumerateFiles (libraryProjects, "lint.jar", SearchOption.AllDirectories).Any (), + "`lint.jar` should not be extracted!"); } /// /// Tests two .aar files with r-classes.jar, repackaged.jar /// [Test] - public void CheckDuplicateJavaLibraries () + public void CheckDuplicateJavaLibraries ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + var path = Path.Combine ("temp", TestName); var lib1 = new XamarinAndroidBindingProject { + IsRelease = isRelease, ProjectName = "Library1", AndroidClassParser = "class-parse", Jars = { @@ -809,7 +972,10 @@ public void CheckDuplicateJavaLibraries () }, }, }; + lib1.SetRuntime (runtime); + var lib2 = new XamarinAndroidBindingProject { + IsRelease = isRelease, ProjectName = "Library2", AndroidClassParser = "class-parse", Jars = { @@ -824,30 +990,42 @@ public void CheckDuplicateJavaLibraries () }, }, }; + lib2.SetRuntime (runtime); + var app = new XamarinAndroidApplicationProject { + IsRelease = isRelease, SupportedOSPlatformVersion = "30", // androidx.health requires minSdkVersion="30" }; + app.SetRuntime (runtime); app.AddReference (lib1); app.AddReference (lib2); - using (var lib1Builder = CreateDllBuilder (Path.Combine (path, lib1.ProjectName))) - using (var lib2Builder = CreateDllBuilder (Path.Combine (path, lib2.ProjectName))) - using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { - Assert.IsTrue (lib1Builder.Build (lib1), "Library1 build should have succeeded."); - Assert.IsTrue (lib2Builder.Build (lib2), "Library2 build should have succeeded."); - Assert.IsTrue (appBuilder.Build (app), "App build should have succeeded."); - } + + using var lib1Builder = CreateDllBuilder (Path.Combine (path, lib1.ProjectName)); + using var lib2Builder = CreateDllBuilder (Path.Combine (path, lib2.ProjectName)); + using var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName)); + + Assert.IsTrue (lib1Builder.Build (lib1), "Library1 build should have succeeded."); + Assert.IsTrue (lib2Builder.Build (lib2), "Library2 build should have succeeded."); + Assert.IsTrue (appBuilder.Build (app), "App build should have succeeded."); } [Test] - public void AndroidMavenLibrary () + [NonParallelizable] // All tests are accessing the same .pom file + public void AndroidMavenLibrary ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } // Test that downloads .jar from Maven and successfully binds it var item = new BuildItem ("AndroidMavenLibrary", "com.google.auto.value:auto-value-annotations"); item.Metadata.Add ("Version", "1.10.4"); var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, Jars = { item } }; + proj.SetRuntime (runtime); using (var b = CreateDllBuilder ()) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); @@ -859,8 +1037,13 @@ public void AndroidMavenLibrary () } [Test] - public void AndroidMavenLibrary_FailsDueToUnverifiedDependency () + public void AndroidMavenLibrary_FailsDueToUnverifiedDependency ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + // Test that triggers Java dependency verification // var item = new BuildItem ("AndroidMavenLibrary", "androidx.core:core"); @@ -868,8 +1051,10 @@ public void AndroidMavenLibrary_FailsDueToUnverifiedDependency () item.Metadata.Add ("Repository", "Google"); var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, Jars = { item } }; + proj.SetRuntime (runtime); using (var b = CreateDllBuilder ()) { b.ThrowOnBuildFailure = false; @@ -881,8 +1066,13 @@ public void AndroidMavenLibrary_FailsDueToUnverifiedDependency () } [Test] - public void AndroidMavenLibrary_IgnoreDependencyVerification () + public void AndroidMavenLibrary_IgnoreDependencyVerification ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + // Test that ignores Java dependency verification // var item = new BuildItem ("AndroidMavenLibrary", "androidx.core:core"); @@ -892,8 +1082,10 @@ public void AndroidMavenLibrary_IgnoreDependencyVerification () item.Metadata.Add ("Bind", "false"); var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, Jars = { item } }; + proj.SetRuntime (runtime); using (var b = CreateDllBuilder ()) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); @@ -901,8 +1093,13 @@ public void AndroidMavenLibrary_IgnoreDependencyVerification () } [Test] - public void AndroidMavenLibrary_AllDependenciesAreVerified () + public void AndroidMavenLibrary_AllDependenciesAreVerified ([Values] AndroidRuntime runtime) { + bool isRelease = runtime == AndroidRuntime.NativeAOT; + if (IgnoreUnsupportedConfiguration (runtime, release: isRelease)) { + return; + } + // Test that triggers Java dependency verification and that // all dependencies are verified via various supported mechanisms @@ -934,10 +1131,12 @@ public void AndroidMavenLibrary_AllDependenciesAreVerified () var parcelable = new BuildItem ("AndroidIgnoredJavaDependency", "androidx.versionedparcelable:versionedparcelable:1.2.0"); var proj = new XamarinAndroidBindingProject { + IsRelease = isRelease, Jars = { item, annotations_experimental_androidlib }, PackageReferences = { annotations_nuget }, OtherBuildItems = { concurrent, lifecycle, parcelable }, }; + proj.SetRuntime (runtime); proj.AddReference (collection); var collection_proj = proj.References.First ();