Skip to content

Commit afd1274

Browse files
authored
[Tests] Fix TestResolveToolsExists on .NET (#8445)
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.
1 parent f84220a commit afd1274

File tree

5 files changed

+54
-88
lines changed

5 files changed

+54
-88
lines changed

build-tools/installers/create-installers.targets

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,11 @@
2929
<_EarlierFrameworkDir Include="@(_FrameworkDirsThatExist)" Exclude="$(_LatestStableFrameworkDir)" />
3030
</ItemGroup>
3131
</Target>
32-
<Target Name="_WriteVersionFiles"
33-
DependsOnTargets="GetXAVersionInfo" >
34-
<WriteLinesToFile
35-
File="$(MicrosoftAndroidSdkOutDir)Version"
36-
Lines="$(ProductVersion)"
37-
Overwrite="True"
38-
/>
39-
<WriteLinesToFile
40-
File="$(MicrosoftAndroidSdkOutDir)Version.commit"
41-
Lines="$(XARepositoryName)/$(XAVersionBranch)/$(XAVersionHash)"
42-
Overwrite="True"
43-
/>
44-
<WriteLinesToFile
45-
File="$(MicrosoftAndroidSdkOutDir)Version.rev"
46-
Lines="$(XAVersionCommitCount)"
47-
Overwrite="True"
48-
/>
49-
<ItemGroup>
50-
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version" />
51-
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.commit" />
52-
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.rev" />
53-
</ItemGroup>
54-
</Target>
32+
<ItemGroup>
33+
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version" />
34+
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.commit" />
35+
<VersionFiles Include="$(MicrosoftAndroidSdkOutDir)Version.rev" />
36+
</ItemGroup>
5537
<ItemGroup>
5638
<_DesignerFilesUnix Include="$(LegacyMSBuildSrcDir)$(HostOS)\bcl\**\*" />
5739
<_DesignerFilesWin Include="$(LegacyMSBuildSrcDir)bcl\**\* "/>
@@ -365,7 +347,7 @@
365347
<Import Project="$(_MonoDroidPath)\tools\scripts\installer-files.projitems" Condition=" '$(_HasCommercialFiles)' == 'True' And Exists ('$(_MonoDroidPath)\tools\scripts\installer-files.projitems') " />
366348
<!-- end monodroid -->
367349
<Target Name="ConstructInstallerItems"
368-
DependsOnTargets="_FindFrameworkDirs;_WriteVersionFiles"
350+
DependsOnTargets="_FindFrameworkDirs"
369351
Returns="@(FrameworkItemsWin);@(FrameworkItemsUnix);@(MSBuildItemsWin);@(LegacyMSBuildItemsWin);@(MSBuildItemsUnix);@(LegacyMSBuildItemsUnix)">
370352
<ItemGroup>
371353
<_FrameworkFiles Include="@(_FrameworkDirsThatExist->'%(Identity)\AndroidApiInfo.xml')" />

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/DebuggingTasksTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ public void TestResolveToolsExists ()
3434
Directory.Delete (Path.Combine (Root, path), recursive: true);
3535

3636
var engine = new MockBuildEngine (TestContext.Out, errors: errors, messages: messages);
37-
var frameworksPath = Path.Combine (TestEnvironment.MonoAndroidFrameworkDirectory, "v1.0");
37+
var frameworksRoot = Path.Combine (TestEnvironment.DotNetPreviewDirectory, "packs", "Microsoft.NETCore.App.Ref");
38+
var mscorlibDll = Directory.GetFiles (frameworksRoot, "mscorlib.dll", SearchOption.AllDirectories).LastOrDefault ();
39+
var frameworksPath = Path.GetDirectoryName (mscorlibDll);
3840
var androidSdk = CreateFauxAndroidSdkDirectory (Path.Combine (path, "Sdk"), "24.0.1", new[]
3941
{
4042
new ApiInfo { Id = "23", Level = 23, Name = "Marshmallow", FrameworkVersion = "v6.0", Stable = true },
@@ -52,6 +54,7 @@ public void TestResolveToolsExists ()
5254
MonoAndroidToolsPath = TestEnvironment.AndroidMSBuildDirectory,
5355
ReferenceAssemblyPaths = new string[] {
5456
frameworksPath,
57+
TestEnvironment.MonoAndroidFrameworkDirectory,
5558
},
5659
};
5760
Assert.True (task.Execute (), "Task should have completed successfully.");

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void GetTargetFrameworkVersionRange (out string firstApiLevel, out string
105105
Version lastVersion = null;
106106
List<string> allTFVs = new List<string> ();
107107

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

139-
public bool TargetFrameworkExists (string targetFramework)
140-
{
141-
var path = Path.Combine (TestEnvironment.MonoAndroidFrameworkDirectory, targetFramework);
142-
if (!Directory.Exists (path)) {
143-
return false;
144-
}
145-
return true;
146-
}
147-
148-
149139
public string Root {
150140
get {
151141
return String.IsNullOrEmpty (root) ? Path.GetDirectoryName (new Uri (typeof (XamarinProject).Assembly.CodeBase).LocalPath) : root;

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs

Lines changed: 23 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using System.IO;
44
using System.Linq;
55
using System.Runtime.InteropServices;
6-
using Xamarin.Android.Tools.VSWhere;
6+
using Xamarin.Android.Tools;
77

88
namespace Xamarin.ProjectTools
99
{
@@ -47,69 +47,40 @@ public static bool IsLinux {
4747
}
4848
}
4949

50-
static readonly string LocalMonoAndroidToolsDirectory = Path.Combine (XABuildPaths.PrefixDirectory, "lib", "xamarin.android", "xbuild", "Xamarin", "Android");
51-
52-
public static readonly string MacOSInstallationRoot = "/Library/Frameworks/Xamarin.Android.framework/Versions/Current";
53-
54-
static VisualStudioInstance visualStudioInstance;
55-
public static VisualStudioInstance GetVisualStudioInstance ()
56-
{
57-
//We should cache and reuse this value, so we don't run vswhere.exe so much
58-
if (visualStudioInstance != null && !string.IsNullOrEmpty (visualStudioInstance.VisualStudioRootPath))
59-
return visualStudioInstance;
60-
61-
return visualStudioInstance = MSBuildLocator.QueryLatest ();
62-
}
63-
6450
/// <summary>
65-
/// The MonoAndroid framework (and other reference assemblies) directory within a local build tree. Contains v1.0, v9.0, etc,
66-
/// e.g. xamarin-android/bin/Debug/lib/xamarin.android/xbuild-frameworks/MonoAndroid.<br/>
51+
/// 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/>
6752
/// If a local build tree can not be found, or if it is empty, this will return the system installation location instead:<br/>
68-
/// Windows: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\MonoAndroid <br/>
69-
/// macOS: Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild-frameworks/MonoAndroid
53+
/// bin/Debug/dotnet/packs/Microsoft.Android.Ref.34/$(Latest)/ref/net$(Latest)/
7054
/// </summary>
7155
public static string MonoAndroidFrameworkDirectory {
7256
get {
73-
var frameworkLibDir = Path.Combine (XABuildPaths.PrefixDirectory, "lib", "xamarin.android", "xbuild-frameworks", "MonoAndroid");
74-
if (Directory.Exists (frameworkLibDir) && Directory.EnumerateDirectories (frameworkLibDir, "v*", SearchOption.TopDirectoryOnly).Any ())
75-
return frameworkLibDir;
76-
77-
if (IsWindows) {
78-
VisualStudioInstance vs = GetVisualStudioInstance ();
79-
return Path.Combine (vs.VisualStudioRootPath, "Common7", "IDE", "ReferenceAssemblies", "Microsoft", "Framework", "MonoAndroid");
80-
} else {
81-
return Path.Combine (MacOSInstallationRoot, "lib", "xamarin.android", "xbuild-frameworks", "MonoAndroid");
57+
var rootRefDir = Directory.GetDirectories (Path.Combine (DotNetPreviewPacksDirectory, $"Microsoft.Android.Ref.{XABuildConfig.AndroidDefaultTargetDotnetApiLevel}")).LastOrDefault ();
58+
if (!Directory.Exists (rootRefDir)) {
59+
throw new DirectoryNotFoundException ($"Unable to locate Microsoft.Android.Ref.");
8260
}
61+
62+
var maDll = Directory.GetFiles (rootRefDir, "Mono.Android.dll", SearchOption.AllDirectories).LastOrDefault ();
63+
var refDir = Path.GetDirectoryName(maDll);
64+
if (!Directory.Exists (refDir)) {
65+
throw new DirectoryNotFoundException ($"Unable to locate Mono.Android.dll inside Microsoft.Android.Ref.");
66+
}
67+
68+
return refDir;
8369
}
8470
}
8571

8672
/// <summary>
87-
/// The MonoAndroidTools directory within a local build tree, e.g. xamarin-android/bin/Debug/lib/xamarin.android/xbuild/Xamarin/Android.<br/>
88-
/// 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/>
89-
/// Windows: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Xamarin\Android <br/>
90-
/// macOS: /Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild/Xamarin/Android<br/>
91-
/// Windows (dotnet): bin\Debug\dotnet\packs\Microsoft.Android.Sdk.Windows\$(Latest)\tools<br/>
92-
/// macOS (dotnet): bin/Debug/dotnet/packs/Microsoft.Android.Sdk.Darwin/$(Latest)/tools
73+
/// The MonoAndroidTools directory within a local build tree, e.g. bin/Debug/lib/packs/Microsoft.Android.Sdk.Darwin/34.99.0/tools/<br/>
74+
/// If a local build tree can not be found, or if it is empty, this will return the .NET sandbox location instead:<br/>
75+
/// Windows: bin\Debug\dotnet\packs\Microsoft.Android.Sdk.Windows\$(Latest)\tools<br/>
76+
/// macOS: bin/Debug/dotnet/packs/Microsoft.Android.Sdk.Darwin/$(Latest)/tools
9377
/// </summary>
9478
public static string AndroidMSBuildDirectory {
9579
get {
96-
if (Builder.UseDotNet) {
97-
if (!Directory.Exists (DotNetPreviewAndroidSdkDirectory)) {
98-
throw new DirectoryNotFoundException ($"Unable to locate a Microsoft.Android.Sdk in either '{DefaultPacksDir}' or '{LocalPacksDir}'.");
99-
}
100-
return Path.Combine (DotNetPreviewAndroidSdkDirectory, "tools");
101-
}
102-
103-
if (UseLocalBuildOutput) {
104-
return LocalMonoAndroidToolsDirectory;
105-
} else {
106-
if (IsWindows) {
107-
VisualStudioInstance vs = GetVisualStudioInstance ();
108-
return Path.Combine (vs.VisualStudioRootPath, "MSBuild", "Xamarin", "Android");
109-
} else {
110-
return Path.Combine (MacOSInstallationRoot, "lib", "xamarin.android", "xbuild", "Xamarin", "Android");
111-
}
80+
if (!Directory.Exists (DotNetPreviewAndroidSdkDirectory)) {
81+
throw new DirectoryNotFoundException ($"Unable to locate a Microsoft.Android.Sdk in either '{DefaultPacksDir}' or '{LocalPacksDir}'.");
11282
}
83+
return Path.Combine (DotNetPreviewAndroidSdkDirectory, "tools");
11384
}
11485
}
11586

@@ -167,12 +138,12 @@ orderby version descending
167138

168139
/// <summary>
169140
/// Tests will attempt to run against local build output directories by default,
170-
/// and fall back to `dotnet/packs` or a legacy system install location if a local build does not exist.
141+
/// and fall back to `dotnet/packs` if a local build does not exist.
171142
/// This will always return false for our tests running in CI.
172143
/// </summary>
173144
public static bool UseLocalBuildOutput {
174145
get {
175-
var msbuildDir = Builder.UseDotNet ? Path.Combine (LocalDotNetAndroidSdkDirectory, "tools") : LocalMonoAndroidToolsDirectory;
146+
var msbuildDir = Path.Combine (LocalDotNetAndroidSdkDirectory, "tools");
176147
return Directory.Exists (msbuildDir) && File.Exists (Path.Combine (msbuildDir, "Xamarin.Android.Build.Tasks.dll"));
177148
}
178149
}

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Build.Tasks.targets

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
_GenerateBundledVersions;
2323
_CopyNetSdkTargets;
2424
_CopyVSExtensionTargets;
25+
_WriteVersionFiles;
2526
</BuildDependsOn>
2627
<_AndroidSdkLocation Condition="'$(_AndroidSdkLocation)'==''">$(AndroidSdkDirectory)</_AndroidSdkLocation>
2728
<_MultiDexAarInAndroidSdk>extras\android\m2repository\com\android\support\multidex\1.0.1\multidex-1.0.1.aar</_MultiDexAarInAndroidSdk>
@@ -381,4 +382,23 @@
381382
SkipUnchangedFiles="True"
382383
/>
383384
</Target>
385+
386+
<Target Name="_WriteVersionFiles"
387+
DependsOnTargets="GetXAVersionInfo" >
388+
<WriteLinesToFile
389+
File="$(MicrosoftAndroidSdkOutDir)Version"
390+
Lines="$(ProductVersion)"
391+
Overwrite="True"
392+
/>
393+
<WriteLinesToFile
394+
File="$(MicrosoftAndroidSdkOutDir)Version.commit"
395+
Lines="$(XARepositoryName)/$(XAVersionBranch)/$(XAVersionHash)"
396+
Overwrite="True"
397+
/>
398+
<WriteLinesToFile
399+
File="$(MicrosoftAndroidSdkOutDir)Version.rev"
400+
Lines="$(XAVersionCommitCount)"
401+
Overwrite="True"
402+
/>
403+
</Target>
384404
</Project>

0 commit comments

Comments
 (0)