blob: 1ec4af4e7982d518e83788b8a3d6d3a3d66950fe [file] [log] [blame]
// Copyright (c) 2013, 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.
// This test forks a second vm process that runs the script tools/coverage.dart
// and verifies that the coverage tool produces its expected output.
// This test is mainly here to ensure that the coverage tool compiles and
// runs.
import "dart:async";
import "dart:convert";
import "dart:io";
import "package:path/path.dart";
// Coverage tool script relative to the path of this test.
var coverageToolScript = "../../tools/coverage.dart";
// Coverage target script relative to this test.
var coverageTargetScript = "../language/hello_dart_test.dart";
var targPath;
Process coverageToolProcess;
List sourceLines;
int nextLineToMatch = 0;
void onCoverageOutput(String line) {
print("COV: $line");
if (nextLineToMatch < sourceLines.length) {
if (line.endsWith("|" + sourceLines[nextLineToMatch])) {
nextLineToMatch++;
}
}
}
bool checkExitCode(exitCode) {
var pid = coverageToolProcess.pid;
print("Coverage tool process (pid $pid) terminated with "
"exit code $exitCode.");
return exitCode == 0;
}
void checkSuccess() {
if (nextLineToMatch == sourceLines.length) {
print("Successfully matched all lines of '$targPath'");
} else {
print("Error: could not match all source code lines of '$targPath'");
exit(-1);
}
}
void main() {
// Compute paths for coverage tool and coverage target relative
// the the path of this script.
var scriptPath = dirname(Platform.script.toFilePath());
var toolPath = normalize(join(scriptPath, coverageToolScript));
targPath = normalize(join(scriptPath, coverageTargetScript));
sourceLines = new File(targPath).readAsLinesSync();
assert(sourceLines != null);
var processOpts = [ "--compile_all", toolPath, targPath ];
Process.start(Platform.executable, processOpts).then((Process process) {
coverageToolProcess = process;
coverageToolProcess.stdin.close();
var stdoutStringStream = coverageToolProcess.stdout
.transform(UTF8.decoder)
.transform(new LineSplitter());
var stderrStringStream = coverageToolProcess.stderr
.transform(UTF8.decoder)
.transform(new LineSplitter());
// Wait for 3 future events: stdout and stderr streams of the coverage
// tool process closed, and coverage tool process terminated.
var futures = [];
var subscription = stdoutStringStream.listen(onCoverageOutput);
futures.add(subscription.asFuture(true));
subscription = stderrStringStream.listen(onCoverageOutput);
futures.add(subscription.asFuture(true));
futures.add(coverageToolProcess.exitCode.then(checkExitCode));
Future.wait(futures).then((results) {
checkSuccess();
if (results.contains(false)) exit(-1);
});
});
}