Index: utils/tests/testrunner/testrunner_test.dart |
=================================================================== |
--- utils/tests/testrunner/testrunner_test.dart (revision 0) |
+++ utils/tests/testrunner/testrunner_test.dart (revision 0) |
@@ -0,0 +1,522 @@ |
+// 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. |
+ |
+library testrunner_test; |
+ |
+import 'dart:async'; |
+import 'dart:io'; |
+import 'package:unittest/unittest.dart'; |
+ |
+var dart; |
+var debug = false; |
+ |
+Future runTestrunner(command, List<String> args, |
+ List<String> stdout, List<String> stderr) { |
+ if (debug) { |
+ print("Running $command ${args.join(' ')}"); |
+ } |
+ return Process.run(command, args).then((ProcessResult result) { |
+ var lineEndings = new RegExp("\r\n|\n"); |
+ stdout.addAll(result.stdout.trim().split(lineEndings)); |
+ stderr.addAll(result.stderr.trim().split(lineEndings)); |
+ }) |
+ .catchError((e) { |
+ stderr.add("Error starting process:"); |
+ stderr.add(" Command: $command"); |
+ stderr.add(" Error: ${e}"); |
+ completer.complete(-1); |
+ }); |
+} |
+ |
+// Useful utility for debugging test failures. |
+void dump(label, list) { |
+ if (!debug) return; |
+ print('\n@=[ $label ]=============================\n'); |
+ for (var i = 0; i < list.length; i++) |
+ print('@ ${list[i]}\n'); |
+ print('------------------------------------------\n'); |
+} |
+ |
+int stringCompare(String s1, String s2) => s1.compareTo(s2); |
+ |
+Future runTest( |
+ List<String> args, |
+ List<String> expected_stdout, |
+ {List<String> expected_stderr, sort: false}) { |
+ var stdout = new List<String>(); |
+ var stderr = new List<String>(); |
+ for (var i = 0; i < expected_stdout.length; i++) { |
+ expected_stdout[i] = expected_stdout[i]. |
+ replaceAll('/', Platform.pathSeparator); |
+ } |
+ if (debug) { |
+ args.insert(1, "--log=stderr"); |
+ } |
+ var rtn = runTestrunner(dart, args, stdout, stderr); |
+ rtn.then((_) { |
+ dump('stderr', stderr); |
+ dump('stdout', stdout); |
+ |
+ if (expected_stderr != null) { |
+ expect(stderr.length, orderedEquals(expected_stderr)); |
+ } |
+ var i, l = 0, matched = 0; |
+ if (sort) { |
+ stdout.sort(stringCompare); |
+ expected_stdout.sort(stringCompare); |
+ } |
+ for (i = 0; i < stdout.length; i++) { |
+ if (!stdout[i].startsWith('@')) { |
+ if (expected_stdout.length <= l) { |
+ fail("Extra text in output: ${stdout[i]}"); |
+ return; |
+ } |
+ var actual = stdout[i].trim(); |
+ if (debug) { |
+ print("Compare <$actual> and <${expected_stdout[l]}>"); |
+ } |
+ if (expected_stdout[l].startsWith('*')) { |
+ expect(actual, endsWith(expected_stdout[l].substring(1))); |
+ } else if (expected_stdout[l].startsWith('?')) { |
+ var pat = expected_stdout[l].substring(1); |
+ if (Platform.operatingSystem == 'windows') { |
+ // The joys of Windows... |
+ pat = pat.replaceAll('\\','\\\\'); |
+ } |
+ expect(actual, matches(pat)); |
+ } else { |
+ expect(actual, expected_stdout[l]); |
+ } |
+ ++l; |
+ } |
+ } |
+ if (l < expected_stdout.length) { |
+ fail("Only matched $l of ${expected_stdout.length} lines"); |
+ } |
+ }); |
+ return rtn; |
+} |
+ |
+// A useful function to quickly disable a group of tests; just |
+// replace group() with skip_group(). |
+skip_group(_1,_2) {} |
+ |
+main() { |
+ var opt = new Options(); |
+ dart = opt.executable; |
+ var idx = dart.indexOf('dart-sdk'); |
+ if (idx < 0) { |
+ print("Please run using the dart executable from the Dart SDK"); |
+ exit(-1); |
+ } |
+ var _ = Platform.pathSeparator; |
+ var testrunner = '../../testrunner/testrunner.dart' |
+ .replaceAll('/', Platform.pathSeparator); |
+ |
+ group("list tests", () { |
+ test('list file', () { |
+ return runTest( |
+ [ testrunner, |
+ '--list-files', |
+ 'non_browser_tests' ], |
+ [ '?.*/non_browser_tests/non_browser_test.dart' ]); |
+ }); |
+ test('list files', () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--sort', |
+ '--list-files', |
+ '--test-file-pattern=.dart\$' ], |
+ [ '*browser_tests/web/browser_test.dart', |
+ '*http_client_tests/http_client_test.dart', |
+ '*layout_tests/web/layout_test.dart', |
+ '*non_browser_tests/non_browser_test.dart', |
+ '*non_browser_tests/non_browser_toast.dart', |
+ '*/testrunner_test.dart' ] |
+ ); |
+ }); |
+ test('list files', () { |
+ return runTest( |
+ [ testrunner, |
+ '--list-files', |
+ '--test-file-pattern=.dart\$', |
+ 'non_browser_tests' ], |
+ [ '*non_browser_tests/non_browser_test.dart', |
+ '*non_browser_tests/non_browser_toast.dart' ], |
+ sort:true |
+ ); |
+ }); |
+ test('list groups', () { |
+ return runTest( |
+ [ testrunner, |
+ '--list-groups', |
+ 'non_browser_tests' ], |
+ [ '*non_browser_tests/non_browser_test.dart group1', |
+ '*non_browser_tests/non_browser_test.dart group2']); |
+ }); |
+ test('list tests', () { |
+ return runTest( |
+ [ testrunner, |
+ '--list-tests', |
+ 'non_browser_tests' ], |
+ [ '*non_browser_tests/non_browser_test.dart group1 test1', |
+ '*non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ }); |
+ |
+ group("vm", () { |
+ test("vm without timing info", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1' |
+ ' Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ |
+ test("vm with timing info", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--time', |
+ 'non_browser_tests' ], |
+ [ '?FAIL [0-9.]+s .*/non_browser_tests/non_browser_test.dart group1' |
+ ' test1 Expected: false', |
+ '?PASS [0-9.]+s .*/non_browser_tests/non_browser_test.dart group2' |
+ ' test2' ]); |
+ }); |
+ }); |
+ |
+ group("selection", () { |
+ test("--include", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--include=group1', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' |
+ 'Expected: false' ]); |
+ }); |
+ |
+ test("--exclude", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--exclude=group1', |
+ 'non_browser_tests' ], |
+ [ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ |
+ test("test file pattern", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--test-file-pattern=toast', |
+ 'non_browser_tests' ], |
+ [ '?PASS .*/non_browser_tests/non_browser_toast.dart foo bar' ]); |
+ }); |
+ }); |
+ |
+ group("stop on failure tests", () { |
+ test("without stop", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--sort', |
+ '--tasks=1', |
+ '--test-file-pattern=.dart\$', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2', |
+ '?PASS .*/non_browser_tests/non_browser_toast.dart foo bar' ]); |
+ }); |
+ test("with stop", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--sort', |
+ '--tasks=1', |
+ '--test-file-pattern=.dart\$', |
+ '--stop-on-failure', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ }); |
+ |
+ group("output control", () { |
+ test("summary test", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--summary', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2', |
+ '', |
+ '?.*/non_browser_tests/non_browser_test.dart: ' |
+ '1 PASSED, 1 FAILED, 0 ERRORS' ]); |
+ }); |
+ |
+ test('list tests with custom format', () { |
+ return runTest( |
+ [ testrunner, |
+ '--list-tests', |
+ '--list-format="<FILENAME><TESTNAME>"', |
+ 'non_browser_tests' ], |
+ [ '?.*/non_browser_tests/non_browser_test.dart test1', |
+ '?.*/non_browser_tests/non_browser_test.dart test2' ]); |
+ }); |
+ |
+ test("custom message formatting", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--pass-format=YIPPEE! <GROUPNAME><TESTNAME>', |
+ '--fail-format=EPIC FAIL! <GROUPNAME><TESTNAME>', |
+ 'non_browser_tests' ], |
+ [ 'EPIC FAIL! group1 test1', 'YIPPEE! group2 test2' ]); |
+ }); |
+ }); |
+ |
+ test("checked mode test", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--checked', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ "?FAIL .*/non_browser_tests/non_browser_test.dart group2 test2 " |
+ "Caught type 'int' is not a subtype of type 'bool' of 'x'." ]); |
+ }); |
+ |
+ group("browser", () { |
+ test("native test", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--runtime=drt-dart', |
+ 'browser_tests' ], |
+ [ '?FAIL .*/browser_tests/web/browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ '?PASS .*/browser_tests/web/browser_test.dart group2 test2' ]); |
+ }); |
+ |
+ test("compiled test", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--runtime=drt-js', |
+ 'browser_tests' ], |
+ [ '?FAIL .*/browser_tests/web/browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ '?PASS .*/browser_tests/web/browser_test.dart group2 test2' ]); |
+ }); |
+ }); |
+ |
+ group("textual layout tests", () { |
+ group("drt-dart", () { |
+ test("no baseline", () { |
+ var f = new File("layout_tests/web/layout_test/layout.txt"); |
+ if (f.existsSync()) { |
+ f.deleteSync(); |
+ } |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--layout-text', |
+ 'layout_tests' ], |
+ [ '?FAIL .*/layout_tests/web/layout_test.dart layout ' |
+ 'No expectation file' ]); |
+ }); |
+ test("create baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--layout-text', |
+ '--regenerate', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ test("test baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--layout-text', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ }); |
+ group("drt-js", () { |
+ test("no baseline", () { |
+ var f = new File("layout_tests/web/layout_test/layout.txt"); |
+ if (f.existsSync()) { |
+ f.deleteSync(); |
+ } |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--layout-text', |
+ 'layout_tests' ], |
+ [ '?FAIL .*/layout_tests/web/layout_test.dart layout ' |
+ 'No expectation file' ]); |
+ }); |
+ test("create baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--layout-text', |
+ '--regenerate', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ test("test baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--layout-text', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ }); |
+ }); |
+ |
+ group("pixel layout tests", () { |
+ group("drt-dart", () { |
+ test("no baseline", () { |
+ var f = new File("layout_tests/web/layout_test/layout.png"); |
+ if (f.existsSync()) { |
+ f.deleteSync(); |
+ } |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--layout-pixel', |
+ 'layout_tests' ], |
+ [ '?FAIL .*/layout_tests/web/layout_test.dart layout ' |
+ 'No expectation file' ]); |
+ }); |
+ test("create baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--layout-pixel', |
+ '--regenerate', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ test("test baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--layout-pixel', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ // TODO(gram): Should add a test that changes a byte of the |
+ // expectation .png. |
+ }); |
+ group("drt-js", () { |
+ test("no baseline", () { |
+ var f = new File("layout_tests/web/layout_test/layout.png"); |
+ if (f.existsSync()) { |
+ f.deleteSync(); |
+ } |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--layout-pixel', |
+ 'layout_tests' ], |
+ [ '?FAIL .*/layout_tests/web/layout_test.dart layout ' |
+ 'No expectation file' ]); |
+ }); |
+ test("create baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--layout-pixel', |
+ '--regenerate', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ test("test baseline", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--layout-pixel', |
+ 'layout_tests' ], |
+ [ '?PASS .*/layout_tests/web/layout_test.dart layout' ]); |
+ }); |
+ }); |
+ }); |
+ |
+ group("run in isolate", () { |
+ test("vm", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=vm', |
+ '--recurse', |
+ '--isolate', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1' |
+ ' Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ test("drt-dart", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-dart', |
+ '--recurse', |
+ '--isolate', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1' |
+ ' Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ test("drt-js", () { |
+ return runTest( |
+ [ testrunner, |
+ '--runtime=drt-js', |
+ '--recurse', |
+ '--isolate', |
+ 'non_browser_tests' ], |
+ [ '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' |
+ 'Expected: false', |
+ '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' ]); |
+ }); |
+ }); |
+ |
+ group("embedded server", () { |
+ test("get test", () { |
+ return runTest( |
+ [ testrunner, |
+ '--recurse', |
+ '--server', |
+ '--port=3456', |
+ '--root=${new Directory.current().path}', |
+ 'http_client_tests' ], |
+ [ '?PASS .*/http_client_tests/http_client_test.dart test1', |
+ '?PASS .*/http_client_tests/http_client_test.dart test2' ]); |
+ }); |
+ }); |
+} |
+ |
Property changes on: utils/tests/testrunner/testrunner_test.dart |
___________________________________________________________________ |
Added: svn:executable |
+ * |