// 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.

// @dart = 2.9

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:expect/expect.dart';

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>();
  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;
}
