// 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 errors during startup of the process.

// @dart = 2.9

import 'dart:async';
import 'dart:io';
import "package:expect/expect.dart";

// ENOENT and ERROR_FILE_NOT_FOUND on Windows both have the same value.
// Note: we are setting PATH to an empty string in tests below because on
// POSIX systems if target binary name does not contain `/` then it is
// searched through PATH and if it is not found anywhere in the PATH
// but some folder in PATH is inaccessible then underlying execvp(...)
// call will return EACCES (13) instead of ENOENT.
// For example on some Android devices PATH would include /sbin with is
// inaccessible - so this test will fail.
const ENOENT = 2;

testStartError() {
  Future<Process> processFuture = Process.start(
      "__path_to_something_that_should_not_exist__", const [],
      environment: {"PATH": ""});
  processFuture
      .then((p) => Expect.fail('got process despite start error'))
      .catchError((error, stackTrace) {
    Expect.isTrue(error is ProcessException);
    Expect.equals(ENOENT, error.errorCode, error.toString());
    Expect.notEquals(stackTrace.toString(), '');
  });
}

testRunError() {
  Future<ProcessResult> processFuture = Process.run(
      "__path_to_something_that_should_not_exist__", const [],
      environment: {"PATH": ""});

  processFuture
      .then((result) => Expect.fail("exit handler called"))
      .catchError((error) {
    Expect.isTrue(error is ProcessException);
    Expect.equals(ENOENT, error.errorCode, error.toString());
  });
}

main() {
  testStartError();
  testRunError();
}
