Index: tools/testing/dart/test_suite.dart |
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart |
index 5012d4974b1ff34dee11ac377e7524adaad3121f..59a3ba6135ec59a5d068a5fd76c14e4b5dcacbc4 100644 |
--- a/tools/testing/dart/test_suite.dart |
+++ b/tools/testing/dart/test_suite.dart |
@@ -14,7 +14,6 @@ |
*/ |
import 'dart:async'; |
import 'dart:io'; |
-import 'dart:math'; |
import 'browser_test.dart'; |
import 'compiler_configuration.dart'; |
@@ -752,9 +751,7 @@ class StandardTestSuite extends TestSuite { |
} |
static Path _findPubspecYamlFile(Path filePath) { |
- final existsCache = TestUtils.existsCache; |
- |
- Path root = TestUtils.dartDir; |
+ var root = TestUtils.dartDir; |
assert("$filePath".startsWith("$root")); |
// We start with the parent directory of [filePath] and go up until |
@@ -762,11 +759,12 @@ class StandardTestSuite extends TestSuite { |
List<String> segments = filePath.directoryPath.relativeTo(root).segments(); |
while (segments.length > 0) { |
var pubspecYamlPath = new Path(segments.join('/')).append('pubspec.yaml'); |
- if (existsCache.doesFileExist(pubspecYamlPath.toNativePath())) { |
+ if (TestUtils.existsCache.doesFileExist(pubspecYamlPath.toNativePath())) { |
return root.join(pubspecYamlPath); |
} |
segments.removeLast(); |
} |
+ |
return null; |
} |
@@ -780,11 +778,11 @@ class StandardTestSuite extends TestSuite { |
enqueueHtmlTest(info, testName, expectations); |
return; |
} |
+ |
var optionsFromFile = info.optionsFromFile; |
// If this test is inside a package, we will check if there is a |
// pubspec.yaml file and if so, create a custom package root for it. |
- List<Command> baseCommands = <Command>[]; |
Path packageRoot; |
Path packages; |
@@ -804,7 +802,7 @@ class StandardTestSuite extends TestSuite { |
// If a compile-time error is expected, and we're testing a |
// compiler, we never need to attempt to run the program (in a |
// browser or otherwise). |
- enqueueStandardTest(baseCommands, info, testName, expectations); |
+ enqueueStandardTest(info, testName, expectations); |
} else if (configuration.runtime.isBrowser) { |
if (info.optionsFromFile['isMultiHtmlTest'] as bool) { |
// A browser multi-test has multiple expectations for one test file. |
@@ -816,19 +814,18 @@ class StandardTestSuite extends TestSuite { |
multiHtmlTestExpectations[fullTestName] = |
testExpectations.expectations(fullTestName); |
} |
- enqueueBrowserTest(baseCommands, packageRoot, packages, info, testName, |
- multiHtmlTestExpectations); |
- } else { |
enqueueBrowserTest( |
- baseCommands, packageRoot, packages, info, testName, expectations); |
+ packageRoot, packages, info, testName, multiHtmlTestExpectations); |
+ } else { |
+ enqueueBrowserTest(packageRoot, packages, info, testName, expectations); |
} |
} else { |
- enqueueStandardTest(baseCommands, info, testName, expectations); |
+ enqueueStandardTest(info, testName, expectations); |
} |
} |
- void enqueueStandardTest(List<Command> baseCommands, TestInformation info, |
- String testName, Set<Expectation> expectations) { |
+ void enqueueStandardTest( |
+ TestInformation info, String testName, Set<Expectation> expectations) { |
var commonArguments = |
commonArgumentsFromFile(info.filePath, info.optionsFromFile); |
@@ -844,9 +841,8 @@ class StandardTestSuite extends TestSuite { |
allVmOptions = vmOptions.toList()..addAll(extraVmOptions); |
} |
- var commands = baseCommands.toList(); |
- commands.addAll( |
- makeCommands(info, vmOptionsVariant, allVmOptions, commonArguments)); |
+ var commands = |
+ makeCommands(info, vmOptionsVariant, allVmOptions, commonArguments); |
enqueueNewTestCase(new TestCase( |
'$suiteName/$testName', commands, configuration, expectations, |
isNegative: isNegative(info), info: info)); |
@@ -1030,7 +1026,6 @@ class StandardTestSuite extends TestSuite { |
* compilation and many browser runs). |
*/ |
void enqueueBrowserTest( |
- List<Command> baseCommands, |
Path packageRoot, |
Path packages, |
TestInformation info, |
@@ -1044,13 +1039,12 @@ class StandardTestSuite extends TestSuite { |
var optionsName = |
multipleOptions ? vmOptions.join('-').replaceAll(badChars, '') : ''; |
var tempDir = createOutputDirectory(info.filePath, optionsName); |
- enqueueBrowserTestWithOptions(baseCommands, packageRoot, packages, info, |
- testName, expectations, vmOptions, tempDir); |
+ enqueueBrowserTestWithOptions(packageRoot, packages, info, testName, |
+ expectations, vmOptions, tempDir); |
} |
} |
void enqueueBrowserTestWithOptions( |
- List<Command> baseCommands, |
Path packageRoot, |
Path packages, |
TestInformation info, |
@@ -1080,7 +1074,7 @@ class StandardTestSuite extends TestSuite { |
// Construct the command(s) that compile all the inputs needed by the |
// browser test. For running Dart in DRT, this will be noop commands. |
- var commands = baseCommands.toList(); |
+ var commands = <Command>[]; |
// Use existing HTML document if available. |
String htmlPath; |
@@ -1723,7 +1717,6 @@ class PKGTestSuite extends StandardTestSuite { |
recursive: true); |
void enqueueBrowserTest( |
- List<Command> baseCommands, |
Path packageRoot, |
packages, |
TestInformation info, |
@@ -1737,14 +1730,15 @@ class PKGTestSuite extends StandardTestSuite { |
var customHtml = new File(customHtmlPath.toNativePath()); |
if (!customHtml.existsSync()) { |
super.enqueueBrowserTest( |
- baseCommands, packageRoot, packages, info, testName, expectations); |
+ packageRoot, packages, info, testName, expectations); |
} else { |
var relativeHtml = customHtmlPath.relativeTo(TestUtils.dartDir); |
- var commands = baseCommands.toList(); |
var fullPath = _createUrlPathFromFile(customHtmlPath); |
- commands.add(CommandBuilder.instance |
- .getBrowserTestCommand(fullPath, configuration, !isNegative(info))); |
+ var commands = [ |
+ CommandBuilder.instance |
+ .getBrowserTestCommand(fullPath, configuration, !isNegative(info)) |
+ ]; |
var testDisplayName = '$suiteName/$testName'; |
enqueueNewTestCase(new BrowserTestCase( |
testDisplayName, |
@@ -1814,272 +1808,3 @@ class AnalyzeLibraryTestSuite extends DartcCompilationTestSuite { |
bool get listRecursively => true; |
} |
- |
-class LastModifiedCache { |
- Map<String, DateTime> _cache = <String, DateTime>{}; |
- |
- /** |
- * Returns the last modified date of the given [uri]. |
- * |
- * The return value will be cached for future queries. If [uri] is a local |
- * file, it's last modified [Date] will be returned. If the file does not |
- * exist, null will be returned instead. |
- * In case [uri] is not a local file, this method will always return |
- * the current date. |
- */ |
- DateTime getLastModified(Uri uri) { |
- if (uri.scheme == "file") { |
- if (_cache.containsKey(uri.path)) { |
- return _cache[uri.path]; |
- } |
- var file = new File(new Path(uri.path).toNativePath()); |
- _cache[uri.path] = file.existsSync() ? file.lastModifiedSync() : null; |
- return _cache[uri.path]; |
- } |
- return new DateTime.now(); |
- } |
-} |
- |
-class ExistsCache { |
- Map<String, bool> _cache = <String, bool>{}; |
- |
- /** |
- * Returns true if the file in [path] exists, false otherwise. |
- * |
- * The information will be cached. |
- */ |
- bool doesFileExist(String path) { |
- if (!_cache.containsKey(path)) { |
- _cache[path] = new File(path).existsSync(); |
- } |
- return _cache[path]; |
- } |
-} |
- |
-class TestUtils { |
- /** |
- * Any script using TestUtils must set dartDirUri to a file:// URI |
- * pointing to the root of the Dart checkout. |
- */ |
- static void setDartDirUri(Uri uri) { |
- dartDirUri = uri; |
- dartDir = new Path(uri.toFilePath()); |
- } |
- |
- static Random rand = new Random.secure(); |
- static Uri dartDirUri; |
- static Path dartDir; |
- static LastModifiedCache lastModifiedCache = new LastModifiedCache(); |
- static ExistsCache existsCache = new ExistsCache(); |
- static Path currentWorkingDirectory = new Path(Directory.current.path); |
- |
- /** |
- * Generates a random number. |
- */ |
- static int getRandomNumber() { |
- return rand.nextInt(0xffffffff); |
- } |
- |
- /** |
- * Creates a directory using a [relativePath] to an existing |
- * [base] directory if that [relativePath] does not already exist. |
- */ |
- static Directory mkdirRecursive(Path base, Path relativePath) { |
- if (relativePath.isAbsolute) { |
- base = new Path('/'); |
- } |
- Directory dir = new Directory(base.toNativePath()); |
- assert(dir.existsSync()); |
- var segments = relativePath.segments(); |
- for (String segment in segments) { |
- base = base.append(segment); |
- if (base.toString() == "/$segment" && |
- segment.length == 2 && |
- segment.endsWith(':')) { |
- // Skip the directory creation for a path like "/E:". |
- continue; |
- } |
- dir = new Directory(base.toNativePath()); |
- if (!dir.existsSync()) { |
- dir.createSync(); |
- } |
- assert(dir.existsSync()); |
- } |
- return dir; |
- } |
- |
- /** |
- * Copy a [source] file to a new place. |
- * Assumes that the directory for [dest] already exists. |
- */ |
- static Future copyFile(Path source, Path dest) { |
- return new File(source.toNativePath()) |
- .openRead() |
- .pipe(new File(dest.toNativePath()).openWrite()); |
- } |
- |
- static Future copyDirectory(String source, String dest) { |
- source = new Path(source).toNativePath(); |
- dest = new Path(dest).toNativePath(); |
- |
- var executable = 'cp'; |
- var args = ['-Rp', source, dest]; |
- if (Platform.operatingSystem == 'windows') { |
- executable = 'xcopy'; |
- args = [source, dest, '/e', '/i']; |
- } |
- return Process.run(executable, args).then((ProcessResult result) { |
- if (result.exitCode != 0) { |
- throw new Exception("Failed to execute '$executable " |
- "${args.join(' ')}'."); |
- } |
- }); |
- } |
- |
- static Future deleteDirectory(String path) { |
- // We are seeing issues with long path names on windows when |
- // deleting them. Use the system tools to delete our long paths. |
- // See issue 16264. |
- if (Platform.operatingSystem == 'windows') { |
- var native_path = new Path(path).toNativePath(); |
- // Running this in a shell sucks, but rmdir is not part of the standard |
- // path. |
- return Process |
- .run('rmdir', ['/s', '/q', native_path], runInShell: true) |
- .then((ProcessResult result) { |
- if (result.exitCode != 0) { |
- throw new Exception('Can\'t delete path $native_path. ' |
- 'This path might be too long'); |
- } |
- }); |
- } else { |
- var dir = new Directory(path); |
- return dir.delete(recursive: true); |
- } |
- } |
- |
- static void deleteTempSnapshotDirectory(Configuration configuration) { |
- if (configuration.compiler == Compiler.appJit || |
- configuration.compiler == Compiler.precompiler) { |
- var checked = configuration.isChecked ? '-checked' : ''; |
- var strong = configuration.isStrong ? '-strong' : ''; |
- var minified = configuration.isMinified ? '-minified' : ''; |
- var csp = configuration.isCsp ? '-csp' : ''; |
- var sdk = configuration.useSdk ? '-sdk' : ''; |
- var dirName = "${configuration.compiler.name}" |
- "$checked$strong$minified$csp$sdk"; |
- var generatedPath = |
- configuration.buildDirectory + "/generated_compilations/$dirName"; |
- TestUtils.deleteDirectory(generatedPath); |
- } |
- } |
- |
- static final debugLogFilePath = new Path(".debug.log"); |
- |
- /// If a flaky test did fail, infos about it (i.e. test name, stdin, stdout) |
- /// will be written to this file. |
- /// |
- /// This is useful for debugging flaky tests. When running on a buildbot, the |
- /// file can be made visible in the waterfall UI. |
- static const flakyFileName = ".flaky.log"; |
- |
- /// If test.py was invoked with '--write-test-outcome-log it will write |
- /// test outcomes to this file. |
- static const testOutcomeFileName = ".test-outcome.log"; |
- |
- static void ensureExists(String filename, Configuration configuration) { |
- if (!configuration.listTests && !existsCache.doesFileExist(filename)) { |
- throw "'$filename' does not exist"; |
- } |
- } |
- |
- static Path absolutePath(Path path) { |
- if (!path.isAbsolute) { |
- return currentWorkingDirectory.join(path); |
- } |
- return path; |
- } |
- |
- static int shortNameCounter = 0; // Make unique short file names on Windows. |
- |
- static String getShortName(String path) { |
- final PATH_REPLACEMENTS = const { |
- "pkg_polymer_e2e_test_bad_import_test": "polymer_bi", |
- "pkg_polymer_e2e_test_canonicalization_test": "polymer_c16n", |
- "pkg_polymer_e2e_test_experimental_boot_test": "polymer_boot", |
- "pkg_polymer_e2e_test_good_import_test": "polymer_gi", |
- "tests_co19_src_Language_12_Expressions_14_Function_Invocation_": |
- "co19_fn_invoke_", |
- "tests_co19_src_LayoutTests_fast_css_getComputedStyle_getComputedStyle-": |
- "co19_css_getComputedStyle_", |
- "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_" |
- "caretRangeFromPoint-": "co19_caretrangefrompoint_", |
- "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_" |
- "hittest-relative-to-viewport_": "co19_caretrange_hittest_", |
- "tests_co19_src_LayoutTests_fast_dom_HTMLLinkElement_link-onerror-" |
- "stylesheet-with-": "co19_dom_link-", |
- "tests_co19_src_LayoutTests_fast_dom_": "co19_dom", |
- "tests_co19_src_LayoutTests_fast_canvas_webgl": "co19_canvas_webgl", |
- "tests_co19_src_LibTest_core_AbstractClassInstantiationError_" |
- "AbstractClassInstantiationError_": "co19_abstract_class_", |
- "tests_co19_src_LibTest_core_IntegerDivisionByZeroException_" |
- "IntegerDivisionByZeroException_": "co19_division_by_zero", |
- "tests_co19_src_WebPlatformTest_html_dom_documents_dom-tree-accessors_": |
- "co19_dom_accessors_", |
- "tests_co19_src_WebPlatformTest_html_semantics_embedded-content_" |
- "media-elements_": "co19_media_elements", |
- "tests_co19_src_WebPlatformTest_html_semantics_": "co19_semantics_", |
- "tests_co19_src_WebPlatformTest_html-templates_additions-to-" |
- "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_", |
- "tests_co19_src_WebPlatformTest_html-templates_definitions_" |
- "template-contents-owner": "co19_htmltemplates_contents", |
- "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" |
- "templates_additions-to-": "co19_htmltemplates_add_", |
- "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" |
- "templates_appending-to-a-template_": "co19_htmltemplates_append_", |
- "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" |
- "templates_clearing-the-stack-back-to-a-given-context_": |
- "co19_htmltemplates_clearstack_", |
- "tests_co19_src_WebPlatformTest_html-templates_parsing-html-" |
- "templates_creating-an-element-for-the-token_": |
- "co19_htmltemplates_create_", |
- "tests_co19_src_WebPlatformTest_html-templates_template-element" |
- "_template-": "co19_htmltemplates_element-", |
- "tests_co19_src_WebPlatformTest_html-templates_": "co19_htmltemplate_", |
- "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_": |
- "co19_shadow-trees_", |
- "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_": |
- "co19_shadowdom_", |
- "tests_co19_src_WebPlatformTest_shadow-dom_html-elements-in-" |
- "shadow-trees_": "co19_shadow_html_", |
- "tests_co19_src_WebPlatformTest_html_webappapis_system-state-and-" |
- "capabilities_the-navigator-object": "co19_webappapis_navigator_", |
- "tests_co19_src_WebPlatformTest_DOMEvents_approved_": "co19_dom_approved_" |
- }; |
- |
- // Some tests are already in [build_dir]/generated_tests. |
- String GEN_TESTS = 'generated_tests/'; |
- if (path.contains(GEN_TESTS)) { |
- int index = path.indexOf(GEN_TESTS) + GEN_TESTS.length; |
- path = 'multitest/${path.substring(index)}'; |
- } |
- path = path.replaceAll('/', '_'); |
- final int WINDOWS_SHORTEN_PATH_LIMIT = 58; |
- final int WINDOWS_PATH_END_LENGTH = 30; |
- if (Platform.operatingSystem == 'windows' && |
- path.length > WINDOWS_SHORTEN_PATH_LIMIT) { |
- for (var key in PATH_REPLACEMENTS.keys) { |
- if (path.startsWith(key)) { |
- path = path.replaceFirst(key, PATH_REPLACEMENTS[key]); |
- break; |
- } |
- } |
- if (path.length > WINDOWS_SHORTEN_PATH_LIMIT) { |
- ++shortNameCounter; |
- var pathEnd = path.substring(path.length - WINDOWS_PATH_END_LENGTH); |
- path = "short${shortNameCounter}_$pathEnd"; |
- } |
- } |
- return path; |
- } |
-} |