@@ -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-
2619class _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
352354final 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-
374362extension on TestEvent {
375363 bool shouldCancelTimer () {
376364 final event = this ;
0 commit comments