blob: 1fa5b0fb4d0fecf2c008d40c74aa6514dc2a27cf [file] [log] [blame]
#!/usr/bin/env dart
// Copyright (c) 2012, 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.
/**
* This file is the entrypoint of the dart test suite. This suite is used
* to test:
*
* 1. the dart vm
* 2. the dart2js compiler
* 3. the dartc static analyzer
* 4. the dart core library
* 5. other standard dart libraries (DOM bindings, ui libraries,
* io libraries etc.)
*
* This script is normally invoked by test.py. (test.py finds the dart vm
* and passses along all command line arguments to this script.)
*
* The command line args of this script are documented in
* "tools/testing/test_options.dart".
*
*/
#library("test");
#import("dart:io");
#import("testing/dart/test_runner.dart");
#import("testing/dart/test_options.dart");
#import("testing/dart/test_suite.dart");
#import("testing/dart/test_progress.dart");
#import("testing/dart/http_server.dart");
#import("../compiler/tests/dartc/test_config.dart");
#import("../runtime/tests/vm/test_config.dart");
#import("../samples/tests/dartc/test_config.dart");
#import("../tests/co19/test_config.dart");
/**
* The directories that contain test suites which follow the conventions
* required by [StandardTestSuite]'s forDirectory constructor.
* New test suites should follow this convention because it makes it much
* simpler to add them to test.dart. Existing test suites should be
* moved to here, if possible.
*/
final TEST_SUITE_DIRECTORIES = [
new Path('pkg'),
new Path('runtime/tests/vm'),
new Path('samples/tests/samples'),
new Path('tests/benchmark_smoke'),
new Path('tests/compiler/dart2js'),
new Path('tests/compiler/dart2js_extra'),
new Path('tests/compiler/dart2js_foreign'),
new Path('tests/compiler/dart2js_native'),
new Path('tests/corelib'),
new Path('tests/dom'),
new Path('tests/html'),
new Path('tests/isolate'),
new Path('tests/json'),
new Path('tests/language'),
new Path('tests/lib'),
new Path('tests/standalone'),
new Path('tests/utils'),
new Path('utils/tests/css'),
new Path('utils/tests/peg'),
new Path('utils/tests/pub'),
];
main() {
var startTime = new Date.now();
var optionsParser = new TestOptionsParser();
List<Map> configurations = optionsParser.parse(new Options().arguments);
if (configurations == null || configurations.length == 0) return;
// Extract global options from first configuration.
var firstConf = configurations[0];
Map<String, RegExp> selectors = firstConf['selectors'];
var maxProcesses = firstConf['tasks'];
var progressIndicator = firstConf['progress'];
BuildbotProgressIndicator.stepName = firstConf['step_name'];
var verbose = firstConf['verbose'];
var printTiming = firstConf['time'];
var listTests = firstConf['list'];
if (!firstConf['append_flaky_log']) {
var file = new File(TestUtils.flakyFileName());
if (file.existsSync()) {
file.deleteSync();
}
}
// 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') {
List output_words = configurations.length > 1 ?
['Test configurations:'] : ['Test configuration:'];
for (Map conf in configurations) {
List settings =
['compiler', 'runtime', 'mode', 'arch'].map((name) => conf[name]);
if (conf['checked']) settings.add('checked');
output_words.add(Strings.join(settings, '_'));
}
print(Strings.join(output_words, ' '));
}
var configurationIterator = configurations.iterator();
void enqueueConfiguration(ProcessQueue queue) {
if (!configurationIterator.hasNext) return;
var conf = configurationIterator.next();
for (String key in selectors.keys) {
if (key == 'co19') {
queue.addTestSuite(new Co19TestSuite(conf));
} else if (conf['runtime'] == 'vm' && key == 'vm') {
// vm tests contain both cc tests (added here) and dart tests (added in
// [TEST_SUITE_DIRECTORIES]).
queue.addTestSuite(new VMTestSuite(conf));
} else if (conf['compiler'] == 'dartc' && key == 'dartc') {
queue.addTestSuite(new SamplesDartcTestSuite(conf));
queue.addTestSuite(new JUnitDartcTestSuite(conf));
}
}
for (final testSuiteDir in TEST_SUITE_DIRECTORIES) {
final name = testSuiteDir.filename;
if (selectors.containsKey(name)) {
queue.addTestSuite(
new StandardTestSuite.forDirectory(conf, testSuiteDir));
}
}
}
// Start global http server that serves the entire dart repo.
// The http server is available on localhost:9876 for any
// test that needs to load resources from the repo over http.
if (!listTests) {
// Only start the server if we are running browser tests.
var runningBrowserTests = configurations.some((config) {
return TestUtils.isBrowserRuntime(config['runtime']);
});
if (runningBrowserTests) startHttpServer('127.0.0.1', 9876);
}
// Start process queue.
new ProcessQueue(maxProcesses,
progressIndicator,
startTime,
printTiming,
enqueueConfiguration,
() => terminateHttpServer(),
verbose,
listTests);
}