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