/*
 * 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<Process> start(
 *     String executable,
 *     List<String> arguments, {
 *     String workingDirectory,
 *     Map<String, String> environment,
 *     bool includeParentEnvironment: true,
 *     bool runInShell: false,
 *     ProcessStartMode mode: ProcessStartMode.normal
 * })
 *
 * If mode is ProcessStartMode.DETACHED_WITH_STDIO a detached process will be
 * created where the stdin, stdout and stderr are connected. The creator can
 * communicate with the child through these. The detached process will keep
 * running even if these communication channels are closed. The process' exit
 * code will not become available when it terminated.
 *
 * @description Checks that if mode is ProcessStartMode.DETACHED_WITH_STDIO a
 * detached process will be created where the stdin, stdout and stderr are
 * connected. The process' exit code will not become available when it
 * terminated.
 * @author ngl@unipro.ru
 * @issue 30945
 */
import "dart:convert";
import "dart:io";
import "dart:async";
import "../../../Utils/expect.dart";

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

void setCommand() {
  if (Platform.isWindows) {
    command = 'dart';
    args = ['--version'];
  } else {
    command = 'pwd';
    args = [];
  }
}

Future testEmpty(var stream) {
  return stream.toList().then((List errList) {
    Expect.equals(0, errList.length);
  });

}

Future testNotEmpty(var stream) {
  return stream.transform(utf8.decoder).transform(const LineSplitter()).
      toList().then((List outList) {
    Expect.isTrue(outList[0].length > 0);
  });
}

main() {
  setCommand();
  asyncStart();
  Process
      .start(command, args, mode: ProcessStartMode.detachedWithStdio)
      .then((Process process) {
    if (Platform.isWindows) {
      testEmpty(process.stdout).then((_) {
        testNotEmpty(process.stderr).then((_) {
          asyncEnd();
        });
      });

    } else {
      testEmpty(process.stderr).then((_) {
        testNotEmpty(process.stdout).then((_) {
          asyncEnd();
        });
      });
    }
  });
}
