blob: bcfd811fab37b53b48d363a52384baf821c05e2f [file] [log] [blame]
// Copyright (c) 2016, 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 'dart:async';
import 'dart:convert';
import 'package:path/path.dart' as p;
import 'package:test_descriptor/test_descriptor.dart' as d;
import 'package:test/src/util/io.dart';
import 'package:test/test.dart';
import '../../io.dart';
void main() {
test("ignores an empty file", () async {
await d.file("dart_test.yaml", "").create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains("+1: All tests passed!")));
await test.shouldExit(0);
});
test("loads configuration from the path passed to --configuration", () async {
// Make sure dart_test.yaml is ignored.
await d.file("dart_test.yaml", jsonEncode({"run_skipped": true})).create();
await d.file("special_test.yaml", jsonEncode({"skip": true})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () => throw "oh no");
}
""").create();
var test =
await runTest(["--configuration", "special_test.yaml", "test.dart"]);
expect(test.stdout, emitsThrough(contains('All tests skipped.')));
await test.shouldExit(0);
});
test("pauses the test runner after a suite loads with pause_after_load: true",
() async {
await d
.file("dart_test.yaml", jsonEncode({"pause_after_load": true}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
print('loaded test!');
test("success", () {});
}
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
await expectLater(test.stdout, emitsThrough("loaded test!"));
await expectLater(
test.stdout,
emitsInOrder([
"",
equalsIgnoringWhitespace("""
The test runner is paused. Open the dev console in Chrome and set
breakpoints. Once you're finished, return to this terminal and press
Enter.
""")
]));
var nextLineFired = false;
test.stdout.next.then(expectAsync1((line) {
expect(line, contains("+0: success"));
nextLineFired = true;
}));
// Wait a little bit to be sure that the tests don't start running without
// our input.
await new Future.delayed(new Duration(seconds: 2));
expect(nextLineFired, isFalse);
test.stdin.writeln();
await expectLater(
test.stdout, emitsThrough(contains("+1: All tests passed!")));
await test.shouldExit(0);
}, tags: 'chrome');
test("runs skipped tests with run_skipped: true", () async {
await d.file("dart_test.yaml", jsonEncode({"run_skipped": true})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("skip", () => print("In test!"), skip: true);
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains("In test!")));
expect(test.stdout, emitsThrough(contains("+1: All tests passed!")));
await test.shouldExit(0);
});
test("includes the full stack with verbose_trace: true", () async {
await d
.file("dart_test.yaml", jsonEncode({"verbose_trace": true}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("failure", () => throw "oh no");
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains("dart:isolate-patch")));
await test.shouldExit(1);
});
test("disables stack trace chaining with chain_stack_traces: false",
() async {
await d
.file("dart_test.yaml", jsonEncode({"chain_stack_traces": false}))
.create();
await d.file("test.dart", """
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("failure", () async{
await new Future((){});
await new Future((){});
throw "oh no";
});
}
""").create();
var test = await runTest(["test.dart"]);
expect(
test.stdout,
containsInOrder([
"+0: failure",
"+0 -1: failure [E]",
"oh no",
"test.dart 9:15 main.<fn>",
]));
await test.shouldExit(1);
});
test("doesn't dartify stack traces for JS-compiled tests with js_trace: true",
() async {
await d.file("dart_test.yaml", jsonEncode({"js_trace": true})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("failure", () => throw "oh no");
}
""").create();
var test = await runTest(["-p", "chrome", "--verbose-trace", "test.dart"]);
expect(test.stdoutStream(), neverEmits(endsWith(" main.<fn>")));
expect(test.stdoutStream(), neverEmits(contains("package:test")));
expect(test.stdoutStream(), neverEmits(contains("dart:async/zone.dart")));
expect(test.stdout, emitsThrough(contains("-1: Some tests failed.")));
await test.shouldExit(1);
}, tags: 'chrome');
test("retries tests with retry: 1", () async {
await d.file("dart_test.yaml", jsonEncode({"retry": 1})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
import 'dart:async';
var attempt = 0;
void main() {
test("test", () {
attempt++;
if(attempt <= 1) {
throw 'Failure!';
}
});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains('+1: All tests passed')));
await test.shouldExit(0);
});
test("skips tests with skip: true", () async {
await d.file("dart_test.yaml", jsonEncode({"skip": true})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains('All tests skipped.')));
await test.shouldExit(0);
});
test("skips tests with skip: reason", () async {
await d
.file("dart_test.yaml", jsonEncode({"skip": "Tests are boring."}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains('Tests are boring.')));
expect(test.stdout, emitsThrough(contains('All tests skipped.')));
await test.shouldExit(0);
});
group("test_on", () {
test("runs tests on a platform matching platform", () async {
await d.file("dart_test.yaml", jsonEncode({"test_on": "vm"})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains('All tests passed!')));
await test.shouldExit(0);
});
test("warns about the VM when no OSes are supported", () async {
await d
.file("dart_test.yaml", jsonEncode({"test_on": "chrome"}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(
test.stderr,
emits(
"Warning: this package doesn't support running tests on the Dart "
"VM."));
expect(test.stdout, emitsThrough(contains('No tests ran.')));
await test.shouldExit(0);
});
test("warns about the OS when some OSes are supported", () async {
await d.file("dart_test.yaml", jsonEncode({"test_on": otherOS})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(
test.stderr,
emits("Warning: this package doesn't support running tests on "
"${currentOS.name}."));
expect(test.stdout, emitsThrough(contains('No tests ran.')));
await test.shouldExit(0);
});
test("warns about browsers in general when no browsers are supported",
() async {
await d.file("dart_test.yaml", jsonEncode({"test_on": "vm"})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["-p", "chrome", "test.dart"]);
expect(
test.stderr,
emits(
"Warning: this package doesn't support running tests on browsers."));
expect(test.stdout, emitsThrough(contains('No tests ran.')));
await test.shouldExit(0);
});
test(
"warns about specific browsers when specific browsers are "
"supported", () async {
await d
.file("dart_test.yaml", jsonEncode({"test_on": "safari"}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("test", () {});
}
""").create();
var test = await runTest(["-p", "chrome,firefox,phantomjs", "test.dart"]);
expect(
test.stderr,
emits(
"Warning: this package doesn't support running tests on Chrome, "
"Firefox, or PhantomJS."));
expect(test.stdout, emitsThrough(contains('No tests ran.')));
await test.shouldExit(0);
});
});
test("uses the specified reporter", () async {
await d.file("dart_test.yaml", jsonEncode({"reporter": "json"})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains('"testStart"')));
await test.shouldExit(0);
});
test("uses the specified pub serve port", () async {
await d.file("pubspec.yaml", """
name: myapp
dependencies:
barback: any
test: {path: ${p.current}}
transformers:
- myapp:
\$include: test/**_test.dart
- test/pub_serve:
\$include: test/**_test.dart
""").create();
await d.dir("lib", [
d.file("myapp.dart", """
import 'package:barback/barback.dart';
class MyTransformer extends Transformer {
final allowedExtensions = '.dart';
MyTransformer.asPlugin();
Future apply(Transform transform) async {
var contents = await transform.primaryInput.readAsString();
transform.addOutput(new Asset.fromString(
transform.primaryInput.id,
contents.replaceAll("isFalse", "isTrue")));
}
}
""")
]).create();
await (await runPub(['get'])).shouldExit(0);
await d.dir("test", [
d.file("my_test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () => expect(true, isFalse));
}
""")
]).create();
var pub = await runPubServe();
await d
.file("dart_test.yaml", jsonEncode({"pub_serve": pubServePort}))
.create();
var test = await runTest([]);
expect(test.stdout, emitsThrough(contains('+1: All tests passed!')));
await test.shouldExit(0);
await pub.kill();
}, tags: 'pub', skip: 'https://github.com/dart-lang/test/issues/821');
test("uses the specified concurrency", () async {
await d.file("dart_test.yaml", jsonEncode({"concurrency": 2})).create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""").create();
// We can't reliably test the concurrency, but this at least ensures that
// it doesn't fail to parse.
var test = await runTest(["test.dart"]);
expect(test.stdout, emitsThrough(contains("+1: All tests passed!")));
await test.shouldExit(0);
});
test("uses the specified timeout", () async {
await d.file("dart_test.yaml", jsonEncode({"timeout": "0s"})).create();
await d.file("test.dart", """
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("success", () => new Future.delayed(Duration.zero));
}
""").create();
var test = await runTest(["test.dart"]);
expect(
test.stdout,
containsInOrder(
["Test timed out after 0 seconds.", "-1: Some tests failed."]));
await test.shouldExit(1);
});
test("runs on the specified platforms", () async {
await d
.file(
"dart_test.yaml",
jsonEncode({
"platforms": ["vm", "chrome"]
}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, containsInOrder(["[VM] success", "[Chrome] success"]));
await test.shouldExit(0);
}, tags: "chrome");
test("command line args take precedence", () async {
await d.file("dart_test.yaml", jsonEncode({"timeout": "0s"})).create();
await d.file("test.dart", """
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("success", () => new Future.delayed(Duration.zero));
}
""").create();
var test = await runTest(["--timeout=none", "test.dart"]);
expect(test.stdout, emitsThrough(contains("All tests passed!")));
await test.shouldExit(0);
});
test("uses the specified regexp names", () async {
await d
.file(
"dart_test.yaml",
jsonEncode({
"names": ["z[ia]p", "a"]
}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("zip", () {});
test("zap", () {});
test("zop", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, containsInOrder(["+0: zap", "+1: All tests passed!"]));
await test.shouldExit(0);
});
test("uses the specified plain names", () async {
await d
.file(
"dart_test.yaml",
jsonEncode({
"names": ["z", "a"]
}))
.create();
await d.file("test.dart", """
import 'package:test/test.dart';
void main() {
test("zip", () {});
test("zap", () {});
test("zop", () {});
}
""").create();
var test = await runTest(["test.dart"]);
expect(test.stdout, containsInOrder(["+0: zap", "+1: All tests passed!"]));
await test.shouldExit(0);
});
test("uses the specified paths", () async {
await d
.file(
"dart_test.yaml",
jsonEncode({
"paths": ["zip", "zap"]
}))
.create();
await d.dir("zip", [
d.file("zip_test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""")
]).create();
await d.dir("zap", [
d.file("zip_test.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
""")
]).create();
await d.dir("zop", [
d.file("zip_test.dart", """
import 'package:test/test.dart';
void main() {
test("failure", () => throw "oh no");
}
""")
]).create();
var test = await runTest([]);
expect(test.stdout, emitsThrough(contains('All tests passed!')));
await test.shouldExit(0);
});
test("uses the specified filename", () async {
await d
.file("dart_test.yaml", jsonEncode({"filename": "test_*.dart"}))
.create();
await d.dir("test", [
d.file("test_foo.dart", """
import 'package:test/test.dart';
void main() {
test("success", () {});
}
"""),
d.file("foo_test.dart", """
import 'package:test/test.dart';
void main() {
test("failure", () => throw "oh no");
}
"""),
d.file("test_foo.bart", """
import 'package:test/test.dart';
void main() {
test("failure", () => throw "oh no");
}
""")
]).create();
var test = await runTest([]);
expect(test.stdout, emitsThrough(contains('All tests passed!')));
await test.shouldExit(0);
});
}