Skip to content

Commit 07c4c2b

Browse files
authored
[Xamarin.Android.Tools.AndroidSdk] Revert JDK validation (#34)
Context: dotnet/android#2004 Context: https://jenkins.mono-project.com/job/xamarin-android-pr-builder/3656/testReport/junit/Xamarin.Android.Build.Tests/ResolveSdksTaskTests/ResolveSdkTiming___Debug/ Before commit 7553056, the only validation performed on the `AndroidSdkInfo`'s `javaSdkPath` parameter was "does `{javaSdkPath}/bin/jarsigner` exist? This is the world the [xamarin-android unit tests assumed][0], as it would create `{javaSdkPath}/bin/jarsigner` and `{javaSdkPath}/bin/javac.bash` (among others), but *not* `{javaSdkPath/bin/javac`. Then came commit 7553056, which altered `AndroidSdkUnix.ValidateJavaSdkLocation()` semantics so that it now *required* the presence of `{javaSdkPath}/bin/javac`. This changed caused the xamarin-android unit tests to fail: JavaSdkPath should be /Users/builder/jenkins/workspace/xamarin-android-pr-builder/xamarin-android/bin/TestDebug/temp/ResolveSdkTiming/jdk Expected string length 63 but was 115. Strings differ at index 1. Expected: "/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home" But was: "/Users/builder/jenkins/workspace/xamarin-android-pr-builder/x..." ------------^ The "expected" and "actual" values are reversed; the actual problem is that the `javaSdkPath` value provided to the `AndroidSdkInfo` constructor -- `/Users/builder/jenkins/workspace/xamarin-android-pr-builder/xamarin-android/bin/TestDebug/temp/ResolveSdkTiming/jdk` -- is "ignored", because it doesn't pass validation, prompting `AndroidSdkInfo` to call `AndroidSdkUnix.GetJavaSdkPath()`, which returns a "system" location, `/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home`. As such, the original `javaSdkPath` value is not preserved and returned by the `AndroidSdkInfo.JavaSdkPath` property. Fix this by *removing* the `AndroidSdkUnix.ValidateJavaSdkLocation()` method: it doesn't appear to actually be useful in this instance, as the base `AndroidSdkBase.ValidateJavaSdkLocation()` already checks for the presence of `{javaSdkPath}/bin/jarsigner`. [0]: https://github.com/xamarin/xamarin-android/blob/997b8904889d371610026c1802a8e3403d7d2c96/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Utilities/BaseTest.cs#L220-L235
1 parent 7553056 commit 07c4c2b

File tree

2 files changed

+139
-11
lines changed

2 files changed

+139
-11
lines changed

src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkUnix.cs

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,6 @@ protected override string GetJavaSdkPath ()
112112
return JdkInfo.GetKnownSystemJdkInfos (Logger).FirstOrDefault ()?.HomePath;
113113
}
114114

