Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(630)

Unified Diff: tools/migration/bin/run_tests.dart

Issue 2987223002: Add a script to run the tests in a migration block. (Closed)
Patch Set: Merge branch 'master' into run-tests Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/migration/bin/migrate_batch.dart ('k') | tools/migration/lib/src/fork.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/migration/bin/run_tests.dart
diff --git a/tools/migration/bin/run_tests.dart b/tools/migration/bin/run_tests.dart
new file mode 100644
index 0000000000000000000000000000000000000000..0aba299d243529f9863208bf4fec1422784c62da
--- /dev/null
+++ b/tools/migration/bin/run_tests.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2017, 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.
+
+/// Runs the tests in a batch on the various configurations used on the bots.
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:path/path.dart' as p;
+
+import 'package:migration/src/fork.dart';
+import 'package:migration/src/log.dart';
+
+const appJit = "--compiler=app_jit";
+const dart2js = "--compiler=dart2js";
+const dartdevc = "--compiler=dartdevc";
+const noCompiler = "--compiler=none";
+const precompiler = "--compiler=precompiler";
+const analyzer = "--compiler=dart2analyzer";
+
+const chrome = "--runtime=chrome";
+const precompiled = "--runtime=dart_precompiled";
+const noRuntime = "--runtime=none";
+const vm = "--runtime=vm";
+
+const checked = "--checked";
+const dart2jsBatch = "--dart2js-batch";
+const useSdk = "--use-sdk";
+const productMode = "--mode=product";
+const strong = "--strong";
+
+/// Maps configuration names to a corresponding set of test.dart command line
+/// arguments.
+///
+/// Each configuration name starts with the name of a column on the buildbot
+/// waterfall (except for "dartjs-linux" which is just called "dart2js" here)
+/// possibly followed by some modifier for a specific bot or annotated step on
+/// a bot. The configs here are ordered the same order as the waterfall.
+final allConfigs = {
+ "vm": [noCompiler, vm],
+ "vm-checked": [noCompiler, vm, checked],
+ "vm-app": [appJit, vm],
+ "vm-app-product": [productMode, appJit, vm],
+ // TODO(rnystrom): What build target do we need to get this to work?
+// "vm-precomp": [precompiler, precompiled],
+ "vm-product": [productMode, noCompiler, vm],
+ // TODO(rnystrom): Add dart2js-d8-hostchecked, dart2js-d8-minified, or
+ // dart2js-jsshell?
+ "analyzer": [analyzer, noRuntime, useSdk],
+ "analyzer-checked": [analyzer, noRuntime, checked, useSdk],
+ "dart2js": [dart2js, chrome, useSdk, dart2jsBatch],
+ // TODO(rnystrom): Is it worth running dart2js on Firefox too?
+ "dartdevc": [dartdevc, chrome, useSdk, strong]
+};
+
+final buildSteps = [
+ // The SDK, which also builds the VM.
+ ["--mode=release", "create_sdk"],
+ // Product version of the runtime and precompiled runtime.
+ ["--mode=product", "runtime", "runtime_precompiled"],
+ // Dartdevc and its dependencies.
+ ["--mode=release", "dartdevc_test"],
+];
+
+Future<Null> main(List<String> arguments) async {
+ var argParser = new ArgParser(allowTrailingOptions: true);
+ argParser.addFlag("build", help: "Build runtimes before running tests.");
+ argParser.addOption("config",
+ abbr: "c", allowMultiple: true, help: "Which configurations to run.");
+ argParser.addFlag("help");
+
+ var argResults = argParser.parse(arguments);
+ if (argResults["help"] as bool) {
+ usage(argParser);
+ return;
+ }
+
+ if (argResults.rest.length != 2) {
+ usage(argParser);
+ exit(1);
+ }
+
+ var build = argResults["build"] as bool;
+ var configs = argResults["config"] as List<String>;
+ if (configs.isEmpty) configs = allConfigs.keys.toList();
+
+ var tests = scanTests();
+
+ var startIndex = findFork(tests, argResults.rest[0]);
+ var endIndex = findFork(tests, argResults.rest[1]);
+
+ if (startIndex == null || endIndex == null) exit(1);
+
+ tests = tests.sublist(startIndex, endIndex + 1);
+
+ if (tests.isEmpty) {
+ print("No tests in range.");
+ return;
+ }
+
+ // Build any needed targets first.
+ if (build) {
+ for (var steps in buildSteps) {
+ var command = "tools/build.py ${steps.join(' ')}";
+ print("Building ${bold(command)}:");
+ var exitCode = await run("tools/build.py", steps);
+ if (exitCode != 0) {
+ print(red("Build failed: $command"));
+ }
+ }
+ }
+
+ // Splits the tests into selectors and patterns.
+ var selectors = <String, List<String>>{};
+ for (var test in tests) {
+ var parts = p.split(p.withoutExtension(test.twoPath));
+ var selector = parts[0];
+ var path = parts.skip(1).join("/");
+ selectors.putIfAbsent(selector, () => []).add(path);
+ }
+
+ var failed = <String>[];
+ var passed = <String>[];
+ for (var name in configs) {
+ var configArgs = allConfigs[name];
+ print("${bold(name)} ${configArgs.join(' ')}:");
+
+ var args = [
+ "--progress=color",
+ ];
+
+ args.addAll(configArgs);
+
+ if (!args.any((arg) => arg.startsWith("--mode"))) {
+ args.add("--mode=release");
+ }
+
+ selectors.forEach((selector, paths) {
+ args.add("$selector/${paths.join('|')}");
+ });
+
+ var exitCode = await run("tools/test.py", args);
+ if (exitCode != 0) {
+ print(red("Configuration failed: $name"));
+ failed.add(name);
+ } else {
+ passed.add(name);
+ }
+ }
+
+ if (failed.length == 0) {
+ var s = passed.length == 1 ? "" : "s";
+ print("${green('PASSED')} all ${bold(passed.length)} configuration$s!");
+ } else {
+ if (passed.length > 0) {
+ var s = passed == 1 ? "" : "s";
+ print("${green('PASSED')} ${bold(passed.length)} configuration$s:");
+ for (var config in passed) {
+ print("- ${bold(config)}");
+ }
+ }
+
+ var s = failed == 1 ? "" : "s";
+ print("${red("FAILED")} ${bold(failed.length)} configuration$s:");
+ for (var config in failed) {
+ print("- ${bold(config)}");
+ }
+ }
+}
+
+void usage(ArgParser parser) {
+ print("Usage: dart run_tests.dart [--build] [--configs=...] "
+ "<first file> <last file>");
+ print("\n");
+ print("Example:");
+ print("\n");
+ print(" \$ dart run_tests.dart map_to_string queue");
+ print("\n");
+ print(parser.usage);
+}
+
+Future<int> run(String executable, List<String> arguments) async {
+ var process = await Process.start(executable, arguments);
+ process.stdout.listen((bytes) {
+ stdout.add(bytes);
+ });
+
+ process.stderr.listen((bytes) {
+ stderr.add(bytes);
+ });
+
+ return await process.exitCode;
+}
« no previous file with comments | « tools/migration/bin/migrate_batch.dart ('k') | tools/migration/lib/src/fork.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698