// 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 Future<int> exitCode
///
/// Returns a Future which completes with the exit code of the process when the
/// process completes.
///
/// The handling of exit codes is platform specific.
///
/// On Linux and OS X a normal exit code will be a positive value in the range
/// 0..255. 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. For example, if a process crashes due to a
/// segmentation violation the exit code will be -11, as the signal SIGSEGV has
/// the number 11.
///
/// On Windows a process can report any 32-bit value as an exit code. When
/// returning the exit code this exit code is turned into a signed value. Some
/// special values are used to report termination due to some system event. E.g.
/// if a process crashes due to an access violation the 32-bit exit code is
/// 0xc0000005, which will be returned as the negative number -1073741819. To get
/// the original 32-bit value use (0x100000000 + exitCode) & 0xffffffff.
///
/// @description Checks that [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) {
    process.kill(ProcessSignal.sigterm);

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