// Copyright (c) 2018, 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.

// OtherResources=process_inherit_stdio_script.dart

// Process test program to test 'inherit stdio' processes.

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

import "process_test_util.dart";

main() {
  asyncStart();
  // process_inherit_stdio_script.dart spawns a process in INHERIT_STDIO mode
  // that prints to its stdout. Since that child process inherits the stdout
  // of the process spawned here, we should see it.
  var script =
      Platform.script.resolve('process_inherit_stdio_script.dart').toFilePath();
  var future = Process.start(Platform.executable, [script, "foo"]);
  Completer<String> s = new Completer();
  future.then((process) {
    StringBuffer buf = new StringBuffer();
    process.stdout.transform(UTF8.decoder).listen((data) {
      buf.write(data);
    }, onDone: () {
      s.complete(buf.toString());
    });
  });
  s.future.then((String result) {
    Expect.isTrue(result.contains("foo"));
    asyncEnd();
  });
}
