Improve robustness of --version parsing for sdkmanager (#15029)

This commit is contained in:
jcollins-g 2018-03-01 14:25:03 -08:00 committed by GitHub
parent 701eff4ac5
commit 050ee9d180
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 5 deletions

View file

@ -347,7 +347,8 @@ class AndroidSdk {
throwToolExit('Android sdkmanager not found. Update to the latest Android SDK to resolve this.'); throwToolExit('Android sdkmanager not found. Update to the latest Android SDK to resolve this.');
final ProcessResult result = processManager.runSync(<String>[sdkManagerPath, '--version'], environment: sdkManagerEnv); final ProcessResult result = processManager.runSync(<String>[sdkManagerPath, '--version'], environment: sdkManagerEnv);
if (result.exitCode != 0) { 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(); return result.stdout.trim();
} }

View file

@ -213,7 +213,7 @@ class AndroidWorkflow extends DoctorValidator implements Workflow {
); );
final Version sdkManagerVersion = new Version.parse(androidSdk.sdkManagerVersion); 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. // SDK manager is found, but needs to be updated.
throwToolExit( throwToolExit(
'A newer version of the Android SDK is required. To update, run:\n' 'A newer version of the Android SDK is required. To update, run:\n'

View file

@ -81,7 +81,7 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('throws on sdkmanager version check failure', () { testUsingContext('does not throw on sdkmanager version check failure', () {
sdkDir = MockAndroidSdk.createSdkDirectory(); sdkDir = MockAndroidSdk.createSdkDirectory();
Config.instance.setValue('android-sdk', sdkDir.path); Config.instance.setValue('android-sdk', sdkDir.path);
@ -89,7 +89,7 @@ void main() {
when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true); when(processManager.canRun(sdk.sdkManagerPath)).thenReturn(true);
when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'], environment: argThat(isNotNull))) when(processManager.runSync(<String>[sdk.sdkManagerPath, '--version'], environment: argThat(isNotNull)))
.thenReturn(new ProcessResult(1, 1, '26.1.1\n', 'Mystery error')); .thenReturn(new ProcessResult(1, 1, '26.1.1\n', 'Mystery error'));
expect(() => sdk.sdkManagerVersion, throwsToolExit(exitCode: 1)); expect(sdk.sdkManagerVersion, isNull);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fs, FileSystem: () => fs,
ProcessManager: () => processManager, ProcessManager: () => processManager,

View file

@ -132,7 +132,21 @@ void main() {
when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager'); when(sdk.sdkManagerPath).thenReturn('/foo/bar/sdkmanager');
when(sdk.sdkManagerVersion).thenReturn('25.0.0'); when(sdk.sdkManagerVersion).thenReturn('25.0.0');
expect(AndroidWorkflow.runLicenseManager(), throwsToolExit()); expect(AndroidWorkflow.runLicenseManager(), throwsToolExit(message: 'To update, run'));
}, overrides: <Type, Generator>{
AndroidSdk: () => sdk,
FileSystem: () => fs,
Platform: () => new FakePlatform()..environment = <String, String>{'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: <Type, Generator>{ }, overrides: <Type, Generator>{
AndroidSdk: () => sdk, AndroidSdk: () => sdk,
FileSystem: () => fs, FileSystem: () => fs,