Revert "Revert "Revert "Refactor test option parsing code."""

This reverts commit 79af418430.

Review-Url: https://codereview.chromium.org/2912563002 .
This commit is contained in:
Bob Nystrom 2017-05-26 14:46:02 -07:00
parent 79af418430
commit 02547656cc
9 changed files with 1048 additions and 940 deletions

View file

@ -156,6 +156,9 @@ dart/optimized_stacktrace_line_and_column_test: RuntimeError
# minifying they can be renamed, which is issue 7953.
dart/inline_stack_frame_test: RuntimeError, Pass # Issue 7953
[ $compiler == dart2js && $cps_ir && $checked ]
dart/*: Skip # checked mode + cpsir not supported yet. Issue 25761
[ $compiler == dart2js || $compiler == dart2analyzer ]
# Data uri's not supported by dart2js or the analyzer.
dart/data_uri*test: Skip

View file

@ -14,6 +14,9 @@ sample_extension: Skip
[ $compiler == dart2js && $runtime == none ]
*: Fail, Pass # TODO(ahe): Triage these tests.
[ $compiler == dart2js && $cps_ir && $checked ]
sample_extension: Crash # Unable to compile UnsupportedError.message.
[ $compiler == dart2analyzer ]
build_dart: Skip

View file

@ -18,7 +18,7 @@ library co19_test;
import "dart:io";
import "options.dart";
import "test_options.dart";
import "test_suite.dart";
import "test_configurations.dart";
@ -59,7 +59,7 @@ const List<List<String>> COMMAND_LINES = const <List<String>>[
void main(List<String> args) {
TestUtils.setDartDirUri(Platform.script.resolve('../../..'));
var optionsParser = new OptionsParser();
var optionsParser = new TestOptionsParser();
var configurations = <Map>[];
for (var commandLine in COMMAND_LINES) {
var arguments = <String>[];

View file

@ -47,12 +47,6 @@ abstract class CompilerConfiguration {
final bool isHostChecked;
final bool useSdk;
/// Only some subclasses support this check, but we statically allow calling
/// it on [CompilerConfiguration].
bool get useDfe {
throw new UnsupportedError("This compiler does not support DFE.");
}
// TODO(ahe): Remove this constructor and move the switch to
// test_options.dart. We probably want to store an instance of
// [CompilerConfiguration] in [configuration] there.
@ -68,6 +62,7 @@ abstract class CompilerConfiguration {
bool isHostChecked = configuration['host_checked'];
bool useSdk = configuration['use_sdk'];
bool isCsp = configuration['csp'];
bool useCps = configuration['cps_ir'];
bool useBlobs = configuration['use_blobs'];
bool hotReload = configuration['hot_reload'];
bool hotReloadRollback = configuration['hot_reload_rollback'];
@ -87,6 +82,7 @@ abstract class CompilerConfiguration {
isDebug: isDebug,
isChecked: isChecked,
isHostChecked: isHostChecked,
useCps: useCps,
useSdk: useSdk,
isCsp: isCsp,
useFastStartup: useFastStartup,
@ -111,7 +107,7 @@ abstract class CompilerConfiguration {
useSdk: useSdk,
hotReload: hotReload,
hotReloadRollback: hotReloadRollback,
useDfe: true);
useDFE: true);
case 'dartkp':
return new PrecompilerCompilerConfiguration(
isDebug: isDebug,
@ -119,7 +115,7 @@ abstract class CompilerConfiguration {
arch: configuration['arch'],
useBlobs: useBlobs,
isAndroid: configuration['system'] == 'android',
useDfe: true);
useDFE: true);
case 'none':
return new NoneCompilerConfiguration(
isDebug: isDebug,
@ -191,7 +187,7 @@ abstract class CompilerConfiguration {
class NoneCompilerConfiguration extends CompilerConfiguration {
final bool hotReload;
final bool hotReloadRollback;
final bool useDfe;
final bool useDFE;
NoneCompilerConfiguration(
{bool isDebug,
@ -200,7 +196,7 @@ class NoneCompilerConfiguration extends CompilerConfiguration {
bool useSdk,
bool this.hotReload,
bool this.hotReloadRollback,
this.useDfe: false})
this.useDFE: false})
: super._subclass(
isDebug: isDebug,
isChecked: isChecked,
@ -218,7 +214,7 @@ class NoneCompilerConfiguration extends CompilerConfiguration {
List<String> originalArguments,
CommandArtifact artifact) {
List<String> args = [];
if (useDfe) {
if (useDFE) {
args.add('--dfe=${buildDir}/gen/kernel-service.dart.snapshot');
args.add('--platform=${buildDir}/patched_sdk/platform.dill');
}
@ -541,15 +537,20 @@ class Dart2xCompilerConfiguration extends CompilerConfiguration {
/// Configuration for dart2js compiler.
class Dart2jsCompilerConfiguration extends Dart2xCompilerConfiguration {
final bool isCsp;
final bool useCps;
final bool useFastStartup;
final bool useKernel;
final List<String> extraDart2jsOptions;
// We cache the extended environment to save memory.
static Map<String, String> cpsFlagCache;
static Map<String, String> environmentOverridesCacheObject;
Dart2jsCompilerConfiguration(
{bool isDebug,
bool isChecked,
bool isHostChecked,
bool useSdk,
bool this.useCps,
bool this.isCsp,
bool this.useFastStartup,
this.useKernel,
@ -603,7 +604,7 @@ class PrecompilerCompilerConfiguration extends CompilerConfiguration {
final String arch;
final bool useBlobs;
final bool isAndroid;
final bool useDfe;
final bool useDFE;
PrecompilerCompilerConfiguration(
{bool isDebug,
@ -611,7 +612,7 @@ class PrecompilerCompilerConfiguration extends CompilerConfiguration {
this.arch,
this.useBlobs,
this.isAndroid,
this.useDfe: false})
this.useDFE: false})
: super._subclass(isDebug: isDebug, isChecked: isChecked);
int computeTimeoutMultiplier() {
@ -657,7 +658,7 @@ class PrecompilerCompilerConfiguration extends CompilerConfiguration {
exec = "$buildDir/dart_bootstrap";
}
var args = <String>[];
if (useDfe) {
if (useDFE) {
args.add('--dfe=utils/kernel-service/kernel-service.dart');
args.add('--platform=${buildDir}/patched_sdk/platform.dill');
}

View file

@ -22,8 +22,8 @@
/// `factory StandardTestSuite.forDirectory`.
import "dart:io";
import "options.dart";
import "test_configurations.dart";
import "test_options.dart";
import "test_suite.dart";
/// Runs all of the tests specified by the given command line [arguments].
@ -32,8 +32,8 @@ void main(List<String> arguments) {
TestUtils.setDartDirUri(Platform.script.resolve('../../..'));
// Parse the command line arguments to a configuration.
var parser = new OptionsParser();
var configurations = parser.parse(arguments);
var optionsParser = new TestOptionsParser();
var configurations = optionsParser.parse(arguments);
if (configurations == null || configurations.isEmpty) return;
// Run all of the configured tests.

View file

@ -1,916 +0,0 @@
// Copyright (c) 2013, 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:io';
import 'drt_updater.dart';
import 'test_suite.dart';
import 'path.dart';
import 'compiler_configuration.dart' show CompilerConfiguration;
import 'runtime_configuration.dart' show RuntimeConfiguration;
const _defaultTestSelectors = const [
'samples',
'standalone',
'corelib',
'co19',
'language',
'isolate',
'vm',
'html',
'benchmark_smoke',
'utils',
'lib',
'analyze_library',
'service',
'kernel',
'observatory_ui'
];
/// Specifies a single command line option.
///
/// The name of the specification is used as the key for the option in the Map
/// returned from the [TestOptionParser] parse method.
class _Option {
// TODO(rnystrom): Some string options use "" to mean "no value" and others
// use null. Clean that up.
_Option(this.name, this.description,
{String abbr, List<String> values, String defaultsTo = ""})
: abbreviation = abbr,
values = values ?? [],
defaultValue = defaultsTo,
type = _OptionValueType.string;
_Option.bool(this.name, this.description, [this.abbreviation])
: values = [],
defaultValue = false,
type = _OptionValueType.bool;
_Option.int(this.name, this.description, {String abbr, int defaultsTo})
: abbreviation = abbr,
values = [],
defaultValue = defaultsTo,
type = _OptionValueType.int;
final String name;
final String description;
final String abbreviation;
final List<String> values;
final Object defaultValue;
final _OptionValueType type;
/// Gets the shortest command line argument used to refer to this option.
String get shortCommand => abbreviation != null ? "-$abbreviation" : command;
/// Gets the canonical long command line argument used to refer to this
/// option.
String get command => "--${name.replaceAll('_', '-')}";
}
enum _OptionValueType { bool, int, string }
/// Parses command line arguments and produces a test runner configuration.
class OptionsParser {
static final List<_Option> _options = [
new _Option('mode', 'Mode in which to run the tests.',
abbr: 'm',
values: ['all', 'debug', 'release', 'product'],
defaultsTo: 'debug'),
new _Option(
'compiler',
'''Specify any compilation step (if needed).
none: Do not compile the Dart code (run native Dart code
on the VM).
(Only valid with runtimes vm, flutter, or drt.)
precompiler: Compile into AOT snapshot before running the test.
(Only valid with runtime dart_precompiled.)
dart2js: Compile dart code to JavaScript by running dart2js.
(Only valid with runtimes: d8, drt, chrome, safari,
ie9, ie10, ie11, firefox, opera, chromeOnAndroid,
and none [compile only].)
dart2analyzer: Perform static analysis on Dart code by running the
analyzer.
(Only valid with runtime none.)
app_jit: Compile the Dart code into an app snapshot before
running test.
(Only valid with dart_app runtime.)
dartk: Compile the Dart source into Kernel before running
test.
dartkp: Compile the Dart source into Kernel and then Kernel
into AOT snapshot before running the test.
(Only valid with runtime dart_precompiled.)''',
abbr: 'c',
values: [
'none',
'precompiler',
'dart2js',
'dart2analyzer',
'app_jit',
'dartk',
'dartkp'
],
defaultsTo: 'none'),
new _Option(
'runtime',
'''Where the tests should be run.
vm: Run Dart code on the standalone dart vm.
flutter: Run Dart code on the flutter engine.
dart_precompiled: Run a precompiled snapshot on a variant of the
standalone dart VM lacking a JIT.
d8: Run JavaScript from the command line using v8.
jsshell: Run JavaScript from the command line using
Firefox js-shell.
drt: Run Dart or JavaScript in the headless version
of Chrome, Content shell.
dartium: Run Dart or JavaScript in Dartium.
ContentShellOnAndroid: Run Dart or JavaScript in Dartium content
shell on Android.
DartiumOnAndroid: Run Dart or Javascript in Dartium on Android.
ff:
chrome:
safari:
ie9:
ie10:
ie11:
opera:
chromeOnAndroid: Run JavaScript in the specified browser.
self_check: Pass each test or its compiled output to every
file under `pkg` whose name ends with
`_self_check.dart`. Each test is given to the
self_check tester as a filename on stdin using
the batch-mode protocol.
none: No runtime, compile only. (For example, used
for dart2analyzer static analysis tests).''',
abbr: 'r',
values: [
'vm',
'flutter',
'dart_precompiled',
'd8',
'jsshell',
'drt',
'dartium',
'ff',
'firefox',
'chrome',
'safari',
'ie9',
'ie10',
'ie11',
'opera',
'chromeOnAndroid',
'safarimobilesim',
'ContentShellOnAndroid',
'DartiumOnAndroid',
'self_check',
'none'
],
defaultsTo: 'vm'),
new _Option(
'arch',
'''The architecture to run tests for.
Allowed values are:
all
ia32, x64
arm, armv6, armv5te, arm64,
simarm, simarmv6, simarmv5te, simarm64,
mips, simmips
simdbc, simdbc64''',
abbr: 'a',
values: [
'all',
'ia32',
'x64',
'arm',
'armv6',
'armv5te',
'arm64',
'mips',
'simarm',
'simarmv6',
'simarmv5te',
'simarm64',
'simmips',
'simdbc',
'simdbc64',
],
defaultsTo: 'x64'),
new _Option('system', 'The operating system to run tests on.',
abbr: 's',
values: ['linux', 'macos', 'windows', 'android'],
defaultsTo: Platform.operatingSystem),
new _Option.bool('checked', 'Run tests in checked mode.'),
new _Option.bool('strong', 'Run tests in strong mode.'),
new _Option.bool('host_checked', 'Run compiler in checked mode.'),
new _Option.bool('minified', 'Enable minification in the compiler.'),
new _Option.bool(
'csp', 'Run tests under Content Security Policy restrictions.'),
new _Option.bool(
'fast_startup', 'Pass the --fast-startup flag to dart2js.'),
new _Option.bool('dart2js_with_kernel',
'Enable the internal pipeline in dart2js to use kernel.'),
new _Option.bool('hot_reload', 'Run hot reload stress tests.'),
new _Option.bool(
'hot_reload_rollback', 'Run hot reload rollback stress tests.'),
new _Option.bool('use_blobs',
'Use mmap instead of shared libraries for precompilation.'),
new _Option.int('timeout', 'Timeout in seconds.',
abbr: 't', defaultsTo: -1),
new _Option(
'progress',
'''Progress indication mode.
Allowed values are:
compact, color, line, verbose, silent, status, buildbot, diff
''',
abbr: 'p',
values: [
'compact',
'color',
'line',
'verbose',
'silent',
'status',
'buildbot',
'diff'
],
defaultsTo: 'compact'),
new _Option('step_name', 'Step name for use by -pbuildbot.',
defaultsTo: null),
new _Option.bool('report',
'Print a summary report of the number of tests, by expectation.'),
new _Option.int('tasks', 'The number of parallel tasks to run.',
abbr: 'j', defaultsTo: Platform.numberOfProcessors),
new _Option.int('shards',
'The number of instances that the tests will be sharded over.',
defaultsTo: 1),
new _Option.int(
'shard', 'The index of this instance when running in sharded mode.',
defaultsTo: 1),
new _Option.bool('help', 'Print list of options.', 'h'),
new _Option.bool('verbose', 'Verbose output.', 'v'),
new _Option.bool('verify-ir', 'Verify kernel IR.'),
new _Option.bool('no-tree-shake', 'Disable kernel IR tree shaking.'),
new _Option.bool('list', 'List tests only, do not run them.'),
new _Option.bool('report_in_json',
'When listing with --list, output result summary in JSON.'),
new _Option.bool('time', 'Print timing information after running tests.'),
new _Option('dart', 'Path to dart executable.'),
new _Option('flutter', 'Path to flutter executable.'),
new _Option(
'drt', // TODO(antonm): fix the option name.
'Path to content shell executable.'),
new _Option('dartium', 'Path to Dartium Chrome executable.'),
new _Option('firefox', 'Path to firefox browser executable.'),
new _Option('chrome', 'Path to chrome browser executable.'),
new _Option('safari', 'Path to safari browser executable.'),
new _Option.bool(
'use_sdk',
'''Use compiler or runtime from the SDK.
Normally, the compiler or runtimes in PRODUCT_DIR is tested, with
this option, the compiler or runtime in PRODUCT_DIR/dart-sdk/bin
is tested.
(Note: currently only implemented for dart2js.)'''),
new _Option('build_directory',
'The name of the build directory, where products are placed.'),
new _Option.bool('noBatch', 'Do not run tests in batch mode.', 'n'),
new _Option.bool('dart2js_batch', 'Run dart2js tests in batch mode.'),
new _Option.bool(
'append_logs', 'Do not delete old logs but rather append to them.'),
new _Option.bool('write_debug_log',
'Don\'t write debug messages to stdout but rather to a logfile.'),
new _Option.bool('write_test_outcome_log',
'Write test outcomes to a "${TestUtils.testOutcomeFileName}" file.'),
new _Option.bool(
'reset_browser_configuration',
'''Browser specific reset of configuration.
Warning: Using this option may remove your bookmarks and other
settings.'''),
new _Option.bool(
'copy_coredumps',
'''If we see a crash that we did not expect, copy the core dumps to
"/tmp".'''),
new _Option(
'local_ip',
'''IP address the HTTP servers should listen on. This address is also
used for browsers to connect to.''',
defaultsTo: '127.0.0.1'),
new _Option.int('test_server_port', 'Port for test http server.',
defaultsTo: 0),
new _Option.int('test_server_cross_origin_port',
'Port for test http server cross origin.',
defaultsTo: 0),
new _Option.int('test_driver_port', 'Port for http test driver server.',
defaultsTo: 0),
new _Option.int(
'test_driver_error_port', 'Port for http test driver server errors.',
defaultsTo: 0),
new _Option('record_to_file',
'Records all commands to be executed and writes to a file.',
defaultsTo: null),
new _Option(
'replay_from_file', 'Replays a previously recorded list of commands.',
defaultsTo: null),
new _Option(
'builder_tag',
'''Machine specific options that is not captured by the regular test
options. Used to be able to make sane updates to the status files.'''),
new _Option('vm_options', 'Extra options to send to the vm when running.',
defaultsTo: null),
new _Option(
'dart2js_options', 'Extra options for dart2js compilation step.',
defaultsTo: null),
new _Option(
'suite_dir', 'Additional directory to add to the testing matrix.',
defaultsTo: null),
new _Option('package_root', 'The package root to use for testing.',
defaultsTo: null),
new _Option('packages', 'The package spec file to use for testing.',
defaultsTo: null),
new _Option(
'exclude_suite',
'''Exclude suites from default selector, only works when no selector
has been specified on the command line.''',
defaultsTo: null),
new _Option.bool(
'skip-compilation',
'''
Skip the compilation step, using the compilation artifacts left in
the output folder from a previous run. This flag will often cause
false positves and negatives, but can be useful for quick and
dirty offline testing when not making changes that affect the
compiler.''')
];
/// For printing out reproducing command lines, we don't want to add these
/// options.
static final _blacklistedOptions = [
'append_logs',
'build_directory',
'chrome',
'copy_coredumps',
'dart',
'flutter',
'dartium',
'drt',
'exclude_suite',
'firefox',
'local_ip',
'progress',
'report',
'safari',
'shard',
'shards',
'step_name',
'tasks',
'time',
'verbose',
'write_debug_log',
'write_test_outcome_log',
].toSet();
/// Parses a list of strings as test options.
///
/// Returns a list of configurations in which to run the tests.
/// Configurations are maps mapping from option keys to values. When
/// encountering the first non-option string, the rest of the arguments are
/// stored in the returned Map under the 'rest' key.
List<Map> parse(List<String> arguments) {
// TODO(rnystrom): The builders on the buildbots still pass this even
// though it does nothing. Until those can be fixed, silently ignore the
// option. Remove this once the buildbot scripts are fixed.
if (arguments.contains("--failure-summary")) {
arguments = arguments.where((arg) => arg != "--failure-summary").toList();
print('Note: Ignoring unsupported "--failure-summary" option.');
}
var configuration = {};
// Fill in configuration with arguments passed to the test script.
for (var i = 0; i < arguments.length; i++) {
var arg = arguments[i];
// Help supersedes all other arguments.
if (arg == "--help" || arg == "-h") {
_printHelp();
return null;
}
// Extract name and value for options.
String command;
String value;
_Option option;
if (arg.startsWith("--")) {
// A long option name.
var equals = arg.indexOf("=");
if (equals != -1) {
// A long option with a value, like "--arch=ia32".
command = arg.substring(0, equals);
value = arg.substring(equals + 1);
} else {
command = arg;
}
option = _findByName(command.substring(2));
} else if (arg.startsWith("-")) {
// An abbreviated option.
if (arg.length == 1) {
_fail('Missing option name after "-".');
}
command = arg.substring(0, 2);
if (arg.length > 2) {
// An abbreviated option followed by a value, like "-aia32".
value = arg.substring(2);
}
option = _findByAbbreviation(command.substring(1));
} else {
// The argument does not start with "-" or "--" and is therefore not an
// option. Use it as a test selector pattern.
var patterns = configuration.putIfAbsent("selectors", () => <String>[]);
patterns.add(arg);
continue;
}
if (option == null) {
_fail('Unknown command line option "$command".');
}
// If we need a value, look at the next argument.
if (value == null && option.type != _OptionValueType.bool) {
if (i + 1 >= arguments.length) {
_fail('Missing value for command line option "$command".');
}
value = arguments[++i];
}
// Multiple uses of a flag are an error, because there is no naturally
// correct way to handle conflicting options.
if (configuration.containsKey(option.name)) {
_fail('Already have value for command line option "$command".');
}
// Parse the value for the option.
switch (option.type) {
case _OptionValueType.bool:
if (value != null) {
_fail('Boolean flag "$command" does not take a value.');
}
configuration[option.name] = true;
break;
case _OptionValueType.int:
try {
configuration[option.name] = int.parse(value);
} on FormatException {
_fail('Integer value expected for option "$command".');
}
break;
case _OptionValueType.string:
// Validate against the allowed values.
if (!option.values.isEmpty) {
for (var v in value.split(",")) {
if (!option.values.contains(v)) {
_fail('Unknown value "$v" for command line option "$command".');
}
}
}
// TODO(rnystrom): Store as a list instead of a comma-delimited
// string.
configuration[option.name] = value;
break;
}
}
// Apply default values for unspecified options.
for (var option in _options) {
if (!configuration.containsKey(option.name)) {
configuration[option.name] = option.defaultValue;
}
}
var expandedConfigs = _expandConfigurations(configuration);
var result = expandedConfigs.where(_isValidConfig).toList();
for (var config in result) {
config['_reproducing_arguments_'] = _reproducingCommand(config);
}
return result.isEmpty ? null : result;
}
/// Prints [message] and exits with a non-zero exit code.
void _fail(String message) {
print(message);
exit(1);
}
/// Given a configuration, returns the list of command line arguments that
/// would reproduce that configuration.
List<String> _reproducingCommand(Map config) {
var arguments = <String>[];
for (var option in _options) {
var name = option.name;
if (!config.containsKey(name) || _blacklistedOptions.contains(name)) {
continue;
}
var value = config[name];
if (config[name] == option.defaultValue ||
(name == 'packages' &&
value ==
TestUtils.dartDirUri.resolve('.packages').toFilePath())) {
continue;
}
arguments.add(option.shortCommand);
if (option.type != _OptionValueType.bool) {
arguments.add(value.toString());
}
}
return arguments;
}
/// Determines if a particular configuration has a valid combination of
/// compiler and runtime elements.
bool _isValidConfig(Map config) {
var isValid = true;
List<String> validRuntimes;
switch (config['compiler']) {
case 'dart2js':
// Note: by adding 'none' as a configuration, if the user
// runs test.py -c dart2js -r drt,none the dart2js_none and
// dart2js_drt will be duplicating work. If later we don't need 'none'
// with dart2js, we should remove it from here.
validRuntimes = const [
'd8',
'jsshell',
'drt',
'none',
'dartium',
'ff',
'chrome',
'safari',
'ie9',
'ie10',
'ie11',
'opera',
'chromeOnAndroid',
'safarimobilesim'
];
break;
case 'dart2analyzer':
validRuntimes = const ['none'];
break;
case 'app_jit':
case 'dartk':
validRuntimes = const ['vm', 'self_check', 'none'];
break;
case 'precompiler':
case 'dartkp':
validRuntimes = const ['dart_precompiled'];
break;
case 'none':
validRuntimes = const [
'vm',
'flutter',
'drt',
'dartium',
'ContentShellOnAndroid',
'DartiumOnAndroid'
];
break;
}
if (!validRuntimes.contains(config['runtime'])) {
isValid = false;
print("Warning: combination of compiler '${config['compiler']}' and "
"runtime '${config['runtime']}' is invalid. "
"Skipping this combination.");
}
if (config['ie'] && Platform.operatingSystem != 'windows') {
isValid = false;
print("Warning: cannot run Internet Explorer on non-Windows operating"
" system.");
}
if (config['shard'] < 1 || config['shard'] > config['shards']) {
isValid = false;
print("Error: shard index is ${config['shard']} out of "
"${config['shards']} shards");
}
if (config['runtime'] == 'flutter' && config['flutter'] == '') {
isValid = false;
print("-rflutter requires the flutter engine executable to "
"be specified using --flutter=");
}
if (config['runtime'] == 'flutter' && config['arch'] != 'x64') {
isValid = false;
print("-rflutter is applicable only for --arch=x64");
}
return isValid;
}
/// Recursively expands a configuration with multiple values per key into a
/// list of configurations with exactly one value per key.
List<Map> _expandConfigurations(Map configuration) {
// Expand the pseudo-values such as 'all'.
if (configuration['arch'] == 'all') {
configuration['arch'] = 'ia32,x64,simarm,simarm64,simmips,simdbc64';
}
if (configuration['mode'] == 'all') {
configuration['mode'] = 'debug,release,product';
}
if (configuration['report_in_json']) {
configuration['list'] = true;
configuration['report'] = true;
}
// Use verbose progress indication for verbose output unless buildbot
// progress indication is requested.
if (configuration['verbose'] && configuration['progress'] != 'buildbot') {
configuration['progress'] = 'verbose';
}
// Create the artificial negative options that test status files
// expect.
configuration['unchecked'] = !configuration['checked'];
configuration['host_unchecked'] = !configuration['host_checked'];
configuration['unminified'] = !configuration['minified'];
configuration['nocsp'] = !configuration['csp'];
String runtime = configuration['runtime'];
if (runtime == 'firefox') {
configuration['runtime'] == 'ff';
}
String compiler = configuration['compiler'];
configuration['browser'] = TestUtils.isBrowserRuntime(runtime);
configuration['analyzer'] = TestUtils.isCommandLineAnalyzer(compiler);
// Set the javascript command line flag for less verbose status files.
configuration['jscl'] = TestUtils.isJsCommandLineRuntime(runtime);
// Allow suppression that is valid for all ie versions
configuration['ie'] = runtime.startsWith('ie');
// Expand the test selectors into a suite name and a simple
// regular expressions to be used on the full path of a test file
// in that test suite. If no selectors are explicitly given use
// the default suite patterns.
var selectors = configuration['selectors'];
if (selectors is! Map) {
if (selectors == null) {
if (configuration['suite_dir'] != null) {
var suite_path = new Path(configuration['suite_dir']);
selectors = [suite_path.filename];
} else {
selectors = _defaultTestSelectors.toList();
}
var excludeSuites = configuration['exclude_suite'] != null
? configuration['exclude_suite'].split(',')
: [];
for (var exclude in excludeSuites) {
if (selectors.contains(exclude)) {
selectors.remove(exclude);
} else {
print("Warning: default selectors does not contain $exclude");
}
}
}
var selectorMap = <String, RegExp>{};
for (var i = 0; i < selectors.length; i++) {
var pattern = selectors[i];
var suite = pattern;
var slashLocation = pattern.indexOf('/');
if (slashLocation != -1) {
suite = pattern.substring(0, slashLocation);
pattern = pattern.substring(slashLocation + 1);
pattern = pattern.replaceAll('*', '.*');
} else {
pattern = ".?";
}
if (selectorMap.containsKey(suite)) {
print("Error: '$suite/$pattern'. Only one test selection"
" pattern is allowed to start with '$suite/'");
exit(1);
}
selectorMap[suite] = new RegExp(pattern);
}
configuration['selectors'] = selectorMap;
}
// Put observatory_ui in a configuration with its own packages override.
// Only one value in the configuration map is mutable:
selectors = configuration['selectors'];
if (selectors.containsKey('observatory_ui')) {
if (selectors.length == 1) {
configuration['packages'] = TestUtils.dartDirUri
.resolve('runtime/observatory/.packages')
.toFilePath();
} else {
// Make a new configuration whose selectors map only contains
// observatory_ui, and remove the key from the original selectors.
// The only mutable value in the map is the selectors, so a
// shallow copy is safe.
var observatoryConfiguration = new Map.from(configuration);
observatoryConfiguration['selectors'] = {
'observatory_ui': selectors['observatory_ui']
};
selectors.remove('observatory_ui');
// Set the packages flag.
observatoryConfiguration['packages'] = TestUtils.dartDirUri
.resolve('runtime/observatory/.packages')
.toFilePath();
// Return the expansions of both configurations. Neither will reach
// this line in the recursive call to _expandConfigurations.
return _expandConfigurations(configuration)
..addAll(_expandConfigurations(observatoryConfiguration));
}
}
// Set the default package spec explicitly.
if (configuration['package_root'] == null &&
configuration['packages'] == null) {
configuration['packages'] =
TestUtils.dartDirUri.resolve('.packages').toFilePath();
}
// Expand the architectures.
if (configuration['arch'].contains(',')) {
return _expandHelper('arch', configuration);
}
// Expand modes.
if (configuration['mode'].contains(',')) {
return _expandHelper('mode', configuration);
}
// Expand compilers.
if (configuration['compiler'].contains(',')) {
return _expandHelper('compiler', configuration);
}
// Expand runtimes.
var runtimes = configuration['runtime'];
if (runtimes.contains(',')) {
return _expandHelper('runtime', configuration);
} else {
// All runtimes eventually go through this path, after expansion.
var updater = runtimeUpdater(configuration);
if (updater != null) {
updater.update();
}
}
// Adjust default timeout based on mode, compiler, and sometimes runtime.
if (configuration['timeout'] == -1) {
var isReload =
configuration['hot_reload'] || configuration['hot_reload_rollback'];
int compilerMulitiplier =
new CompilerConfiguration(configuration).computeTimeoutMultiplier();
int runtimeMultiplier = new RuntimeConfiguration(configuration)
.computeTimeoutMultiplier(
mode: configuration['mode'],
isChecked: configuration['checked'],
isReload: isReload,
arch: configuration['arch']);
configuration['timeout'] = 60 * compilerMulitiplier * runtimeMultiplier;
}
return [configuration];
}
/// Helper for _expandConfigurations. Creates a new configuration and adds it
/// to a list, for use in a case when a particular configuration has multiple
/// results (separated by a ',').
/// Arguments:
/// option: The particular test option we are expanding.
/// configuration: The map containing all test configuration information
/// specified.
List<Map> _expandHelper(String option, Map configuration) {
var result = <Map>[];
var configs = configuration[option];
for (var config in configs.split(',')) {
var newConfiguration = new Map.from(configuration);
newConfiguration[option] = config;
result.addAll(_expandConfigurations(newConfiguration));
}
return result;
}
/// Print out usage information.
void _printHelp() {
var buffer = new StringBuffer();
buffer.writeln('''usage: dart test.dart [options] [selector]
The optional selector limits the tests that will be run.
For example, the selector "language/issue", or equivalently
"language/*issue*", limits to test files matching the regexp
".*issue.*\\.dart" in the "tests/language" directory.
Options:''');
for (var option in _options) {
if (option.abbreviation != null) {
buffer.write("-${option.abbreviation}, ");
} else {
buffer.write(" ");
}
buffer.write(option.command);
switch (option.type) {
case _OptionValueType.bool:
// No value.
break;
case _OptionValueType.int:
buffer.write("=<integer>");
break;
case _OptionValueType.string:
if (option.values.length > 6) {
// If there are many options, they won't fit nicely in one line and
// should be instead listed in the description.
buffer.write("=<...>");
} else if (option.values.isNotEmpty) {
buffer.write("=<${option.values.join('|')}>");
} else {
buffer.write("=<string>");
}
break;
}
if (option.type != _OptionValueType.bool &&
option.defaultValue != null &&
option.defaultValue != "") {
buffer.write(" (defaults to ${option.defaultValue})");
}
buffer.writeln();
buffer
.writeln(" ${option.description.replaceAll('\n', '\n ')}");
buffer.writeln();
}
print(buffer);
}
_Option _findByAbbreviation(String abbreviation) {
for (var option in _options) {
if (abbreviation == option.abbreviation) return option;
}
return null;
}
_Option _findByName(String name) {
for (var option in _options) {
if (name == option.name) return option;
// Allow hyphens instead of underscores as the separator since they are
// more common for command line flags.
if (name == option.name.replaceAll("_", "-")) return option;
}
return null;
}
}

View file

@ -4,15 +4,17 @@
library package_testing_support;
import 'options.dart';
import 'test_configurations.dart';
import 'test_suite.dart';
import 'test_configurations.dart' show testConfigurations;
import 'test_options.dart' show TestOptionsParser;
import 'test_suite.dart' show TestUtils;
void main(List<String> arguments) {
TestUtils.setDartDirUri(Uri.base);
var configurations = <Map>[];
for (var argument in arguments) {
configurations.addAll(new OptionsParser().parse(argument.split(" ")));
configurations.addAll(new TestOptionsParser().parse(argument.split(" ")));
}
testConfigurations(configurations);
}

File diff suppressed because it is too large Load diff

View file

@ -474,7 +474,7 @@ class CCTestSuite extends TestSuite {
var args = TestUtils.standardOptions(configuration);
var compilerConfiguration = new CompilerConfiguration(configuration);
if (compilerConfiguration.useDfe) {
if (compilerConfiguration.useDFE) {
args.add('--use-dart-frontend');
// '--dfe' has to be the first argument for run_vm_test to pick it up.
args.insert(0, '--dfe=$buildDir/gen/kernel-service.dart.snapshot');
@ -2028,6 +2028,9 @@ class TestUtils {
if (compiler == "dart2js" && configuration["csp"]) {
args.add("--csp");
}
if (compiler == "dart2js" && configuration["cps_ir"]) {
args.add("--use-cps-ir");
}
if (compiler == "dart2js" && configuration["fast_startup"]) {
args.add("--fast-startup");
}