1+ // ignore_for_file: public_member_api_docs
2+
13part of 'cli.dart' ;
24
35const _testOptimizerFileName = '.test_optimizer.dart' ;
46
7+ abstract class ProcessSignalOverrides {
8+ static final _token = Object ();
9+ StreamController <ProcessSignal >? _sigintStreamController;
10+
11+ static ProcessSignalOverrides ? get current {
12+ return Zone .current[_token] as ProcessSignalOverrides ? ;
13+ }
14+
15+ static R runZoned <R >(
16+ R Function () body, {
17+ Stream <ProcessSignal >? sigintStream,
18+ }) {
19+ final overrides = _ProcessSignalOverridesScope (sigintStream);
20+ return _asyncRunZoned (body, zoneValues: {_token: overrides});
21+ }
22+
23+ Stream <ProcessSignal >? get sigintWatch;
24+
25+ void addSIGINT () {
26+ _sigintStreamController? .add (ProcessSignal .sigint);
27+ }
28+ }
29+
30+ class _ProcessSignalOverridesScope extends ProcessSignalOverrides {
31+ _ProcessSignalOverridesScope (Stream <ProcessSignal >? mockSigintStream) {
32+ if (mockSigintStream != null ) {
33+ _sigintStreamController = StreamController <ProcessSignal >();
34+ }
35+ }
36+
37+ @override
38+ Stream <ProcessSignal >? get sigintWatch {
39+ return _sigintStreamController? .stream;
40+ }
41+ }
42+
543/// Thrown when `flutter pub get` is executed without a `pubspec.yaml` .
644class PubspecNotFound implements Exception {}
745
@@ -211,9 +249,7 @@ class Flutter {
211249 stderr: stderr ?? noop,
212250 ).whenComplete (() async {
213251 if (optimizePerformance) {
214- File (p.join (cwd, 'test' , _testOptimizerFileName))
215- .delete ()
216- .ignore ();
252+ await _cleanupOptimizerFile (cwd);
217253 }
218254
219255 if (collectCoverage) {
@@ -325,6 +361,8 @@ Future<int> _flutterTest({
325361 final groups = < int , TestGroup > {};
326362 final tests = < int , Test > {};
327363 final failedTestErrorMessages = < String , List <String >> {};
364+ final sigintWatch = ProcessSignalOverrides .current? .sigintWatch ??
365+ ProcessSignal .sigint.watch ();
328366
329367 var successCount = 0 ;
330368 var skipCount = 0 ;
@@ -351,6 +389,15 @@ Future<int> _flutterTest({
351389 );
352390
353391 late final StreamSubscription <TestEvent > subscription;
392+ late final StreamSubscription <ProcessSignal > sigintWatchSubscription;
393+
394+ sigintWatchSubscription = sigintWatch.listen ((_) async {
395+ await _cleanupOptimizerFile (cwd);
396+ await subscription.cancel ();
397+ await sigintWatchSubscription.cancel ();
398+ return completer.complete (ExitCode .success.code);
399+ });
400+
354401 subscription = testRunner (
355402 workingDirectory: cwd,
356403 arguments: [
@@ -483,6 +530,8 @@ Future<int> _flutterTest({
483530 if (event is ExitTestEvent ) {
484531 if (completer.isCompleted) return ;
485532 subscription.cancel ();
533+ sigintWatchSubscription.cancel ();
534+
486535 completer.complete (
487536 event.exitCode == ExitCode .success.code
488537 ? ExitCode .success.code
@@ -506,6 +555,10 @@ String? _topGroupName(Test test, Map<int, TestGroup> groups) => test.groupIDs
506555 .map ((groupID) => groups[groupID]? .name)
507556 .firstWhereOrNull ((groupName) => groupName? .isNotEmpty ?? false );
508557
558+ Future <void > _cleanupOptimizerFile (String cwd) async => File (
559+ p.join (cwd, 'test' , _testOptimizerFileName),
560+ ).delete ().ignore ();
561+
509562final int _lineLength = () {
510563 try {
511564 return stdout.terminalColumns;
0 commit comments