Index: mojo/public/dart/third_party/test/lib/src/runner/configuration.dart |
diff --git a/mojo/public/dart/third_party/test/lib/src/runner/configuration.dart b/mojo/public/dart/third_party/test/lib/src/runner/configuration.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..329470fa395cc8ce7d54045fce8a681a129eec17 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/test/lib/src/runner/configuration.dart |
@@ -0,0 +1,210 @@ |
+// Copyright (c) 2015, 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.runner.configuration; |
+ |
+import 'dart:io'; |
+import 'dart:math' as math; |
+ |
+import 'package:args/args.dart'; |
+import 'package:path/path.dart' as p; |
+ |
+import '../frontend/timeout.dart'; |
+import '../backend/metadata.dart'; |
+import '../backend/test_platform.dart'; |
+import '../util/io.dart'; |
+ |
+/// The default number of test suites to run at once. |
+/// |
+/// This defaults to half the available processors, since presumably some of |
+/// them will be used for the OS and other processes. |
+final _defaultConcurrency = math.max(1, Platform.numberOfProcessors ~/ 2); |
+ |
+/// A class that encapsulates the command-line configuration of the test runner. |
+class Configuration { |
+ /// The parser used to parse the command-line arguments. |
+ static final ArgParser _parser = (() { |
+ var parser = new ArgParser(allowTrailingOptions: true); |
+ |
+ var allPlatforms = TestPlatform.all.toList(); |
+ if (!Platform.isMacOS) allPlatforms.remove(TestPlatform.safari); |
+ if (!Platform.isWindows) allPlatforms.remove(TestPlatform.internetExplorer); |
+ |
+ parser.addFlag("help", abbr: "h", negatable: false, |
+ help: "Shows this usage information."); |
+ parser.addFlag("version", negatable: false, |
+ help: "Shows the package's version."); |
+ parser.addOption("package-root", hide: true); |
+ parser.addOption("name", |
+ abbr: 'n', |
+ help: 'A substring of the name of the test to run.\n' |
+ 'Regular expression syntax is supported.'); |
+ parser.addOption("plain-name", |
+ abbr: 'N', |
+ help: 'A plain-text substring of the name of the test to run.'); |
+ parser.addOption("platform", |
+ abbr: 'p', |
+ help: 'The platform(s) on which to run the tests.', |
+ allowed: allPlatforms.map((platform) => platform.identifier).toList(), |
+ defaultsTo: 'vm', |
+ allowMultiple: true); |
+ parser.addOption("concurrency", |
+ abbr: 'j', |
+ help: 'The number of concurrent test suites run.\n' |
+ '(defaults to $_defaultConcurrency)', |
+ valueHelp: 'threads'); |
+ parser.addOption("pub-serve", |
+ help: 'The port of a pub serve instance serving "test/".', |
+ valueHelp: 'port'); |
+ parser.addFlag("pause-after-load", |
+ help: 'Pauses for debugging before any tests execute.\n' |
+ 'Implies --concurrency=1.\n' |
+ 'Currently only supported for browser tests.', |
+ negatable: false); |
+ parser.addOption("reporter", |
+ abbr: 'r', |
+ help: 'The runner used to print test results.', |
+ allowed: ['compact', 'expanded'], |
+ defaultsTo: Platform.isWindows ? 'expanded' : 'compact', |
+ allowedHelp: { |
+ 'compact': 'A single line, updated continuously.', |
+ 'expanded': 'A separate line for each update.' |
+ }); |
+ parser.addFlag("verbose-trace", negatable: false, |
+ help: 'Whether to emit stack traces with core library frames.'); |
+ parser.addFlag("js-trace", negatable: false, |
+ help: 'Whether to emit raw JavaScript stack traces for browser tests.'); |
+ parser.addFlag("color", defaultsTo: null, |
+ help: 'Whether to use terminal colors.\n(auto-detected by default)'); |
+ |
+ return parser; |
+ })(); |
+ |
+ /// The usage string for the command-line arguments. |
+ static String get usage => _parser.usage; |
+ |
+ /// Whether `--help` was passed. |
+ final bool help; |
+ |
+ /// Whether `--version` was passed. |
+ final bool version; |
+ |
+ /// Whether stack traces should be presented as-is or folded to remove |
+ /// irrelevant packages. |
+ final bool verboseTrace; |
+ |
+ /// Whether JavaScript stack traces should be left as-is or converted to |
+ /// Dart-like traces. |
+ final bool jsTrace; |
+ |
+ /// Whether to pause for debugging after loading each test suite. |
+ final bool pauseAfterLoad; |
+ |
+ /// The package root for resolving "package:" URLs. |
+ final String packageRoot; |
+ |
+ /// The name of the reporter to use to display results. |
+ final String reporter; |
+ |
+ /// The URL for the `pub serve` instance from which to load tests, or `null` |
+ /// if tests should be loaded from the filesystem. |
+ final Uri pubServeUrl; |
+ |
+ /// Whether to use command-line color escapes. |
+ final bool color; |
+ |
+ /// How many tests to run concurrently. |
+ final int concurrency; |
+ |
+ /// The from which to load tests. |
+ final List<String> paths; |
+ |
+ /// Whether the load paths were passed explicitly or the default was used. |
+ final bool explicitPaths; |
+ |
+ /// The pattern to match against test names to decide which to run, or `null` |
+ /// if all tests should be run. |
+ final Pattern pattern; |
+ |
+ /// The set of platforms on which to run tests. |
+ final List<TestPlatform> platforms; |
+ |
+ /// The global test metadata derived from this configuration. |
+ Metadata get metadata => |
+ new Metadata( |
+ timeout: pauseAfterLoad ? Timeout.none : null, |
+ verboseTrace: verboseTrace); |
+ |
+ /// Parses the configuration from [args]. |
+ /// |
+ /// Throws a [FormatException] if [args] are invalid. |
+ factory Configuration.parse(List<String> args) { |
+ var options = _parser.parse(args); |
+ |
+ var pattern; |
+ if (options['name'] != null) { |
+ if (options["plain-name"] != null) { |
+ throw new FormatException( |
+ "--name and --plain-name may not both be passed."); |
+ } |
+ |
+ pattern = _wrapFormatException( |
+ options, 'name', (value) => new RegExp(value)); |
+ } else if (options['plain-name'] != null) { |
+ pattern = options['plain-name']; |
+ } |
+ |
+ return new Configuration( |
+ help: options['help'], |
+ version: options['version'], |
+ verboseTrace: options['verbose-trace'], |
+ jsTrace: options['js-trace'], |
+ pauseAfterLoad: options['pause-after-load'], |
+ color: options['color'], |
+ packageRoot: options['package-root'], |
+ reporter: options['reporter'], |
+ pubServePort: _wrapFormatException(options, 'pub-serve', int.parse), |
+ concurrency: _wrapFormatException(options, 'concurrency', int.parse, |
+ orElse: () => _defaultConcurrency), |
+ pattern: pattern, |
+ platforms: options['platform'].map(TestPlatform.find), |
+ paths: options.rest.isEmpty ? null : options.rest); |
+ } |
+ |
+ /// Runs [parse] on the value of the option [name], and wraps any |
+ /// [FormatException] it throws with additional information. |
+ static _wrapFormatException(ArgResults options, String name, parse(value), |
+ {orElse()}) { |
+ var value = options[name]; |
+ if (value == null) return orElse == null ? null : orElse(); |
+ |
+ try { |
+ return parse(value); |
+ } on FormatException catch (error) { |
+ throw new FormatException('Couldn\'t parse --$name "${options[name]}": ' |
+ '${error.message}'); |
+ } |
+ } |
+ |
+ Configuration({this.help: false, this.version: false, |
+ this.verboseTrace: false, this.jsTrace: false, |
+ bool pauseAfterLoad: false, bool color, String packageRoot, |
+ String reporter, int pubServePort, int concurrency, this.pattern, |
+ Iterable<TestPlatform> platforms, Iterable<String> paths}) |
+ : pauseAfterLoad = pauseAfterLoad, |
+ color = color == null ? canUseSpecialChars : color, |
+ packageRoot = packageRoot == null |
+ ? p.join(p.current, 'packages') |
+ : packageRoot, |
+ reporter = reporter == null ? 'compact' : reporter, |
+ pubServeUrl = pubServePort == null |
+ ? null |
+ : Uri.parse("http://localhost:$pubServePort"), |
+ concurrency = pauseAfterLoad |
+ ? 1 |
+ : (concurrency == null ? _defaultConcurrency : concurrency), |
+ platforms = platforms == null ? [TestPlatform.vm] : platforms.toList(), |
+ paths = paths == null ? ["test"] : paths.toList(), |
+ explicitPaths = paths != null; |
+} |