Skip to content

Commit 78d549e

Browse files
authored
fix(test): coverage timeout (#375)
1 parent ba1cfa4 commit 78d549e

File tree

3 files changed

+15
-34
lines changed

3 files changed

+15
-34
lines changed

lib/src/cli/flutter_cli.dart

+14-26
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ class MinCoverageNotMet implements Exception {
1616
final double coverage;
1717
}
1818

19-
/// Thrown when `flutter test ---coverage --min-coverage value`
20-
/// does not generate the coverage file within the timeout threshold.
21-
class GenerateCoverageTimeout implements Exception {
22-
@override
23-
String toString() => 'Timed out waiting for coverage to be generated.';
24-
}
25-
2619
class _CoverageMetrics {
2720
const _CoverageMetrics._({this.totalHits = 0, this.totalFound = 0});
2821

@@ -191,7 +184,9 @@ class Flutter {
191184
recursive: recursive,
192185
);
193186

194-
if (collectCoverage) await lcovFile.ensureCreated();
187+
if (collectCoverage) {
188+
assert(lcovFile.existsSync(), 'coverage/lcov.info must exist');
189+
}
195190
if (minCoverage != null) {
196191
final records = await Parser.parse(lcovPath);
197192
final coverageMetrics = _CoverageMetrics.fromLcovRecords(
@@ -269,7 +264,7 @@ Future<int> _flutterTest({
269264
},
270265
);
271266

272-
final StreamSubscription<TestEvent> subscription;
267+
late final StreamSubscription<TestEvent> subscription;
273268
subscription = flutterTest(
274269
workingDirectory: cwd,
275270
arguments: [
@@ -335,18 +330,25 @@ Future<int> _flutterTest({
335330
: lightRed.wrap('Some tests failed.')!;
336331

337332
stdout('$clearLine${darkGray.wrap(timeElapsed)} $stats: $summary\n');
333+
}
334+
335+
if (event is ExitTestEvent) {
338336
if (completer.isCompleted) return;
337+
subscription.cancel();
339338
completer.complete(
340-
event.success == true
339+
event.exitCode == ExitCode.success.code
341340
? ExitCode.success.code
342341
: ExitCode.unavailable.code,
343342
);
344343
}
345344
},
346-
onError: completer.completeError,
345+
onError: (Object error, StackTrace stackTrace) {
346+
subscription.cancel();
347+
completer.completeError(error, stackTrace);
348+
},
347349
);
348350

349-
return completer.future.whenComplete(subscription.cancel);
351+
return completer.future;
350352
}
351353

352354
final int _lineLength = () {
@@ -357,20 +359,6 @@ final int _lineLength = () {
357359
}
358360
}();
359361

360-
extension on File {
361-
Future<void> ensureCreated({
362-
Duration timeout = const Duration(seconds: 10),
363-
Duration interval = const Duration(milliseconds: 50),
364-
}) async {
365-
var elapsedTime = Duration.zero;
366-
while (!existsSync()) {
367-
await Future<void>.delayed(interval);
368-
elapsedTime += interval;
369-
if (elapsedTime >= timeout) throw GenerateCoverageTimeout();
370-
}
371-
}
372-
}
373-
374362
extension on TestEvent {
375363
bool shouldCancelTimer() {
376364
final event = this;

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dependencies:
1818
universal_io: ^2.0.4
1919
usage: ^4.0.2
2020
very_good_analysis: ^2.4.0
21-
very_good_test_runner: ^0.1.1
21+
very_good_test_runner: ^0.1.2
2222

2323
dev_dependencies:
2424
build_runner: ^2.0.0

test/src/cli/flutter_cli_test.dart

-7
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,6 @@ void main() {
273273
when(() => logger.progress(any())).thenReturn(([_]) {});
274274
});
275275

276-
test('GenerateCoverageTimeout toString()', () {
277-
expect(
278-
GenerateCoverageTimeout().toString(),
279-
equals('Timed out waiting for coverage to be generated.'),
280-
);
281-
});
282-
283276
test('throws when there is no pubspec.yaml', () {
284277
expectLater(
285278
Flutter.test(cwd: Directory.systemTemp.path),

0 commit comments

Comments
 (0)