blob: e7bcd7b0286136e8cbf6b082cc3848a41cf716e8 [file] [log] [blame]
// Copyright (c) 2020, 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.
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart' as path;
import 'package:pub_semver/pub_semver.dart';
import 'package:test/test.dart';
import 'package:vm_service/vm_service_io.dart';
import '../experiment_util.dart';
import '../utils.dart';
void main() {
ensureRunFromSdkBinDart();
final experiments = experimentsWithValidation();
group('test', () => defineTest(experiments), timeout: longTimeout);
}
void defineTest(List<Experiment> experiments) {
test('--help', () async {
final p = project(pubspecExtras: {
'dev_dependencies': {'test': 'any'}
});
final result = await p.run(['test', '--help']);
expect(result.exitCode, 0);
expect(result.stdout, startsWith('''
Runs tests in this package.
Usage: dart test [files or directories...]
'''));
expect(result.stderr, isEmpty);
});
test('dart help test', () async {
final p = project(pubspecExtras: {
'dev_dependencies': {'test': 'any'}
});
final result = await p.run(['help', 'test']);
expect(result.exitCode, 0);
expect(result.stdout, contains('Usage: dart test [arguments]'));
expect(result.stderr, isEmpty);
});
test('no pubspec.yaml', () async {
final p = project(pubspecExtras: {
'dev_dependencies': {'test': 'any'}
});
var pubspec = File(path.join(p.dirPath, 'pubspec.yaml'));
pubspec.deleteSync();
var result = await p.run(['test']);
expect(result.stderr, isEmpty);
expect(result.stdout, '''
No pubspec.yaml file found - run this command in your project folder.
''');
expect(result.exitCode, 65);
var resultHelp = await p.run(['test', '--help']);
expect(resultHelp.stderr, isEmpty);
expect(resultHelp.stdout, contains('No pubspec.yaml file found'));
expect(resultHelp.stdout, contains('Usage: dart test [arguments]'));
expect(resultHelp.exitCode, 65);
});
test('runs test', () async {
final p = project(pubspecExtras: {
'dev_dependencies': {'test': 'any'}
});
p.file('test/foo_test.dart', '''
import 'package:test/test.dart';
void main() {
test('', () {
expect(1,1);
});
}
''');
// An implicit `pub get` will happen.
final result =
await p.run(['test', '--no-color', '--reporter', 'expanded']);
expect(result.stderr, isEmpty);
expect(result.stdout, contains('All tests passed!'));
expect(result.exitCode, 0);
});
test('no package:test dependency', () async {
final p = project(
mainSrc: 'int get foo => 1;\n',
pubspecExtras: {
'dev_dependencies': {'test': 'any'}
},
);
p.file('pubspec.yaml', '''
name: ${p.name}
environment:
sdk: '>=2.12.0 <4.0.0'
''');
p.file('test/foo_test.dart', '''
import 'package:test/test.dart';
void main() {
test('', () {
expect(1,1);
});
}
''');
final result = await p.run(['test']);
expect(result.exitCode, 65);
expect(
result.stdout,
contains('You need to add a dev_dependency on package:test'),
);
expect(result.stderr, isEmpty);
expect(result.exitCode, 65);
final resultPubAdd = await p.run(['pub', 'add', 'test']);
expect(resultPubAdd.exitCode, 0);
final result2 =
await p.run(['test', '--no-color', '--reporter', 'expanded']);
expect(result2.stderr, isEmpty);
expect(result2.stdout, contains('All tests passed!'));
expect(result2.exitCode, 0);
});
test('has package:test dependency', () async {
final p = project(
mainSrc: 'int get foo => 1;\n',
pubspecExtras: {
'dev_dependencies': {'test': 'any'}
},
);
p.file('test/foo_test.dart', '''
import 'package:test/test.dart';
void main() {
test('', () {
print('hello world');
});
}
''');
final result =
await p.run(['test', '--no-color', '--reporter', 'expanded']);
expect(result.exitCode, 0);
expect(result.stdout, contains('All tests passed!'));
expect(result.stderr, isEmpty);
});
test('implicitly passes --mark-main-isolate-as-system-isolate', () async {
// --mark-main-isolate-as-system-isolate is necessary for DevTools to be
// able to identify the correct root library.
//
// See https://github.com/flutter/flutter/issues/143170 for details.
final p = project(
mainSrc: 'int get foo => 1;\n',
pubspecExtras: {
'dev_dependencies': {'test': 'any'}
},
);
p.file('test/foo_test.dart', '''
import 'package:test/test.dart';
void main() {
test('', () {
print('hello world');
});
}
''');
final vmServiceUriRegExp =
RegExp(r'(http:\/\/127.0.0.1:\d*\/[\da-zA-Z-_]*=\/)');
final process = await p.start(['test', '--pause-after-load']);
final completer = Completer<Uri>();
late StreamSubscription sub;
sub = process.stdout
.transform(utf8.decoder)
.transform(const LineSplitter())
.listen((line) async {
if (line.contains(vmServiceUriRegExp)) {
await sub.cancel();
final httpUri = Uri.parse(
vmServiceUriRegExp.firstMatch(line)!.group(0)!,
);
completer.complete(
httpUri.replace(scheme: 'ws', path: '${httpUri.path}ws'),
);
}
});
final vmServiceUri = await completer.future;
final vmService = await vmServiceConnectUri(vmServiceUri.toString());
final vm = await vmService.getVM();
expect(vm.systemIsolates!.where((e) => e.name == 'main'), isNotEmpty);
});
group('--enable-experiment', () {
late TestProject p;
Future<ProcessResult> runTestWithExperimentFlag(String? flag) async {
return await p.run([
if (flag != null) flag,
'test',
'--no-color',
'--reporter',
'expanded',
]);
}
Future<void> expectSuccess(String? flag) async {
final result = await runTestWithExperimentFlag(flag);
expect(result.stdout, contains('feature enabled'),
reason: 'stderr: ${result.stderr}');
expect(result.exitCode, 0,
reason: 'stdout: ${result.stdout} stderr: ${result.stderr}');
}
Future<void> expectFailure(String? flag) async {
final result = await runTestWithExperimentFlag(flag);
expect(result.exitCode, isNot(0));
}
for (final experiment in experiments) {
test(experiment.name, () async {
final currentSdk = Version.parse(Platform.version.split(' ').first);
p = project(
mainSrc: experiment.validation,
sdkConstraint: VersionConstraint.compatibleWith(currentSdk),
pubspecExtras: {
'dev_dependencies': {'test': 'any'}
},
);
p.file('test/experiment_test.dart', '''
import 'package:dartdev_temp/main.dart' as imported;
import 'package:test/test.dart';
void main() {
test('testing feature', () {
imported.main();
});
}
''');
if (experiment.enabledIn != null) {
// The experiment has been released - enabling it should have no effect.
await expectSuccess(null);
await expectSuccess('--enable-experiment=${experiment.name}');
} else {
await expectFailure(null);
await expectFailure('--enable-experiment=no-${experiment.name}');
await expectSuccess('--enable-experiment=${experiment.name}');
}
});
}
});
}