// 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.

// @dart = 2.9

// 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);
      }
    });
  });
}