115-
public override bool ValidateJavaSdkLocation (string loc)
116-
{
117-
var result = base.ValidateJavaSdkLocation (loc);
118-
119-
if (result) {
120-
return File.Exists (Path.Combine (loc, "bin", "javac"));
121-
}
122-
123-
return result;
124-
}
125-
126115
protected override IEnumerable<string> GetAllAvailableAndroidNdks ()
127116
{
128117
var preferedNdkPath = PreferedAndroidNdkPath;

src/Xamarin.Android.Tools.AndroidSdk/Tests/AndroidSdkInfoTests.cs

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Diagnostics;
4+
using System.IO;
5+
using System.Text;
46

57
using NUnit.Framework;
68

@@ -15,5 +17,142 @@ public void Constructor_NullLogger ()
1517
Action<TraceLevel, string> logger = null;
1618
Assert.Throws<ArgumentNullException> (() => new AndroidSdkInfo (logger));
1719
}
20+
21+
[Test]
22+
public void Constructor_Paths ()
23+
{
24+
var root = Path.GetTempFileName ();
25+
File.Delete (root);
26+
Directory.CreateDirectory (root);
27+
28+
var sdk = Path.Combine (root, "sdk");
29+
var jdk = Path.Combine (root, "jdk");
30+
31+
Directory.CreateDirectory (sdk);
32+
Directory.CreateDirectory (jdk);
33+
34+
CreateFauxAndroidSdkDirectory (sdk, "26.0.0");
35+
CreateFauxJavaSdkDirectory (jdk, "1.8.0", out var _, out var _);
36+
37+
var logs = new StringWriter ();
38+
Action<TraceLevel, string> logger = (level, message) => {
39+
logs.WriteLine ($"[{level}] {message}");
40+
};
41+
var info = new AndroidSdkInfo (logger, androidSdkPath: sdk, javaSdkPath: jdk, androidNdkPath: null);
42+
43+
Assert.AreEqual (sdk, info.AndroidSdkPath, "AndroidSdkPath not preserved!");
44+
Assert.AreEqual (jdk, info.JavaSdkPath, "JavaSdkPath not preserved!");
45+
}
46+
47+
static bool IsWindows => OS.IsWindows;
48+
49+
static void CreateFauxAndroidSdkDirectory (string androidSdkDirectory, string buildToolsVersion, ApiInfo [] apiLevels = null)
50+
{
51+
var androidSdkToolsPath = Path.Combine (androidSdkDirectory, "tools");
52+
var androidSdkBinPath = Path.Combine (androidSdkToolsPath, "bin");
53+
var androidSdkPlatformToolsPath = Path.Combine (androidSdkDirectory, "platform-tools");
54+
var androidSdkPlatformsPath = Path.Combine (androidSdkDirectory, "platforms");
55+
var androidSdkBuildToolsPath = Path.Combine (androidSdkDirectory, "build-tools", buildToolsVersion);
56+
57+
Directory.CreateDirectory (androidSdkDirectory);
58+
Directory.CreateDirectory (androidSdkToolsPath);
59+
Directory.CreateDirectory (androidSdkBinPath);
60+
Directory.CreateDirectory (androidSdkPlatformToolsPath);
61+
Directory.CreateDirectory (androidSdkPlatformsPath);
62+
Directory.CreateDirectory (androidSdkBuildToolsPath);
63+
64+
File.WriteAllText (Path.Combine (androidSdkPlatformToolsPath, IsWindows ? "adb.exe" : "adb"), "");
65+
File.WriteAllText (Path.Combine (androidSdkBuildToolsPath, IsWindows ? "zipalign.exe" : "zipalign"), "");
66+
File.WriteAllText (Path.Combine (androidSdkBuildToolsPath, IsWindows ? "aapt.exe" : "aapt"), "");
67+
File.WriteAllText (Path.Combine (androidSdkToolsPath, IsWindows ? "lint.bat" : "lint"), "");
68+
69+
List<ApiInfo> defaults = new List<ApiInfo> ();
70+
for (int i = 10; i < 26; i++) {
71+
defaults.Add (new ApiInfo () {
72+
Id = i.ToString (),
73+
});
74+
}
75+
foreach (var level in ((IEnumerable<ApiInfo>) apiLevels) ?? defaults) {
76+
var dir = Path.Combine (androidSdkPlatformsPath, $"android-{level.Id}");
77+
Directory.CreateDirectory(dir);
78+
File.WriteAllText (Path.Combine (dir, "android.jar"), "");
79+
}
80+
}
81+
82+
struct ApiInfo {
83+
public string Id;
84+
}
85+
86+
protected string CreateFauxJavaSdkDirectory (string javaPath, string javaVersion, out string javaExe, out string javacExe)
87+
{
88+
javaExe = IsWindows ? "Java.cmd" : "java.bash";
89+
javacExe = IsWindows ? "Javac.cmd" : "javac.bash";
90+
var jarSigner = IsWindows ? "jarsigner.exe" : "jarsigner";
91+
var javaBinPath = Path.Combine (javaPath, "bin");
92+
93+
Directory.CreateDirectory (javaBinPath);
94+
95+
CreateFauxJavaExe (Path.Combine (javaBinPath, javaExe), javaVersion);
96+
CreateFauxJavacExe (Path.Combine (javaBinPath, javacExe), javaVersion);
97+
98+
File.WriteAllText (Path.Combine (javaBinPath, jarSigner), "");
99+
return javaPath;
100+
}
101+
102+
void CreateFauxJavaExe (string javaExeFullPath, string version)
103+
{
104+
var sb = new StringBuilder ();
105+
if (IsWindows) {
106+
sb.AppendLine ("@echo off");
107+
sb.AppendLine ($"echo java version \"{version}\"");
108+
sb.AppendLine ($"echo Java(TM) SE Runtime Environment (build {version}-b13)");
109+
sb.AppendLine ($"echo Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)");
110+
} else {
111+
sb.AppendLine ("#!/bin/bash");
112+
sb.AppendLine ($"echo \"java version \\\"{version}\\\"\"");
113+
sb.AppendLine ($"echo \"Java(TM) SE Runtime Environment (build {version}-b13)\"");
114+
sb.AppendLine ($"echo \"Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)\"");
115+
}
116+
File.WriteAllText (javaExeFullPath, sb.ToString ());
117+
if (!IsWindows) {
118+
Exec ("chmod", $"u+x \"{javaExeFullPath}\"");
119+
}
120+
}
121+
122+
void CreateFauxJavacExe (string javacExeFullPath, string version)
123+
{
124+
var sb = new StringBuilder ();
125+
if (IsWindows) {
126+
sb.AppendLine ("@echo off");
127+
sb.AppendLine ($"echo javac {version}");
128+
} else {
129+
sb.AppendLine ("#!/bin/bash");
130+
sb.AppendLine ($"echo \"javac {version}\"");
131+
}
132+
File.WriteAllText (javacExeFullPath, sb.ToString ());
133+
if (!IsWindows) {
134+
Exec ("chmod", $"u+x \"{javacExeFullPath}\"");
135+
}
136+
}
137+
138+
protected void Exec (string exe, string args)
139+
{
140+
var psi = new ProcessStartInfo {
141+
FileName = exe,
142+
Arguments = args,
143+
UseShellExecute = false,
144+
RedirectStandardInput = false,
145+
RedirectStandardOutput = false,
146+
RedirectStandardError = false,
147+
CreateNoWindow = true,
148+
WindowStyle = ProcessWindowStyle.Hidden,
149+
150+
};
151+
var proc = Process.Start (psi);
152+
if (!proc.WaitForExit ((int) TimeSpan.FromSeconds(30).TotalMilliseconds)) {
153+
proc.Kill ();
154+
proc.WaitForExit ();
155+
}
156+
}
18157
}
19158
}

0 commit comments

Comments
 (0)