22using System . Collections . Generic ;
33using System . Diagnostics ;
44using System . IO ;
5+ using System . Linq ;
56using System . Text ;
67using System . Xml . Linq ;
78
@@ -12,6 +13,35 @@ namespace Xamarin.Android.Tools.Tests
1213 [ TestFixture ]
1314 public class AndroidSdkInfoTests
1415 {
16+ string UnixConfigDirOverridePath ;
17+ string PreferredJdksOverridePath ;
18+
19+ static readonly string GetMacOSMicrosoftJdkPathsOverrideName = $ "GetMacOSMicrosoftJdkPaths jdks override! { typeof ( JdkInfo ) . AssemblyQualifiedName } ";
20+ static readonly string GetUnixConfigDirOverrideName = $ "UnixConfigPath directory override! { typeof ( AndroidSdkInfo ) . AssemblyQualifiedName } ";
21+
22+ [ OneTimeSetUp ]
23+ public void FixtureSetUp ( )
24+ {
25+ UnixConfigDirOverridePath = Path . GetTempFileName ( ) ;
26+ File . Delete ( UnixConfigDirOverridePath ) ;
27+ Directory . CreateDirectory ( UnixConfigDirOverridePath ) ;
28+ AppDomain . CurrentDomain . SetData ( GetUnixConfigDirOverrideName , UnixConfigDirOverridePath ) ;
29+
30+ PreferredJdksOverridePath = Path . GetTempFileName ( ) ;
31+ File . Delete ( PreferredJdksOverridePath ) ;
32+ Directory . CreateDirectory ( PreferredJdksOverridePath ) ;
33+ AppDomain . CurrentDomain . SetData ( GetMacOSMicrosoftJdkPathsOverrideName , PreferredJdksOverridePath ) ;
34+ }
35+
36+ [ OneTimeTearDown ]
37+ public void FixtureTearDown ( )
38+ {
39+ AppDomain . CurrentDomain . SetData ( GetMacOSMicrosoftJdkPathsOverrideName , null ) ;
40+ AppDomain . CurrentDomain . SetData ( GetUnixConfigDirOverrideName , null ) ;
41+ Directory . Delete ( UnixConfigDirOverridePath , recursive : true ) ;
42+ Directory . Delete ( PreferredJdksOverridePath , recursive : true ) ;
43+ }
44+
1545 [ Test ]
1646 public void Constructor_NullLogger ( )
1747 {
@@ -22,27 +52,17 @@ public void Constructor_NullLogger ()
2252 [ Test ]
2353 public void Constructor_Paths ( )
2454 {
25- var root = Path . GetTempFileName ( ) ;
26- File . Delete ( root ) ;
27- Directory . CreateDirectory ( root ) ;
28-
29- var sdk = Path . Combine ( root , "sdk" ) ;
30- var jdk = Path . Combine ( root , "jdk" ) ;
31-
32- Directory . CreateDirectory ( sdk ) ;
33- Directory . CreateDirectory ( jdk ) ;
34-
35- CreateFauxAndroidSdkDirectory ( sdk , "26.0.0" ) ;
36- CreateFauxJavaSdkDirectory ( jdk , "1.8.0" , out var _ , out var _ ) ;
55+ CreateSdks ( out string root , out string jdk , out string ndk , out string sdk ) ;
3756
3857 var logs = new StringWriter ( ) ;
3958 Action < TraceLevel , string > logger = ( level , message ) => {
4059 logs . WriteLine ( $ "[{ level } ] { message } ") ;
4160 } ;
4261
4362 try {
44- var info = new AndroidSdkInfo ( logger , androidSdkPath : sdk , javaSdkPath : jdk , androidNdkPath : null ) ;
63+ var info = new AndroidSdkInfo ( logger , androidSdkPath : sdk , androidNdkPath : ndk , javaSdkPath : jdk ) ;
4564
65+ Assert . AreEqual ( ndk , info . AndroidNdkPath , "AndroidNdkPath not preserved!" ) ;
4666 Assert . AreEqual ( sdk , info . AndroidSdkPath , "AndroidSdkPath not preserved!" ) ;
4767 Assert . AreEqual ( jdk , info . JavaSdkPath , "JavaSdkPath not preserved!" ) ;
4868 }
@@ -51,8 +71,58 @@ public void Constructor_Paths ()
5171 }
5272 }
5373
74+ [ Test ]
75+ public void Constructor_SetValuesFromPath ( )
76+ {
77+ CreateSdks ( out string root , out string jdk , out string ndk , out string sdk ) ;
78+ JdkInfoTests . CreateFauxJdk ( jdk , "1.8.0" ) ;
79+
80+ Action < TraceLevel , string > logger = ( level , message ) => {
81+ Console . WriteLine ( $ "[{ level } ] { message } ") ;
82+ } ;
83+ var oldPath = Environment . GetEnvironmentVariable ( "PATH" ) ;
84+ try {
85+ var paths = new List < string > ( ) {
86+ Path . Combine ( jdk , "bin" ) ,
87+ ndk ,
88+ Path . Combine ( sdk , "platform-tools" ) ,
89+ } ;
90+ paths . AddRange ( oldPath . Split ( new [ ] { Path . PathSeparator } , StringSplitOptions . RemoveEmptyEntries ) ) ;
91+ Environment . SetEnvironmentVariable ( "PATH" , string . Join ( Path . PathSeparator . ToString ( ) , paths ) ) ;
92+
93+ var info = new AndroidSdkInfo ( logger ) ;
94+
95+ Assert . AreEqual ( ndk , info . AndroidNdkPath , "AndroidNdkPath not set from $PATH!" ) ;
96+ Assert . AreEqual ( sdk , info . AndroidSdkPath , "AndroidSdkPath not set from $PATH!" ) ;
97+ Assert . AreEqual ( jdk , info . JavaSdkPath , "JavaSdkPath not set from $PATH!" ) ;
98+ }
99+ finally {
100+ Environment . SetEnvironmentVariable ( "PATH" , oldPath ) ;
101+ Directory . Delete ( root , recursive : true ) ;
102+ }
103+ }
104+
54105 static bool IsWindows => OS . IsWindows ;
55106
107+ static void CreateSdks ( out string root , out string jdk , out string ndk , out string sdk )
108+ {
109+ root = Path . GetTempFileName ( ) ;
110+ File . Delete ( root ) ;
111+ Directory . CreateDirectory ( root ) ;
112+
113+ ndk = Path . Combine ( root , "ndk" ) ;
114+ sdk = Path . Combine ( root , "sdk" ) ;
115+ jdk = Path . Combine ( root , "jdk" ) ;
116+
117+ Directory . CreateDirectory ( sdk ) ;
118+ Directory . CreateDirectory ( ndk ) ;
119+ Directory . CreateDirectory ( jdk ) ;
120+
121+ CreateFauxAndroidSdkDirectory ( sdk , "26.0.0" ) ;
122+ CreateFauxAndroidNdkDirectory ( ndk ) ;
123+ CreateFauxJavaSdkDirectory ( jdk , "1.8.0" , out var _ , out var _ ) ;
124+ }
125+
56126 static void CreateFauxAndroidSdkDirectory ( string androidSdkDirectory , string buildToolsVersion , ApiInfo [ ] apiLevels = null )
57127 {
58128 var androidSdkToolsPath = Path . Combine ( androidSdkDirectory , "tools" ) ;
@@ -90,7 +160,28 @@ struct ApiInfo {
90160 public string Id ;
91161 }
92162
93- protected string CreateFauxJavaSdkDirectory ( string javaPath , string javaVersion , out string javaExe , out string javacExe )
163+ static void CreateFauxAndroidNdkDirectory ( string androidNdkDirectory )
164+ {
165+ File . WriteAllText ( Path . Combine ( androidNdkDirectory , "ndk-stack" ) , "" ) ;
166+ File . WriteAllText ( Path . Combine ( androidNdkDirectory , "ndk-stack.cmd" ) , "" ) ;
167+
168+ string prebuiltHostName = "" ;
169+ if ( OS . IsWindows )
170+ prebuiltHostName = "windows-x86_64" ;
171+ else if ( OS . IsMac )
172+ prebuiltHostName = "darwin-x86_64" ;
173+ else
174+ prebuiltHostName = "linux-x86_64" ;
175+
176+
177+ var toolchainsDir = Path . Combine ( androidNdkDirectory , "toolchains" ) ;
178+ var armToolchainDir = Path . Combine ( toolchainsDir , "arm-linux-androideabi-4.9" ) ;
179+ var armPrebuiltDir = Path . Combine ( armToolchainDir , "prebuilt" , prebuiltHostName ) ;
180+
181+ Directory . CreateDirectory ( armPrebuiltDir ) ;
182+ }
183+
184+ static string CreateFauxJavaSdkDirectory ( string javaPath , string javaVersion , out string javaExe , out string javacExe )
94185 {
95186 javaExe = IsWindows ? "Java.cmd" : "java.bash" ;
96187 javacExe = IsWindows ? "Javac.cmd" : "javac.bash" ;
@@ -106,7 +197,7 @@ protected string CreateFauxJavaSdkDirectory (string javaPath, string javaVersion
106197 return javaPath ;
107198 }
108199
109- void CreateFauxJavaExe ( string javaExeFullPath , string version )
200+ static void CreateFauxJavaExe ( string javaExeFullPath , string version )
110201 {
111202 var sb = new StringBuilder ( ) ;
112203 if ( IsWindows ) {
@@ -126,7 +217,7 @@ void CreateFauxJavaExe (string javaExeFullPath, string version)
126217 }
127218 }
128219
129- void CreateFauxJavacExe ( string javacExeFullPath , string version )
220+ static void CreateFauxJavacExe ( string javacExeFullPath , string version )
130221 {
131222 var sb = new StringBuilder ( ) ;
132223 if ( IsWindows ) {
@@ -142,7 +233,7 @@ void CreateFauxJavacExe (string javacExeFullPath, string version)
142233 }
143234 }
144235
145- protected void Exec ( string exe , string args )
236+ static void Exec ( string exe , string args )
146237 {
147238 var psi = new ProcessStartInfo {
148239 FileName = exe ,
@@ -168,10 +259,6 @@ public void DetectAndSetPreferredJavaSdkPathToLatest ()
168259 Action < TraceLevel , string > logger = ( level , message ) => {
169260 Console . WriteLine ( $ "[{ level } ] { message } ") ;
170261 } ;
171- var jdks = Path . GetTempFileName ( ) ;
172- File . Delete ( jdks ) ;
173- Directory . CreateDirectory ( jdks ) ;
174- AppDomain . CurrentDomain . SetData ( $ "GetMacOSMicrosoftJdkPaths jdks override! { typeof ( JdkInfo ) . AssemblyQualifiedName } ", jdks ) ;
175262
176263 var backupConfig = UnixConfigPath + "." + Path . GetRandomFileName ( ) ;
177264 try {
@@ -180,7 +267,7 @@ public void DetectAndSetPreferredJavaSdkPathToLatest ()
180267 return ;
181268 }
182269 Assert . Throws < NotSupportedException > ( ( ) => AndroidSdkInfo . DetectAndSetPreferredJavaSdkPathToLatest ( logger ) ) ;
183- var newJdkPath = Path . Combine ( jdks , "microsoft_dist_openjdk_1.8.999" ) ;
270+ var newJdkPath = Path . Combine ( PreferredJdksOverridePath , "microsoft_dist_openjdk_1.8.999" ) ;
184271 JdkInfoTests . CreateFauxJdk ( newJdkPath , "1.8.999" ) ;
185272
186273 if ( File . Exists ( UnixConfigPath ) )
@@ -190,16 +277,14 @@ public void DetectAndSetPreferredJavaSdkPathToLatest ()
190277 AssertJdkPath ( newJdkPath ) ;
191278 }
192279 finally {
193- AppDomain . CurrentDomain . SetData ( $ "GetMacOSMicrosoftJdkPaths jdks override! { typeof ( JdkInfo ) . AssemblyQualifiedName } ", null ) ;
194- Directory . Delete ( jdks , recursive : true ) ;
195280 if ( File . Exists ( backupConfig ) ) {
196281 File . Delete ( UnixConfigPath ) ;
197282 File . Move ( backupConfig , UnixConfigPath ) ;
198283 }
199284 }
200285 }
201286
202- static void AssertJdkPath ( string expectedJdkPath )
287+ void AssertJdkPath ( string expectedJdkPath )
203288 {
204289 var config_file = XDocument . Load ( UnixConfigPath ) ;
205290 var javaEl = config_file . Root . Element ( "java-sdk" ) ;
@@ -208,10 +293,9 @@ static void AssertJdkPath (string expectedJdkPath)
208293 Assert . AreEqual ( expectedJdkPath , actualJdkPath ) ;
209294 }
210295
211- static string UnixConfigPath {
296+ string UnixConfigPath {
212297 get {
213- var p = Environment . GetFolderPath ( Environment . SpecialFolder . ApplicationData ) ;
214- return Path . Combine ( Path . Combine ( p , "xbuild" ) , "monodroid-config.xml" ) ;
298+ return Path . Combine ( UnixConfigDirOverridePath , "monodroid-config.xml" ) ;
215299 }
216300 }
217301 }
0 commit comments