Index: utils/testrunner/layout_test_controller.dart |
diff --git a/utils/testrunner/layout_test_controller.dart b/utils/testrunner/layout_test_controller.dart |
deleted file mode 100644 |
index 31a35cf702c903a50b180ab78749ed23e612adab..0000000000000000000000000000000000000000 |
--- a/utils/testrunner/layout_test_controller.dart |
+++ /dev/null |
@@ -1,368 +0,0 @@ |
-// Copyright (c) 2012, 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. |
- |
-// The following set of variables should be set by the caller that |
-// #sources this file. |
-/** Whether to include elapsed time. */ |
- |
-part of test_controller; |
- |
-bool includeTime; |
- |
-/** Path to DRT executable. */ |
-String drt; |
- |
-/** Whether to regenerate layout test files. */ |
-bool regenerate; |
- |
-/** Whether to output test summary. */ |
-bool summarize; |
- |
-/** Whether to print results immediately as they come in. */ |
-bool immediate; |
- |
-/** Format strings to use for test result messages. */ |
-String passFormat, failFormat, errorFormat, listFormat; |
- |
-/** Location of the running test file. */ |
-String sourceDir; |
- |
-/** Path of the running test file. */ |
-String testfile; |
- |
-/** URL of the child test file. */ |
-String baseUrl; |
- |
-/** The print function to use. */ |
-Function tprint; |
- |
-/** A callback function to notify the caller we are done. */ |
-Function notifyDone; |
- |
-// Variable below here are local to this file. |
-var passCount = 0, failCount = 0, errorCount = 0; |
-DateTime start; |
- |
-class Macros { |
- static const String testTime = '<TIME>'; |
- static const String testfile = '<FILENAME>'; |
- static const String testGroup = '<GROUPNAME>'; |
- static const String testDescription = '<TESTNAME>'; |
- static const String testMessage = '<MESSAGE>'; |
- static const String testStacktrace = '<STACK>'; |
-} |
- |
-String formatMessage(filename, groupname, |
- [testname = '', testTime = '', result = '', |
- message = '', stack = '']) { |
- var format = errorFormat; |
- if (result == 'pass') format = passFormat; |
- else if (result == 'fail') format = failFormat; |
- return format. |
- replaceAll(Macros.testTime, testTime). |
- replaceAll(Macros.testfile, filename). |
- replaceAll(Macros.testGroup, groupname). |
- replaceAll(Macros.testDescription, testname). |
- replaceAll(Macros.testMessage, message). |
- replaceAll(Macros.testStacktrace, stack); |
-} |
- |
-void outputResult(start, label, result, [message = '']) { |
- var idx = label.lastIndexOf('###'); |
- var group = '', test = ''; |
- if (idx >= 0) { |
- group = '${label.substring(0, idx).replaceAll("###", " ")} '; |
- test = '${label.substring(idx+3)} '; |
- } else { |
- test = '$label '; |
- } |
- var elapsed = ''; |
- if (includeTime) { |
- var end = new DateTime.now(); |
- double duration = (end.difference(start)).inMilliseconds.toDouble(); |
- duration /= 1000; |
- elapsed = '${duration.toStringAsFixed(3)}s '; |
- } |
- tprint(formatMessage('$testfile ', group, test, elapsed, result, message)); |
-} |
- |
-pass(start, label) { |
- ++passCount; |
- outputResult(start, label, 'pass'); |
-} |
- |
-fail(start, label, message) { |
- ++failCount; |
- outputResult(start, label, 'fail', message); |
-} |
- |
-error(start, label, message) { |
- ++errorCount; |
- outputResult(start, label, 'error', message); |
-} |
- |
-void printSummary(String testFile, int passed, int failed, int errors, |
- [String uncaughtError = '']) { |
- tprint(''); |
- if (passed == 0 && failed == 0 && errors == 0) { |
- tprint('$testFile: No tests found.'); |
- } else if (failed == 0 && errors == 0 && uncaughtError == null) { |
- tprint('$testFile: All $passed tests passed.'); |
- } else { |
- if (uncaughtError != null) { |
- tprint('$testFile: Top-level uncaught error: $uncaughtError'); |
- } |
- tprint('$testFile: $passed PASSED, $failed FAILED, $errors ERRORS'); |
- } |
-} |
- |
-complete() { |
- if (summarize) { |
- printSummary(testfile, passCount, failCount, errorCount); |
- } |
- notifyDone(failCount > 0 ? -1 : 0); |
-} |
- |
-/* |
- * Run an external process [cmd] with command line arguments [args]. |
- * [timeout] can be used to forcefully terminate the process after |
- * some number of seconds. This is used by runCommand and startProcess. |
- * If [procId] is non-zero (i.e. called from startProcess) then a reference |
- * to the [Process] will be put in a map with key [procId]; in this case |
- * the process can be terminated later by calling [stopProcess] and |
- * passing in the [procId]. |
- * [outputMonitor] is an optional function that will be called back with each |
- * line of output from the process. |
- * Returns a [Future] for when the process terminates. |
- */ |
-Future _processHelper(String command, List<String> args, |
- List stdout, List stderr, |
- int timeout, int procId, Function outputMonitor, bool raw) { |
- var timer = null; |
- return Process.start(command, args).then((process) { |
- |
- timer = new Timer(new Duration(seconds: timeout), () { |
- timer = null; |
- process.kill(); |
- }); |
- |
- if (raw) { |
- process.stdout.listen((c) { stdout.addAll(c); }); |
- } else { |
- _pipeStream(process.stdout, stdout, outputMonitor); |
- } |
- _pipeStream(process.stderr, stderr, outputMonitor); |
- return process.exitCode; |
- }).then((exitCode) { |
- if (timer != null) { |
- timer.cancel(); |
- } |
- return exitCode; |
- }) |
- .catchError((e) { |
- stderr.add("#Error starting process $command: ${e.error}"); |
- }); |
-} |
- |
-void _pipeStream(Stream stream, List<String> destination, |
- Function outputMonitor) { |
- stream |
- .transform(UTF8.decoder) |
- .transform(new LineTransformer()) |
- .listen((String line) { |
- if (outputMonitor != null) { |
- outputMonitor(line); |
- } |
- destination.add(line); |
- }); |
-} |
- |
-/** |
- * Run an external process [cmd] with command line arguments [args]. |
- * [timeout] can be used to forcefully terminate the process after |
- * some number of seconds. |
- * Returns a [Future] for when the process terminates. |
- */ |
-Future runCommand(String command, List<String> args, |
- List stdout, List stderr, |
- {int timeout: 300, Function outputMonitor, |
- bool raw: false}) { |
- return _processHelper(command, args, stdout, stderr, |
- timeout, 0, outputMonitor, raw); |
-} |
- |
-String parseLabel(String line) { |
- if (line.startsWith('CONSOLE MESSAGE')) { |
- var idx = line.indexOf('#TEST '); |
- if (idx > 0) { |
- return line.substring(idx + 6); |
- } |
- } |
- return null; |
-} |
- |
-runTextLayoutTest(testNum) { |
- var url = '$baseUrl?test=$testNum'; |
- var stdout = new List(); |
- var stderr = new List(); |
- start = new DateTime.now(); |
- runCommand(drt, [url], stdout, stderr).then((e) { |
- if (stdout.length > 0 && stdout[stdout.length-1].startsWith('#EOF')) { |
- stdout.removeLast(); |
- } |
- var done = false; |
- var i = 0; |
- var label = null; |
- var contentMarker = 'layer at '; |
- while (i < stdout.length) { |
- if (label == null && (label = parseLabel(stdout[i])) != null) { |
- if (label == 'NONEXISTENT') { |
- complete(); |
- return; |
- } |
- } else if (stdout[i].startsWith(contentMarker)) { |
- if (label == null) { |
- complete(); |
- return; |
- } |
- var expectedFileName = |
- '$sourceDir${Platform.pathSeparator}' |
- '${label.replaceAll("###", "_") |
- .replaceAll(new RegExp("[^A-Za-z0-9]"),"_")}.txt'; |
- var expected = new File(expectedFileName); |
- if (regenerate) { |
- var osink = expected.openWrite(); |
- while (i < stdout.length) { |
- osink.write(stdout[i]); |
- osink.write('\n'); |
- i++; |
- } |
- osink.close(); |
- pass(start, label); |
- } else if (!expected.existsSync()) { |
- fail(start, label, 'No expectation file'); |
- } else { |
- var lines = expected.readAsLinesSync(); |
- var actualLength = stdout.length - i; |
- var compareCount = min(lines.length, actualLength); |
- var match = true; |
- for (var j = 0; j < compareCount; j++) { |
- if (lines[j] != stdout[i + j]) { |
- fail(start, label, 'Expectation differs at line ${j + 1}'); |
- match = false; |
- break; |
- } |
- } |
- if (match) { |
- if (lines.length != actualLength) { |
- fail(start, label, 'Expectation file has wrong length'); |
- } else { |
- pass(start, label); |
- } |
- } |
- } |
- done = true; |
- break; |
- } |
- i++; |
- } |
- if (label != null) { |
- if (!done) error(start, label, 'Failed to parse output'); |
- runTextLayoutTest(testNum + 1); |
- } |
- }); |
-} |
- |
-runPixelLayoutTest(int testNum) { |
- var url = '$baseUrl?test=$testNum'; |
- var stdout = new List(); |
- var stderr = new List(); |
- start = new DateTime.now(); |
- runCommand(drt, ["$url'-p"], stdout, stderr, raw:true).then((exitCode) { |
- var contentMarker = 'Content-Length: '; |
- var eol = '\n'.codeUnitAt(0); |
- var pos = 0; |
- var label = null; |
- var done = false; |
- |
- while(pos < stdout.length) { |
- StringBuffer sb = new StringBuffer(); |
- while (pos < stdout.length && stdout[pos] != eol) { |
- sb.writeCharCode(stdout[pos++]); |
- } |
- if (++pos >= stdout.length && line == '') break; |
- var line = sb.toString(); |
- |
- if (label == null && (label = parseLabel(line)) != null) { |
- if (label == 'NONEXISTENT') { |
- complete(); |
- } |
- } else if (line.startsWith(contentMarker)) { |
- if (label == null) { |
- complete(); |
- } |
- var len = int.parse(line.substring(contentMarker.length)); |
- var expectedFileName = |
- '$sourceDir${Platform.pathSeparator}' |
- '${label.replaceAll("###","_"). |
- replaceAll(new RegExp("[^A-Za-z0-9]"),"_")}.png'; |
- var expected = new File(expectedFileName); |
- if (regenerate) { |
- var osink = expected.openWrite(); |
- stdout.removeRange(0, pos); |
- stdout.length = len; |
- osink.add(stdout); |
- osink.close(); |
- pass(start, label); |
- } else if (!expected.existsSync()) { |
- fail(start, label, 'No expectation file'); |
- } else { |
- var bytes = expected.readAsBytesSync(); |
- if (bytes.length != len) { |
- fail(start, label, 'Expectation file has wrong length'); |
- } else { |
- var match = true; |
- for (var j = 0; j < len; j++) { |
- if (bytes[j] != stdout[pos + j]) { |
- fail(start, label, 'Expectation differs at byte ${j + 1}'); |
- match = false; |
- break; |
- } |
- } |
- if (match) pass(start, label); |
- } |
- } |
- done = true; |
- break; |
- } |
- } |
- if (label != null) { |
- if (!done) error(start, label, 'Failed to parse output'); |
- runPixelLayoutTest(testNum + 1); |
- } |
- }); |
-} |
- |
-void init() { |
- // Get the name of the directory that has the expectation files |
- // (by stripping .dart suffix from test file path). |
- // Create it if it does not exist. |
- sourceDir = testfile.substring(0, testfile.length - 5); |
- if (regenerate) { |
- var d = new Directory(sourceDir); |
- if (!d.existsSync()) { |
- d.createSync(); |
- } |
- } |
-} |
- |
-void runPixelLayoutTests() { |
- init(); |
- runPixelLayoutTest(0); |
-} |
- |
-void runTextLayoutTests() { |
- init(); |
- runTextLayoutTest(0); |
-} |