// Copyright (c) 2015, 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=verbose_gc_to_bmu_script.dart

// This test forks a second vm process that runs the BMU tool and verifies that
// it produces some output. This test is mainly here to ensure that the BMU
// tool compiles and runs.

import "dart:async";
import "dart:convert";
import "dart:io";

import "package:path/path.dart";

// Tool script relative to the path of this test.
var toolScript = Uri.parse(Platform.executable)
    .resolve("../../runtime/tools/verbose_gc_to_bmu.dart")
    .toFilePath();

// Target script relative to this test.
var targetScript =
    Platform.script.resolve("verbose_gc_to_bmu_script.dart").toFilePath();
const minOutputLines = 20;

void checkExitCode(targetResult) {
  if (exitCode != 0) {
    print("Process terminated with exit code ${exitCode}.");
    exit(-1);
  }
}

void main() {
  // Compute paths for tool and target relative to the path of this script.
  var targetResult =
      Process.runSync(Platform.executable, ["--verbose_gc", targetScript]);
  checkExitCode(targetResult);
  var gcLog = targetResult.stderr;
  Process.start(Platform.executable, [toolScript]).then((Process process) {
    // Feed the GC log of the target to the BMU tool.
    process.stdin.write(gcLog);
    process.stdin.close();
    var stdoutStringStream =
        process.stdout.transform(utf8.decoder).transform(new LineSplitter());
    var stderrStringStream =
        process.stderr.transform(utf8.decoder).transform(new LineSplitter());
    // Wait for 3 future events: stdout and stderr streams closed, and
    // process terminated.
    var futures = <Future>[];
    var stdoutLines = [];
    var stderrLines = [];
    var subscription = stdoutStringStream.listen(stdoutLines.add);
    futures.add(subscription.asFuture(true));
    subscription = stderrStringStream.listen(stderrLines.add);
    futures.add(subscription.asFuture(true));
    futures.add(process.exitCode.then(checkExitCode));
    Future.wait(futures).then((results) {
      if (stderrLines.isNotEmpty) {
        print("Unexpected output on stderr:");
        print(stderrLines.join('\n'));
        exit(-1);
      }
      if (stdoutLines.length < minOutputLines) {
        print("Less than expected output on stdout:");
        print(stdoutLines.join('\n'));
        exit(-1);
      }
    });
  });
}
