Index: mojo/public/dart/third_party/test/lib/src/executable.dart |
diff --git a/mojo/public/dart/third_party/test/lib/src/executable.dart b/mojo/public/dart/third_party/test/lib/src/executable.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..29c4dd33c4599a0fffdf5435d2ac32cef22e15a4 |
--- /dev/null |
+++ b/mojo/public/dart/third_party/test/lib/src/executable.dart |
@@ -0,0 +1,214 @@ |
+// 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. |
+ |
+// TODO(nweiz): This is under lib so that it can be used by the unittest dummy |
+// package. Once that package is no longer being updated, move this back into |
+// bin. |
+library test.executable; |
+ |
+import 'dart:io'; |
+ |
+import 'package:stack_trace/stack_trace.dart'; |
+import 'package:yaml/yaml.dart'; |
+ |
+import 'runner.dart'; |
+import 'runner/application_exception.dart'; |
+import 'runner/configuration.dart'; |
+import 'util/exit_codes.dart' as exit_codes; |
+import 'util/io.dart'; |
+import 'utils.dart'; |
+ |
+/// A merged stream of all signals that tell the test runner to shut down |
+/// gracefully. |
+/// |
+/// Signals will only be captured as long as this has an active subscription. |
+/// Otherwise, they'll be handled by Dart's default signal handler, which |
+/// terminates the program immediately. |
+final _signals = Platform.isWindows |
+ ? ProcessSignal.SIGINT.watch() |
+ : mergeStreams([ |
+ ProcessSignal.SIGTERM.watch(), |
+ ProcessSignal.SIGINT.watch() |
+ ]); |
+ |
+/// Returns whether the current package has a pubspec which uses the |
+/// `test/pub_serve` transformer. |
+bool get _usesTransformer { |
+ if (!new File('pubspec.yaml').existsSync()) return false; |
+ var contents = new File('pubspec.yaml').readAsStringSync(); |
+ |
+ var yaml; |
+ try { |
+ yaml = loadYaml(contents); |
+ } on FormatException { |
+ return false; |
+ } |
+ |
+ if (yaml is! Map) return false; |
+ |
+ var transformers = yaml['transformers']; |
+ if (transformers == null) return false; |
+ if (transformers is! List) return false; |
+ |
+ return transformers.any((transformer) { |
+ if (transformer is String) return transformer == 'test/pub_serve'; |
+ if (transformer is! Map) return false; |
+ if (transformer.keys.length != 1) return false; |
+ return transformer.keys.single == 'test/pub_serve'; |
+ }); |
+} |
+ |
+main(List<String> args) async { |
+ var configuration; |
+ try { |
+ configuration = new Configuration.parse(args); |
+ } on FormatException catch (error) { |
+ _printUsage(error.message); |
+ exitCode = exit_codes.usage; |
+ return; |
+ } |
+ |
+ if (configuration.help) { |
+ _printUsage(); |
+ return; |
+ } |
+ |
+ if (configuration.version) { |
+ if (!_printVersion()) { |
+ stderr.writeln("Couldn't find version number."); |
+ exitCode = exit_codes.data; |
+ } |
+ return; |
+ } |
+ |
+ if (configuration.pubServeUrl != null && !_usesTransformer) { |
+ stderr.write(''' |
+When using --pub-serve, you must include the "test/pub_serve" transformer in |
+your pubspec: |
+ |
+transformers: |
+- test/pub_serve: |
+ \$include: test/**_test.dart |
+'''); |
+ exitCode = exit_codes.data; |
+ return; |
+ } |
+ |
+ if (!configuration.explicitPaths && |
+ !new Directory(configuration.paths.single).existsSync()) { |
+ _printUsage('No test files were passed and the default "test/" ' |
+ "directory doesn't exist."); |
+ exitCode = exit_codes.data; |
+ return; |
+ } |
+ |
+ var runner = new Runner(configuration); |
+ |
+ var signalSubscription; |
+ close() async { |
+ if (signalSubscription == null) return; |
+ signalSubscription.cancel(); |
+ signalSubscription = null; |
+ stdinLines.cancel(immediate: true); |
+ await runner.close(); |
+ } |
+ |
+ signalSubscription = _signals.listen((_) => close()); |
+ |
+ try { |
+ exitCode = (await runner.run()) ? 0 : 1; |
+ } on ApplicationException catch (error) { |
+ stderr.writeln(error.message); |
+ exitCode = exit_codes.data; |
+ } catch (error, stackTrace) { |
+ stderr.writeln(getErrorMessage(error)); |
+ stderr.writeln(new Trace.from(stackTrace).terse); |
+ stderr.writeln( |
+ "This is an unexpected error. Please file an issue at " |
+ "http://github.com/dart-lang/test\n" |
+ "with the stack trace and instructions for reproducing the error."); |
+ exitCode = exit_codes.software; |
+ } finally { |
+ await close(); |
+ } |
+} |
+ |
+/// Print usage information for this command. |
+/// |
+/// If [error] is passed, it's used in place of the usage message and the whole |
+/// thing is printed to stderr instead of stdout. |
+void _printUsage([String error]) { |
+ var output = stdout; |
+ |
+ var message = "Runs tests in this package."; |
+ if (error != null) { |
+ message = error; |
+ output = stderr; |
+ } |
+ |
+ output.write("""$message |
+ |
+Usage: pub run test:test [files or directories...] |
+ |
+${Configuration.usage} |
+"""); |
+} |
+ |
+/// Prints the version number of the test package. |
+/// |
+/// This loads the version number from the current package's lockfile. It |
+/// returns true if it successfully printed the version number and false if it |
+/// couldn't be loaded. |
+bool _printVersion() { |
+ var lockfile; |
+ try { |
+ lockfile = loadYaml(new File("pubspec.lock").readAsStringSync()); |
+ } on FormatException catch (_) { |
+ return false; |
+ } on IOException catch (_) { |
+ return false; |
+ } |
+ |
+ if (lockfile is! Map) return false; |
+ var packages = lockfile["packages"]; |
+ if (packages is! Map) return false; |
+ var package = packages["test"]; |
+ if (package is! Map) return false; |
+ |
+ var source = package["source"]; |
+ if (source is! String) return false; |
+ |
+ switch (source) { |
+ case "hosted": |
+ var version = package["version"]; |
+ if (version is! String) return false; |
+ |
+ print(version); |
+ return true; |
+ |
+ case "git": |
+ var version = package["version"]; |
+ if (version is! String) return false; |
+ var description = package["description"]; |
+ if (description is! Map) return false; |
+ var ref = description["resolved-ref"]; |
+ if (ref is! String) return false; |
+ |
+ print("$version (${ref.substring(0, 7)})"); |
+ return true; |
+ |
+ case "path": |
+ var version = package["version"]; |
+ if (version is! String) return false; |
+ var description = package["description"]; |
+ if (description is! Map) return false; |
+ var path = description["path"]; |
+ if (path is! String) return false; |
+ |
+ print("$version (from $path)"); |
+ return true; |
+ |
+ default: return false; |
+ } |
+} |