2
2
using System . Collections . Generic ;
3
3
using System . IO ;
4
4
using System . Linq ;
5
+ using System . Text ;
5
6
using System . Xml ;
6
7
using System . Xml . Linq ;
7
8
using NUnit . Framework ;
@@ -16,11 +17,9 @@ public class AndroidDependenciesTests : BaseTest
16
17
{
17
18
[ Test ]
18
19
[ NonParallelizable ] // Do not run environment modifying tests in parallel.
19
- public void InstallAndroidDependenciesTest ( )
20
+ public void InstallAndroidDependenciesTest ( [ Values ( "GoogleV2" , "Xamarin" ) ] string manifestType )
20
21
{
21
22
AssertCommercialBuild ( ) ;
22
- // We need to grab the latest API level *before* changing env vars
23
- var apiLevel = AndroidSdkResolver . GetMaxInstalledPlatform ( ) ;
24
23
var oldSdkPath = Environment . GetEnvironmentVariable ( "TEST_ANDROID_SDK_PATH" ) ;
25
24
var oldJdkPath = Environment . GetEnvironmentVariable ( "TEST_ANDROID_JDK_PATH" ) ;
26
25
try {
@@ -33,41 +32,48 @@ public void InstallAndroidDependenciesTest ()
33
32
Directory . Delete ( path , recursive : true ) ;
34
33
Directory . CreateDirectory ( path ) ;
35
34
}
36
- var proj = new XamarinAndroidApplicationProject {
37
- TargetSdkVersion = apiLevel . ToString ( ) ,
35
+
36
+ var proj = new XamarinAndroidApplicationProject ( ) ;
37
+ var buildArgs = new List < string > {
38
+ "AcceptAndroidSDKLicenses=true" ,
39
+ $ "AndroidManifestType={ manifestType } ",
38
40
} ;
39
- const string ExpectedPlatformToolsVersion = "34.0.3" ;
41
+ // When using the default Xamarin manifest, this test should fail if we can't install any of the defaults in Xamarin.Android.Tools.Versions.props
42
+ // When using the Google manifest, override the platform tools version to the one in their manifest as it only ever contains one version
43
+ if ( manifestType == "GoogleV2" ) {
44
+ buildArgs . Add ( $ "AndroidSdkPlatformToolsVersion={ GetCurrentPlatformToolsVersion ( ) } ") ;
45
+ }
46
+
40
47
using ( var b = CreateApkBuilder ( ) ) {
41
48
b . CleanupAfterSuccessfulBuild = false ;
42
49
string defaultTarget = b . Target ;
43
50
b . Target = "InstallAndroidDependencies" ;
44
51
b . BuildLogFile = "install-deps.log" ;
45
- Assert . IsTrue ( b . Build ( proj , parameters : new string [ ] {
46
- "AcceptAndroidSDKLicenses=true" ,
47
- "AndroidManifestType=GoogleV2" , // Need GoogleV2 so we can install API-32
48
- $ "AndroidSdkPlatformToolsVersion={ ExpectedPlatformToolsVersion } ",
49
- } ) , "InstallAndroidDependencies should have succeeded." ) ;
50
- b . Target = defaultTarget ;
51
- b . BuildLogFile = "build.log" ;
52
- Assert . IsTrue ( b . Build ( proj , true ) , "build should have succeeded." ) ;
53
- bool usedNewDir = b . LastBuildOutput . ContainsText ( $ "Output Property: _AndroidSdkDirectory={ sdkPath } ") ;
54
- if ( ! usedNewDir ) {
55
- // Is this because the platform-tools version changed (again?!)
56
- try {
57
- var currentPlatformToolsVersion = GetCurrentPlatformToolsVersion ( ) ;
58
- if ( currentPlatformToolsVersion != ExpectedPlatformToolsVersion ) {
59
- Assert . Fail ( $ "_AndroidSdkDirectory not set to new SDK path `{ sdkPath } `, *probably* because Google's repository has a newer platform-tools package! " +
60
- $ "repository2-3.xml contains platform-tools { currentPlatformToolsVersion } ; expected { ExpectedPlatformToolsVersion } !") ;
52
+ Assert . IsTrue ( b . Build ( proj , parameters : buildArgs . ToArray ( ) ) , "InstallAndroidDependencies should have succeeded." ) ;
53
+
54
+ // When dependencies can not be resolved/installed a warning will be present in build output:
55
+ // Dependency `platform-tools` should have been installed but could not be resolved.
56
+ var depFailedMessage = "should have been installed but could not be resolved" ;
57
+ bool failedToInstall = b . LastBuildOutput . ContainsText ( depFailedMessage ) ;
58
+ if ( failedToInstall ) {
59
+ var sb = new StringBuilder ( ) ;
60
+ foreach ( var line in b . LastBuildOutput ) {
61
+ if ( line . Contains ( depFailedMessage ) ) {
62
+ sb . AppendLine ( line ) ;
61
63
}
62
64
}
63
- catch ( Exception e ) {
64
- TestContext . WriteLine ( $ "Could not extract platform-tools version from repository2-3.xml: { e } ") ;
65
- }
65
+ Assert . Fail ( $ "A required dependency was not installed, warnings are listed below. Please check the task output in 'install-deps.log'.\n { sb . ToString ( ) } ") ;
66
66
}
67
- Assert . IsTrue ( usedNewDir , $ "_AndroidSdkDirectory was not set to new SDK path `{ sdkPath } `.") ;
67
+
68
+ b . Target = defaultTarget ;
69
+ b . BuildLogFile = "build.log" ;
70
+ Assert . IsTrue ( b . Build ( proj , true ) , "build should have succeeded." ) ;
71
+ Assert . IsTrue ( b . LastBuildOutput . ContainsText ( $ "Output Property: _AndroidSdkDirectory={ sdkPath } ") ,
72
+ $ "_AndroidSdkDirectory was not set to new SDK path `{ sdkPath } `. Please check the task output in 'install-deps.log'") ;
68
73
Assert . IsTrue ( b . LastBuildOutput . ContainsText ( $ "Output Property: _JavaSdkDirectory={ jdkPath } ") ,
69
- $ "_JavaSdkDirectory was not set to new JDK path `{ jdkPath } `.") ;
70
- Assert . IsTrue ( b . LastBuildOutput . ContainsText ( $ "JavaPlatformJarPath={ sdkPath } ") , $ "JavaPlatformJarPath did not contain new SDK path `{ sdkPath } `.") ;
74
+ $ "_JavaSdkDirectory was not set to new JDK path `{ jdkPath } `. Please check the task output in 'install-deps.log'") ;
75
+ Assert . IsTrue ( b . LastBuildOutput . ContainsText ( $ "JavaPlatformJarPath={ sdkPath } ") ,
76
+ $ "JavaPlatformJarPath did not contain new SDK path `{ sdkPath } `. Please check the task output in 'install-deps.log'") ;
71
77
}
72
78
} finally {
73
79
Environment . SetEnvironmentVariable ( "TEST_ANDROID_SDK_PATH" , oldSdkPath ) ;
@@ -89,7 +95,7 @@ static string GetCurrentPlatformToolsVersion ()
89
95
90
96
var revision = platformToolsPackage . Element ( "revision" ) ;
91
97
92
- return $ "{ revision . Element ( "major" ) } .{ revision . Element ( "minor" ) } .{ revision . Element ( "micro" ) } ";
98
+ return $ "{ revision . Element ( "major" ) ? . Value } .{ revision . Element ( "minor" ) ? . Value } .{ revision . Element ( "micro" ) ? . Value } ";
93
99
}
94
100
95
101
[ Test ]
0 commit comments