/*
 * Copyright (c) 2017, 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.
 */
/**
 * @assertion bool kill([ProcessSignal signal = ProcessSignal.sigterm ])
 *
 * Kills the process.
 *
 * Where possible, sends the signal to the process. This includes Linux and
 * OS X. The default signal is ProcessSignal.sigterm which will normally
 * terminate the process.
 *
 * On platforms without signal support, including Windows, the call just
 * terminates the process in a platform specific way, and the signal parameter
 * is ignored.
 *
 * Returns true if the signal is successfully delivered to the process.
 * Otherwise the signal could not be sent, usually meaning that the process is
 * already dead.
 *
 * @description Checks that method [kill] kills the process and [exitCode]
 * returns a Future which completes with the exit code of the process when the
 * process completes. On Linux and OS X if the process was terminated due to a
 * signal  the exit code will be a negative value in the range -255..-1, where
 * the absolute value of the exit code is the signal number. If the process is
 * killed with ProcessSignal.sigterm the exit code is -15, as the signal SIGTERM
 * has number 15.
 * @author ngl@unipro.ru
 */
import "dart:io";
import "../../../Utils/expect.dart";

String command = "";
List<String> args = new List<String>.empty(growable: true);

void setCommand() {
  if (Platform.isWindows) {
    command = 'ping';
    args = ['127.0.0.1 -n 6 > nul'];
  } else {
    command = 'sleep';
    args = ['5'];
  }
}

main() {
  setCommand();
  asyncStart();
  Process.start(command, args).then((Process process) {
    bool pKill = process.kill();
    if (!Platform.isWindows) {
      Expect.isTrue(pKill);
    }

    process.exitCode.then((int value) {
      if (Platform.isLinux || Platform.isMacOS) {
        Expect.equals(-15, value);
      } else if (Platform.isWindows) {
        Expect.equals(1, value);
      }
      pKill = process.kill(ProcessSignal.sigterm);
      Expect.isFalse(pKill);
      asyncEnd();
    });
  });
}
