mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 14:39:38 +00:00
Use pub embedding to run test in dart test
Now a `pub get` will be run implicitly if needed. (This happens in getExecutableForCommand from the pub package). Change-Id: I9eca9b6d8761a3035f21c0f86653c87710b9d229 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/171281 Commit-Queue: Sigurd Meldgaard <sigurdm@google.com> Reviewed-by: Jonas Jensen <jonasfj@google.com>
This commit is contained in:
parent
d09c73d7fb
commit
eb5fea9f3d
|
@ -5,10 +5,9 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:args/args.dart';
|
||||
import 'package:pub/pub.dart';
|
||||
|
||||
import '../core.dart';
|
||||
import '../experiments.dart';
|
||||
import '../sdk.dart';
|
||||
import '../vm_interop_handler.dart';
|
||||
|
||||
/// Implement `dart test`.
|
||||
|
@ -19,110 +18,38 @@ class TestCommand extends DartdevCommand {
|
|||
|
||||
TestCommand() : super(cmdName, 'Run tests in this package.');
|
||||
|
||||
// This argument parser is here solely to ensure that VM specific flags are
|
||||
// provided before any command and to provide a more consistent help message
|
||||
// with the rest of the tool.
|
||||
@override
|
||||
final ArgParser argParser = ArgParser.allowAnything();
|
||||
|
||||
@override
|
||||
void printUsage() {
|
||||
_runImpl(['-h']);
|
||||
ArgParser createArgParser() {
|
||||
return ArgParser.allowAnything();
|
||||
}
|
||||
|
||||
@override
|
||||
FutureOr<int> run() async {
|
||||
return _runImpl(argResults.arguments.toList());
|
||||
}
|
||||
|
||||
int _runImpl(List<String> testArgs) {
|
||||
if (!Sdk.checkArtifactExists(sdk.pubSnapshot)) {
|
||||
return 255;
|
||||
if (argResults.rest.contains('-h') || argResults.rest.contains('--help')) {
|
||||
printUsage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
final pubSnapshot = sdk.pubSnapshot;
|
||||
|
||||
bool isHelpCommand = testArgs.contains('--help') || testArgs.contains('-h');
|
||||
|
||||
// Check for no pubspec.yaml file.
|
||||
if (!project.hasPubspecFile) {
|
||||
_printNoPubspecMessage(isHelpCommand);
|
||||
return 65;
|
||||
}
|
||||
|
||||
// Handle the case of no .dart_tool/package_config.json file.
|
||||
if (!project.hasPackageConfigFile) {
|
||||
_printRunPubGetInstructions(isHelpCommand);
|
||||
return 65;
|
||||
}
|
||||
|
||||
// "Could not find package "test". Did you forget to add a dependency?"
|
||||
if (!project.packageConfig.hasDependency('test')) {
|
||||
_printMissingDepInstructions(isHelpCommand);
|
||||
return 65;
|
||||
}
|
||||
List<String> enabledExperiments = [];
|
||||
if (!(testArgs.length == 1 && testArgs[0] == '-h')) {
|
||||
enabledExperiments = argResults.enabledExperiments;
|
||||
}
|
||||
final args = [
|
||||
'run',
|
||||
if (enabledExperiments.isNotEmpty)
|
||||
'--$experimentFlagName=${enabledExperiments.join(',')}',
|
||||
'test',
|
||||
...testArgs,
|
||||
];
|
||||
|
||||
log.trace('$pubSnapshot ${args.join(' ')}');
|
||||
VmInteropHandler.run(pubSnapshot, args);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void _printNoPubspecMessage(bool wasHelpCommand) {
|
||||
log.stdout('''
|
||||
log.stdout('''
|
||||
No pubspec.yaml file found; please run this command from the root of your project.
|
||||
''');
|
||||
|
||||
if (wasHelpCommand) {
|
||||
log.stdout(_terseHelp);
|
||||
log.stdout('');
|
||||
printUsage();
|
||||
return 65;
|
||||
}
|
||||
|
||||
log.stdout(_usageHelp);
|
||||
}
|
||||
|
||||
void _printRunPubGetInstructions(bool wasHelpCommand) {
|
||||
log.stdout('''
|
||||
No .dart_tool/package_config.json file found, please run 'dart pub get'.
|
||||
''');
|
||||
|
||||
if (wasHelpCommand) {
|
||||
log.stdout(_terseHelp);
|
||||
log.stdout('');
|
||||
try {
|
||||
final testExecutable = await getExecutableForCommand('test:test');
|
||||
log.trace('dart $testExecutable ${argResults.rest.join(' ')}');
|
||||
VmInteropHandler.run(testExecutable, argResults.rest);
|
||||
return 0;
|
||||
} on CommandResolutionFailedException catch (e) {
|
||||
print(e.message);
|
||||
print('You need to add a dependency on package:test.');
|
||||
print('Try running `dart pub add test`.');
|
||||
return 65;
|
||||
}
|
||||
|
||||
log.stdout(_usageHelp);
|
||||
}
|
||||
|
||||
void _printMissingDepInstructions(bool wasHelpCommand) {
|
||||
final ansi = log.ansi;
|
||||
|
||||
log.stdout('''
|
||||
No dependency on package:test found. In order to run tests, you need to add a dependency
|
||||
on package:test in your pubspec.yaml file:
|
||||
|
||||
${ansi.emphasized('dev_dependencies:\n test: ^1.0.0')}
|
||||
|
||||
See https://pub.dev/packages/test/install for more information on adding package:test,
|
||||
and https://dart.dev/guides/testing for general information on testing.
|
||||
''');
|
||||
|
||||
if (wasHelpCommand) {
|
||||
log.stdout(_terseHelp);
|
||||
log.stdout('');
|
||||
}
|
||||
|
||||
log.stdout(_usageHelp);
|
||||
}
|
||||
}
|
||||
|
||||
const String _terseHelp = 'Run tests in this package.';
|
||||
|
||||
const String _usageHelp = 'Usage: dart test [files or directories...]';
|
||||
|
|
|
@ -21,10 +21,7 @@ void defineTest() {
|
|||
test('--help', () {
|
||||
p = project();
|
||||
|
||||
var result = p.runSync('pub', ['get']);
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
result = p.runSync('test', ['--help']);
|
||||
final result = p.runSync('test', ['--help']);
|
||||
|
||||
expect(result.exitCode, 0);
|
||||
expect(result.stdout, contains(' tests in this package'));
|
||||
|
@ -34,10 +31,7 @@ void defineTest() {
|
|||
test('dart help test', () {
|
||||
p = project();
|
||||
|
||||
var result = p.runSync('pub', ['get']);
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
result = p.runSync('help', ['test']);
|
||||
final result = p.runSync('help', ['test']);
|
||||
|
||||
expect(result.exitCode, 0);
|
||||
expect(result.stdout, contains(' tests in this package'));
|
||||
|
@ -49,22 +43,30 @@ void defineTest() {
|
|||
var pubspec = File(path.join(p.dirPath, 'pubspec.yaml'));
|
||||
pubspec.deleteSync();
|
||||
|
||||
var result = p.runSync('help', ['test']);
|
||||
var result = p.runSync('test', []);
|
||||
|
||||
expect(result.exitCode, 0);
|
||||
expect(result.stdout, contains('No pubspec.yaml file found'));
|
||||
expect(result.stderr, isEmpty);
|
||||
expect(result.stdout, contains('No pubspec.yaml file found'));
|
||||
expect(result.exitCode, 65);
|
||||
});
|
||||
|
||||
test('no .dart_tool/package_config.json', () {
|
||||
test('runs test', () {
|
||||
p = project();
|
||||
p.file('test/foo_test.dart', '''
|
||||
import 'package:test/test.dart';
|
||||
|
||||
var result = p.runSync('help', ['test']);
|
||||
void main() {
|
||||
test('', () {
|
||||
expect(1,1);
|
||||
});
|
||||
}
|
||||
''');
|
||||
|
||||
expect(result.exitCode, 0);
|
||||
expect(result.stdout,
|
||||
contains('No .dart_tool/package_config.json file found'));
|
||||
// An implicit `pub get` will happen.
|
||||
final result = p.runSync('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', () {
|
||||
|
@ -74,16 +76,31 @@ name: ${p.name}
|
|||
environment:
|
||||
sdk: '>=2.10.0 <3.0.0'
|
||||
''');
|
||||
p.file('test/foo_test.dart', '''
|
||||
import 'package:test/test.dart';
|
||||
|
||||
var result = p.runSync('pub', ['get']);
|
||||
expect(result.exitCode, 0);
|
||||
void main() {
|
||||
test('', () {
|
||||
expect(1,1);
|
||||
});
|
||||
}
|
||||
''');
|
||||
|
||||
result = p.runSync('test', []);
|
||||
expect(result.exitCode, 65);
|
||||
final result = p.runSync('test', []);
|
||||
expect(
|
||||
result.stdout,
|
||||
contains('In order to run tests, you need to add a dependency'),
|
||||
contains('You need to add a dependency on package:test'),
|
||||
);
|
||||
expect(result.stderr, isEmpty);
|
||||
expect(result.exitCode, 65);
|
||||
|
||||
final resultPubAdd = p.runSync('pub', ['add', 'test']);
|
||||
|
||||
expect(resultPubAdd.exitCode, 0);
|
||||
final result2 = p.runSync('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', () {
|
||||
|
@ -100,10 +117,7 @@ void main() {
|
|||
}
|
||||
''');
|
||||
|
||||
var result = p.runSync('pub', ['get']);
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
result = p.runSync('test', ['--no-color', '--reporter', 'expanded']);
|
||||
final result = p.runSync('test', ['--no-color', '--reporter', 'expanded']);
|
||||
expect(result.exitCode, 0);
|
||||
expect(result.stdout, contains('All tests passed!'));
|
||||
expect(result.stderr, isEmpty);
|
||||
|
@ -123,11 +137,10 @@ void main() {
|
|||
}
|
||||
''');
|
||||
|
||||
var result = p.runSync('pub', ['get']);
|
||||
expect(result.exitCode, 0);
|
||||
|
||||
result = p.runSync('--enable-experiment=non-nullable',
|
||||
['test', '--no-color', '--reporter', 'expanded']);
|
||||
final result = p.runSync(
|
||||
'--enable-experiment=non-nullable',
|
||||
['test', '--no-color', '--reporter', 'expanded'],
|
||||
);
|
||||
expect(result.exitCode, 1);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue