diff --git a/pkgs/coverage/CHANGELOG.md b/pkgs/coverage/CHANGELOG.md index 26f242d03..3c843f3f8 100644 --- a/pkgs/coverage/CHANGELOG.md +++ b/pkgs/coverage/CHANGELOG.md @@ -1,7 +1,9 @@ -## 1.13.0-wip +## 1.13.0 - Introduced support for minimum coverage thresholds using --fail-under flag in format_coverage. +- Fix a bug where we attempt to resume an isolate after the VM service has been + shut down. ## 1.12.0 diff --git a/pkgs/coverage/README.md b/pkgs/coverage/README.md index 81736a4de..2963c6a97 100644 --- a/pkgs/coverage/README.md +++ b/pkgs/coverage/README.md @@ -1,7 +1,7 @@ Coverage provides coverage data collection, manipulation, and formatting for Dart. -[![Build Status](https://github.com/dart-lang/tools/actions/workflows/coverage.yml/badge.svg)](https://github.com/dart-lang/tools/actions/workflows/coverage.yml) +[![Build Status](https://github.com/dart-lang/tools/actions/workflows/coverage.yaml/badge.svg)](https://github.com/dart-lang/tools/actions/workflows/coverage.yaml) [![Coverage Status](https://coveralls.io/repos/github/dart-lang/tools/badge.svg?branch=main)](https://coveralls.io/github/dart-lang/tools?branch=main) [![Pub](https://img.shields.io/pub/v/coverage.svg)](https://pub.dev/packages/coverage) diff --git a/pkgs/coverage/lib/src/isolate_paused_listener.dart b/pkgs/coverage/lib/src/isolate_paused_listener.dart index 28894f772..915acf50e 100644 --- a/pkgs/coverage/lib/src/isolate_paused_listener.dart +++ b/pkgs/coverage/lib/src/isolate_paused_listener.dart @@ -89,13 +89,15 @@ class IsolatePausedListener { } else { final isLastIsolateInGroup = group.noRunningIsolates; if (isLastIsolateInGroup) { - _getGroup(isolateRef).collected = true; + group.collected = true; } try { await _onIsolatePaused(isolateRef, isLastIsolateInGroup); } finally { group.exit(isolateRef); - await _service.resume(isolateRef.id!); + if (!_finishedListening) { + await _service.resume(isolateRef.id!); + } } } } diff --git a/pkgs/coverage/pubspec.yaml b/pkgs/coverage/pubspec.yaml index 2de3f074d..621832101 100644 --- a/pkgs/coverage/pubspec.yaml +++ b/pkgs/coverage/pubspec.yaml @@ -1,5 +1,5 @@ name: coverage -version: 1.13.0-wip +version: 1.13.0 description: Coverage data manipulation and formatting repository: https://github.com/dart-lang/tools/tree/main/pkgs/coverage issue_tracker: https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Acoverage diff --git a/pkgs/coverage/test/isolate_paused_listener_test.dart b/pkgs/coverage/test/isolate_paused_listener_test.dart index dc77408ef..53134db08 100644 --- a/pkgs/coverage/test/isolate_paused_listener_test.dart +++ b/pkgs/coverage/test/isolate_paused_listener_test.dart @@ -485,6 +485,7 @@ void main() { late Future allIsolatesExited; late List received; + Future Function(String)? delayTheOnPauseCallback; late bool stopped; void startEvent(String id, String groupId, [String? name]) => @@ -522,6 +523,7 @@ void main() { when(service.getVM()).thenAnswer((_) async => VM()); received = []; + delayTheOnPauseCallback = null; when(service.resume(any)).thenAnswer((invocation) async { final id = invocation.positionalArguments[0]; received.add('Resume $id'); @@ -535,6 +537,10 @@ void main() { expect(stopped, isFalse); received.add('Pause ${iso.id}. Collect group ${iso.isolateGroupId}? ' '${isLastIsolateInGroup ? 'Yes' : 'No'}'); + if (delayTheOnPauseCallback != null) { + await delayTheOnPauseCallback!(iso.id!); + received.add('Pause done ${iso.id}'); + } }, (message) => received.add(message), ).waitUntilAllExited(); @@ -849,5 +855,39 @@ void main() { 'Resume C', ]); }); + + test('main isolate paused during other isolate pause callback', () async { + final delayingB = Completer(); + delayTheOnPauseCallback = (String isoId) async { + if (isoId == 'B') await delayingB.future; + }; + + startEvent('A', '1', 'main'); + startEvent('B', '2'); + pauseEvent('B', '2'); + pauseEvent('A', '1', 'main'); + + while (received.length < 4) { + await Future.delayed(Duration.zero); + } + + expect(received, [ + 'Pause B. Collect group 2? Yes', + 'Pause A. Collect group 1? Yes', + 'Pause done A', + 'Resume A', + ]); + + delayingB.complete(); + await endTest(); + expect(received, [ + 'Pause B. Collect group 2? Yes', + 'Pause A. Collect group 1? Yes', + 'Pause done A', + 'Resume A', + 'Pause done B', + // Don't try to resume B, because the VM service is already shut down. + ]); + }); }); }