Catch exceptions thrown by runChecked* when possible (#36109)
diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart index c439573..96c5632 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart
@@ -10,6 +10,7 @@ import 'package:flutter_tools/src/android/android_console.dart'; import 'package:flutter_tools/src/android/android_device.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; +import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/base/config.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; @@ -365,7 +366,7 @@ testUsingContext('returns the generated host port from stdout', () async { when(mockProcessManager.run(argThat(contains('forward')))) - .thenAnswer((_) async => ProcessResult(0, 0, '456', '')); + .thenAnswer((_) async => ProcessResult(0, 0, '456', '')); expect(await forwarder.forward(123), equals(456)); }, overrides: <Type, Generator>{ @@ -374,7 +375,7 @@ testUsingContext('returns the supplied host port when stdout is empty', () async { when(mockProcessManager.run(argThat(contains('forward')))) - .thenAnswer((_) async => ProcessResult(0, 0, '', '')); + .thenAnswer((_) async => ProcessResult(0, 0, '', '')); expect(await forwarder.forward(123, hostPort: 456), equals(456)); }, overrides: <Type, Generator>{ @@ -383,7 +384,7 @@ testUsingContext('returns the supplied host port when stdout is the host port', () async { when(mockProcessManager.run(argThat(contains('forward')))) - .thenAnswer((_) async => ProcessResult(0, 0, '456', '')); + .thenAnswer((_) async => ProcessResult(0, 0, '456', '')); expect(await forwarder.forward(123, hostPort: 456), equals(456)); }, overrides: <Type, Generator>{ @@ -392,12 +393,34 @@ testUsingContext('throws an error when stdout is not blank nor the host port', () async { when(mockProcessManager.run(argThat(contains('forward')))) - .thenAnswer((_) async => ProcessResult(0, 0, '123456', '')); + .thenAnswer((_) async => ProcessResult(0, 0, '123456', '')); expect(forwarder.forward(123, hostPort: 456), throwsA(isInstanceOf<ProcessException>())); }, overrides: <Type, Generator>{ ProcessManager: () => mockProcessManager, }); + + testUsingContext('forwardedPorts returns empty list when forward failed', () { + when(mockProcessManager.runSync(argThat(contains('forward')))) + .thenReturn(ProcessResult(0, 1, '', '')); + + expect(forwarder.forwardedPorts, equals(const <ForwardedPort>[])); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + }); + }); + + group('lastLogcatTimestamp', () { + final ProcessManager mockProcessManager = MockProcessManager(); + final AndroidDevice device = AndroidDevice('1234'); + + testUsingContext('returns null if shell command failed', () async { + when(mockProcessManager.runSync(argThat(contains('logcat')))) + .thenReturn(ProcessResult(0, 1, '', '')); + expect(device.lastLogcatTimestamp, isNull); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + }); }); } @@ -601,3 +624,10 @@ @override void add(List<int> data) {} } + +class AndroidPackageTest extends ApplicationPackage { + AndroidPackageTest() : super(id: 'app-id'); + + @override + String get name => 'app-package'; +}
diff --git a/packages/flutter_tools/test/general.shard/application_package_test.dart b/packages/flutter_tools/test/general.shard/application_package_test.dart index 620ee3f..a531335 100644 --- a/packages/flutter_tools/test/general.shard/application_package_test.dart +++ b/packages/flutter_tools/test/general.shard/application_package_test.dart
@@ -129,6 +129,15 @@ ), ); }, overrides: overrides); + + testUsingContext('returns null when failed to extract manifest', () async { + final AndroidSdkVersion sdkVersion = MockitoAndroidSdkVersion(); + when(sdk.latestVersion).thenReturn(sdkVersion); + when(mockProcessManager.runSync(argThat(contains('logcat')))) + .thenReturn(ProcessResult(0, 1, '', '')); + + expect(AndroidApk.fromApk(null), isNull); + }, overrides: overrides); }); group('ApkManifestData', () {
diff --git a/packages/flutter_tools/test/general.shard/commands/version_test.dart b/packages/flutter_tools/test/general.shard/commands/version_test.dart index 1e48004..304e3e0 100644 --- a/packages/flutter_tools/test/general.shard/commands/version_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/version_test.dart
@@ -6,6 +6,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/version.dart'; @@ -59,12 +60,29 @@ }, overrides: <Type, Generator>{ ProcessManager: () => MockProcessManager(), }); + + testUsingContext('exit tool if can\'t get the tags', () async { + final VersionCommand command = VersionCommand(); + + try { + await command.getTags(); + fail('ToolExit expected'); + } catch(e) { + expect(e, isInstanceOf<ToolExit>()); + } + }, overrides: <Type, Generator>{ + ProcessManager: () => MockProcessManager(failGitTag: true), + }); }); } class MockProcessManager extends Mock implements ProcessManager { + MockProcessManager({ this.failGitTag = false }); + String version = ''; + bool failGitTag; + @override Future<ProcessResult> run( List<dynamic> command, { @@ -76,6 +94,9 @@ Encoding stderrEncoding = systemEncoding, }) async { if (command[0] == 'git' && command[1] == 'tag') { + if (failGitTag) { + return ProcessResult(0, 1, '', ''); + } return ProcessResult(0, 0, 'v10.0.0\r\nv20.0.0', ''); } if (command[0] == 'git' && command[1] == 'checkout') {
diff --git a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart index 57a2242..a90b9b2 100644 --- a/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/code_signing_test.dart
@@ -440,6 +440,62 @@ Config: () => mockConfig, AnsiTerminal: () => testTerminal, }); + + testUsingContext('find-identity failure', () async { + when(mockProcessManager.runSync(<String>['which', 'security'])) + .thenReturn(exitsHappy); + when(mockProcessManager.runSync(<String>['which', 'openssl'])) + .thenReturn(exitsHappy); + when(mockProcessManager.runSync( + argThat(contains('find-identity')), + environment: anyNamed('environment'), + workingDirectory: anyNamed('workingDirectory'), + )).thenReturn(ProcessResult(0, 1, '', '')); + + final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app); + expect(signingConfigs, isNull); + }, + overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Config: () => mockConfig, + AnsiTerminal: () => testTerminal, + }); + + testUsingContext('find-certificate failure', () async { + when(mockProcessManager.runSync(<String>['which', 'security'])) + .thenReturn(exitsHappy); + when(mockProcessManager.runSync(<String>['which', 'openssl'])) + .thenReturn(exitsHappy); + when(mockProcessManager.runSync( + argThat(contains('find-identity')), + environment: anyNamed('environment'), + workingDirectory: anyNamed('workingDirectory'), + )).thenReturn(ProcessResult( + 1, // pid + 0, // exitCode + ''' +1) 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 "iPhone Developer: Profile 1 (1111AAAA11)" +2) da4b9237bacccdf19c0760cab7aec4a8359010b0 "iPhone Developer: Profile 2 (2222BBBB22)" +3) 5bf1fd927dfb8679496a2e6cf00cbe50c1c87145 "iPhone Developer: Profile 3 (3333CCCC33)" + 3 valid identities found''', + '', + )); + mockTerminalStdInStream = + Stream<String>.fromFuture(Future<String>.value('3')); + when(mockProcessManager.runSync( + <String>['security', 'find-certificate', '-c', '3333CCCC33', '-p'], + environment: anyNamed('environment'), + workingDirectory: anyNamed('workingDirectory'), + )).thenReturn(ProcessResult(1, 1, '', '' )); + + final Map<String, String> signingConfigs = await getCodeSigningIdentityDevelopmentTeam(iosApp: app); + expect(signingConfigs, isNull); + }, + overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Config: () => mockConfig, + AnsiTerminal: () => testTerminal, + }); }); }
diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart index 9026ec0..b560538 100644 --- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart
@@ -143,6 +143,12 @@ .thenReturn(ProcessResult(1, 0, 'Xcode 8.3.3\nBuild version 8E3004b', '')); expect(xcodeProjectInterpreter.isInstalled, isTrue); }); + + testUsingOsxContext('build settings is empty when xcodebuild failed to get the build settings', () { + when(mockProcessManager.runSync(argThat(contains(xcodebuild)))) + .thenReturn(ProcessResult(0, 1, '', '')); + expect(xcodeProjectInterpreter.getBuildSettings('', ''), const <String, String>{}); + }); }); group('Xcode project properties', () { test('properties from default project can be parsed', () {