Index: tools/testing/dart/test_options.dart |
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart |
deleted file mode 100644 |
index 06ddec629ea8f66c08ab9c581d0c61a1baa5780d..0000000000000000000000000000000000000000 |
--- a/tools/testing/dart/test_options.dart |
+++ /dev/null |
@@ -1,1012 +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. |
- |
-library test_options_parser; |
- |
-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 List<String> defaultTestSelectors = const [ |
- 'samples', |
- 'standalone', |
- 'corelib', |
- 'co19', |
- 'language', |
- 'isolate', |
- 'vm', |
- 'html', |
- 'benchmark_smoke', |
- 'utils', |
- 'lib', |
- 'analyze_library', |
- 'service', |
- 'kernel', |
- 'observatory_ui' |
-]; |
- |
-/** |
- * Specification of a single test option. |
- * |
- * The name of the specification is used as the key for the option in |
- * the Map returned from the [TestOptionParser] parse method. |
- */ |
-class _TestOptionSpecification { |
- _TestOptionSpecification( |
- this.name, this.description, this.keys, this.values, this.defaultValue, |
- {this.type: 'string'}); |
- String name; |
- String description; |
- List<String> keys; |
- List<String> values; |
- Object defaultValue; |
- String type; |
-} |
- |
-/** |
- * Parser of test options. |
- */ |
-class TestOptionsParser { |
- /** |
- * Creates a test options parser initialized with the known options. |
- */ |
- TestOptionsParser() { |
- _options = [ |
- new _TestOptionSpecification('mode', 'Mode in which to run the tests', |
- ['-m', '--mode'], ['all', 'debug', 'release', 'product'], 'debug'), |
- new _TestOptionSpecification( |
- 'compiler', |
- '''Specify any compilation step (if needed). |
- |
- none: Do not compile the Dart code (run native Dart code on the VM). |
- (only valid with the following runtimes: vm, flutter, drt) |
- |
- precompiler: Compile into AOT snapshot before running the test. |
- (only valid with the dart_precompiled runtime) |
- |
- dart2js: Compile dart code to JavaScript by running dart2js. |
- (only valid with the following runtimes: d8, drt, chrome, |
- safari, ie9, ie10, ie11, firefox, opera, chromeOnAndroid, |
- none (compile only)), |
- |
- dart2analyzer: Perform static analysis on Dart code by running the analyzer |
- (only valid with the following runtimes: 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: Compiler the Dart source into Kernel and then Kernel into AOT |
- snapshot before running the test. |
- (only valid with the dart_precompiled runtime) |
- ''', |
- ['-c', '--compiler'], |
- [ |
- 'none', |
- 'precompiler', |
- 'dart2js', |
- 'dart2analyzer', |
- 'app_jit', |
- 'dartk', |
- 'dartkp' |
- ], |
- 'none'), |
- // TODO(antonm): fix the option drt. |
- new _TestOptionSpecification( |
- '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).''', |
- ['-r', '--runtime'], |
- [ |
- 'vm', |
- 'flutter', |
- 'dart_precompiled', |
- 'd8', |
- 'jsshell', |
- 'drt', |
- 'dartium', |
- 'ff', |
- 'firefox', |
- 'chrome', |
- 'safari', |
- 'ie9', |
- 'ie10', |
- 'ie11', |
- 'opera', |
- 'chromeOnAndroid', |
- 'safarimobilesim', |
- 'ContentShellOnAndroid', |
- 'DartiumOnAndroid', |
- 'self_check', |
- 'none' |
- ], |
- 'vm'), |
- new _TestOptionSpecification( |
- 'arch', |
- 'The architecture to run tests for', |
- ['-a', '--arch'], |
- [ |
- 'all', |
- 'ia32', |
- 'x64', |
- 'arm', |
- 'armv6', |
- 'armv5te', |
- 'arm64', |
- 'mips', |
- 'simarm', |
- 'simarmv6', |
- 'simarmv5te', |
- 'simarm64', |
- 'simmips', |
- 'simdbc', |
- 'simdbc64', |
- ], |
- 'x64'), |
- new _TestOptionSpecification( |
- 'system', |
- 'The operating system to run tests on', |
- ['-s', '--system'], |
- ['linux', 'macos', 'windows', 'android'], |
- Platform.operatingSystem), |
- new _TestOptionSpecification( |
- 'checked', 'Run tests in checked mode', ['--checked'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'strong', 'Run tests in strong mode', ['--strong'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification('host_checked', |
- 'Run compiler in checked mode', ['--host-checked'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification('minified', |
- 'Enable minification in the compiler', ['--minified'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'csp', |
- 'Run tests under Content Security Policy restrictions', |
- ['--csp'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'cps_ir', |
- 'Run the compiler with the cps based backend', |
- ['--cps-ir'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'fast_startup', |
- 'Pass the --fast-startup flag to dart2js', |
- ['--fast-startup'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'dart2js_with_kernel', |
- 'Enable the internal pipeline in dart2js to use kernel', |
- ['--dart2js-with-kernel'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification('hot_reload', 'Run hot reload stress tests', |
- ['--hot-reload'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'hot_reload_rollback', |
- 'Run hot reload rollback stress tests', |
- ['--hot-reload-rollback'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'use_blobs', |
- 'Use mmap instead of shared libraries for precompilation', |
- ['--use-blobs'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'timeout', 'Timeout in seconds', ['-t', '--timeout'], [], -1, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'progress', |
- 'Progress indication mode', |
- ['-p', '--progress'], |
- [ |
- 'compact', |
- 'color', |
- 'line', |
- 'verbose', |
- 'silent', |
- 'status', |
- 'buildbot', |
- 'diff' |
- ], |
- 'compact'), |
- new _TestOptionSpecification('failure-summary', |
- 'Print failure summary at the end', ['--failure-summary'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification('step_name', |
- 'Step name for use by -pbuildbot', ['--step_name'], [], null), |
- new _TestOptionSpecification( |
- 'report', |
- 'Print a summary report of the number of tests, by expectation', |
- ['--report'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'tasks', |
- 'The number of parallel tasks to run', |
- ['-j', '--tasks'], |
- [], |
- Platform.numberOfProcessors, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'shards', |
- 'The number of instances that the tests will be sharded over', |
- ['--shards'], |
- [], |
- 1, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'shard', |
- 'The index of this instance when running in sharded mode', |
- ['--shard'], |
- [], |
- 1, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'help', 'Print list of options', ['-h', '--help'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'verbose', 'Verbose output', ['-v', '--verbose'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'verify-ir', 'Verify kernel IR', ['--verify-ir'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification('no-tree-shake', |
- 'Disable kernel IR tree shaking', ['--no-tree-shake'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'list', 'List tests only, do not run them', ['--list'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'report_in_json', |
- 'When doing list, output result summary in json only.', |
- ['--report-in-json'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification('time', |
- 'Print timing information after running tests', ['--time'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'dart', 'Path to dart executable', ['--dart'], [], ''), |
- new _TestOptionSpecification( |
- 'flutter', 'Path to flutter executable', ['--flutter'], [], ''), |
- new _TestOptionSpecification( |
- 'drt', // TODO(antonm): fix the option name. |
- 'Path to content shell executable', |
- ['--drt'], |
- [], |
- ''), |
- new _TestOptionSpecification('dartium', |
- 'Path to Dartium Chrome executable', ['--dartium'], [], ''), |
- new _TestOptionSpecification('firefox', |
- 'Path to firefox browser executable', ['--firefox'], [], ''), |
- new _TestOptionSpecification( |
- 'chrome', 'Path to chrome browser executable', ['--chrome'], [], ''), |
- new _TestOptionSpecification( |
- 'safari', 'Path to safari browser executable', ['--safari'], [], ''), |
- new _TestOptionSpecification( |
- '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.''', |
- ['--use-sdk'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'build_directory', |
- 'The name of the build directory, where products are placed.', |
- ['--build-directory'], |
- [], |
- ''), |
- new _TestOptionSpecification('noBatch', 'Do not run tests in batch mode', |
- ['-n', '--nobatch'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification('dart2js_batch', |
- 'Run dart2js tests in batch mode', ['--dart2js-batch'], [], false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'append_logs', |
- 'Do not delete old logs but rather append to them.', |
- ['--append_logs'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'write_debug_log', |
- 'Don\'t write debug messages to stdout but rather to a logfile.', |
- ['--write-debug-log'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'write_test_outcome_log', |
- 'Write the outcome of all tests executed to a ' |
- '"${TestUtils.testOutcomeFileName}" file.', |
- ['--write-test-outcome-log'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'reset_browser_configuration', |
- 'Browser specific reset of configuration. ' |
- 'WARNING: Using this option may remove your bookmarks and ' |
- 'other settings.', |
- ['--reset-browser-configuration'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'copy_coredumps', |
- 'If we see a crash that we did not expect, copy the core dumps. ' |
- 'to /tmp', |
- ['--copy-coredumps'], |
- [], |
- false, |
- type: 'bool'), |
- new _TestOptionSpecification( |
- 'local_ip', |
- 'IP address the http servers should listen on.' |
- 'This address is also used for browsers to connect.', |
- ['--local_ip'], |
- [], |
- '127.0.0.1'), |
- new _TestOptionSpecification('test_server_port', |
- 'Port for test http server.', ['--test_server_port'], [], 0, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'test_server_cross_origin_port', |
- 'Port for test http server cross origin.', |
- ['--test_server_cross_origin_port'], |
- [], |
- 0, |
- type: 'int'), |
- new _TestOptionSpecification('test_driver_port', |
- 'Port for http test driver server.', ['--test_driver_port'], [], 0, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'test_driver_error_port', |
- 'Port for http test driver server errors.', |
- ['--test_driver_error_port'], |
- [], |
- 0, |
- type: 'int'), |
- new _TestOptionSpecification( |
- 'record_to_file', |
- 'Records all the commands that need to be executed and writes it ' |
- 'out to a file.', |
- ['--record_to_file'], |
- [], |
- null), |
- new _TestOptionSpecification( |
- 'replay_from_file', |
- 'Records all the commands that need to be executed and writes it ' |
- 'out to a file.', |
- ['--replay_from_file'], |
- [], |
- null), |
- new _TestOptionSpecification( |
- '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.', |
- ['--builder-tag'], |
- [], |
- ''), |
- new _TestOptionSpecification( |
- 'vm_options', |
- 'Extra options to send to the vm when running', |
- ['--vm-options'], |
- [], |
- null), |
- new _TestOptionSpecification( |
- 'dart2js_options', |
- 'Extra options for dart2js compilation step', |
- ['--dart2js-options'], |
- [], |
- null), |
- new _TestOptionSpecification( |
- 'suite_dir', |
- 'Additional directory to add to the testing matrix', |
- ['--suite-dir'], |
- [], |
- null), |
- new _TestOptionSpecification('package_root', |
- 'The package root to use for testing.', ['--package-root'], [], null), |
- new _TestOptionSpecification( |
- 'packages', |
- 'The package spec file to use for testing.', |
- ['--packages'], |
- [], |
- null), |
- new _TestOptionSpecification( |
- 'exclude_suite', |
- 'Exclude suites from default selector, only works when no' |
- ' selector has been specified on the command line', |
- ['--exclude-suite'], |
- [], |
- null), |
- new _TestOptionSpecification( |
- '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.', |
- ['--skip-compilation'], |
- [], |
- false, |
- type: 'bool') |
- ]; |
- } |
- |
- /** |
- * Parse 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) { |
- var configuration = new Map(); |
- // Fill in configuration with arguments passed to the test script. |
- var numArguments = arguments.length; |
- for (var i = 0; i < numArguments; i++) { |
- // Extract name and value for options. |
- String arg = arguments[i]; |
- String name = ''; |
- String value = ''; |
- _TestOptionSpecification spec; |
- if (arg.startsWith('--')) { |
- if (arg == '--help') { |
- _printHelp(); |
- return null; |
- } |
- var split = arg.indexOf('='); |
- if (split == -1) { |
- name = arg; |
- spec = _getSpecification(name); |
- // Boolean options do not have a value. |
- if (spec.type != 'bool') { |
- if ((i + 1) >= arguments.length) { |
- print('No value supplied for option $name'); |
- return null; |
- } |
- value = arguments[++i]; |
- } |
- } else { |
- name = arg.substring(0, split); |
- spec = _getSpecification(name); |
- value = arg.substring(split + 1, arg.length); |
- } |
- } else if (arg.startsWith('-')) { |
- if (arg == '-h') { |
- _printHelp(); |
- return null; |
- } |
- if (arg.length > 2) { |
- name = arg.substring(0, 2); |
- spec = _getSpecification(name); |
- value = arg.substring(2, arg.length); |
- } else { |
- name = arg; |
- spec = _getSpecification(name); |
- // Boolean options do not have a value. |
- if (spec.type != 'bool') { |
- if ((i + 1) >= arguments.length) { |
- print('No value supplied for option $name'); |
- return null; |
- } |
- value = arguments[++i]; |
- } |
- } |
- } else { |
- // The argument does not start with '-' or '--' and is |
- // therefore not an option. We use it as a test selection |
- // pattern. |
- var patterns = configuration.putIfAbsent('selectors', () => <String>[]); |
- patterns.add(arg); |
- continue; |
- } |
- |
- // Multiple uses of a flag are an error, because there is no |
- // naturally correct way to handle conflicting options. |
- if (configuration.containsKey(spec.name)) { |
- print('Error: test.dart disallows multiple "--${spec.name}" flags'); |
- exit(1); |
- } |
- // Parse the value for the option. |
- if (spec.type == 'bool') { |
- if (!value.isEmpty) { |
- print('No value expected for bool option $name'); |
- exit(1); |
- } |
- configuration[spec.name] = true; |
- } else if (spec.type == 'int') { |
- try { |
- configuration[spec.name] = int.parse(value); |
- } catch (e) { |
- print('Integer value expected for int option $name'); |
- exit(1); |
- } |
- } else { |
- assert(spec.type == 'string'); |
- if (!spec.values.isEmpty) { |
- for (var v in value.split(',')) { |
- if (spec.values.lastIndexOf(v) == -1) { |
- print('Unknown value ($v) for option $name'); |
- exit(1); |
- } |
- } |
- } |
- configuration[spec.name] = value; |
- } |
- } |
- |
- // Apply default values for unspecified options. |
- for (var option in _options) { |
- if (!configuration.containsKey(option.name)) { |
- configuration[option.name] = option.defaultValue; |
- } |
- } |
- |
- List<Map> expandedConfigs = _expandConfigurations(configuration); |
- List<Map> result = expandedConfigs.where(_isValidConfig).toList(); |
- for (var config in result) { |
- config['_reproducing_arguments_'] = |
- _constructReproducingCommandArguments(config); |
- } |
- return result.isEmpty ? null : result; |
- } |
- |
- // For printing out reproducing command lines, we don't want to add these |
- // options. |
- final _blacklistedOptions = [ |
- 'append_logs', |
- 'build_directory', |
- 'chrome', |
- 'copy_coredumps', |
- 'dart', |
- 'flutter', |
- 'dartium', |
- 'drt', |
- 'exclude_suite', |
- 'failure-summary', |
- 'firefox', |
- 'local_ip', |
- 'progress', |
- 'report', |
- 'safari', |
- 'shard', |
- 'shards', |
- 'step_name', |
- 'tasks', |
- 'time', |
- 'verbose', |
- 'write_debug_log', |
- 'write_test_outcome_log', |
- ].toSet(); |
- |
- List<String> _constructReproducingCommandArguments(Map config) { |
- var arguments = new List<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; |
- } |
- shortest(String a, String b) => a.length <= b.length ? a : b; |
- var key = option.keys.reduce(shortest); |
- if (option.type == 'bool') { |
- arguments.add(key); |
- } else if (key.startsWith('--')) { |
- // long version |
- arguments.add(key); |
- arguments.add("$value"); |
- } else { |
- // short version |
- assert(key.startsWith('-')); |
- arguments.add("$key$value"); |
- } |
- } |
- return arguments; |
- } |
- |
- /** |
- * Determine if a particular configuration has a valid combination of compiler |
- * and runtime elements. |
- */ |
- bool _isValidConfig(Map config) { |
- bool 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 expand 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 = new List<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() { |
- print('usage: dart test.dart [options] [selector]'); |
- print(''); |
- print('The optional selector limits the tests that will be run.'); |
- print('For example, the selector "language/issue", or equivalently'); |
- print('"language/*issue*", limits to test files matching the regexp'); |
- print('".*issue.*\\.dart" in the "tests/language" directory.'); |
- print(''); |
- print('Options:\n'); |
- for (var option in _options) { |
- print('${option.name}: ${option.description}.'); |
- for (var name in option.keys) { |
- assert(name.startsWith('-')); |
- var buffer = new StringBuffer(); |
- ; |
- buffer.write(name); |
- if (option.type == 'bool') { |
- assert(option.values.isEmpty); |
- } else { |
- buffer.write(name.startsWith('--') ? '=' : ' '); |
- if (option.type == 'int') { |
- assert(option.values.isEmpty); |
- buffer.write('n (default: ${option.defaultValue})'); |
- } else { |
- buffer.write('['); |
- bool first = true; |
- for (var value in option.values) { |
- if (!first) buffer.write(", "); |
- if (value == option.defaultValue) buffer.write('*'); |
- buffer.write(value); |
- first = false; |
- } |
- buffer.write(']'); |
- } |
- } |
- print(buffer.toString()); |
- } |
- print(''); |
- } |
- } |
- |
- /** |
- * Find the test option specification for a given option key. |
- */ |
- _TestOptionSpecification _getSpecification(String name) { |
- for (var option in _options) { |
- if (option.keys.contains(name)) { |
- return option; |
- } |
- } |
- print('Unknown test option $name'); |
- exit(1); |
- return null; // Unreachable. |
- } |
- |
- List<_TestOptionSpecification> _options; |
-} |