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