blob: 01568e4b4f11fd24d08dc9b5cf678ef9c6b615e2 [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:convert';
import 'package:test/test.dart';
import 'package:test_core/src/util/exit_codes.dart' as exit_codes;
import 'package:test_core/src/util/io.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;
import '../../io.dart';
void main() {
setUpAll(precompileTestExecutable);
group('presets', () {
test("don't do anything by default", () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
await (await runTest(['test.dart'])).shouldExit(0);
});
test('can be selected on the command line', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['-P', 'foo', 'test.dart']);
expect(test.stdout,
containsInOrder(['-1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
});
test('multiple presets can be selected', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'},
'bar': {
'paths': ['test.dart']
}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['-P', 'foo,bar']);
expect(test.stdout,
containsInOrder(['-1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
});
test('the latter preset takes precedence', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'},
'bar': {'timeout': '30s'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
await (await runTest(['-P', 'foo,bar', 'test.dart'])).shouldExit(0);
var test = await runTest(['-P', 'bar,foo', 'test.dart']);
expect(test.stdout,
containsInOrder(['-1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
});
test('a preset takes precedence over the base configuration', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'}
},
'timeout': '30s'
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['-P', 'foo', 'test.dart']);
expect(test.stdout,
containsInOrder(['-1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '30s'}
},
'timeout': '00s'
}))
.create();
await (await runTest(['-P', 'foo', 'test.dart'])).shouldExit(0);
});
test('a nested preset is activated', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': {
'presets': {
'bar': {'timeout': '0s'}
},
},
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test 1", () => Future.delayed(Duration.zero), tags: "foo");
test("test 2", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['-P', 'bar', 'test.dart']);
expect(test.stdout,
containsInOrder(['+0 -1: test 1 [E]', '+1 -1: Some tests failed.']));
await test.shouldExit(1);
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '30s'}
},
'timeout': '00s'
}))
.create();
await (await runTest(['-P', 'foo', 'test.dart'])).shouldExit(0);
});
});
group('add_presets', () {
test('selects a preset', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'}
},
'add_presets': ['foo']
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['test.dart']);
expect(test.stdout,
containsInOrder(['-1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
});
test('applies presets in selection order', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'},
'bar': {'timeout': '30s'}
},
'add_presets': ['foo', 'bar']
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
await (await runTest(['test.dart'])).shouldExit(0);
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '0s'},
'bar': {'timeout': '30s'}
},
'add_presets': ['bar', 'foo']
}))
.create();
var test = await runTest(['test.dart']);
expect(test.stdout,
containsInOrder(['-1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
});
test('allows preset inheritance via add_presets', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {
'add_presets': ['bar']
},
'bar': {'timeout': '0s'}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () => Future.delayed(Duration.zero));
}
''').create();
var test = await runTest(['-P', 'foo', 'test.dart']);
expect(test.stdout,
containsInOrder(['+0 -1: test [E]', '-1: Some tests failed.']));
await test.shouldExit(1);
});
test('allows circular preset inheritance via add_presets', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {
'add_presets': ['bar']
},
'bar': {
'add_presets': ['foo']
}
}
}))
.create();
await d.file('test.dart', '''
import 'dart:async';
import 'package:test/test.dart';
void main() {
test("test", () {});
}
''').create();
await (await runTest(['-P', 'foo', 'test.dart'])).shouldExit(0);
});
});
group('errors', () {
group('presets', () {
test('rejects an invalid preset type', () async {
await d.file('dart_test.yaml', '{"presets": {12: null}}').create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(['presets key must be a string', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid preset name', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {'foo bar': null}
}))
.create();
var test = await runTest([]);
expect(
test.stderr,
containsInOrder([
'presets key must be an (optionally hyphenated) Dart identifier.',
'^^^^^^^^^'
]));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid preset map', () async {
await d.file('dart_test.yaml', jsonEncode({'presets': 12})).create();
var test = await runTest([]);
expect(test.stderr, containsInOrder(['presets must be a map', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid preset configuration', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'presets': {
'foo': {'timeout': '12p'}
}
}))
.create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(['Invalid timeout: expected unit', '^^^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects runner configuration in a non-runner context', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'tags': {
'foo': {
'presets': {
'bar': {'filename': '*_blorp.dart'}
}
}
}
}))
.create();
var test = await runTest([]);
expect(test.stderr,
containsInOrder(["filename isn't supported here.", '^^^^^^^^^^']));
await test.shouldExit(exit_codes.data);
});
test('fails if an undefined preset is passed', () async {
var test = await runTest(['-P', 'foo']);
expect(test.stderr, emitsThrough(contains('Undefined preset "foo".')));
await test.shouldExit(exit_codes.usage);
});
test('fails if an undefined preset is added', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'add_presets': ['foo', 'bar']
}))
.create();
var test = await runTest([]);
expect(test.stderr,
emitsThrough(contains('Undefined presets "foo" and "bar".')));
await test.shouldExit(exit_codes.usage);
});
test('fails if an undefined preset is added in a nested context',
() async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'on_os': {
currentOS.identifier: {
'add_presets': ['bar']
}
}
}))
.create();
var test = await runTest([]);
expect(test.stderr, emitsThrough(contains('Undefined preset "bar".')));
await test.shouldExit(exit_codes.usage);
});
});
group('add_presets', () {
test('rejects an invalid list type', () async {
await d
.file('dart_test.yaml', jsonEncode({'add_presets': 'foo'}))
.create();
var test = await runTest(['test.dart']);
expect(test.stderr,
containsInOrder(['add_presets must be a list', '^^^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid preset type', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'add_presets': [12]
}))
.create();
var test = await runTest(['test.dart']);
expect(test.stderr,
containsInOrder(['Preset name must be a string', '^^']));
await test.shouldExit(exit_codes.data);
});
test('rejects an invalid preset name', () async {
await d
.file(
'dart_test.yaml',
jsonEncode({
'add_presets': ['foo bar']
}))
.create();
var test = await runTest(['test.dart']);
expect(
test.stderr,
containsInOrder([
'Preset name must be an (optionally hyphenated) Dart identifier.',
'^^^^^^^^^'
]));
await test.shouldExit(exit_codes.data);
});
});
});
}