From b99444142c5d5c921e21f42a5e12ffa2a9c78fff Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Fri, 7 Jun 2024 11:24:29 -0400 Subject: [PATCH] [tests] Reduce default build output verbosity (#9002) Sets the default build verbosity for MSBuild desktop and device tests to 'normal' to reduce log sizes and hopefully slightly improve test run timings. Tests that need to validate target outputs or other build details have been configured to use 'detailed' verbosity. Runtime identifier information will no longer be gathered by reading from the build log, we will instead read from the project file or assume a default of 64-bit architectures. --- .../AndroidDependenciesTests.cs | 5 +++ .../AndroidUpdateResourcesTest.cs | 5 +++ .../Xamarin.Android.Build.Tests/AotTests.cs | 3 ++ .../BindingBuildTest.cs | 3 ++ .../Xamarin.Android.Build.Tests/BuildTest.cs | 2 ++ .../Xamarin.Android.Build.Tests/BuildTest2.cs | 18 ++++------ .../BuildWithLibraryTests.cs | 1 - .../CodeBehindTests.cs | 1 + .../DeferredBuildTest.cs | 2 ++ .../DesignerTests.cs | 2 ++ .../IncrementalBuildTest.cs | 9 ++--- .../PackagingTest.cs | 10 +++--- .../SingleProjectTest.cs | 2 +- .../Tasks/CheckClientHandlerTypeTests.cs | 1 + .../Tasks/LinkerTests.cs | 8 ++--- .../Utilities/BaseTest.cs | 2 +- .../Xamarin.Android.Build.Tests/XASdkTests.cs | 1 + .../Xamarin.ProjectTools/Common/Builder.cs | 35 +------------------ .../Xamarin.ProjectTools/Common/DotNetCLI.cs | 2 +- .../Common/SolutionBuilder.cs | 6 +++- .../Utilities/ProjectExtensions.cs | 16 +++++++++ .../Tests/DebuggingTest.cs | 2 ++ .../Tests/InstallTests.cs | 2 ++ .../Tests/InstantRunTest.cs | 5 +++ 24 files changed, 80 insertions(+), 63 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs index f51c15da9a6..824d7b0d755 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidDependenciesTests.cs @@ -8,6 +8,7 @@ using NUnit.Framework; using Xamarin.Android.Tools; using Xamarin.ProjectTools; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -45,6 +46,7 @@ public void InstallAndroidDependenciesTest ([Values ("GoogleV2", "Xamarin")] str } using (var b = CreateApkBuilder ()) { + b.Verbosity = LoggerVerbosity.Detailed; b.CleanupAfterSuccessfulBuild = false; string defaultTarget = b.Target; b.Target = "InstallAndroidDependencies"; @@ -108,6 +110,7 @@ public void GetDependencyNdkRequiredConditions (string property, bool ndkRequire proj.AotAssemblies = true; proj.SetProperty (property, "true"); using (var builder = CreateApkBuilder ()) { + builder.Verbosity = LoggerVerbosity.Detailed; builder.Target = "GetAndroidDependencies"; Assert.IsTrue (builder.Build (proj), "Build should have succeeded."); IEnumerable taskOutput = builder.LastBuildOutput @@ -141,6 +144,7 @@ public void GetDependencyWhenBuildToolsAreMissingTest () }; string buildToolsVersion = GetExpectedBuildToolsVersion (); using (var builder = CreateApkBuilder (Path.Combine (path, proj.ProjectName), cleanupAfterSuccessfulBuild: false, cleanupOnDispose: false)) { + builder.Verbosity = LoggerVerbosity.Detailed; builder.ThrowOnBuildFailure = false; builder.Target = "GetAndroidDependencies"; Assert.True (builder.Build (proj, parameters: parameters), @@ -178,6 +182,7 @@ public void GetDependencyWhenSDKIsMissingTest ([Values (true, false)] bool creat string buildToolsVersion = GetExpectedBuildToolsVersion (); using (var builder = CreateApkBuilder (Path.Combine (path, proj.ProjectName), cleanupAfterSuccessfulBuild: false, cleanupOnDispose: false)) { + builder.Verbosity = LoggerVerbosity.Detailed; builder.ThrowOnBuildFailure = false; builder.Target = "GetAndroidDependencies"; Assert.True (builder.Build (proj, parameters: parameters), diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs index fbe9f4e5536..e11d2e418af 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AndroidUpdateResourcesTest.cs @@ -958,6 +958,7 @@ public void BuildAppWithManagedResourceParser() appProj.SetProperty ("AndroidUseManagedDesignTimeResourceGenerator", "True"); appProj.SetProperty ("AndroidUseDesignerAssembly", "false"); using (var appBuilder = CreateApkBuilder (Path.Combine (path, appProj.ProjectName))) { + appBuilder.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (appBuilder.DesignTimeBuild (appProj), "DesignTime Application Build should have succeeded."); Assert.IsFalse (appProj.CreateBuildOutput (appBuilder).IsTargetSkipped ("_ManagedUpdateAndroidResgen"), "Target '_ManagedUpdateAndroidResgen' should have run."); @@ -1028,10 +1029,12 @@ public void BuildAppWithManagedResourceParserAndLibraries () appProj.SetProperty ("AndroidUseManagedDesignTimeResourceGenerator", "True"); appProj.SetProperty ("AndroidUseDesignerAssembly", "false"); using (var libBuilder = CreateDllBuilder (Path.Combine (path, libProj.ProjectName), false, false)) { + libBuilder.Verbosity = LoggerVerbosity.Detailed; libBuilder.AutomaticNuGetRestore = false; Assert.IsTrue (libBuilder.RunTarget (libProj, "Restore"), "Library project should have restored."); libBuilder.ThrowOnBuildFailure = false; using (var appBuilder = CreateApkBuilder (Path.Combine (path, appProj.ProjectName), false, false)) { + appBuilder.Verbosity = LoggerVerbosity.Detailed; appBuilder.AutomaticNuGetRestore = false; Assert.IsTrue (appBuilder.RunTarget (appProj, "Restore"), "App project should have restored."); appBuilder.ThrowOnBuildFailure = false; @@ -1209,6 +1212,7 @@ public void CustomViewAddResourceId () proj.LayoutMain = proj.LayoutMain.Replace ("", ""); proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat); using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "first build should have succeeded"); //Add a new android:id @@ -1237,6 +1241,7 @@ public void CheckNoVersionVectors () { var proj = new XamarinFormsAndroidApplicationProject (); using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); string aaptCommand = "Executing link"; diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs index bf69140c390..cd0da12f83f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/AotTests.cs @@ -72,6 +72,7 @@ public void BuildBasicApplicationReleaseProfiledAot ([Values (true, false)] bool proj.SetProperty ("EnableLLVM", enableLLVM.ToString ()); proj.SetProperty (proj.ActiveConfigurationProperties, "AndroidExtraAotOptions", "--verbose"); using var b = CreateApkBuilder (); + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); AssertProfiledAotBuildMessages (b); } @@ -93,6 +94,7 @@ public void BuildBasicApplicationReleaseWithCustomAotProfile () proj.OtherBuildItems.Add (new BuildItem ("AndroidAotProfile", "custom.aotprofile") { BinaryContent = () => custom_aot_profile }); using var b = CreateApkBuilder (); + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); AssertProfiledAotBuildMessages (b); } @@ -106,6 +108,7 @@ public void BuildBasicApplicationReleaseProfiledAotWithoutDefaultProfile () }; proj.SetProperty (proj.ActiveConfigurationProperties, "AndroidUseDefaultAotProfile", "false"); using var b = CreateApkBuilder (); + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); StringAssertEx.DoesNotContainRegex (@$"Using profile data file.*dotnet\.aotprofile", b.LastBuildOutput, "Should not use default AOT profile", RegexOptions.IgnoreCase); } 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 48a46e56b46..df1fb580f45 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 @@ -8,6 +8,7 @@ using System.Xml.Linq; using Xamarin.ProjectTools; using Microsoft.Android.Build.Tasks; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -86,6 +87,7 @@ public void BindingLibraryIncremental (string classParser) }); proj.AndroidClassParser = classParser; using (var b = CreateDllBuilder ()) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); var assemblyPath = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.ProjectName}.dll"); @@ -679,6 +681,7 @@ public void BindingWithAndroidJavaSource () }; using (var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName), cleanupAfterSuccessfulBuild: false)) using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { + libBuilder.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (libBuilder.Build (lib), "Library build should have succeeded."); var generatedCode = Path.Combine (Root, libBuilder.ProjectDirectory, lib.IntermediateOutputPath, "generated", "src", "Com.Xamarin.Android.Test.Msbuildtest.JavaSourceTestExtension.cs"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index fce460a2c6d..f76ef5ed22a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -363,6 +363,7 @@ public void CheckItemMetadata ([Values (true, false)] bool isRelease) mainAxml.MetadataValues = "CustomData=ResourceMetaDataOK"; using (var builder = CreateApkBuilder (string.Format ("temp/CheckItemMetadata_{0}", isRelease))) { + builder.Verbosity = LoggerVerbosity.Detailed; builder.Build (proj); StringAssertEx.Contains ("AssetMetaDataOK", builder.LastBuildOutput, "Metadata was not copied for AndroidAsset"); StringAssertEx.Contains ("ResourceMetaDataOK", builder.LastBuildOutput, "Metadata was not copied for AndroidResource"); @@ -698,6 +699,7 @@ public void BuildAfterUpgradingNuget () //[TearDown] will still delete if test outcome successful, I need logs if assertions fail but build passes b.CleanupAfterSuccessfulBuild = b.CleanupOnDispose = false; + b.Verbosity = LoggerVerbosity.Detailed; var projectDir = Path.Combine (Root, b.ProjectDirectory); if (Directory.Exists (projectDir)) Directory.Delete (projectDir, true); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs index c37c20efbd0..b517429a188 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest2.cs @@ -54,6 +54,7 @@ public void MarshalMethodsDefaultEnabledStatus (bool isRelease, bool marshalMeth bool shouldMarshalMethodsBeEnabled = isRelease && marshalMethodsEnabled; using (var b = CreateApkBuilder ()) { + b.Verbosity = LoggerVerbosity.Diagnostic; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); Assert.IsTrue ( StringAssertEx.ContainsText (b.LastBuildOutput, $"_AndroidUseMarshalMethods = {shouldMarshalMethodsBeEnabled}"), @@ -455,6 +456,7 @@ public void SkipConvertResourcesCases () WebContent = "https://repo1.maven.org/maven2/com/balysv/material-menu/1.1.0/material-menu-1.1.0.aar" }); using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); Assert.IsFalse (b.Output.IsTargetSkipped (target), $"`{target}` should not be skipped."); @@ -1207,9 +1209,7 @@ public void BuildBasicApplicationCheckPdb () var proj = new XamarinAndroidApplicationProject (); using (var b = CreateApkBuilder ()) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); - + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (File.Exists (Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, $"android/assets/{abi}/UnnamedProject.pdb")), $"UnnamedProject.pdb must be copied to the Intermediate directory for ABI {abi}"); } @@ -1223,18 +1223,14 @@ public void BuildBasicApplicationCheckPdbRepeatBuild () using (var b = CreateApkBuilder ()) { Assert.IsTrue (b.Build (proj), "Build should have succeeded."); - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); - + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (File.Exists (Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, $"android/assets/{abi}/UnnamedProject.pdb")), $"UnnamedProject.pdb must be copied to the Intermediate directory for ABI {abi}"); } Assert.IsTrue (b.Build (proj), "second build failed"); - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); - + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (File.Exists (Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, $"android/assets/{abi}/UnnamedProject.pdb")), $"UnnamedProject.pdb must be copied to the Intermediate directory for ABI {abi}"); } @@ -1318,8 +1314,8 @@ public Class2 () }; string apkPath = Path.Combine (outputPath, proj.PackageName + "-Signed.apk"); - var helper = new ArchiveAssemblyHelper (apkPath, useAssemblyStores: false, b.GetBuildRuntimeIdentifiers ().ToArray ()); - foreach (string abi in b.GetBuildAbis ()) { + var helper = new ArchiveAssemblyHelper (apkPath, useAssemblyStores: false, proj.GetRuntimeIdentifiers ().ToArray ()); + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { foreach ((string fileName, bool existsInBin) in fileNames) { EnsureFilesAreTheSame (intermediate, existsInBin ? outputPath : null, fileName, abi, helper, uncompressIfNecessary: fileName.EndsWith (".dll", StringComparison.Ordinal)); } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildWithLibraryTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildWithLibraryTests.cs index 0e8a721998f..43d674f0085 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildWithLibraryTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildWithLibraryTests.cs @@ -427,7 +427,6 @@ public void BuildWithNativeLibraries ([Values (true, false)] bool isRelease) } } } - Directory.Delete (path, recursive: true); } [Test] diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/CodeBehindTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/CodeBehindTests.cs index 59a6d1742ed..da088199ffd 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/CodeBehindTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/CodeBehindTests.cs @@ -20,6 +20,7 @@ sealed class LocalBuilder : Builder public LocalBuilder () { BuildingInsideVisualStudio = false; + Verbosity = LoggerVerbosity.Detailed; } public bool Build (string projectOrSolution, string target, string [] parameters = null, Dictionary environmentVariables = null) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DeferredBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DeferredBuildTest.cs index e486cf3c7a8..73a8f41d9a6 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DeferredBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DeferredBuildTest.cs @@ -1,6 +1,7 @@ using NUnit.Framework; using System.IO; using Xamarin.ProjectTools; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -19,6 +20,7 @@ public void SelectivelyRunUpdateAndroidResources () app.SetProperty ("AndroidUseIntermediateDesignerFile", "True"); using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { + appBuilder.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (appBuilder.DesignTimeBuild (app, parameters: new string[]{ "BuildingInsideVisualStudio=true", "DeferredBuildSupported=true", diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs index 50a90784a83..c8288443d5a 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DesignerTests.cs @@ -5,6 +5,7 @@ using System.Xml.Linq; using NUnit.Framework; using Xamarin.ProjectTools; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -214,6 +215,7 @@ public void GetExtraLibraryLocationsForDesigner () // Each NuGet package and AAR file are in libraryprojectimports.cache, AndroidJavaSource is not const int libraryProjectImportsJars = 55; using (var b = CreateApkBuilder (Path.Combine ("temp", TestName), false, false)) { + b.Verbosity = LoggerVerbosity.Detailed; // GetExtraLibraryLocationsForDesigner on new project Assert.IsTrue (b.RunTarget (proj, target, parameters: DesignerParameters), $"build should have succeeded for target `{target}` 1"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs index b4eae1ec907..55c05640ea6 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/IncrementalBuildTest.cs @@ -438,7 +438,7 @@ public void AppProjectTargetsDoNotBreak () Path.Combine (output, $"{proj.ProjectName}.dll.config"), }; - foreach (string abi in b.GetBuildAbis ()) { + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { filesToTouch.Add (Path.Combine (intermediate, "android", "assets", abi, $"{proj.ProjectName}.dll")); } @@ -647,7 +647,7 @@ public void TransitiveDependencyProduceReferenceAssembly () var lib2Output = Path.Combine (path, lib2.ProjectName, "bin", "Debug", "netstandard2.0", $"{lib2.ProjectName}.dll"); - foreach (string abi in appBuilder.GetBuildAbis ()) { + foreach (string abi in app.GetRuntimeIdentifiersAsAbis ()) { var lib2InAppOutput = Path.Combine (path, app.ProjectName, app.IntermediateOutputPath, "android", "assets", abi, $"{lib2.ProjectName}.dll"); FileAssert.AreEqual (lib2Output, lib2InAppOutput, $"new Library2 should have been copied to app output directory for abi '{abi}'"); } @@ -662,8 +662,7 @@ public void LinkAssembliesNoShrink () Assert.IsTrue (b.Build (proj), "build should have succeeded."); // Touch an assembly to a timestamp older than build.props - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { var formsViewGroup = b.Output.GetIntermediaryPath (Path.Combine ("android", "assets", abi, "FormsViewGroup.dll")); File.SetLastWriteTimeUtc (formsViewGroup, new DateTime (1970, 1, 1)); } @@ -751,6 +750,7 @@ public CustomTextView(Context context, IAttributeSet attributes) : base(context, using (var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName), false)) using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { + appBuilder.Verbosity = LoggerVerbosity.Detailed; libBuilder.BuildLogFile = "build.log"; Assert.IsTrue (libBuilder.Build (lib), "first library build should have succeeded."); appBuilder.BuildLogFile = "build.log"; @@ -1176,6 +1176,7 @@ public void DesignTimeBuildSignAndroidPackage () proj.SetProperty ("AndroidUseDesignerAssembly", "true"); var builder = CreateApkBuilder (); var parameters = new [] { "BuildingInsideVisualStudio=true"}; + builder.Verbosity = LoggerVerbosity.Detailed; builder.BuildLogFile = "update.log"; Assert.IsTrue (builder.RunTarget (proj, "Compile", parameters: parameters), $"{proj.ProjectName} should succeed"); builder.Output.AssertTargetIsNotSkipped ("_GenerateResourceCaseMap", occurrence: 1); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs index 35523031a2d..72c37fd533f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs @@ -9,6 +9,7 @@ using Xamarin.Tools.Zip; using Xamarin.Android.Tasks; using Xamarin.Android.Tools; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -466,8 +467,7 @@ public void MissingSatelliteAssemblyInLibrary () var helper = new ArchiveAssemblyHelper (apk); foreach (string lang in languages) { - foreach (string rid in appBuilder.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); + foreach (string abi in app.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (helper.Exists ($"assemblies/{abi}/{lang}/{lib.ProjectName}.resources.dll"), $"Apk should contain satellite assembly for language '{lang}'!"); } } @@ -498,8 +498,7 @@ public void MissingSatelliteAssemblyInApp () var apk = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.apk"); var helper = new ArchiveAssemblyHelper (apk); - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (helper.Exists ($"assemblies/{abi}/es/{proj.ProjectName}.resources.dll"), "Apk should contain satellite assemblies!"); } } @@ -546,6 +545,7 @@ public class Test Assert.IsTrue (zip.ContainsEntry ($"AndroidManifest.xml"), "Jar should contain AndroidManifest.xml"); } using (var b = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (app), "Build of jar should have succeeded."); var jar = "2965D0C9A2D5DB1E.jar"; string expected = $"Ignoring jar entry AndroidManifest.xml from {jar}: the same file already exists in the apk"; @@ -563,6 +563,7 @@ public void CheckExcludedFilesAreMissing () }; proj.PackageReferences.Add (KnownPackages.Xamarin_Kotlin_StdLib_Common); using (var b = CreateApkBuilder ()) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); var apk = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.apk"); @@ -583,6 +584,7 @@ public void CheckExcludedFilesCanBeModified () }; proj.PackageReferences.Add (KnownPackages.Xamarin_Kotlin_StdLib_Common); using (var b = CreateApkBuilder ()) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); var apk = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.apk"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/SingleProjectTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/SingleProjectTest.cs index cce32043203..ed018079dd8 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/SingleProjectTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/SingleProjectTest.cs @@ -85,7 +85,7 @@ public void AndroidManifestProperties (string versionName, string versionCode, s $"{versionName}.0.0" : $"{versionName.Substring (0, index)}.0.0"; - foreach (string abi in b.GetBuildAbis ()) { + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { var assemblyPath = b.Output.GetIntermediaryPath ($"android/assets/{abi}/{proj.ProjectName}.dll"); FileAssert.Exists (assemblyPath); using var assembly = AssemblyDefinition.ReadAssembly (assemblyPath); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs index a1e0d1b096f..5db3db21aae 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/CheckClientHandlerTypeTests.cs @@ -28,6 +28,7 @@ public void ErrorIsNotRaised (string handler) }; proj.SetProperty ("AndroidHttpClientHandlerType", handler); using (var b = CreateApkBuilder (path)) { + b.Verbosity = LoggerVerbosity.Detailed; b.Build (proj); intermediatePath = Path.Combine (path,proj.IntermediateOutputPath); targetSkipped = b.Output.IsTargetSkipped ("_CheckAndroidHttpClientHandlerType"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs index 86f2a319cc0..98eaed9a4af 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Tasks/LinkerTests.cs @@ -235,8 +235,7 @@ public void RemoveDesigner ([Values (true, false)] bool useAssemblyStore) var apk = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.apk"); FileAssert.Exists (apk); var helper = new ArchiveAssemblyHelper (apk, useAssemblyStore); - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (helper.Exists ($"assemblies/{abi}/{assemblyName}.dll"), $"{assemblyName}.dll should exist in apk!"); using var stream = helper.ReadEntry ($"assemblies/{assemblyName}.dll"); @@ -292,8 +291,7 @@ public void LinkDescription ([Values (true, false)] bool useAssemblyStore) var apk = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}-Signed.apk"); FileAssert.Exists (apk); var helper = new ArchiveAssemblyHelper (apk, useAssemblyStore); - foreach (string rid in b.GetBuildRuntimeIdentifiers ()) { - string abi = MonoAndroidHelper.RidToAbi (rid); + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { Assert.IsTrue (helper.Exists ($"assemblies/{abi}/{assembly_name}.dll"), $"{assembly_name}.dll should exist in apk!"); } using (var stream = helper.ReadEntry ($"assemblies/{assembly_name}.dll")) { @@ -432,7 +430,7 @@ public unsafe bool MyMethod (Android.OS.IBinder windowToken, [global::Android.Ru string projectDir = Path.Combine (proj.Root, b.ProjectDirectory); var assemblyFile = "UnnamedProject.dll"; if (!isRelease || setLinkModeNone) { - foreach (string abi in b.GetBuildAbis ()) { + foreach (string abi in proj.GetRuntimeIdentifiersAsAbis ()) { CheckAssembly (b.Output.GetIntermediaryPath (Path.Combine ("android", "assets", abi, assemblyFile)), projectDir); } } else { diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs index 4b99199d45c..a42ec7ee3f3 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs @@ -606,7 +606,7 @@ protected virtual void CleanupTest () FileSystemUtils.SetDirectoryWriteable (output); try { Directory.Delete (output, recursive: true); - } catch (IOException ex) { + } catch (Exception ex) { // This happens on CI occasionally, let's not fail the test TestContext.Out.WriteLine ($"Failed to delete '{output}': {ex}"); } 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 f0d0cecf12b..b8524cc6f7e 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 @@ -224,6 +224,7 @@ public void DotNetPublish ([Values (false, true)] bool isRelease, [ValueSource(n var projBuilder = CreateDllBuilder (); projBuilder.Save (proj); var dotnet = new DotNetCLI (Path.Combine (Root, projBuilder.ProjectDirectory, proj.ProjectFilePath)); + dotnet.Verbosity = "detailed"; string[] configParam = isRelease ? new [] { "Configuration=Release" } : new [] { "Configuration=Debug" }; Assert.IsTrue (dotnet.Publish (parameters: configParam), "first `dotnet publish` should succeed"); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index 8407a3af198..5ecf6827bd3 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -33,7 +33,7 @@ public class Builder : IDisposable /// Passes /m:N to MSBuild, defaults to null to omit the /m parameter completely. /// public int? MaxCpuCount { get; set; } - public LoggerVerbosity Verbosity { get; set; } = LoggerVerbosity.Diagnostic; + public LoggerVerbosity Verbosity { get; set; } = LoggerVerbosity.Normal; public IEnumerable LastBuildOutput { get { if (lastBuildOutput != null) { @@ -131,39 +131,6 @@ public void GetTargetFrameworkVersionRange (out string firstApiLevel, out string allFrameworkVersions = allTFVs.ToArray (); } - public HashSet GetBuildRuntimeIdentifiers () - { - var ret = new HashSet (StringComparer.OrdinalIgnoreCase); - foreach (string l in LastBuildOutput) { - string line = l.Trim (); - if (line.Length == 0 || line[0] != 'R') { - continue; - } - - // Here's hoping MSBuild doesn't change the property reporting format - if (!line.StartsWith ("RuntimeIdentifiers =", StringComparison.Ordinal)) { - continue; - } - - foreach (string r in line.Split ('=')[1].Split (';')) { - ret.Add (r.Trim ()); - } - break; - } - - return ret; - } - - public HashSet GetBuildAbis () - { - var ret = new HashSet (StringComparer.OrdinalIgnoreCase); - foreach (string rid in GetBuildRuntimeIdentifiers ()) { - ret.Add (MonoAndroidHelper.RidToAbi (rid)); - } - - return ret; - } - static string GetApiInfoElementValue (string androidApiInfo, string elementPath) { if (!File.Exists (androidApiInfo)) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs index f33cc4d9c45..bc07fbb44db 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs @@ -11,7 +11,7 @@ public class DotNetCLI { public string BuildLogFile { get; set; } public string ProcessLogFile { get; set; } - public string Verbosity { get; set; } = "diag"; + public string Verbosity { get; set; } = "normal"; public string AndroidSdkPath { get; set; } = AndroidSdkResolver.GetAndroidSdkPath (); public string JavaSdkPath { get; set; } = AndroidSdkResolver.GetJavaSdkPath (); public string ProjectDirectory { get; set; } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/SolutionBuilder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/SolutionBuilder.cs index 2de2bbabf23..8c3eea39321 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/SolutionBuilder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/SolutionBuilder.cs @@ -94,7 +94,11 @@ protected override void Dispose (bool disposing) { if (disposing) if (BuildSucceeded) - Directory.Delete (SolutionPath, recursive: true); + try { + Directory.Delete (SolutionPath, recursive: true); + } catch (Exception) { + // This happens on CI occasionally, let's not fail the test + } } } } diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Utilities/ProjectExtensions.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Utilities/ProjectExtensions.cs index 3e737019d26..9492df1738c 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Utilities/ProjectExtensions.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Utilities/ProjectExtensions.cs @@ -50,5 +50,21 @@ public static void SetRuntimeIdentifiers (this IShortFormProject project, params project.SetProperty (KnownProperties.RuntimeIdentifiers, String.Join (";", targetArches.Select (arch => MonoAndroidHelper.ArchToRid (arch)))); } + + public static HashSet GetRuntimeIdentifiers (this XamarinProject project) + { + var ridsPropValue = project.GetProperty (KnownProperties.RuntimeIdentifiers); + + if (string.IsNullOrEmpty (ridsPropValue)) { + return new HashSet () { "android-arm64", "android-x64", }; + } + + return ridsPropValue.Split (';').ToHashSet (StringComparer.OrdinalIgnoreCase); + } + + public static HashSet GetRuntimeIdentifiersAsAbis (this XamarinProject project) + { + return project.GetRuntimeIdentifiers ().Select(r => MonoAndroidHelper.RidToAbi (r)).ToHashSet (StringComparer.OrdinalIgnoreCase); + } } } diff --git a/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs b/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs index 72fce3201d2..81cccab53d5 100755 --- a/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs +++ b/tests/MSBuildDeviceIntegration/Tests/DebuggingTest.cs @@ -9,6 +9,7 @@ using NUnit.Framework; using Xamarin.ProjectTools; using System.Collections.Generic; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -392,6 +393,7 @@ public Foo () app.SetDefaultTargetDevice (); using (var libBuilder = CreateDllBuilder (Path.Combine (path, lib.ProjectName))) using (var appBuilder = CreateApkBuilder (Path.Combine (path, app.ProjectName))) { + appBuilder.Verbosity = LoggerVerbosity.Detailed; Assert.True (libBuilder.Build (lib), "Library should have built."); SetTargetFrameworkAndManifest (app, appBuilder, app.TargetFramework == "net8.0-android" ? 34 : null); diff --git a/tests/MSBuildDeviceIntegration/Tests/InstallTests.cs b/tests/MSBuildDeviceIntegration/Tests/InstallTests.cs index 5f310d91f65..3217c7da035 100644 --- a/tests/MSBuildDeviceIntegration/Tests/InstallTests.cs +++ b/tests/MSBuildDeviceIntegration/Tests/InstallTests.cs @@ -538,6 +538,7 @@ public void IncrementalFastDeployment () long lib1FirstBuildSize = new FileInfo (Path.Combine (rootPath, lib1.ProjectName, lib1.OutputPath, "Library1.dll")).Length; using (var builder = CreateApkBuilder (Path.Combine (rootPath, app.ProjectName))) { + builder.Verbosity = LoggerVerbosity.Detailed; builder.ThrowOnBuildFailure = false; builder.BuildLogFile = "install.log"; Assert.IsTrue (builder.Install (app), "First install should have succeeded."); @@ -653,6 +654,7 @@ public String test(){ }, }; using (var b = CreateApkBuilder ()) { + b.Verbosity = LoggerVerbosity.Detailed; b.ThrowOnBuildFailure = false; Assert.IsTrue (b.Build (proj), "Build should have succeeded."); b.AssertHasNoWarnings (); diff --git a/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs b/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs index 5df3689abb5..b7b83b7206c 100644 --- a/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs +++ b/tests/MSBuildDeviceIntegration/Tests/InstantRunTest.cs @@ -3,6 +3,7 @@ using System.Linq; using NUnit.Framework; using Xamarin.ProjectTools; +using Microsoft.Build.Framework; namespace Xamarin.Android.Build.Tests { @@ -138,6 +139,7 @@ public void SkipFastDevAlreadyInstalledFile () proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat); proj.MainActivity = proj.DefaultMainActivity.Replace (": Activity", ": AndroidX.AppCompat.App.AppCompatActivity"); var b = CreateApkBuilder (Path.Combine ("temp", TestName)); + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Install (proj), "install should have succeeded."); File.WriteAllLines (Path.Combine (Root, b.ProjectDirectory, b.BuildLogFile + ".bak"), b.LastBuildOutput); @@ -182,6 +184,7 @@ public void SkipFastDevAlreadyInstalledResources (Package [] packages, string ba if (baseActivityClass != null) proj.MainActivity = proj.DefaultMainActivity.Replace (": Activity", ": " + baseActivityClass); var b = CreateApkBuilder ("temp/SkipFastDevAlreadyInstalledResources"); + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Install (proj), "install should have succeeded."); // slightly (but significantly) modify the resources that causes packaged_resources changes. @@ -206,6 +209,7 @@ public void InstantRunResourceChange () }; proj.SetDefaultTargetDevice (); using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) { + b.Verbosity = LoggerVerbosity.Detailed; Assert.IsTrue (b.Install (proj), "install should have succeeded. 0"); var logLines = b.LastBuildOutput; Assert.IsTrue (logLines.Any (l => l.Contains ("Building target \"_BuildApkFastDev\" completely.") || @@ -237,6 +241,7 @@ public void InstantRunFastDevDexes ([Values (false, true)] bool useEmbeddedDex) proj.SetDefaultTargetDevice (); proj.AndroidManifest = proj.AndroidManifest.Replace (" l.Contains ("Building target \"_BuildApkFastDev\" completely.") ||