// Copyright (c) 2012, 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.
//
// Process test program to test process communication.

// @dart = 2.9

library ProcessKillTest;

import 'dart:io';

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

import "process_test_util.dart";

testKill() {
  asyncStart();
  // Start a process that will hang waiting for input until killed.
  Process.start(getProcessTestFileName(), const ["0", "1", "0", "0"]).then((p) {
    p.exitCode.then((exitCode) {
      // Process killed from the side so exit code is not 0.
      Expect.isTrue(exitCode != 0);
      // Killing a process that is already dead returns false.
      Expect.isFalse(p.kill());
      asyncEnd();
    });
    Expect.isTrue(p.kill());
  });
}

testKillPid() {
  asyncStart();
  // Start a process that will hang waiting for input until killed.
  Process.start(getProcessTestFileName(), const ["0", "1", "0", "0"]).then((p) {
    p.exitCode.then((exitCode) {
      // Process killed from the side so exit code is not 0.
      Expect.isTrue(exitCode != 0);
      // Killing a process that is already dead returns false.
      Expect.isFalse(Process.killPid(p.pid));
      asyncEnd();
    });
    Expect.isTrue(Process.killPid(p.pid));
  });
}

main() {
  testKill();
  testKillPid();
}
