Index: tools/testing/dart/test_configurations.dart |
diff --git a/tools/testing/dart/test_configurations.dart b/tools/testing/dart/test_configurations.dart |
index 2c499e0df7703e763b3787c199e6e1b29c38e1ef..4b146aa5e7e6672a63a51645c24c71f9060f469a 100644 |
--- a/tools/testing/dart/test_configurations.dart |
+++ b/tools/testing/dart/test_configurations.dart |
@@ -2,23 +2,20 @@ |
// 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_configurations; |
- |
-import "dart:async"; |
-import 'dart:convert'; |
+import 'dart:async'; |
import 'dart:io'; |
-import "dart:math" as math; |
+import 'dart:math' as math; |
import 'android.dart'; |
-import "browser_controller.dart"; |
-import "co19_test_config.dart"; |
-import "http_server.dart"; |
-import "path.dart"; |
-import "test_progress.dart"; |
-import "test_runner.dart"; |
-import "test_suite.dart"; |
-import "utils.dart"; |
-import "vm_test_config.dart"; |
+import 'browser_controller.dart'; |
+import 'co19_test_config.dart'; |
+import 'configuration.dart'; |
+import 'path.dart'; |
+import 'test_progress.dart'; |
+import 'test_runner.dart'; |
+import 'test_suite.dart'; |
+import 'utils.dart'; |
+import 'vm_test_config.dart'; |
/** |
* The directories that contain test suites which follow the conventions |
@@ -58,32 +55,30 @@ final TEST_SUITE_DIRECTORIES = [ |
// This file is created by gclient runhooks. |
final VS_TOOLCHAIN_FILE = new Path("build/win_toolchain.json"); |
-Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
+Future testConfigurations(List<Configuration> configurations) async { |
var startTime = new DateTime.now(); |
// Extract global options from first configuration. |
var firstConf = configurations[0]; |
- var maxProcesses = firstConf['tasks'] as int; |
- var progressIndicator = firstConf['progress'] as String; |
- BuildbotProgressIndicator.stepName = firstConf['step_name'] as String; |
- var verbose = firstConf['verbose'] as bool; |
- var printTiming = firstConf['time'] as bool; |
- var listTests = firstConf['list'] as bool; |
- |
- var reportInJson = firstConf['report_in_json'] as bool; |
+ var maxProcesses = firstConf.taskCount; |
+ var progressIndicator = firstConf.progress; |
+ BuildbotProgressIndicator.stepName = firstConf.stepName; |
+ var verbose = firstConf.isVerbose; |
+ var printTiming = firstConf.printTiming; |
+ var listTests = firstConf.listTests; |
- var recordingPath = firstConf['record_to_file'] as String; |
- var recordingOutputPath = firstConf['replay_from_file'] as String; |
+ var reportInJson = firstConf.reportInJson; |
+ var recordingPath = firstConf.recordingPath; |
+ var replayPath = firstConf.replayPath; |
- Browser.resetBrowserConfiguration = |
- firstConf['reset_browser_configuration'] as bool; |
+ Browser.resetBrowserConfiguration = firstConf.resetBrowser; |
- if (recordingPath != null && recordingOutputPath != null) { |
+ if (recordingPath != null && replayPath != null) { |
print("Fatal: Can't have the '--record_to_file' and '--replay_from_file'" |
"at the same time. Exiting ..."); |
exit(1); |
} |
- if (!(firstConf['append_logs'] as bool)) { |
+ if (!firstConf.appendLogs) { |
var files = [ |
new File(TestUtils.flakyFileName), |
new File(TestUtils.testOutcomeFileName) |
@@ -95,70 +90,52 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
} |
} |
- DebugLogger.init( |
- firstConf['write_debug_log'] as bool ? TestUtils.debugLogFilePath : null, |
- append: firstConf['append_logs'] as bool); |
+ DebugLogger.init(firstConf.writeDebugLog ? TestUtils.debugLogFilePath : null, |
+ append: firstConf.appendLogs); |
// Print the configurations being run by this execution of |
// test.dart. However, don't do it if the silent progress indicator |
// is used. This is only needed because of the junit tests. |
- if (progressIndicator != 'silent') { |
+ if (progressIndicator != Progress.silent) { |
var outputWords = configurations.length > 1 |
? ['Test configurations:'] |
: ['Test configuration:']; |
- for (Map conf in configurations) { |
- List settings = ['compiler', 'runtime', 'mode', 'arch'] |
- .map((name) => conf[name]) |
- .toList(); |
- if (conf['checked'] as bool) settings.add('checked'); |
- if (conf['strong'] as bool) settings.add('strong'); |
+ |
+ for (var configuration in configurations) { |
+ var settings = [ |
+ configuration.compiler.name, |
+ configuration.runtime.name, |
+ configuration.mode.name, |
+ configuration.architecture.name |
+ ]; |
+ if (configuration.isChecked) settings.add('checked'); |
+ if (configuration.isStrong) settings.add('strong'); |
+ if (configuration.useFastStartup) settings.add('fast-startup'); |
outputWords.add(settings.join('_')); |
} |
print(outputWords.join(' ')); |
} |
- var runningBrowserTests = configurations.any((config) { |
- return TestUtils.isBrowserRuntime(config['runtime'] as String); |
- }); |
+ var runningBrowserTests = |
+ configurations.any((config) => config.runtime.isBrowser); |
- List<Future> serverFutures = []; |
+ var serverFutures = <Future>[]; |
var testSuites = <TestSuite>[]; |
var maxBrowserProcesses = maxProcesses; |
if (configurations.length > 1 && |
- (configurations[0]['test_server_port'] != 0 || |
- configurations[0]['test_server_cross_origin_port'] != 0)) { |
+ (configurations[0].testServerPort != 0 || |
+ configurations[0].testServerCrossOriginPort != 0)) { |
print("If the http server ports are specified, only one configuration" |
" may be run at a time"); |
exit(1); |
} |
- for (var conf in configurations) { |
- var selectors = conf['selectors'] as Map<String, RegExp>; |
- var useContentSecurityPolicy = conf['csp'] as bool; |
+ |
+ for (var configuration in configurations) { |
if (!listTests && runningBrowserTests) { |
- // Start global http servers that serve the entire dart repo. |
- // The http server is available on window.location.port, and a second |
- // server for cross-domain tests can be found by calling |
- // getCrossOriginPortNumber(). |
- var servers = new TestingServers( |
- TestUtils.buildDir(conf), |
- useContentSecurityPolicy, |
- conf['runtime'] as String, |
- null, |
- conf['package_root'] as String, |
- conf['packages'] as String); |
- serverFutures.add(servers.startServers(conf['local_ip'] as String, |
- port: conf['test_server_port'] as int, |
- crossOriginPort: conf['test_server_cross_origin_port'] as int)); |
- conf['_servers_'] = servers; |
- if (verbose) { |
- serverFutures.last.then((_) { |
- var commandline = servers.httpServerCommandLine(); |
- print('Started HttpServers: $commandline'); |
- }); |
- } |
+ serverFutures.add(configuration.startServers()); |
} |
- if ((conf['runtime'] as String).startsWith('ie')) { |
+ if (configuration.runtime.isIE) { |
// NOTE: We've experienced random timeouts of tests on ie9/ie10. The |
// underlying issue has not been determined yet. Our current hypothesis |
// is that windows does not handle the IE processes independently. |
@@ -166,18 +143,18 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
// issues with starting up a new browser just after killing the hanging |
// browser. |
maxBrowserProcesses = 1; |
- } else if ((conf['runtime'] as String).startsWith('safari')) { |
+ } else if (configuration.runtime.isSafari) { |
// Safari does not allow us to run from a fresh profile, so we can only |
// use one browser. Additionally, you can not start two simulators |
// for mobile safari simultainiously. |
maxBrowserProcesses = 1; |
- } else if ((conf['runtime'] as String) == 'chrome' && |
+ } else if (configuration.runtime == Runtime.chrome && |
Platform.operatingSystem == 'macos') { |
// Chrome on mac results in random timeouts. |
// Issue: https://github.com/dart-lang/sdk/issues/23891 |
// This change does not fix the problem. |
maxBrowserProcesses = math.max(1, maxBrowserProcesses ~/ 2); |
- } else if ((conf['runtime'] as String) != 'drt') { |
+ } else if (configuration.runtime != Runtime.drt) { |
// Even on machines with more than 16 processors, don't open more |
// than 15 browser instances, to avoid overloading the machine. |
// This is especially important when running locally on powerful |
@@ -186,30 +163,30 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
} |
// If we specifically pass in a suite only run that. |
- if (conf['suite_dir'] != null) { |
- var suite_path = new Path(conf['suite_dir'] as String); |
- testSuites.add(new PKGTestSuite(conf, suite_path)); |
+ if (configuration.suiteDirectory != null) { |
+ var suitePath = new Path(configuration.suiteDirectory); |
+ testSuites.add(new PKGTestSuite(configuration, suitePath)); |
} else { |
- for (final testSuiteDir in TEST_SUITE_DIRECTORIES) { |
- final name = testSuiteDir.filename; |
- if (selectors.containsKey(name)) { |
- testSuites |
- .add(new StandardTestSuite.forDirectory(conf, testSuiteDir)); |
+ for (var testSuiteDir in TEST_SUITE_DIRECTORIES) { |
+ var name = testSuiteDir.filename; |
+ if (configuration.selectors.containsKey(name)) { |
+ testSuites.add( |
+ new StandardTestSuite.forDirectory(configuration, testSuiteDir)); |
} |
} |
- for (String key in selectors.keys) { |
+ |
+ for (var key in configuration.selectors.keys) { |
if (key == 'co19') { |
- testSuites.add(new Co19TestSuite(conf)); |
- } else if ((conf['compiler'] == 'dartk' || |
- conf['compiler'] == 'none') && |
- conf['runtime'] == 'vm' && |
+ testSuites.add(new Co19TestSuite(configuration)); |
+ } else if (configuration.compiler == Compiler.none && |
+ configuration.runtime == Runtime.vm && |
key == 'vm') { |
// vm tests contain both cc tests (added here) and dart tests (added |
// in [TEST_SUITE_DIRECTORIES]). |
- testSuites.add(new VMTestSuite(conf)); |
- } else if (conf['analyzer'] as bool) { |
+ testSuites.add(new VMTestSuite(configuration)); |
+ } else if (configuration.compiler == Compiler.dart2analyzer) { |
if (key == 'analyze_library') { |
- testSuites.add(new AnalyzeLibraryTestSuite(conf)); |
+ testSuites.add(new AnalyzeLibraryTestSuite(configuration)); |
} |
} |
} |
@@ -217,11 +194,10 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
} |
void allTestsFinished() { |
- for (var conf in configurations) { |
- if (conf.containsKey('_servers_')) { |
- conf['_servers_'].stopServers(); |
- } |
+ for (var configuration in configurations) { |
+ configuration.stopServers(); |
} |
+ |
DebugLogger.close(); |
TestUtils.deleteTempSnapshotDirectory(configurations[0]); |
} |
@@ -229,15 +205,15 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
var eventListener = <EventListener>[]; |
// We don't print progress if we list tests. |
- if (progressIndicator != 'silent' && !listTests) { |
+ if (progressIndicator != Progress.silent && !listTests) { |
var printFailures = true; |
var formatter = Formatter.normal; |
- if (progressIndicator == 'color') { |
- progressIndicator = 'compact'; |
+ if (progressIndicator == Progress.color) { |
+ progressIndicator = Progress.compact; |
formatter = Formatter.color; |
} |
- if (progressIndicator == 'diff') { |
- progressIndicator = 'compact'; |
+ if (progressIndicator == Progress.diff) { |
+ progressIndicator = Progress.compact; |
formatter = Formatter.color; |
printFailures = false; |
eventListener.add(new StatusFileUpdatePrinter()); |
@@ -247,20 +223,22 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
if (printFailures) { |
// The buildbot has it's own failure summary since it needs to wrap it |
// into '@@@'-annotated sections. |
- var printFailureSummary = progressIndicator != 'buildbot'; |
+ var printFailureSummary = progressIndicator != Progress.buildbot; |
eventListener.add(new TestFailurePrinter(printFailureSummary, formatter)); |
} |
- eventListener.add( |
- ProgressIndicator.fromName(progressIndicator, startTime, formatter)); |
+ eventListener.add(ProgressIndicator.fromProgress( |
+ progressIndicator, startTime, formatter)); |
if (printTiming) { |
eventListener.add(new TimingPrinter(startTime)); |
} |
eventListener.add(new SkippedCompilationsPrinter()); |
} |
- if (firstConf['write_test_outcome_log'] as bool) { |
+ |
+ if (firstConf.writeTestOutcomeLog) { |
eventListener.add(new TestOutcomeLogWriter()); |
} |
- if (firstConf['copy_coredumps'] as bool) { |
+ |
+ if (firstConf.copyCoreDumps) { |
eventListener.add(new UnexpectedCrashLogger()); |
} |
@@ -276,8 +254,9 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
// If any of the configurations need to access android devices we'll first |
// make a pool of all available adb devices. |
AdbDevicePool adbDevicePool; |
- var needsAdbDevicePool = configurations.any((Map conf) { |
- return conf['runtime'] == 'dart_precompiled' && conf['system'] == 'android'; |
+ var needsAdbDevicePool = configurations.any((conf) { |
+ return conf.runtime == Runtime.dartPrecompiled && |
+ conf.system == System.android; |
}); |
if (needsAdbDevicePool) { |
adbDevicePool = await AdbDevicePool.create(); |
@@ -288,19 +267,6 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
await Future.wait(serverFutures); |
} |
- if (Platform.isWindows) { |
- // When running tests on Windows, use cdb from depot_tools to dump |
- // stack traces of tests timing out. |
- try { |
- var text = |
- await new File(VS_TOOLCHAIN_FILE.toNativePath()).readAsString(); |
- firstConf['win_sdk_path'] = JSON.decode(text)['win_sdk']; |
- } on dynamic { |
- // Ignore errors here. If win_sdk is not found, stack trace dumping |
- // for timeouts won't work. |
- } |
- } |
- |
// [firstConf] is needed here, since the ProcessQueue needs to know the |
// settings of 'noBatch' and 'local_ip' |
new ProcessQueue( |
@@ -313,6 +279,6 @@ Future testConfigurations(List<Map<String, dynamic>> configurations) async { |
allTestsFinished, |
verbose, |
recordingPath, |
- recordingOutputPath, |
+ replayPath, |
adbDevicePool); |
} |