Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 2745bad

Browse files
[flutter_plugin_tool] Add more failure test coverage (#4132)
Many commands had insufficient failure testing. This adds new tests that ensure that for every Process call, at least one test fails if a failure from that process were ignored (with the exception of calls in the `publish` command, which has a custom process mocking system, so was out of scope here; it already has more coverage than most tests did though.) For a few existing failure tests, adds output checks to ensure that they are testing for the *right* failures. Other changes: - Adds convenience constructors to MockProcess for the common cases of a mock process that just exits with a 0 or 1 status, to reduce test verbosity. - Fixes a few bugs that were found by the new tests. - Minor test cleanup, especially cases where a mock process was being set up just to make all calls succeed, which is the default as of recent changes.
1 parent 3477be2 commit 2745bad

14 files changed

+557
-220
lines changed

script/tool/lib/src/analyze_command.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class AnalyzeCommand extends PackageLoopingCommand {
6666
}
6767

6868
printError(
69-
'Found an extra analysis_options.yaml in ${file.absolute.path}.');
69+
'Found an extra analysis_options.yaml at ${file.absolute.path}.');
7070
printError(
7171
'If this was deliberate, pass the package to the analyze command '
7272
'with the --$_customAnalysisFlag flag and try again.');
@@ -105,7 +105,7 @@ class AnalyzeCommand extends PackageLoopingCommand {
105105

106106
print('Fetching dependencies...');
107107
if (!await _runPackagesGetOnTargetPackages()) {
108-
printError('Unabled to get dependencies.');
108+
printError('Unable to get dependencies.');
109109
throw ToolExit(_exitPackagesGetFailed);
110110
}
111111

script/tool/lib/src/firebase_test_lab_command.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,13 +135,13 @@ class FirebaseTestLabCommand extends PackageLoopingCommand {
135135

136136
// Ensures that gradle wrapper exists
137137
if (!await _ensureGradleWrapperExists(androidDirectory)) {
138-
PackageResult.fail(<String>['Unable to build example apk']);
138+
return PackageResult.fail(<String>['Unable to build example apk']);
139139
}
140140

141141
await _configureFirebaseProject();
142142

143143
if (!await _runGradle(androidDirectory, 'app:assembleAndroidTest')) {
144-
PackageResult.fail(<String>['Unable to assemble androidTest']);
144+
return PackageResult.fail(<String>['Unable to assemble androidTest']);
145145
}
146146

147147
final List<String> errors = <String>[];
@@ -236,7 +236,7 @@ class FirebaseTestLabCommand extends PackageLoopingCommand {
236236
: null;
237237

238238
final int exitCode = await processRunner.runAndStream(
239-
p.join(directory.path, _gradleWrapper),
239+
directory.childFile(_gradleWrapper).path,
240240
<String>[
241241
target,
242242
'-Pverbose=true',

script/tool/lib/src/java_test_command.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ class JavaTestCommand extends PackageLoopingCommand {
5454
print('\nRUNNING JAVA TESTS for $exampleName');
5555

5656
final Directory androidDirectory = example.childDirectory('android');
57-
if (!androidDirectory.childFile(_gradleWrapper).existsSync()) {
57+
final File gradleFile = androidDirectory.childFile(_gradleWrapper);
58+
if (!gradleFile.existsSync()) {
5859
printError('ERROR: Run "flutter build apk" on $exampleName, or run '
5960
'this tool\'s "build-examples --apk" command, '
6061
'before executing tests.');
@@ -63,8 +64,7 @@ class JavaTestCommand extends PackageLoopingCommand {
6364
}
6465

6566
final int exitCode = await processRunner.runAndStream(
66-
p.join(androidDirectory.path, _gradleWrapper),
67-
<String>['testDebugUnitTest', '--info'],
67+
gradleFile.path, <String>['testDebugUnitTest', '--info'],
6868
workingDir: androidDirectory);
6969
if (exitCode != 0) {
7070
errors.add('$exampleName tests failed.');

script/tool/lib/src/version_check_command.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class VersionCheckCommand extends PackageLoopingCommand {
128128
'that intentionally has no version should be marked '
129129
'"publish_to: none".');
130130
// No remaining checks make sense, so fail immediately.
131-
PackageResult.fail(<String>['No pubspec.yaml version.']);
131+
return PackageResult.fail(<String>['No pubspec.yaml version.']);
132132
}
133133

134134
final List<String> errors = <String>[];

script/tool/test/analyze_command_test.dart

Lines changed: 75 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5+
import 'dart:io' as io;
6+
57
import 'package:args/command_runner.dart';
68
import 'package:file/file.dart';
79
import 'package:file/memory.dart';
@@ -33,9 +35,6 @@ void main() {
3335
final Directory plugin1Dir = createFakePlugin('a', packagesDir);
3436
final Directory plugin2Dir = createFakePlugin('b', packagesDir);
3537

36-
final MockProcess mockProcess = MockProcess();
37-
mockProcess.exitCodeCompleter.complete(0);
38-
processRunner.processToReturn = mockProcess;
3938
await runCapturingPrint(runner, <String>['analyze']);
4039

4140
expect(
@@ -55,9 +54,6 @@ void main() {
5554
test('skips flutter pub get for examples', () async {
5655
final Directory plugin1Dir = createFakePlugin('a', packagesDir);
5756

58-
final MockProcess mockProcess = MockProcess();
59-
mockProcess.exitCodeCompleter.complete(0);
60-
processRunner.processToReturn = mockProcess;
6157
await runCapturingPrint(runner, <String>['analyze']);
6258

6359
expect(
@@ -74,9 +70,6 @@ void main() {
7470
final Directory plugin1Dir = createFakePlugin('a', packagesDir);
7571
final Directory plugin2Dir = createFakePlugin('example', packagesDir);
7672

77-
final MockProcess mockProcess = MockProcess();
78-
mockProcess.exitCodeCompleter.complete(0);
79-
processRunner.processToReturn = mockProcess;
8073
await runCapturingPrint(runner, <String>['analyze']);
8174

8275
expect(
@@ -96,9 +89,6 @@ void main() {
9689
test('uses a separate analysis sdk', () async {
9790
final Directory pluginDir = createFakePlugin('a', packagesDir);
9891

99-
final MockProcess mockProcess = MockProcess();
100-
mockProcess.exitCodeCompleter.complete(0);
101-
processRunner.processToReturn = mockProcess;
10292
await runCapturingPrint(
10393
runner, <String>['analyze', '--analysis-sdk', 'foo/bar/baz']);
10494

@@ -124,25 +114,46 @@ void main() {
124114
createFakePlugin('foo', packagesDir,
125115
extraFiles: <String>['analysis_options.yaml']);
126116

127-
await expectLater(() => runCapturingPrint(runner, <String>['analyze']),
128-
throwsA(isA<ToolExit>()));
117+
Error? commandError;
118+
final List<String> output = await runCapturingPrint(
119+
runner, <String>['analyze'], errorHandler: (Error e) {
120+
commandError = e;
121+
});
122+
123+
expect(commandError, isA<ToolExit>());
124+
expect(
125+
output,
126+
containsAllInOrder(<Matcher>[
127+
contains(
128+
'Found an extra analysis_options.yaml at /packages/foo/analysis_options.yaml'),
129+
]),
130+
);
129131
});
130132

131133
test('fails .analysis_options', () async {
132134
createFakePlugin('foo', packagesDir,
133135
extraFiles: <String>['.analysis_options']);
134136

135-
await expectLater(() => runCapturingPrint(runner, <String>['analyze']),
136-
throwsA(isA<ToolExit>()));
137+
Error? commandError;
138+
final List<String> output = await runCapturingPrint(
139+
runner, <String>['analyze'], errorHandler: (Error e) {
140+
commandError = e;
141+
});
142+
143+
expect(commandError, isA<ToolExit>());
144+
expect(
145+
output,
146+
containsAllInOrder(<Matcher>[
147+
contains(
148+
'Found an extra analysis_options.yaml at /packages/foo/.analysis_options'),
149+
]),
150+
);
137151
});
138152

139153
test('takes an allow list', () async {
140154
final Directory pluginDir = createFakePlugin('foo', packagesDir,
141155
extraFiles: <String>['analysis_options.yaml']);
142156

143-
final MockProcess mockProcess = MockProcess();
144-
mockProcess.exitCodeCompleter.complete(0);
145-
processRunner.processToReturn = mockProcess;
146157
await runCapturingPrint(
147158
runner, <String>['analyze', '--custom-analysis', 'foo']);
148159

@@ -161,14 +172,55 @@ void main() {
161172
createFakePlugin('foo', packagesDir,
162173
extraFiles: <String>['analysis_options.yaml']);
163174

164-
final MockProcess mockProcess = MockProcess();
165-
mockProcess.exitCodeCompleter.complete(0);
166-
processRunner.processToReturn = mockProcess;
167-
168175
await expectLater(
169176
() => runCapturingPrint(
170177
runner, <String>['analyze', '--custom-analysis', '']),
171178
throwsA(isA<ToolExit>()));
172179
});
173180
});
181+
182+
test('fails if "packages get" fails', () async {
183+
createFakePlugin('foo', packagesDir);
184+
185+
processRunner.mockProcessesForExecutable['flutter'] = <io.Process>[
186+
MockProcess.failing() // flutter packages get
187+
];
188+
189+
Error? commandError;
190+
final List<String> output = await runCapturingPrint(
191+
runner, <String>['analyze'], errorHandler: (Error e) {
192+
commandError = e;
193+
});
194+
195+
expect(commandError, isA<ToolExit>());
196+
expect(
197+
output,
198+
containsAllInOrder(<Matcher>[
199+
contains('Unable to get dependencies'),
200+
]),
201+
);
202+
});
203+
204+
test('fails if "analyze" fails', () async {
205+
createFakePlugin('foo', packagesDir);
206+
207+
processRunner.mockProcessesForExecutable['dart'] = <io.Process>[
208+
MockProcess.failing() // dart analyze
209+
];
210+
211+
Error? commandError;
212+
final List<String> output = await runCapturingPrint(
213+
runner, <String>['analyze'], errorHandler: (Error e) {
214+
commandError = e;
215+
});
216+
217+
expect(commandError, isA<ToolExit>());
218+
expect(
219+
output,
220+
containsAllInOrder(<Matcher>[
221+
contains('The following packages had errors:'),
222+
contains(' foo'),
223+
]),
224+
);
225+
});
174226
}

0 commit comments

Comments
 (0)