Skip to content

Commit

Permalink
[Tests] Fix TestResolveToolsExists on .NET (#8445)
Browse files Browse the repository at this point in the history
The `TestResolveToolsExists` test currently requires a Xamarin.Android
installation on disk to pass.  The test has been fixed by passing the
.NET reference assembly paths to the `ResolveXamarinAndroidTools` task.

The build has also been updated to allow this test to pass against a
local build tree, as it requires product `Version` files in the SDK
output directory.
  • Loading branch information
pjcollins authored Oct 23, 2023
1 parent f84220a commit afd1274
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 88 deletions.
30 changes: 6 additions & 24 deletions build-tools/installers/create-installers.targets
Original file line number Diff line number Diff line change
Expand Up @@ -29,29 +29,11 @@
<_EarlierFrameworkDir Include="@(_FrameworkDirsThatExist)" Exclude="$(_LatestStableFrameworkDir)" />
</ItemGroup>
</Target>
<Target Name="_WriteVersionFiles"
DependsOnTargets="GetXAVersionInfo" >
<WriteLinesToFile
File="$(MicrosoftAndroidSdkOutDir)Version"
Lines="$(ProductVersion)"
Overwrite="True"
/>
<WriteLinesToFile
File="$(MicrosoftAndroidSdkOutDir)Version.commit"
Lines="$(XARepositoryName)/$(XAVersionBranch)/$(XAVersionHash)"
Overwrite="True"
/>
<WriteLinesToFile
File="$(MicrosoftAndroidSdkOutDir)Version.rev"
Lines="$(XAVersionCommitCount)"
Overwrite="True"
/>
<ItemGroup>
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version" />
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.commit" />
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.rev" />
</ItemGroup>
</Target>
<ItemGroup>
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version" />
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.commit" />
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.rev" />
</ItemGroup>
<ItemGroup>
<_DesignerFilesUnix Include="$(LegacyMSBuildSrcDir)$(HostOS)\bcl\**\*" />
<_DesignerFilesWin Include="$(LegacyMSBuildSrcDir)bcl\**\* "/>
Expand Down Expand Up @@ -365,7 +347,7 @@
<Import Project="$(_MonoDroidPath)\tools\scripts\installer-files.projitems" Condition=" '$(_HasCommercialFiles)' == 'True' And Exists ('$(_MonoDroidPath)\tools\scripts\installer-files.projitems') " />
<!-- end monodroid -->
<Target Name="ConstructInstallerItems"
DependsOnTargets="_FindFrameworkDirs;_WriteVersionFiles"
DependsOnTargets="_FindFrameworkDirs"
Returns="@(FrameworkItemsWin);@(FrameworkItemsUnix);@(MSBuildItemsWin);@(LegacyMSBuildItemsWin);@(MSBuildItemsUnix);@(LegacyMSBuildItemsUnix)">
<ItemGroup>
<_FrameworkFiles Include="@(_FrameworkDirsThatExist->'%(Identity)\AndroidApiInfo.xml')" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ public void TestResolveToolsExists ()
Directory.Delete (Path.Combine (Root, path), recursive: true);

var engine = new MockBuildEngine (TestContext.Out, errors: errors, messages: messages);
var frameworksPath = Path.Combine (TestEnvironment.MonoAndroidFrameworkDirectory, "v1.0");
var frameworksRoot = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "packs", "Microsoft.NETCore.App.Ref");
var mscorlibDll = Directory.GetFiles (frameworksRoot, "mscorlib.dll", SearchOption.AllDirectories).LastOrDefault ();
var frameworksPath = Path.GetDirectoryName (mscorlibDll);
var androidSdk = CreateFauxAndroidSdkDirectory (Path.Combine (path, "Sdk"), "24.0.1", new[]
{
new ApiInfo { Id = "23", Level = 23, Name = "Marshmallow", FrameworkVersion = "v6.0", Stable = true },
Expand All @@ -52,6 +54,7 @@ public void TestResolveToolsExists ()
MonoAndroidToolsPath = TestEnvironment.AndroidMSBuildDirectory,
ReferenceAssemblyPaths = new string[] {
frameworksPath,
TestEnvironment.MonoAndroidFrameworkDirectory,
},
};
Assert.True (task.Execute (), "Task should have completed successfully.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ public void GetTargetFrameworkVersionRange (out string firstApiLevel, out string
Version lastVersion = null;
List<string> allTFVs = new List<string> ();

var searchDir = UseDotNet ? Path.Combine (TestEnvironment.DotNetPreviewAndroidSdkDirectory, "data") : TestEnvironment.MonoAndroidFrameworkDirectory;
var searchDir = Path.Combine (TestEnvironment.DotNetPreviewAndroidSdkDirectory, "data");
foreach (var apiInfoFile in Directory.EnumerateFiles (searchDir, "AndroidApiInfo.xml", SearchOption.AllDirectories)) {
string frameworkVersion = GetApiInfoElementValue (apiInfoFile, "/AndroidApiInfo/Version");
string apiLevel = GetApiInfoElementValue (apiInfoFile, "/AndroidApiInfo/Level");
Expand Down Expand Up @@ -136,16 +136,6 @@ static string GetApiInfoElementValue (string androidApiInfo, string elementPath)
return doc.XPathSelectElement (elementPath)?.Value;
}

public bool TargetFrameworkExists (string targetFramework)
{
var path = Path.Combine (TestEnvironment.MonoAndroidFrameworkDirectory, targetFramework);
if (!Directory.Exists (path)) {
return false;
}
return true;
}


public string Root {
get {
return String.IsNullOrEmpty (root) ? Path.GetDirectoryName (new Uri (typeof (XamarinProject).Assembly.CodeBase).LocalPath) : root;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using Xamarin.Android.Tools.VSWhere;
using Xamarin.Android.Tools;

namespace Xamarin.ProjectTools
{
Expand Down Expand Up @@ -47,69 +47,40 @@ public static bool IsLinux {
}
}

static readonly string LocalMonoAndroidToolsDirectory = Path.Combine (XABuildPaths.PrefixDirectory, "lib", "xamarin.android", "xbuild", "Xamarin", "Android");

public static readonly string MacOSInstallationRoot = "/Library/Frameworks/Xamarin.Android.framework/Versions/Current";

static VisualStudioInstance visualStudioInstance;
public static VisualStudioInstance GetVisualStudioInstance ()
{
//We should cache and reuse this value, so we don't run vswhere.exe so much
if (visualStudioInstance != null && !string.IsNullOrEmpty (visualStudioInstance.VisualStudioRootPath))
return visualStudioInstance;

return visualStudioInstance = MSBuildLocator.QueryLatest ();
}

/// <summary>
/// The MonoAndroid framework (and other reference assemblies) directory within a local build tree. Contains v1.0, v9.0, etc,
/// e.g. xamarin-android/bin/Debug/lib/xamarin.android/xbuild-frameworks/MonoAndroid.<br/>
/// The MonoAndroid reference assemblies directory within a local build tree, e.g. bin/Debug/lib/packs/Microsoft.Android.Ref.34/34.99.0/ref/net8.0/<br/>
/// If a local build tree can not be found, or if it is empty, this will return the system installation location instead:<br/>
/// Windows: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid <br/>
/// macOS: Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild-frameworks/MonoAndroid
/// bin/Debug/dotnet/packs/Microsoft.Android.Ref.34/$(Latest)/ref/net$(Latest)/
/// </summary>
public static string MonoAndroidFrameworkDirectory {
get {
var frameworkLibDir = Path.Combine (XABuildPaths.PrefixDirectory, "lib", "xamarin.android", "xbuild-frameworks", "MonoAndroid");
if (Directory.Exists (frameworkLibDir) && Directory.EnumerateDirectories (frameworkLibDir, "v*", SearchOption.TopDirectoryOnly).Any ())
return frameworkLibDir;

if (IsWindows) {
VisualStudioInstance vs = GetVisualStudioInstance ();
return Path.Combine (vs.VisualStudioRootPath, "Common7", "IDE", "ReferenceAssemblies", "Microsoft", "Framework", "MonoAndroid");
} else {
return Path.Combine (MacOSInstallationRoot, "lib", "xamarin.android", "xbuild-frameworks", "MonoAndroid");
var rootRefDir = Directory.GetDirectories (Path.Combine (DotNetPreviewPacksDirectory, $"Microsoft.Android.Ref.{XABuildConfig.AndroidDefaultTargetDotnetApiLevel}")).LastOrDefault ();
if (!Directory.Exists (rootRefDir)) {
throw new DirectoryNotFoundException ($"Unable to locate Microsoft.Android.Ref.");
}

var maDll = Directory.GetFiles (rootRefDir, "Mono.Android.dll", SearchOption.AllDirectories).LastOrDefault ();
var refDir = Path.GetDirectoryName(maDll);
if (!Directory.Exists (refDir)) {
throw new DirectoryNotFoundException ($"Unable to locate Mono.Android.dll inside Microsoft.Android.Ref.");
}

return refDir;
}
}

/// <summary>
/// The MonoAndroidTools directory within a local build tree, e.g. xamarin-android/bin/Debug/lib/xamarin.android/xbuild/Xamarin/Android.<br/>
/// If a local build tree can not be found, or if it is empty, this will return the system installation or .NET sandbox location instead:<br/>
/// Windows: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Xamarin\Android <br/>
/// macOS: /Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild/Xamarin/Android<br/>
/// Windows (dotnet): bin\Debug\dotnet\packs\Microsoft.Android.Sdk.Windows\$(Latest)\tools<br/>
/// macOS (dotnet): bin/Debug/dotnet/packs/Microsoft.Android.Sdk.Darwin/$(Latest)/tools
/// The MonoAndroidTools directory within a local build tree, e.g. bin/Debug/lib/packs/Microsoft.Android.Sdk.Darwin/34.99.0/tools/<br/>
/// If a local build tree can not be found, or if it is empty, this will return the .NET sandbox location instead:<br/>
/// Windows: bin\Debug\dotnet\packs\Microsoft.Android.Sdk.Windows\$(Latest)\tools<br/>
/// macOS: bin/Debug/dotnet/packs/Microsoft.Android.Sdk.Darwin/$(Latest)/tools
/// </summary>
public static string AndroidMSBuildDirectory {
get {
if (Builder.UseDotNet) {
if (!Directory.Exists (DotNetPreviewAndroidSdkDirectory)) {
throw new DirectoryNotFoundException ($"Unable to locate a Microsoft.Android.Sdk in either '{DefaultPacksDir}' or '{LocalPacksDir}'.");
}
return Path.Combine (DotNetPreviewAndroidSdkDirectory, "tools");
}

if (UseLocalBuildOutput) {
return LocalMonoAndroidToolsDirectory;
} else {
if (IsWindows) {
VisualStudioInstance vs = GetVisualStudioInstance ();
return Path.Combine (vs.VisualStudioRootPath, "MSBuild", "Xamarin", "Android");
} else {
return Path.Combine (MacOSInstallationRoot, "lib", "xamarin.android", "xbuild", "Xamarin", "Android");
}
if (!Directory.Exists (DotNetPreviewAndroidSdkDirectory)) {
throw new DirectoryNotFoundException ($"Unable to locate a Microsoft.Android.Sdk in either '{DefaultPacksDir}' or '{LocalPacksDir}'.");
}
return Path.Combine (DotNetPreviewAndroidSdkDirectory, "tools");
}
}

Expand Down Expand Up @@ -167,12 +138,12 @@ orderby version descending

/// <summary>
/// Tests will attempt to run against local build output directories by default,
/// and fall back to `dotnet/packs` or a legacy system install location if a local build does not exist.
/// and fall back to `dotnet/packs` if a local build does not exist.
/// This will always return false for our tests running in CI.
/// </summary>
public static bool UseLocalBuildOutput {
get {
var msbuildDir = Builder.UseDotNet ? Path.Combine (LocalDotNetAndroidSdkDirectory, "tools") : LocalMonoAndroidToolsDirectory;
var msbuildDir = Path.Combine (LocalDotNetAndroidSdkDirectory, "tools");
return Directory.Exists (msbuildDir) && File.Exists (Path.Combine (msbuildDir, "Xamarin.Android.Build.Tasks.dll"));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
_GenerateBundledVersions;
_CopyNetSdkTargets;
_CopyVSExtensionTargets;
_WriteVersionFiles;
</BuildDependsOn>
<_AndroidSdkLocation Condition="'$(_AndroidSdkLocation)'==''">$(AndroidSdkDirectory)</_AndroidSdkLocation>
<_MultiDexAarInAndroidSdk>extras\android\m2repository\com\android\support\multidex\1.0.1\multidex-1.0.1.aar</_MultiDexAarInAndroidSdk>
Expand Down Expand Up @@ -381,4 +382,23 @@
SkipUnchangedFiles="True"
/>
</Target>

<Target Name="_WriteVersionFiles"
DependsOnTargets="GetXAVersionInfo" >
<WriteLinesToFile
File="$(MicrosoftAndroidSdkOutDir)Version"
Lines="$(ProductVersion)"
Overwrite="True"
/>
<WriteLinesToFile
File="$(MicrosoftAndroidSdkOutDir)Version.commit"
Lines="$(XARepositoryName)/$(XAVersionBranch)/$(XAVersionHash)"
Overwrite="True"
/>
<WriteLinesToFile
File="$(MicrosoftAndroidSdkOutDir)Version.rev"
Lines="$(XAVersionCommitCount)"
Overwrite="True"
/>
</Target>
</Project>

0 comments on commit afd1274

Please sign in to comment.