| Index: utils/testrunner/standard_test_runner.dart
|
| ===================================================================
|
| --- utils/testrunner/standard_test_runner.dart (revision 21957)
|
| +++ utils/testrunner/standard_test_runner.dart (working copy)
|
| @@ -2,9 +2,7 @@
|
| // 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.
|
|
|
| -// TODO(gram): dart2js is not handling 'part of' properly yet; when it does
|
| -// uncomment this.
|
| -//part of test_controller;
|
| +part of test_controller;
|
|
|
| /** Path to DRT executable. */
|
| String drt;
|
| @@ -40,6 +38,12 @@
|
| /** The action function to use. */
|
| Function action;
|
|
|
| +/**
|
| + * A special marker string used to separate group names and
|
| + * identify non-debug output.
|
| + */
|
| +final marker = '###';
|
| +
|
| class Macros {
|
| static const String testTime = '<TIME>';
|
| static const String testfile = '<FILENAME>';
|
| @@ -49,10 +53,12 @@
|
| static const String testStacktrace = '<STACK>';
|
| }
|
|
|
| -class TestRunnerConfiguration extends unittest.Configuration {
|
| +class TestRunnerConfiguration extends Configuration {
|
| get name => 'Minimal test runner configuration';
|
| get autoStart => false;
|
|
|
| + void onInit() {}
|
| +
|
| String formatMessage(filename, groupname,
|
| [ testname = '', testTime = '', result = '',
|
| message = '', stack = '' ]) {
|
| @@ -68,7 +74,7 @@
|
| replaceAll(Macros.testStacktrace, stack);
|
| }
|
|
|
| - String elapsed(unittest.TestCase t) {
|
| + String elapsed(TestCase t) {
|
| if (includeTime) {
|
| double duration = t.runningTime.inMilliseconds.toDouble();
|
| duration /= 1000;
|
| @@ -78,11 +84,11 @@
|
| }
|
| }
|
|
|
| - void dumpTestResult(source, unittest.TestCase t) {
|
| + void dumpTestResult(source, TestCase t) {
|
| var groupName = '', testName = '';
|
| - var idx = t.description.lastIndexOf('###');
|
| + var idx = t.description.lastIndexOf(marker);
|
| if (idx >= 0) {
|
| - groupName = t.description.substring(0, idx).replaceAll('###', ' ');
|
| + groupName = t.description.substring(0, idx).replaceAll(marker, ' ');
|
| testName = t.description.substring(idx+3);
|
| } else {
|
| testName = t.description;
|
| @@ -94,7 +100,7 @@
|
| duration, t.result, message, stack));
|
| }
|
|
|
| - void onTestResult(unittest.TestCase testCase) {
|
| + void onTestResult(TestCase testCase) {
|
| if (immediate) {
|
| dumpTestResult('$testfile ', testCase);
|
| }
|
| @@ -116,7 +122,7 @@
|
| }
|
|
|
| void onSummary(int passed, int failed, int errors,
|
| - List<unittest.TestCase> results, String uncaughtError) {
|
| + List<TestCase> results, String uncaughtError) {
|
| if (!immediate) {
|
| for (final testCase in results) {
|
| dumpTestResult('$testfile ', testCase);
|
| @@ -134,12 +140,6 @@
|
| }
|
| }
|
|
|
| -// Support for listing tests and groups. We use a minimal config.
|
| -class MinimalTestRunnerConfiguration extends unittest.Configuration {
|
| - get name => 'Minimal test runner configuration';
|
| - get autoStart => false;
|
| -}
|
| -
|
| String formatListMessage(filename, groupname, [ testname = '']) {
|
| return listFormat.
|
| replaceAll(Macros.testfile, filename).
|
| @@ -148,13 +148,13 @@
|
| }
|
|
|
| listGroups() {
|
| - List tests = unittest.testCases;
|
| + List tests = testCases;
|
| Map groups = {};
|
| for (var t in tests) {
|
| var groupName, testName = '';
|
| - var idx = t.description.lastIndexOf('###');
|
| + var idx = t.description.lastIndexOf(marker);
|
| if (idx >= 0) {
|
| - groupName = t.description.substring(0, idx).replaceAll('###', ' ');
|
| + groupName = t.description.substring(0, idx).replaceAll(marker, ' ');
|
| if (!groups.containsKey(groupName)) {
|
| groups[groupName] = '';
|
| }
|
| @@ -162,7 +162,7 @@
|
| }
|
| for (var g in groups.keys) {
|
| var msg = formatListMessage('$testfile ', '$g ');
|
| - print('###$msg');
|
| + print('$marker$msg');
|
| }
|
| if (notifyDone != null) {
|
| notifyDone(0);
|
| @@ -170,19 +170,19 @@
|
| }
|
|
|
| listTests() {
|
| - List tests = unittest.testCases;
|
| + List tests = testCases;
|
| for (var t in tests) {
|
| var groupName, testName = '';
|
| - var idx = t.description.lastIndexOf('###');
|
| + var idx = t.description.lastIndexOf(marker);
|
| if (idx >= 0) {
|
| - groupName = t.description.substring(0, idx).replaceAll('###', ' ');
|
| + groupName = t.description.substring(0, idx).replaceAll(marker, ' ');
|
| testName = t.description.substring(idx+3);
|
| } else {
|
| groupName = '';
|
| testName = t.description;
|
| }
|
| var msg = formatListMessage('$testfile ', '$groupName ', '$testName ');
|
| - print('###$msg');
|
| + print('$marker$msg');
|
| }
|
| if (notifyDone != null) {
|
| notifyDone(0);
|
| @@ -191,13 +191,13 @@
|
|
|
| // Support for running in isolates.
|
|
|
| -class TestRunnerChildConfiguration extends unittest.Configuration {
|
| +class TestRunnerChildConfiguration extends Configuration {
|
| get name => 'Test runner child configuration';
|
| get autoStart => false;
|
|
|
| void onSummary(int passed, int failed, int errors,
|
| - List<unittest.TestCase> results, String uncaughtError) {
|
| - unittest.TestCase test = results[0];
|
| + List<TestCase> results, String uncaughtError) {
|
| + TestCase test = results[0];
|
| parentPort.send([test.result, test.runningTime.inMilliseconds,
|
| test.message, test.stackTrace]);
|
| }
|
| @@ -207,59 +207,43 @@
|
| runChildTest() {
|
| port.receive((testName, sendport) {
|
| parentPort = sendport;
|
| - unittest.configure(new TestRunnerChildConfiguration());
|
| - unittest.groupSep = '###';
|
| - unittest.group('', test.main);
|
| - unittest.filterTests(testName);
|
| - unittest.runTests();
|
| + unittestConfiguration = new TestRunnerChildConfiguration();
|
| + groupSep = marker;
|
| + group('', test.main);
|
| + filterTests(testName);
|
| + runTests();
|
| });
|
| }
|
|
|
| -var testNum;
|
| -var failed;
|
| -var errors;
|
| -var passed;
|
| -
|
| -runParentTest() {
|
| - var tests = unittest.testCases;
|
| - tests[testNum].startTime = new DateTime.now();
|
| +isolatedTestParentWrapper(testCase) => () {
|
| SendPort childPort = spawnFunction(runChildTest);
|
| - childPort.call(tests[testNum].description).then((results) {
|
| + var f = childPort.call(testCase.description);
|
| + f.then((results) {
|
| var result = results[0];
|
| var duration = new Duration(milliseconds: results[1]);
|
| var message = results[2];
|
| var stack = results[3];
|
| - if (result == 'pass') {
|
| - tests[testNum].pass();
|
| - ++passed;
|
| - } else if (result == 'fail') {
|
| - tests[testNum].fail(message, stack);
|
| - ++failed;
|
| - } else {
|
| - tests[testNum].error(message, stack);
|
| - ++errors;
|
| + if (result == 'fail') {
|
| + testCase.fail(message, stack);
|
| + } else if (result == 'error') {
|
| + testCase.error(message, stack);
|
| }
|
| - tests[testNum].runningTime = duration;
|
| - ++testNum;
|
| - if (testNum < tests.length) {
|
| - runParentTest();
|
| - } else {
|
| - unittest.config.onDone(passed, failed, errors,
|
| - unittest.testCases, null);
|
| - }
|
| });
|
| -}
|
| + return f;
|
| +};
|
|
|
| runIsolateTests() {
|
| - testNum = 0;
|
| - passed = failed = errors = 0;
|
| - runParentTest();
|
| + // Replace each test with a wrapped version first.
|
| + for (var i = 0; i < testCases.length; i++) {
|
| + testCases[i].testFunction = isolatedTestParentWrapper(testCases[i]);
|
| + }
|
| + runTests();
|
| }
|
|
|
| // Main
|
|
|
| filterTest(t) {
|
| - var name = t.description.replaceAll("###", " ");
|
| + var name = t.description.replaceAll(marker, " ");
|
| if (includeFilters.length > 0) {
|
| for (var f in includeFilters) {
|
| if (name.indexOf(f) >= 0) return true;
|
| @@ -276,10 +260,10 @@
|
| }
|
|
|
| process(testMain, action) {
|
| - unittest.groupSep = '###';
|
| - unittest.configure(new TestRunnerConfiguration());
|
| - unittest.group('', testMain);
|
| + groupSep = marker;
|
| + unittestConfiguration = new TestRunnerConfiguration();
|
| + group('', testMain);
|
| // Do any user-specified test filtering.
|
| - unittest.filterTests(filterTest);
|
| + filterTests(filterTest);
|
| action();
|
| }
|
|
|