Simplify enqueueBrowserTest().

It's still big and monolithic, but it's not as big as it was before.

- Remove old unused Polymer stuff.
- Move some of the logic out into a helper function.
- Other small tweaks.

R=whesse@google.com

Review-Url: https://codereview.chromium.org/2949823003 .
This commit is contained in:
Bob Nystrom 2017-06-23 15:02:35 -07:00
parent 3b6f276c84
commit dfb4f52b43
2 changed files with 101 additions and 152 deletions

View file

@ -752,24 +752,6 @@ class StandardTestSuite extends TestSuite {
}
}
static Path _findPubspecYamlFile(Path filePath) {
var root = TestUtils.dartDir;
assert("$filePath".startsWith("$root"));
// We start with the parent directory of [filePath] and go up until
// the root directory (excluding the root).
List<String> segments = filePath.directoryPath.relativeTo(root).segments();
while (segments.length > 0) {
var pubspecYamlPath = new Path(segments.join('/')).append('pubspec.yaml');
if (TestUtils.existsCache.doesFileExist(pubspecYamlPath.toNativePath())) {
return root.join(pubspecYamlPath);
}
segments.removeLast();
}
return null;
}
void enqueueTestCaseFromTestInformation(TestInformation info) {
String testName = buildTestCaseDisplayName(suiteDir, info.originTestPath,
multitestName: info.optionsFromFile['isMultitest'] as bool
@ -777,7 +759,7 @@ class StandardTestSuite extends TestSuite {
: "");
Set<Expectation> expectations = testExpectations.expectations(testName);
if (info is HtmlTestInformation) {
enqueueHtmlTest(info, testName, expectations);
_enqueueHtmlTest(info, testName, expectations);
return;
}
@ -822,7 +804,7 @@ class StandardTestSuite extends TestSuite {
expectationsMap = {testName: expectations};
}
enqueueBrowserTest(
_enqueueBrowserTest(
packageRoot, packages, info, testName, expectationsMap);
} else {
enqueueStandardTest(info, testName, expectations);
@ -1022,8 +1004,12 @@ class StandardTestSuite extends TestSuite {
* subTestName, Set<String>> if we are running a browser multi-test (one
* compilation and many browser runs).
*/
void enqueueBrowserTest(Path packageRoot, Path packages, TestInformation info,
String testName, Map<String, Set<Expectation>> expectations) {
void _enqueueBrowserTest(
Path packageRoot,
Path packages,
TestInformation info,
String testName,
Map<String, Set<Expectation>> expectations) {
var badChars = new RegExp('[-=/]');
var vmOptionsList = getVmOptions(info.optionsFromFile);
var multipleOptions = vmOptionsList.length > 1;
@ -1031,12 +1017,12 @@ class StandardTestSuite extends TestSuite {
var optionsName =
multipleOptions ? vmOptions.join('-').replaceAll(badChars, '') : '';
var tempDir = createOutputDirectory(info.filePath, optionsName);
enqueueBrowserTestWithOptions(packageRoot, packages, info, testName,
_enqueueBrowserTestWithOptions(packageRoot, packages, info, testName,
expectations, vmOptions, tempDir);
}
}
void enqueueBrowserTestWithOptions(
void _enqueueBrowserTestWithOptions(
Path packageRoot,
Path packages,
TestInformation info,
@ -1058,54 +1044,28 @@ class StandardTestSuite extends TestSuite {
var customHtmlPath = dir.append('$nameNoExt.html').toNativePath();
var customHtml = new File(customHtmlPath);
// 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 = <Command>[];
// Use existing HTML document if available.
String htmlPath;
String content;
if (customHtml.existsSync()) {
// If necessary, run the Polymer deploy steps.
// TODO(jmesserly): this should be generalized for any tests that
// require Pub deploy, not just polymer.
// TODO(rnystrom): This does not appear to be used any more. Remove.
if (customHtml.readAsStringSync().contains('<!--polymer-test')) {
if (configuration.compiler != Compiler.none) {
commands.add(
_polymerDeployCommand(customHtmlPath, tempDir, optionsFromFile));
htmlPath = '$tempDir/test.html';
dartWrapperFilename = filePath.toNativePath();
Path pubspecYamlFile = _findPubspecYamlFile(filePath);
Path homeDir =
(pubspecYamlFile == null) ? dir : pubspecYamlFile.directoryPath;
htmlPath = '$tempDir/${dir.relativeTo(homeDir)}/$nameNoExt.html';
dartWrapperFilename = '${htmlPath}_bootstrap.dart';
compiledDartWrapperFilename = '$dartWrapperFilename.js';
} else {
htmlPath = customHtmlPath;
}
var htmlContents = customHtml.readAsStringSync();
if (configuration.compiler == Compiler.none) {
var dartUrl = _createUrlPathFromFile(filePath);
var dartScript =
'<script type="application/dart" src="$dartUrl"></script>';
var jsUrl = '/packages/browser/dart.js';
var jsScript = '<script type="text/javascript" src="$jsUrl"></script>';
htmlContents =
htmlContents.replaceAll('%TEST_SCRIPTS%', '$dartScript\n$jsScript');
} else {
htmlPath = '$tempDir/test.html';
dartWrapperFilename = filePath.toNativePath();
var htmlContents = customHtml.readAsStringSync();
if (configuration.compiler == Compiler.none) {
var dartUrl = _createUrlPathFromFile(filePath);
var dartScript =
'<script type="application/dart" src="$dartUrl"></script>';
var jsUrl = '/packages/browser/dart.js';
var jsScript =
'<script type="text/javascript" src="$jsUrl"></script>';
htmlContents = htmlContents.replaceAll(
'%TEST_SCRIPTS%', '$dartScript\n$jsScript');
} else {
compiledDartWrapperFilename = '$tempDir/$nameNoExt.js';
var jsUrl = '$nameNoExt.js';
htmlContents = htmlContents.replaceAll(
'%TEST_SCRIPTS%', '<script src="$jsUrl"></script>');
}
new File(htmlPath).writeAsStringSync(htmlContents);
compiledDartWrapperFilename = '$tempDir/$nameNoExt.js';
htmlContents = htmlContents.replaceAll(
'%TEST_SCRIPTS%', '<script src="$nameNoExt.js"></script>');
}
new File(htmlPath).writeAsStringSync(htmlContents);
} else {
htmlPath = '$tempDir/test.html';
if (configuration.compiler != Compiler.dart2js &&
@ -1117,8 +1077,6 @@ class StandardTestSuite extends TestSuite {
}
// Create the HTML file for the test.
var htmlTest = new File(htmlPath).openSync(mode: FileMode.WRITE);
var scriptPath = dartWrapperFilename;
if (configuration.compiler != Compiler.none) {
scriptPath = compiledDartWrapperFilename;
@ -1134,10 +1092,13 @@ class StandardTestSuite extends TestSuite {
content = dartdevcHtml(nameNoExt, jsDir);
}
htmlTest.writeStringSync(content);
htmlTest.closeSync();
new File(htmlPath).writeAsStringSync(content);
}
// 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 = <Command>[];
switch (configuration.compiler) {
case Compiler.dart2js:
commands.add(_dart2jsCompileCommand(dartWrapperFilename,
@ -1157,8 +1118,7 @@ class StandardTestSuite extends TestSuite {
}
// Some tests require compiling multiple input scripts.
var otherScripts = optionsFromFile['otherScripts'] as List<String>;
for (var name in otherScripts) {
for (var name in optionsFromFile['otherScripts'] as List<String>) {
var namePath = new Path(name);
var fromPath = filePath.directoryPath.join(namePath);
@ -1170,7 +1130,7 @@ class StandardTestSuite extends TestSuite {
case Compiler.dartdevc:
commands.add(_dartdevcCompileCommand(fromPath.toNativePath(),
'$tempDir/$nameNoExt.js', optionsFromFile));
'$tempDir/${namePath.filename}.js', optionsFromFile));
break;
default:
@ -1181,66 +1141,80 @@ class StandardTestSuite extends TestSuite {
// For the tests that require multiple input scripts but are not
// compiled, move the input scripts over with the script so they can
// be accessed.
var result = new File(fromPath.toNativePath()).readAsStringSync();
new File('$tempDir/${namePath.filename}').writeAsStringSync(result);
new File(fromPath.toNativePath())
.copySync('$tempDir/${namePath.filename}');
}
}
// Variables for browser multi-tests.
var isMultitest = info.optionsFromFile['isMultiHtmlTest'] as bool;
var subtestNames = isMultitest
? (info.optionsFromFile['subtestNames'] as List<String>)
: <String>[null];
for (var subtestName in subtestNames) {
// Construct the command that executes the browser test
var commandSet = commands.toList();
var htmlPath_subtest = _createUrlPathFromFile(new Path(htmlPath));
var fullHtmlPath =
_getUriForBrowserTest(htmlPath_subtest, subtestName).toString();
if (configuration.runtime == Runtime.drt) {
var dartFlags = <String>[];
var contentShellOptions = ['--no-timeout', '--run-layout-test'];
// Disable the GPU under Linux and Dartium. If the GPU is enabled,
// Chrome may send a termination signal to a test. The test will be
// terminated if a machine (bot) doesn't have a GPU or if a test is
// still running after a certain period of time.
if (configuration.system == System.linux &&
configuration.runtime == Runtime.drt) {
contentShellOptions.add('--disable-gpu');
// TODO(terry): Roll 50 need this in conjection with disable-gpu.
contentShellOptions.add('--disable-gpu-early-init');
}
if (configuration.compiler == Compiler.none) {
dartFlags.add('--ignore-unrecognized-flags');
if (configuration.isChecked) {
dartFlags.add('--enable_asserts');
dartFlags.add("--enable_type_checks");
}
dartFlags.addAll(vmOptions);
}
commandSet.add(Command.contentShell(contentShellFilename, fullHtmlPath,
contentShellOptions, dartFlags, environmentOverrides));
} else {
commandSet.add(Command.browserTest(fullHtmlPath, configuration,
retry: !isNegative(info)));
if (info.optionsFromFile['isMultiHtmlTest'] as bool) {
// Variables for browser multi-tests.
var subtestNames = info.optionsFromFile['subtestNames'] as List<String>;
for (var subtestName in subtestNames) {
_enqueueSingleBrowserTest(commands, info, '$testName/$subtestName',
subtestName, expectations, vmOptions, htmlPath);
}
// Create BrowserTestCase and queue it.
var fullTestName = isMultitest ? '$testName/$subtestName' : testName;
var expectation = expectations[fullTestName];
var testCase = new BrowserTestCase('$suiteName/$fullTestName', commandSet,
configuration, expectation, info, isNegative(info), fullHtmlPath);
enqueueNewTestCase(testCase);
} else {
_enqueueSingleBrowserTest(
commands, info, testName, null, expectations, vmOptions, htmlPath);
}
}
void enqueueHtmlTest(HtmlTestInformation info, String testName,
/// Enqueues a single browser test, or a single subtest of an HTML multitest.
void _enqueueSingleBrowserTest(
List<Command> commands,
TestInformation info,
String testName,
String subtestName,
Map<String, Set<Expectation>> expectations,
List<String> vmOptions,
String htmlPath) {
// Construct the command that executes the browser test.
commands = commands.toList();
var htmlPathSubtest = _createUrlPathFromFile(new Path(htmlPath));
var fullHtmlPath =
_getUriForBrowserTest(htmlPathSubtest, subtestName).toString();
if (configuration.runtime == Runtime.drt) {
var dartFlags = <String>[];
var contentShellOptions = ['--no-timeout', '--run-layout-test'];
// Disable the GPU under Linux and Dartium. If the GPU is enabled,
// Chrome may send a termination signal to a test. The test will be
// terminated if a machine (bot) doesn't have a GPU or if a test is
// still running after a certain period of time.
if (configuration.system == System.linux &&
configuration.runtime == Runtime.drt) {
contentShellOptions.add('--disable-gpu');
// TODO(terry): Roll 50 need this in conjection with disable-gpu.
contentShellOptions.add('--disable-gpu-early-init');
}
if (configuration.compiler == Compiler.none) {
dartFlags.add('--ignore-unrecognized-flags');
if (configuration.isChecked) {
dartFlags.add('--enable_asserts');
dartFlags.add("--enable_type_checks");
}
dartFlags.addAll(vmOptions);
}
commands.add(Command.contentShell(contentShellFilename, fullHtmlPath,
contentShellOptions, dartFlags, environmentOverrides));
} else {
commands.add(Command.browserTest(fullHtmlPath, configuration,
retry: !isNegative(info)));
}
// Create BrowserTestCase and queue it.
var expectation = expectations[testName];
var testCase = new BrowserTestCase('$suiteName/$testName', commands,
configuration, expectation, info, isNegative(info), fullHtmlPath);
enqueueNewTestCase(testCase);
}
void _enqueueHtmlTest(HtmlTestInformation info, String testName,
Set<Expectation> expectations) {
var compiler = configuration.compiler;
var runtime = configuration.runtime;
@ -1375,27 +1349,6 @@ class StandardTestSuite extends TestSuite {
environmentOverrides);
}
/** Helper to create a Polymer deploy command for a single HTML file. */
Command _polymerDeployCommand(String inputFile, String outputDir,
Map<String, dynamic> optionsFromFile) {
var args = <String>[];
var packages = packagesArgument(optionsFromFile['packageRoot'] as String,
optionsFromFile['packages'] as String);
if (packages != null) args.add(packages);
args
..add('package:polymer/deploy.dart')
..add('--test')
..add(inputFile)
..add('--out')
..add(outputDir)
..add('--file-filter')
..add('.svn');
if (configuration.isCsp) args.add('--csp');
return Command.process(
'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides);
}
String get scriptType {
switch (configuration.compiler) {
case Compiler.none:
@ -1757,7 +1710,7 @@ class PKGTestSuite extends StandardTestSuite {
isTestFilePredicate: (f) => f.endsWith('_test.dart'),
recursive: true);
void enqueueBrowserTest(Path packageRoot, packages, TestInformation info,
void _enqueueBrowserTest(Path packageRoot, packages, TestInformation info,
String testName, Map<String, Set<Expectation>> expectations) {
var filePath = info.filePath;
var dir = filePath.directoryPath;
@ -1765,7 +1718,7 @@ class PKGTestSuite extends StandardTestSuite {
var customHtmlPath = dir.append('$nameNoExt.html');
var customHtml = new File(customHtmlPath.toNativePath());
if (!customHtml.existsSync()) {
super.enqueueBrowserTest(
super._enqueueBrowserTest(
packageRoot, packages, info, testName, expectations);
} else {
var relativeHtml = customHtmlPath.relativeTo(TestUtils.dartDir);

View file

@ -448,10 +448,6 @@ class TestUtils {
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-":