From 050ee9d180e29fb26f8797bfe3a8952951cbf49b Mon Sep 17 00:00:00 2001 From: jcollins-g Date: Thu, 1 Mar 2018 14:25:03 -0800 Subject: [PATCH] Improve robustness of --version parsing for sdkmanager (#15029) --- .../lib/src/android/android_sdk.dart | 3 ++- .../lib/src/android/android_workflow.dart | 2 +- .../test/android/android_sdk_test.dart | 4 ++-- .../test/android/android_workflow_test.dart | 16 +++++++++++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart index e3a7dc581c3..ddab13c0326 100644 --- a/packages/flutter_tools/lib/src/android/android_sdk.dart +++ b/packages/flutter_tools/lib/src/android/android_sdk.dart @@ -347,7 +347,8 @@ class AndroidSdk { throwToolExit('Android sdkmanager not found. Update to the latest Android SDK to resolve this.'); final ProcessResult result = processManager.runSync([sdkManagerPath, '--version'], environment: sdkManagerEnv); if (result.exitCode != 0) { - throwToolExit('sdkmanager --version failed: ${result.exitCode}', exitCode: result.exitCode); + printTrace('sdkmanager --version failed: exitCode: ${result.exitCode} stdout: ${result.stdout} stderr: ${result.stderr}'); + return null; } return result.stdout.trim(); } diff --git a/packages/flutter_tools/lib/src/android/android_workflow.dart b/packages/flutter_tools/lib/src/android/android_workflow.dart index 3c900f93bdf..7a72dfa194c 100644 --- a/packages/flutter_tools/lib/src/android/android_workflow.dart +++ b/packages/flutter_tools/lib/src/android/android_workflow.dart @@ -213,7 +213,7 @@ class AndroidWorkflow extends DoctorValidator implements Workflow { ); final Version sdkManagerVersion = new Version.parse(androidSdk.sdkManagerVersion); - if (sdkManagerVersion.major < 26) + if (sdkManagerVersion == null || sdkManagerVersion.major < 26) // SDK manager is found, but needs to be updated. throwToolExit( 'A newer version of the Android SDK is required. To update, run:\n' diff --git a/packages/flutter_tools/test/android/android_sdk_test.dart b/packages/flutter_tools/test/android/android_sdk_test.dart index 60d516e99db..9fb30169195 100644 --- a/packages/flutter_tools/test/android/android_sdk_test.dart +++ b/packages/flutter_tools/test/android/android_sdk_test.dart @@ -81,7 +81,7 @@ void main() { ProcessManager: () => processManager, }); - testUsingContext('throws on sdkmanager version check failure', () { + testUsingContext('does not throw on sdkmanager version check failure', () { sdkDir = MockAndroidSdk.createSdkDirectory(); Config.instance.setValue('android-sdk', sdkDir.path); @@ -89,7 +89,7 @@ void main() { when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true); when(processManager.runSync([sdk.sdkManagerPath, '--version'], environment: argThat(isNotNull))) .thenReturn(new ProcessResult(1, 1, '26.1.1\n', 'Mystery error')); - expect(() => sdk.sdkManagerVersion, throwsToolExit(exitCode: 1)); + expect(sdk.sdkManagerVersion, isNull); }, overrides: { FileSystem: () => fs, ProcessManager: () => processManager, diff --git a/packages/flutter_tools/test/android/android_workflow_test.dart b/packages/flutter_tools/test/android/android_workflow_test.dart index 616bb5ce2ba..19666f98e68 100644 --- a/packages/flutter_tools/test/android/android_workflow_test.dart +++ b/packages/flutter_tools/test/android/android_workflow_test.dart @@ -132,7 +132,21 @@ void main() { when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerVersion).thenReturn('25.0.0'); - expect(AndroidWorkflow.runLicenseManager(), throwsToolExit()); + expect(AndroidWorkflow.runLicenseManager(), throwsToolExit(message: 'To update, run')); + }, overrides: { + AndroidSdk: () => sdk, + FileSystem: () => fs, + Platform: () => new FakePlatform()..environment = {'HOME': '/home/me'}, + ProcessManager: () => processManager, + Stdio: () => stdio, + }); + + testUsingContext('runLicenseManager errors correctly for null version', () async { + MockAndroidSdk.createSdkDirectory(); + when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); + when(sdk.sdkManagerVersion).thenReturn(null); + + expect(AndroidWorkflow.runLicenseManager(), throwsToolExit(message: 'To update, run')); }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs,