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