blob: e3b817e3d8083629fff62d0bc0a09c66db1f4bb4 [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:pedantic/pedantic.dart';
import 'package:test/test.dart';
import 'package:test_core/src/util/io.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;
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;
unawaited(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 Future.delayed(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:async')));
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 Future((){});
await 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
''').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(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", () => 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", () => 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);
});
}