| // Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:io'; |
| |
| import 'package:expect/expect.dart'; |
| |
| late Process process; |
| bool lastKill = false; |
| |
| Future<void> sigint(int iterations) async { |
| for (int i = 0; i < iterations; ++i) { |
| if (i + 1 == iterations) { |
| lastKill = true; |
| } |
| process.kill(ProcessSignal.sigint); |
| // Yield to the event loop to allow for the signal to be sent. |
| await Future.value(null); |
| } |
| } |
| |
| Future<void> main() async { |
| process = await Process.start( |
| Platform.resolvedExecutable, |
| [ |
| Platform.script.resolve('regress_42092_script.dart').toString(), |
| ], |
| ); |
| final startCompleter = Completer<void>(); |
| late StreamSubscription sub; |
| sub = process.stdout.transform(Utf8Decoder()).listen((event) { |
| if (event.contains('Waiting...')) { |
| startCompleter.complete(); |
| sub.cancel(); |
| } |
| }); |
| |
| // Wait for target script to setup its signal handling. |
| await startCompleter.future; |
| |
| final exitCompleter = Completer<void>(); |
| process.exitCode.then((code) { |
| Expect.isTrue(lastKill); |
| exitCompleter.complete(); |
| }); |
| await sigint(3); |
| await exitCompleter.future; |
| } |