Index: dart/tests/standalone/coverage_test.dart |
=================================================================== |
--- dart/tests/standalone/coverage_test.dart (revision 0) |
+++ dart/tests/standalone/coverage_test.dart (revision 0) |
@@ -0,0 +1,89 @@ |
+// 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:io"; |
+import "dart:async"; |
+ |
+// 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() { |
+ var options = new Options(); |
+ |
+ // Compute paths for coverage tool and coverage target relative |
+ // the the path of this script. |
+ var scriptPath = new Path(options.script).directoryPath; |
+ var toolPath = scriptPath.join(new Path(coverageToolScript)).canonicalize(); |
+ targPath = scriptPath.join(new Path(coverageTargetScript)).canonicalize(); |
+ |
+ sourceLines = new File(targPath.toNativePath()).readAsLinesSync(); |
+ assert(sourceLines != null); |
+ |
+ var processOpts = [ "--compile_all", |
+ toolPath.toNativePath(), |
+ targPath.toNativePath() ]; |
+ |
+ Process.start(options.executable, processOpts).then((Process process) { |
+ coverageToolProcess = process; |
+ coverageToolProcess.stdin.close(); |
+ var stdoutStringStream = coverageToolProcess.stdout |
+ .transform(new StringDecoder()) |
+ .transform(new LineTransformer()); |
+ |
+ var stderrStringStream = coverageToolProcess.stderr |
+ .transform(new StringDecoder()) |
+ .transform(new LineTransformer()); |
+ |
+ // 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); |
+ }); |
+ }); |
+} |