Index: mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart |
diff --git a/mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart b/mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..14ad58daad612978ae5c295bf40a7b3ddc0bab6b |
--- /dev/null |
+++ b/mojo/public/dart/third_party/test/test/runner/browser/runner_test.dart |
@@ -0,0 +1,619 @@ |
+// Copyright (c) 2015, 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. |
+ |
+@TestOn("vm") |
+ |
+import 'package:scheduled_test/descriptor.dart' as d; |
+import 'package:scheduled_test/scheduled_stream.dart'; |
+import 'package:scheduled_test/scheduled_test.dart'; |
+ |
+import '../../io.dart'; |
+ |
+final _success = """ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () {}); |
+} |
+"""; |
+ |
+final _failure = """ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("failure", () => throw new TestFailure("oh no")); |
+} |
+"""; |
+ |
+void main() { |
+ useSandbox(); |
+ |
+ group("fails gracefully if", () { |
+ test("a test file fails to compile", () { |
+ d.file("test.dart", "invalid Dart file").create(); |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ |
+ test.stdout.expect(containsInOrder([ |
+ "Expected a declaration, but got 'invalid'", |
+ '-1: compiling test.dart', |
+ 'Failed to load "test.dart": dart2js failed.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a test file throws", () { |
+ d.file("test.dart", "void main() => throw 'oh no';").create(); |
+ |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: compiling test.dart', |
+ 'Failed to load "test.dart": oh no' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a test file doesn't have a main defined", () { |
+ d.file("test.dart", "void foo() {}").create(); |
+ |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: compiling test.dart', |
+ 'Failed to load "test.dart": No top-level main() function defined.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a test file has a non-function main", () { |
+ d.file("test.dart", "int main;").create(); |
+ |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: compiling test.dart', |
+ 'Failed to load "test.dart": Top-level main getter is not a function.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a test file has a main with arguments", () { |
+ d.file("test.dart", "void main(arg) {}").create(); |
+ |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: compiling test.dart', |
+ 'Failed to load "test.dart": Top-level main() function takes arguments.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a custom HTML file has no script tag", () { |
+ d.file("test.dart", "void main() {}").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel="x-dart-test" href="test.dart"> |
+</head> |
+</html> |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: loading test.dart', |
+ 'Failed to load "test.dart": "test.html" must contain ' |
+ '<script src="packages/test/dart.js"></script>.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a custom HTML file has no link", () { |
+ d.file("test.dart", "void main() {}").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+</html> |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: loading test.dart', |
+ 'Failed to load "test.dart": Expected exactly 1 ' |
+ '<link rel="x-dart-test"> in test.html, found 0.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a custom HTML file has too many links", () { |
+ d.file("test.dart", "void main() {}").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel='x-dart-test' href='test.dart'> |
+ <link rel='x-dart-test' href='test.dart'> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+</html> |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: loading test.dart', |
+ 'Failed to load "test.dart": Expected exactly 1 ' |
+ '<link rel="x-dart-test"> in test.html, found 2.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a custom HTML file has no href in the link", () { |
+ d.file("test.dart", "void main() {}").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel='x-dart-test'> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+</html> |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: loading test.dart', |
+ 'Failed to load "test.dart": Expected <link rel="x-dart-test"> in ' |
+ 'test.html to have an "href" attribute.' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("a custom HTML file has an invalid test URL", () { |
+ d.file("test.dart", "void main() {}").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel='x-dart-test' href='wrong.dart'> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+</html> |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ '-1: loading test.dart', |
+ 'Failed to load "test.dart": Failed to load script at ' |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ // TODO(nweiz): test what happens when a test file is unreadable once issue |
+ // 15078 is fixed. |
+ }); |
+ |
+ group("runs successful tests", () { |
+ test("on a JS and non-JS browser", () { |
+ d.file("test.dart", _success).create(); |
+ var test = runTest(["-p", "content-shell", "-p", "chrome", "test.dart"]); |
+ |
+ test.stdout.fork().expect(consumeThrough(contains("[Chrome] compiling"))); |
+ test.stdout.expect(never(contains("[Dartium Content Shell] compiling"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("on a browser and the VM", () { |
+ d.file("test.dart", _success).create(); |
+ var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); |
+ |
+ test.stdout.expect(consumeThrough(contains("+2: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ // Regression test; this broke in 0.12.0-beta.9. |
+ test("on a file in a subdirectory", () { |
+ d.dir("dir", [d.file("test.dart", _success)]).create(); |
+ |
+ var test = runTest(["-p", "chrome", "dir/test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ group("with a custom HTML file", () { |
+ setUp(() { |
+ d.file("test.dart", """ |
+import 'dart:html'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () { |
+ expect(document.query('#foo'), isNotNull); |
+ }); |
+} |
+""").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel='x-dart-test' href='test.dart'> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+<body> |
+ <div id="foo"></div> |
+</body> |
+</html> |
+""").create(); |
+ }); |
+ |
+ test("on content shell", () { |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("on Chrome", () { |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ // Regression test for https://github.com/dart-lang/test/issues/82. |
+ test("ignores irrelevant link tags", () { |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel='x-dart-test-not'> |
+ <link rel='other' href='test.dart'> |
+ <link rel='x-dart-test' href='test.dart'> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+<body> |
+ <div id="foo"></div> |
+</body> |
+</html> |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ }); |
+ }); |
+ |
+ group("runs failing tests", () { |
+ test("that fail only on the browser", () { |
+ d.file("test.dart", """ |
+import 'dart:async'; |
+ |
+import 'package:path/path.dart' as p; |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("test", () { |
+ if (p.style == p.Style.url) throw new TestFailure("oh no"); |
+ }); |
+} |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed."))); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("that fail only on the VM", () { |
+ d.file("test.dart", """ |
+import 'dart:async'; |
+ |
+import 'package:path/path.dart' as p; |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("test", () { |
+ if (p.style != p.Style.url) throw new TestFailure("oh no"); |
+ }); |
+} |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "-p", "vm", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1 -1: Some tests failed."))); |
+ test.shouldExit(1); |
+ }); |
+ |
+ group("with a custom HTML file", () { |
+ setUp(() { |
+ d.file("test.dart", """ |
+import 'dart:html'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("failure", () { |
+ expect(document.query('#foo'), isNull); |
+ }); |
+} |
+""").create(); |
+ |
+ d.file("test.html", """ |
+<html> |
+<head> |
+ <link rel='x-dart-test' href='test.dart'> |
+ <script src="packages/test/dart.js"></script> |
+</head> |
+<body> |
+ <div id="foo"></div> |
+</body> |
+</html> |
+""").create(); |
+ }); |
+ |
+ test("on content shell", () { |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("on Chrome", () { |
+ var test = runTest(["-p", "chrome", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
+ test.shouldExit(1); |
+ }); |
+ }); |
+ }); |
+ |
+ test("the compiler uses colors if the test runner uses colors", () { |
+ d.file("test.dart", "String main() => 12;\n").create(); |
+ |
+ var test = runTest(["--color", "-p", "chrome", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains('\u001b[35m'))); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("forwards prints from the browser test", () { |
+ d.file("test.dart", """ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("test", () { |
+ print("Hello,"); |
+ return new Future(() => print("world!")); |
+ }); |
+} |
+""").create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(inOrder([ |
+ consumeThrough("Hello,"), |
+ "world!" |
+ ])); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("dartifies stack traces for JS-compiled tests by default", () { |
+ d.file("test.dart", _failure).create(); |
+ |
+ var test = runTest(["-p", "chrome", "--verbose-trace", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ " main.<fn>", |
+ "package:test", |
+ "dart:async/zone.dart" |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("doesn't dartify stack traces for JS-compiled tests with --js-trace", () { |
+ d.file("test.dart", _failure).create(); |
+ |
+ var test = runTest( |
+ ["-p", "chrome", "--verbose-trace", "--js-trace", "test.dart"]); |
+ test.stdout.fork().expect(never(endsWith(" main.<fn>"))); |
+ test.stdout.fork().expect(never(contains("package:test"))); |
+ test.stdout.fork().expect(never(contains("dart:async/zone.dart"))); |
+ test.stdout.expect(consumeThrough(contains("-1: Some tests failed."))); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("respects top-level @Timeout declarations", () { |
+ d.file("test.dart", ''' |
+@Timeout(const Duration(seconds: 0)) |
+ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("timeout", () {}); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ "Test timed out after 0 seconds.", |
+ "-1: Some tests failed." |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ group("with onPlatform", () { |
+ test("respects matching Skips", () { |
+ d.file("test.dart", ''' |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("fail", () => throw 'oh no', onPlatform: {"browser": new Skip()}); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+0 ~1: All tests skipped."))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("ignores non-matching Skips", () { |
+ d.file("test.dart", ''' |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () {}, onPlatform: {"vm": new Skip()}); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("respects matching Timeouts", () { |
+ d.file("test.dart", ''' |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("fail", () => throw 'oh no', onPlatform: { |
+ "browser": new Timeout(new Duration(seconds: 0)) |
+ }); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ "Test timed out after 0 seconds.", |
+ "-1: Some tests failed." |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("ignores non-matching Timeouts", () { |
+ d.file("test.dart", ''' |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () {}, onPlatform: { |
+ "vm": new Timeout(new Duration(seconds: 0)) |
+ }); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("applies matching platforms in order", () { |
+ d.file("test.dart", ''' |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () {}, onPlatform: { |
+ "browser": new Skip("first"), |
+ "browser || windows": new Skip("second"), |
+ "browser || linux": new Skip("third"), |
+ "browser || mac-os": new Skip("fourth"), |
+ "browser || android": new Skip("fifth") |
+ }); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.fork().expect(never(contains("Skip: first"))); |
+ test.stdout.fork().expect(never(contains("Skip: second"))); |
+ test.stdout.fork().expect(never(contains("Skip: third"))); |
+ test.stdout.fork().expect(never(contains("Skip: fourth"))); |
+ test.stdout.expect(consumeThrough(contains("Skip: fifth"))); |
+ test.shouldExit(0); |
+ }); |
+ }); |
+ |
+ group("with an @OnPlatform annotation", () { |
+ test("respects matching Skips", () { |
+ d.file("test.dart", ''' |
+@OnPlatform(const {"browser": const Skip()}) |
+ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("fail", () => throw 'oh no'); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("~1: All tests skipped."))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("ignores non-matching Skips", () { |
+ d.file("test.dart", ''' |
+@OnPlatform(const {"vm": const Skip()}) |
+ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () {}); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ |
+ test("respects matching Timeouts", () { |
+ d.file("test.dart", ''' |
+@OnPlatform(const { |
+ "browser": const Timeout(const Duration(seconds: 0)) |
+}) |
+ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("fail", () => throw 'oh no'); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(containsInOrder([ |
+ "Test timed out after 0 seconds.", |
+ "-1: Some tests failed." |
+ ])); |
+ test.shouldExit(1); |
+ }); |
+ |
+ test("ignores non-matching Timeouts", () { |
+ d.file("test.dart", ''' |
+@OnPlatform(const { |
+ "vm": const Timeout(const Duration(seconds: 0)) |
+}) |
+ |
+import 'dart:async'; |
+ |
+import 'package:test/test.dart'; |
+ |
+void main() { |
+ test("success", () {}); |
+} |
+''').create(); |
+ |
+ var test = runTest(["-p", "content-shell", "test.dart"]); |
+ test.stdout.expect(consumeThrough(contains("+1: All tests passed!"))); |
+ test.shouldExit(0); |
+ }); |
+ }); |
+} |