public void BuildAarBindigLibraryStandalone(string classParser) { var proj = new XamarinAndroidBindingProject() { UseLatestPlatformSdk = true, IsRelease = true, }; proj.Jars.Add(new AndroidItem.LibraryProjectZip("Jars\\material-menu-1.1.0.aar") { WebContent = "https://repo.jfrog.org/artifactory/libs-release-bintray/com/balysv/material-menu/1.1.0/material-menu-1.1.0.aar" }); proj.AndroidClassParser = classParser; var b = CreateDllBuilder(Path.Combine("temp", TestName)); Assert.IsTrue(b.Build(proj), "Build should have succeeded."); b.Dispose(); }
[Category("DotNetIgnore")] //TODO: @(LibraryProjectProperties) not supported yet in .NET 5+ public void BugzillaBug11964() { var proj = new XamarinAndroidBindingProject(); proj.Sources.Add(new BuildItem("LibraryProjectProperties", "project.properties") { TextContent = () => "" }); using (var builder = CreateDllBuilder()) { builder.ThrowOnBuildFailure = false; Assert.IsFalse(builder.Build(proj), "Build should have failed."); string error = builder.LastBuildOutput .SkipWhile(x => !x.StartsWith("Build FAILED.")) .FirstOrDefault(x => x.Contains("error XA1019:")); Assert.IsNotNull(error, "Build should have failed with XA1019."); } }
public void BuildBasicBindingLibrary(string classParser) { var targets = new List <string> { "_ExtractJavaDocJars", "_ExportJarToXml", "GenerateBindings", "_CreateBindingResourceArchive", "BuildDocumentation", "_ResolveLibraryProjectImports", "CoreCompile", }; var proj = new XamarinAndroidBindingProject() { IsRelease = true, }; 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" }); proj.AndroidClassParser = classParser; using (var b = CreateDllBuilder(Path.Combine("temp", TestName))) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); //A list of properties we check exist in binding projects var properties = new [] { "AndroidSdkBuildToolsVersion", "AndroidSdkPlatformToolsVersion", "AndroidSdkToolsVersion", "AndroidNdkVersion", }; foreach (var property in properties) { Assert.IsTrue(StringAssertEx.ContainsText(b.LastBuildOutput, property + " = "), $"$({property}) should be set!"); } Assert.IsTrue(b.Build(proj, doNotCleanupOnUpdate: true, saveProject: false), "second build should succeed"); foreach (var target in targets) { Assert.IsTrue(b.Output.IsTargetSkipped(target), $"`{target}` should be skipped on second build!"); } } }
public void BindingCustomJavaApplicationClass() { var binding = new XamarinAndroidBindingProject() { IsRelease = true, }; binding.AndroidClassParser = "class-parse"; binding.Jars.Add(new AndroidItem.EmbeddedJar(() => "$(MonoDroidInstallDirectory)\\lib\\mandroid\\android-support-multidex.jar")); using (var bindingBuilder = CreateDllBuilder("temp/BindingCustomJavaApplicationClass/MultiDexBinding")) { bindingBuilder.Build(binding); var proj = new XamarinAndroidApplicationProject(); proj.OtherBuildItems.Add(new BuildItem("ProjectReference", "..\\MultiDexBinding\\UnnamedProject.csproj")); using (var b = CreateApkBuilder("temp/BindingCustomJavaApplicationClass/App")) { b.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic; Assert.IsTrue(b.Build(proj), "Build should have succeeded."); } } }
public void AnnotationSupport() { // https://trello.com/c/a36dDVS6/37-support-for-annotations-zip var binding = new XamarinAndroidBindingProject() { IsRelease = true, }; binding.AndroidClassParser = "class-parse"; binding.Jars.Add(new AndroidItem.LibraryProjectZip("Jars\\mylibrary.aar") { WebContentFileNameFromAzure = "mylibrary-debug.aar" }); using (var bindingBuilder = CreateDllBuilder()) { Assert.IsTrue(bindingBuilder.Build(binding), "binding build failed"); var cs_file = Path.Combine(Root, bindingBuilder.ProjectDirectory, "obj", "Release", "generated", "src", "Com.Example.Atsushi.Mylibrary.AnnotSample.cs"); FileAssert.Exists(cs_file); StringAssert.Contains("IntDef", File.ReadAllText(cs_file)); } }
public void BuildAarBindingLibraryStandalone(string classParser) { var proj = new XamarinAndroidBindingProject() { UseLatestPlatformSdk = true, IsRelease = true, }; proj.Jars.Add(new AndroidItem.AndroidLibrary("Jars\\material-menu-1.1.0.aar") { WebContent = "https://repo.jfrog.org/artifactory/libs-release-bintray/com/balysv/material-menu/1.1.0/material-menu-1.1.0.aar" }); proj.AndroidClassParser = classParser; using (var b = CreateDllBuilder()) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); if (Builder.UseDotNet) { FileAssert.Exists(Path.Combine(Root, b.ProjectDirectory, proj.OutputPath, "material-menu-1.1.0.aar")); } } }
public void BindngFilterUnsupportedNativeAbiLibraries() { var binding = new XamarinAndroidBindingProject() { IsRelease = true, }; binding.AndroidClassParser = "class-parse"; binding.Jars.Add(new AndroidItem.LibraryProjectZip("Jars\\mylibrary.aar") { WebContent = "https://www.dropbox.com/s/apphdrh9cjqvtye/card.io-5.3.0.aar?dl=1" }); using (var bindingBuilder = CreateDllBuilder(Path.Combine("temp", "BindngFilterUnsupportedNativeAbiLibraries", "Binding"))) { Assert.IsTrue(bindingBuilder.Build(binding), "binding build should have succeeded"); var proj = new XamarinAndroidApplicationProject(); proj.OtherBuildItems.Add(new BuildItem("ProjectReference", "..\\Binding\\UnnamedProject.csproj")); using (var b = CreateApkBuilder(Path.Combine("temp", "BindngFilterUnsupportedNativeAbiLibraries", "App"))) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); } } }
public void BindingCustomJavaApplicationClass() { var binding = new XamarinAndroidBindingProject() { IsRelease = true, ProjectName = "Binding", }; binding.AndroidClassParser = "class-parse"; using (var bindingBuilder = CreateDllBuilder("temp/BindingCustomJavaApplicationClass/MultiDexBinding")) { string multidexJar = Path.Combine(bindingBuilder.AndroidMSBuildDirectory, "android-support-multidex.jar"); binding.Jars.Add(new AndroidItem.EmbeddedJar(() => multidexJar)); bindingBuilder.Build(binding); var proj = new XamarinAndroidApplicationProject(); proj.OtherBuildItems.Add(new BuildItem("ProjectReference", $"..\\MultiDexBinding\\{binding.ProjectName}.csproj")); using (var b = CreateApkBuilder("temp/BindingCustomJavaApplicationClass/App")) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); } } }
public void AnnotationSupport() { // https://trello.com/c/a36dDVS6/37-support-for-annotations-zip var binding = new XamarinAndroidBindingProject() { IsRelease = true, }; binding.AndroidClassParser = "class-parse"; binding.Jars.Add(new AndroidItem.LibraryProjectZip("Jars\\mylibrary.aar") { WebContent = "https://www.dropbox.com/s/53679881kg9rdiq/mylibrary-debug.aar?dl=1" }); var bindingBuilder = CreateDllBuilder("temp/AnnotationSupport"); Assert.IsTrue(bindingBuilder.Build(binding), "binding build failed"); var src = File.ReadAllText(Path.Combine(Root, bindingBuilder.ProjectDirectory, "obj", "Release", "generated", "src", "Com.Example.Atsushi.Mylibrary.AnnotSample.cs")); Assert.IsTrue(src.Contains("IntDef"), "missing IntDef"); bindingBuilder.Dispose(); }
public void JavaSourceJar() { var binding = new XamarinAndroidBindingProject() { AndroidClassParser = "class-parse", }; binding.SetProperty("DocumentationFile", "UnnamedProject.xml"); using (var bindingBuilder = CreateDllBuilder()) { binding.Jars.Add(new AndroidItem.EmbeddedJar("javasourcejartest.jar") { BinaryContent = () => Convert.FromBase64String(InlineData.JavaClassesJarBase64) }); binding.OtherBuildItems.Add(new BuildItem("JavaSourceJar", "javasourcejartest-sources.jar") { BinaryContent = () => Convert.FromBase64String(InlineData.JavaSourcesJarBase64) }); Assert.IsTrue(bindingBuilder.Build(binding), "binding build should have succeeded"); string xml = bindingBuilder.Output.GetIntermediaryAsText("docs/Com.Xamarin.Android.Test.Msbuildtest/JavaSourceJarTest.xml"); Assert.IsTrue(xml.Contains("<param name=\"name\"> - name to display.</param>"), "missing doc"); } }
public void CleanBasicBindingLibrary(string classParser) { var proj = new XamarinAndroidBindingProject() { IsRelease = true, }; 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" }); proj.AndroidClassParser = classParser; using (var b = CreateDllBuilder("temp/CleanBasicBindingLibrary")) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); Assert.IsTrue(b.Clean(proj), "Clean should have succeeded"); var fileCount = Directory.GetFiles(Path.Combine(Root, b.ProjectDirectory, proj.IntermediateOutputPath), "*", SearchOption.AllDirectories) .Where(x => !Path.GetFileName(x).StartsWith("TemporaryGeneratedFile")).Count(); Assert.AreEqual(0, Directory.GetDirectories(Path.Combine(Root, b.ProjectDirectory, proj.IntermediateOutputPath), "*", SearchOption.AllDirectories).Length, "All directories in {0} should have been removed", proj.IntermediateOutputPath); Assert.AreEqual(0, fileCount, "All files in {0} should have been removed", proj.IntermediateOutputPath); } }
public void NullableReferenceTypes(string classParser) { var proj = new XamarinAndroidBindingProject { AndroidClassParser = classParser, Jars = { new AndroidItem.EmbeddedJar("foo.jar") { BinaryContent = () => ResourceData.JavaSourceJarTestJar, } } }; proj.SetProperty("Nullable", "enable"); using (var b = CreateDllBuilder()) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); var cs_file = b.Output.GetIntermediaryPath( Path.Combine("generated", "src", "Com.Xamarin.Android.Test.Msbuildtest.JavaSourceJarTest.cs")); FileAssert.Exists(cs_file); StringAssert.Contains("string? Greet", File.ReadAllText(cs_file)); } }
public void BindingCustomJavaApplicationClass() { var binding = new XamarinAndroidBindingProject() { IsRelease = true, }; binding.AndroidClassParser = "class-parse"; var multidexJar = Environment.OSVersion.Platform == PlatformID.Win32NT ? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "MSBuild", "Xamarin", "Android", "android-support-multidex.jar") : Path.Combine("$(MonoDroidInstallDirectory)", "lib", "xamarin.android", "xbuild", "Xamarin", "Android", "android-support-multidex.jar"); binding.Jars.Add(new AndroidItem.EmbeddedJar(() => multidexJar)); using (var bindingBuilder = CreateDllBuilder("temp/BindingCustomJavaApplicationClass/MultiDexBinding")) { bindingBuilder.Build(binding); var proj = new XamarinAndroidApplicationProject(); proj.OtherBuildItems.Add(new BuildItem("ProjectReference", "..\\MultiDexBinding\\UnnamedProject.csproj")); using (var b = CreateApkBuilder("temp/BindingCustomJavaApplicationClass/App")) { b.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic; Assert.IsTrue(b.Build(proj), "Build should have succeeded."); } } }
public void AarWithRClassesJar() { var path = Path.Combine("temp", TestName); var lib1 = new XamarinAndroidBindingProject { ProjectName = "Library1", AndroidClassParser = "class-parse", Jars = { new AndroidItem.LibraryProjectZip("Library1.aar") { BinaryContent = () => ResourceData.Library1Aar } }, }; var lib2 = new XamarinAndroidBindingProject { ProjectName = "Library2", AndroidClassParser = "class-parse", Jars = { new AndroidItem.LibraryProjectZip("Library2.aar") { BinaryContent = () => ResourceData.Library2Aar } }, }; var app = new XamarinAndroidApplicationProject(); 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."); } }
public void JavaSourceJar() { var binding = new XamarinAndroidBindingProject() { AndroidClassParser = "class-parse", }; binding.SetProperty("DocumentationFile", "UnnamedProject.xml"); using (var bindingBuilder = CreateDllBuilder()) { binding.Jars.Add(new AndroidItem.EmbeddedJar("javasourcejartest.jar") { BinaryContent = () => ResourceData.JavaSourceJarTestJar, }); binding.OtherBuildItems.Add(new BuildItem("JavaSourceJar", "javasourcejartest-sources.jar") { BinaryContent = () => ResourceData.JavaSourceJarTestSourcesJar, }); Assert.IsTrue(bindingBuilder.Build(binding), "binding build should have succeeded"); var path = Path.Combine(Root, bindingBuilder.ProjectDirectory, binding.OutputPath, "UnnamedProject.xml"); var xml = File.ReadAllText(path); Assert.IsTrue(xml.Contains("<param name=\"name\">name to display.</param>"), "param `name` documentation not imported!"); } }
public void MergeLibraryManifest() { byte [] classesJar; using (var stream = typeof(XamarinAndroidCommonProject).Assembly.GetManifestResourceStream("Xamarin.ProjectTools.Resources.Base.classes.jar")) { classesJar = new byte [stream.Length]; stream.Read(classesJar, 0, (int)stream.Length); } byte [] data; using (var ms = new MemoryStream()) { using (var zip = ZipArchive.Create(ms)) { zip.AddEntry("AndroidManifest.xml", @"<?xml version='1.0'?> <manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.xamarin.test'> <uses-sdk android:minSdkVersion='16'/> <permission android:name='${applicationId}.permission.C2D_MESSAGE' android:protectionLevel='signature' /> <application> <activity android:name='.signin.internal.SignInHubActivity' /> <provider android:authorities='${applicationId}.FacebookInitProvider' android:name='.internal.FacebookInitProvider' android:exported='false' /> <meta-data android:name='android.support.VERSION' android:value='25.4.0' /> <meta-data android:name='android.support.VERSION' android:value='25.4.0' /> </application> </manifest> ", encoding: System.Text.Encoding.UTF8); zip.CreateDirectory("res"); zip.AddEntry(classesJar, "classes.jar"); zip.AddEntry("R.txt", " ", encoding: System.Text.Encoding.UTF8); } data = ms.ToArray(); } var path = Path.Combine("temp", TestContext.CurrentContext.Test.Name); var lib = new XamarinAndroidBindingProject() { ProjectName = "Binding1", AndroidClassParser = "class-parse", Jars = { new AndroidItem.LibraryProjectZip("Jars\\foo.aar") { BinaryContent = () => data, } }, }; var proj = new XamarinAndroidApplicationProject() { PackageName = "com.xamarin.manifest", References = { new BuildItem.ProjectReference("..\\Binding1\\Binding1.csproj", lib.ProjectGuid) }, PackageReferences = { KnownPackages.SupportMediaCompat_25_4_0_1, KnownPackages.SupportFragment_25_4_0_1, KnownPackages.SupportCoreUtils_25_4_0_1, KnownPackages.SupportCoreUI_25_4_0_1, KnownPackages.SupportCompat_25_4_0_1, KnownPackages.AndroidSupportV4_25_4_0_1, KnownPackages.SupportV7AppCompat_25_4_0_1, }, }; proj.Sources.Add(new BuildItem.Source("TestActivity1.cs") { TextContent = () => @"using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Android.Support.V4.App; using Android.Util; [Activity (Label = ""TestActivity1"")] [IntentFilter (new[]{Intent.ActionMain}, Categories = new[]{ ""com.xamarin.sample"" })] public class TestActivity1 : FragmentActivity { } " , }); proj.Sources.Add(new BuildItem.Source("TestActivity2.cs") { TextContent = () => @"using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Android.Support.V4.App; using Android.Util; [Activity (Label = ""TestActivity2"")] [IntentFilter (new[]{Intent.ActionMain}, Categories = new[]{ ""com.xamarin.sample"" })] public class TestActivity2 : FragmentActivity { } " , }); using (var libbuilder = CreateDllBuilder(Path.Combine(path, "Binding1"))) { Assert.IsTrue(libbuilder.Build(lib), "Build should have succeeded."); using (var builder = CreateApkBuilder(Path.Combine(path, "App1"))) { Assert.IsTrue(builder.Build(proj), "Build should have succeeded."); var manifest = builder.Output.GetIntermediaryAsText(Root, "android/AndroidManifest.xml"); Assert.IsTrue(manifest.Contains("com.xamarin.manifest.permission.C2D_MESSAGE"), "${applicationId}.permission.C2D_MESSAGE was not replaced with com.xamarin.manifest.permission.C2D_MESSAGE"); Assert.IsTrue(manifest.Contains("com.xamarin.test.signin.internal.SignInHubActivity"), ".signin.internal.SignInHubActivity was not replaced with com.xamarin.test.signin.internal.SignInHubActivity"); Assert.IsTrue(manifest.Contains("com.xamarin.manifest.FacebookInitProvider"), "${applicationId}.FacebookInitProvider was not replaced with com.xamarin.manifest.FacebookInitProvider"); Assert.IsTrue(manifest.Contains("com.xamarin.test.internal.FacebookInitProvider"), ".internal.FacebookInitProvider was not replaced with com.xamarin.test.internal.FacebookInitProvider"); Assert.AreEqual(manifest.IndexOf("meta-data", StringComparison.OrdinalIgnoreCase), manifest.LastIndexOf("meta-data", StringComparison.OrdinalIgnoreCase), "There should be only one meta-data element"); var doc = XDocument.Parse(manifest); var ns = XNamespace.Get("http://schemas.android.com/apk/res/android"); var activities = doc.Element("manifest")?.Element("application")?.Elements("activity"); var e = activities.FirstOrDefault(x => x.Attribute(ns.GetName("label"))?.Value == "TestActivity2"); Assert.IsNotNull(e, "Manifest should contain an activity for TestActivity2"); Assert.IsNotNull(e.Element("intent-filter"), "TestActivity2 should have an intent-filter"); Assert.IsNotNull(e.Element("intent-filter").Element("action"), "TestActivity2 should have an intent-filter/action"); } } }
public void MergeLibraryManifest() { byte [] classesJar; using (var stream = typeof(XamarinAndroidCommonProject).Assembly.GetManifestResourceStream("Xamarin.ProjectTools.Resources.Base.classes.jar")) { classesJar = new byte [stream.Length]; stream.Read(classesJar, 0, (int)stream.Length); } byte [] data; using (var ms = new MemoryStream()) { using (var zip = ZipArchive.Create(ms)) { zip.AddEntry("AndroidManifest.xml", @"<?xml version='1.0'?> <manifest xmlns:android='http://schemas.android.com/apk/res/android' package='com.xamarin.test'> <uses-sdk android:minSdkVersion='14'/> <application> <activity android:name='.signin.internal.SignInHubActivity' /> <provider android:authorities='${applicationId}.FacebookInitProvider' android:name='.internal.FacebookInitProvider' android:exported='false' /> </application> </manifest> ", encoding: System.Text.Encoding.UTF8); zip.CreateDirectory("res"); zip.AddEntry(classesJar, "classes.jar"); zip.AddEntry("R.txt", " ", encoding: System.Text.Encoding.UTF8); } data = ms.ToArray(); } var path = Path.Combine("temp", TestContext.CurrentContext.Test.Name); var lib = new XamarinAndroidBindingProject() { ProjectName = "Binding1", AndroidClassParser = "class-parse", Jars = { new AndroidItem.LibraryProjectZip("Jars\\foo.aar") { BinaryContent = () => data, } }, }; var proj = new XamarinAndroidApplicationProject() { PackageName = "com.xamarin.manifest", References = { new BuildItem.ProjectReference("..\\Binding1\\Binding1.csproj", lib.ProjectGuid) }, }; using (var libbuilder = CreateDllBuilder(Path.Combine(path, "Binding1"))) { Assert.IsTrue(libbuilder.Build(lib), "Build should have succeeded."); using (var builder = CreateApkBuilder(Path.Combine(path, "App1"))) { Assert.IsTrue(builder.Build(proj), "Build should have succeeded."); var manifest = builder.Output.GetIntermediaryAsText(Root, "android/AndroidManifest.xml"); Assert.IsTrue(manifest.Contains("com.xamarin.test.signin.internal.SignInHubActivity"), ".signin.internal.SignInHubActivity was not replaced with com.xamarin.test.signin.internal.SignInHubActivity"); Assert.IsTrue(manifest.Contains("com.xamarin.manifest.FacebookInitProvider"), "${applicationId}.FacebookInitProvider was not replaced with com.xamarin.manifest.FacebookInitProvider"); Assert.IsTrue(manifest.Contains("com.xamarin.test.internal.FacebookInitProvider"), ".internal.FacebookInitProvider was not replaced with com.xamarin.test.internal.FacebookInitProvider"); } } }
public void BuildBasicBindingLibrary(string classParser) { var targets = new List <string> { "_ExportJarToXml", "GenerateBindings", "_ResolveLibraryProjectImports", "CoreCompile", }; if (Builder.UseDotNet) { targets.Add("_CreateAar"); } else { targets.Add("_CreateBindingResourceArchive"); //TODO: .NET 5+ cannot support javadoc yet, due to missing mdoc targets.Add("_ExtractJavaDocJars"); targets.Add("BuildDocumentation"); } var proj = new XamarinAndroidBindingProject() { IsRelease = true, }; 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" }); proj.AndroidClassParser = classParser; using (var b = CreateDllBuilder()) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); var assemblyPath = Path.Combine(Root, b.ProjectDirectory, proj.OutputPath, $"{proj.ProjectName}.dll"); using (var assembly = AssemblyDefinition.ReadAssembly(assemblyPath)) { var typeName = "Com.Larvalabs.Svgandroid.SVG"; var type = assembly.MainModule.GetType(typeName); Assert.IsNotNull(type, $"{assemblyPath} should contain {typeName}"); } //TODO: see https://github.com/dotnet/msbuild/issues/6609 if (!Builder.UseDotNet) { //A list of properties we check exist in binding projects var properties = new [] { "AndroidSdkBuildToolsVersion", "AndroidSdkPlatformToolsVersion", "AndroidSdkToolsVersion", "AndroidNdkVersion", }; foreach (var property in properties) { Assert.IsTrue(StringAssertEx.ContainsText(b.LastBuildOutput, property + " = "), $"$({property}) should be set!"); } } Assert.IsTrue(b.Build(proj, doNotCleanupOnUpdate: true, saveProject: false), "second build should succeed"); foreach (var target in targets) { Assert.IsTrue(b.Output.IsTargetSkipped(target), $"`{target}` should be skipped on second build!"); } } }
public void BindingCheckHiddenFiles([Values(true, false)] bool useShortFileNames) { var binding = new XamarinAndroidBindingProject() { UseLatestPlatformSdk = true, IsRelease = true, }; binding.AndroidClassParser = "class-parse"; binding.Jars.Add(new AndroidItem.LibraryProjectZip("Jars\\mylibrary.aar") { WebContentFileNameFromAzure = "mylibrary.aar" }); binding.Jars.Add(new AndroidItem.EmbeddedJar("Jars\\svg-android.jar") { WebContentFileNameFromAzure = "javaBindingIssue.jar" }); var path = Path.Combine("temp", TestContext.CurrentContext.Test.Name); binding.SetProperty(binding.ActiveConfigurationProperties, "UseShortFileNames", useShortFileNames); using (var bindingBuilder = CreateDllBuilder(Path.Combine(path, "Binding"))) { bindingBuilder.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic; Assert.IsTrue(bindingBuilder.Build(binding), "binding build should have succeeded"); var proj = new XamarinAndroidApplicationProject(); proj.OtherBuildItems.Add(new BuildItem("ProjectReference", "..\\Binding\\UnnamedProject.csproj")); proj.SetProperty(proj.ActiveConfigurationProperties, "UseShortFileNames", useShortFileNames); proj.AndroidManifest = $@"<?xml version=""1.0"" encoding=""utf-8""?> <manifest xmlns:android=""http://schemas.android.com/apk/res/android"" xmlns:tools=""http://schemas.android.com/tools"" android:versionCode=""1"" android:versionName=""1.0"" package=""{proj.PackageName}""> <uses-sdk /> <application android:label=""{proj.ProjectName}"" tools:replace=""android:label""> </application> </manifest>"; using (var b = CreateApkBuilder(Path.Combine(path, "App"))) { Assert.IsTrue(b.Build(proj), "Build should have succeeded."); var assemblyMap = b.Output.GetIntermediaryPath(Path.Combine("lp", "map.cache")); if (useShortFileNames) { Assert.IsTrue(File.Exists(assemblyMap), $"{assemblyMap} should exist."); } else { Assert.IsFalse(File.Exists(assemblyMap), $"{assemblyMap} should not exist."); } var assemblyIdentityMap = new List <string> (); if (useShortFileNames) { foreach (var s in File.ReadLines(assemblyMap)) { assemblyIdentityMap.Add(s); } } var assmeblyIdentity = useShortFileNames ? assemblyIdentityMap.IndexOf("UnnamedProject").ToString() : "UnnamedProject"; var libaryImportsFolder = useShortFileNames ? "lp" : "__library_projects__"; var jlibs = useShortFileNames ? "jl" : "library_project_imports"; var dsStorePath = Path.Combine(Root, b.ProjectDirectory, proj.IntermediateOutputPath, libaryImportsFolder, assmeblyIdentity, jlibs); Assert.IsTrue(Directory.Exists(dsStorePath), "{0} should exist.", dsStorePath); Assert.IsFalse(File.Exists(Path.Combine(dsStorePath, ".DS_Store")), "{0} should NOT exist.", Path.Combine(dsStorePath, ".DS_Store")); var _macOSStorePath = Path.Combine(dsStorePath, "_MACOSX"); Assert.IsFalse(Directory.Exists(_macOSStorePath), "{0} should NOT exist.", _macOSStorePath); var svgJar = Path.Combine(dsStorePath, "svg-android.jar"); Assert.IsTrue(File.Exists(svgJar), $"{svgJar} should exist."); } } }