Index: dart/tools/testing/dart/test_suite.dart |
diff --git a/dart/tools/testing/dart/test_suite.dart b/dart/tools/testing/dart/test_suite.dart |
index 2a2e80973c17f4e7c7e3b964b5287f530b96c9e5..0220cc06c32b3f2caf6ff3d24ed312f149676be8 100644 |
--- a/dart/tools/testing/dart/test_suite.dart |
+++ b/dart/tools/testing/dart/test_suite.dart |
@@ -23,6 +23,13 @@ import "test_runner.dart"; |
import "utils.dart"; |
import "http_server.dart" show PREFIX_BUILDDIR, PREFIX_DARTDIR; |
+import "compiler_configuration.dart" show |
+ CommandArtifact, |
+ CompilerConfiguration; |
+ |
+import "runtime_configuration.dart" show |
+ RuntimeConfiguration; |
+ |
part "browser_test.dart"; |
@@ -124,6 +131,19 @@ abstract class TestSuite { |
// The pub suite always uses the SDK. |
// TODO(rnystrom): Eventually, all test suites should run out of the SDK |
ricow1
2014/03/03 07:47:08
where and why was this introduced - as stated belo
Bob Nystrom
2014/03/03 21:45:51
This was added a long time ago when I first starte
ahe
2014/03/04 07:46:39
Thank you, Bob. It's awesome that you noticed this
|
// and this check should go away. |
+ // TODO(ahe): This check is broken for several reasons: |
+ // First, it is not true that all tests should be running out of the |
+ // SDK. It is absolutely critical to VM development that you can test the |
+ // VM without building the SDK. |
+ // Second, it is convenient for dart2js developers to run tests without |
+ // rebuilding the SDK, and similarly, it should be convenient for pub |
+ // developers. |
Bob Nystrom
2014/03/03 21:45:51
Agreed. I'm not sure what I meant by that comment.
|
+ // Third, even if pub can only run from the SDK directory, this is the |
Bob Nystrom
2014/03/03 21:45:51
The pub binary runs fine from <repo>/sdk/bin/pub,
ahe
2014/03/04 07:46:39
OK. So I wonder if we should fix this. It would se
|
+ // wrong place to work around that problem. Instead, test_options.dart |
+ // should have been modified so that configuration['use_sdk'] is always |
+ // true when testing pub. Attempting to override the value here is brittle |
+ // because we read configuration['use_sdk'] directly in many places without |
+ // using this getter. |
if (suiteName == 'pub') return true; |
return configuration['use_sdk']; |
@@ -139,37 +159,11 @@ abstract class TestSuite { |
* no compiler should be used. |
*/ |
String get compilerPath { |
- if (configuration['compiler'] == 'none') { |
- return null; // No separate compiler for dartium tests. |
- } |
- var name; |
- switch (configuration['compiler']) { |
- case 'dartanalyzer': |
- case 'dart2analyzer': |
- name = executablePath; |
- break; |
- case 'dart2js': |
- case 'dart2dart': |
- var prefix = 'sdk/bin/'; |
- String suffix = getExecutableSuffix(configuration['compiler']); |
- if (configuration['host_checked']) { |
- // The script dart2js_developer is not included in the |
- // shipped SDK, that is the script is not installed in |
- // "$buildDir/dart-sdk/bin/" |
- name = '$prefix/dart2js_developer$suffix'; |
- } else { |
- if (configuration['use_sdk']) { |
- prefix = '$buildDir/dart-sdk/bin/'; |
- } |
- name = '${prefix}dart2js$suffix'; |
- } |
- break; |
- default: |
- throw "Unknown compiler for: ${configuration['compiler']}"; |
- } |
- if (!(new File(name)).existsSync() && !configuration['list']) { |
- throw "Executable '$name' does not exist"; |
- } |
+ var compilerConfiguration = new CompilerConfiguration(configuration); |
+ if (!compilerConfiguration.hasCompiler) return null; |
+ String name = compilerConfiguration.computeCompilerPath(buildDir); |
+ // TODO(ahe): Only validate this once, in test_options.dart. |
+ TestUtils.ensureExists(name, configuration); |
return name; |
} |
@@ -180,53 +174,24 @@ abstract class TestSuite { |
} |
String suffix = getExecutableSuffix('pub'); |
var name = '${prefix}pub$suffix'; |
- if (!(new File(name)).existsSync() && !configuration['list']) { |
- throw "Executable '$name' does not exist"; |
- } |
- return name; |
- } |
- |
- String get dartPath { |
- var prefix = 'sdk/bin/'; |
- if (configuration['use_sdk']) { |
- prefix = '$buildDir/dart-sdk/bin/'; |
- } |
- String suffix = getExecutableSuffix('vm'); |
- var name = '${prefix}dart$suffix'; |
- if (!(new File(name)).existsSync() && !configuration['list']) { |
- throw "Executable '$name' does not exist"; |
- } |
+ TestUtils.ensureExists(name, configuration); |
return name; |
} |
- /** |
- * The path to the executable used to run this suite's tests. |
- */ |
- String get executablePath { |
- var suffix = getExecutableSuffix(configuration['compiler']); |
- switch (configuration['compiler']) { |
- case 'none': |
- if (useSdk) { |
- return '$buildDir/dart-sdk/bin/dart$suffix'; |
- } |
- return '$buildDir/dart$suffix'; |
- case 'dartanalyzer': |
- return 'sdk/bin/dartanalyzer_developer$suffix'; |
- case 'dart2analyzer': |
- return 'editor/tools/analyzer'; |
- default: |
- throw "Unknown executable for: ${configuration['compiler']}"; |
- } |
- } |
+ /// Returns the name of the Dart VM executable. |
+ String get dartVmBinaryFileName { |
+ // Controlled by user with the option "--dart". |
+ String dartExecutable = configuration['dart']; |
- String get dartShellFileName { |
- var name = configuration['dart']; |
- if (name == '') { |
- name = executablePath; |
+ if (dartExecutable == '') { |
+ String suffix = executableBinarySuffix; |
+ dartExecutable = useSdk |
+ ? '$buildDir/dart-sdk/bin/dart$suffix' |
+ : '$buildDir/dart$suffix'; |
} |
- TestUtils.ensureExists(name, configuration); |
- return name; |
+ TestUtils.ensureExists(dartExecutable, configuration); |
+ return dartExecutable; |
} |
String get d8FileName { |
@@ -246,19 +211,10 @@ abstract class TestSuite { |
} |
/** |
- * The file name of the Dart VM executable. |
- */ |
- String get vmFileName { |
- var suffix = getExecutableSuffix('vm'); |
- var vm = '$buildDir/dart$suffix'; |
- TestUtils.ensureExists(vm, configuration); |
- return vm; |
- } |
- |
- /** |
* The file extension (if any) that should be added to the given executable |
* name for the current platform. |
*/ |
+ // TODO(ahe): Get rid of this. Use executableBinarySuffix instead. |
String getExecutableSuffix(String executable) { |
if (Platform.operatingSystem == 'windows') { |
if (executable == 'd8' || executable == 'vm' || executable == 'none') { |
@@ -270,6 +226,8 @@ abstract class TestSuite { |
return ''; |
} |
+ String get executableBinarySuffix => Platform.isWindows ? '.exe' : ''; |
+ |
/** |
* Call the callback function onTest with a [TestCase] argument for each |
* test in the suite. When all tests have been processed, call [onDone]. |
@@ -317,7 +275,7 @@ abstract class TestSuite { |
if (testCase.info != null && |
testCase.info.hasCompileError && |
TestUtils.isBrowserRuntime(configuration['runtime']) && |
- configuration['compiler'] != 'none') { |
+ new CompilerConfiguration(configuration).hasCompiler) { |
SummaryReport.addCompileErrorSkipTest(); |
return; |
} |
@@ -930,7 +888,8 @@ class StandardTestSuite extends TestSuite { |
multitestName: optionsFromFile['isMultitest'] ? info.multitestKey : ""); |
Set<Expectation> expectations = testExpectations.expectations(testName); |
- if (configuration['compiler'] != 'none' && info.hasCompileError) { |
+ if (new CompilerConfiguration(configuration).hasCompiler && |
+ info.hasCompileError) { |
// 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). |
@@ -996,87 +955,53 @@ class StandardTestSuite extends TestSuite { |
} |
List<Command> makeCommands(TestInformation info, var vmOptions, var args) { |
- var compiler = configuration['compiler']; |
+ List<Command> commands = <Command>[]; |
+ CompilerConfiguration compilerConfiguration = |
+ new CompilerConfiguration(configuration); |
List<String> sharedOptions = info.optionsFromFile['sharedOptions']; |
- switch (compiler) { |
- case 'dart2js': |
- args = new List.from(args); |
- String tempDir = createCompilationOutputDirectory(info.filePath); |
- args.addAll(sharedOptions); |
- args.add('--out=$tempDir/out.js'); |
- |
- var command = CommandBuilder.instance.getCompilationCommand( |
- compiler, "$tempDir/out.js", !useSdk, |
- dart2JsBootstrapDependencies, compilerPath, args, |
- environmentOverrides); |
- |
- var javascriptFile = '$tempDir/out.js'; |
- if (configuration['csp']) { |
- javascriptFile = '$tempDir/out.precompiled.js'; |
- } |
- List<Command> commands = <Command>[command]; |
- if (info.hasCompileError) { |
- // Do not attempt to run the compiled result. A compilation |
- // error should be reported by the compilation command. |
- } else if (configuration['runtime'] == 'd8') { |
- commands.add(CommandBuilder.instance.getJSCommandlineCommand( |
- "d8", d8FileName, [javascriptFile], environmentOverrides)); |
- } else if (configuration['runtime'] == 'jsshell') { |
- commands.add(CommandBuilder.instance.getJSCommandlineCommand( |
- "jsshell", jsShellFileName, [javascriptFile], |
- environmentOverrides)); |
- } |
+ List<String> compileTimeArguments = <String>[]; |
+ String tempDir; |
ricow1
2014/03/03 07:47:08
wouldn't a better name be outputDir here?
|
+ if (compilerConfiguration.hasCompiler) { |
+ compileTimeArguments |
+ ..addAll(args) |
+ ..addAll(sharedOptions); |
+ // Avoid doing this for analyzer. |
+ tempDir = createCompilationOutputDirectory(info.filePath); |
+ } |
+ |
+ CommandArtifact compilationArtifact = |
+ compilerConfiguration.computeCompilationArtifact( |
+ buildDir, |
+ tempDir, |
+ CommandBuilder.instance, |
+ compileTimeArguments, |
+ environmentOverrides); |
+ commands.addAll(compilationArtifact.commands); |
+ |
+ if (info.hasCompileError && compilerConfiguration.hasCompiler) { |
+ // Do not attempt to run the compiled result. A compilation |
+ // error should be reported by the compilation command. |
return commands; |
- case 'dart2dart': |
- args = new List.from(args); |
- args.addAll(sharedOptions); |
- args.add('--output-type=dart'); |
- String tempDir = createCompilationOutputDirectory(info.filePath); |
- args.add('--out=$tempDir/out.dart'); |
- |
- List<Command> commands = |
- <Command>[CommandBuilder.instance.getCompilationCommand( |
- compiler, "$tempDir/out.dart", !useSdk, |
- dart2JsBootstrapDependencies, compilerPath, args, |
- environmentOverrides)]; |
- if (info.hasCompileError) { |
- // Do not attempt to run the compiled result. A compilation |
- // error should be reported by the compilation command. |
- } else if (configuration['runtime'] == 'vm') { |
- // TODO(antonm): support checked. |
- var vmArguments = new List.from(vmOptions); |
- vmArguments.addAll([ |
- '--ignore-unrecognized-flags', '$tempDir/out.dart']); |
- commands.add(CommandBuilder.instance.getVmCommand( |
- vmFileName, vmArguments, environmentOverrides)); |
- } else { |
- throw 'Unsupported runtime ${configuration["runtime"]} for dart2dart'; |
- } |
- return commands; |
- |
- case 'none': |
- var arguments = new List.from(vmOptions); |
- arguments.addAll(sharedOptions); |
- arguments.addAll(args); |
- return <Command>[CommandBuilder.instance.getVmCommand( |
- dartShellFileName, arguments, environmentOverrides)]; |
- |
- case 'dartanalyzer': |
- case 'dart2analyzer': |
- return <Command>[makeAnalysisCommand(info, args)]; |
- |
- default: |
- throw 'Unknown compiler ${configuration["compiler"]}'; |
} |
- } |
- AnalysisCommand makeAnalysisCommand(TestInformation info, |
- List<String> arguments) { |
- return CommandBuilder.instance.getAnalysisCommand( |
- configuration['compiler'], dartShellFileName, arguments, |
- environmentOverrides, |
- flavor: configuration['compiler']); |
+ RuntimeConfiguration runtimeConfiguration = |
+ new RuntimeConfiguration(configuration); |
+ List<String> runtimeArguments = |
+ compilerConfiguration.computeRuntimeArguments( |
+ runtimeConfiguration, |
+ info, |
+ vmOptions, sharedOptions, args, |
+ compilationArtifact); |
+ |
+ return commands |
ricow1
2014/03/03 07:47:08
I would not do a method cascade here, but call the
|
+ ..addAll( |
+ runtimeConfiguration.computeRuntimeCommands( |
+ this, |
+ CommandBuilder.instance, |
+ compilationArtifact, |
+ runtimeArguments, |
+ environmentOverrides)); |
} |
CreateTest makeTestCaseCreator(Map optionsFromFile) { |
@@ -1397,7 +1322,7 @@ class StandardTestSuite extends TestSuite { |
if (executable.endsWith('.dart')) { |
// Run the compiler script via the Dart VM. |
args.insert(0, executable); |
- executable = dartShellFileName; |
+ executable = dartVmBinaryFileName; |
} |
return CommandBuilder.instance.getCompilationCommand( |
compiler, outputFile, !useSdk, |
@@ -1416,7 +1341,7 @@ class StandardTestSuite extends TestSuite { |
if (configuration['csp']) args.add('--csp'); |
return CommandBuilder.instance.getProcessCommand( |
- 'polymer_deploy', vmFileName, args, environmentOverrides); |
+ 'polymer_deploy', dartVmBinaryFileName, args, environmentOverrides); |
} |
String createGeneratedTestDirectoryHelper( |
@@ -1814,13 +1739,6 @@ class AnalyzeLibraryTestSuite extends DartcCompilationTestSuite { |
!filename.contains("_internal/lib"); |
} |
- AnalysisCommand makeAnalysisCommand(TestInformation info, |
- List<String> arguments) { |
- return CommandBuilder.instance.getAnalysisCommand( |
- configuration['compiler'], dartShellFileName, arguments, |
- environmentOverrides, flavor: configuration['compiler']); |
- } |
- |
bool get listRecursively => true; |
} |
@@ -1885,7 +1803,7 @@ class PkgBuildTestSuite extends TestSuite { |
bool containsBuildDartFile = |
fileExists(directoryPath.append('build.dart')); |
if (containsBuildDartFile) { |
- var dartBinary = new File(dartPath).absolute.path; |
+ var dartBinary = new File(dartVmBinaryFileName).absolute.path; |
commands.add(CommandBuilder.instance.getProcessCommand( |
"custom_build", dartBinary, ['build.dart'], null, |
@@ -2060,8 +1978,8 @@ class TestUtils { |
} |
static void ensureExists(String filename, Map configuration) { |
- if (!configuration['list'] && !(new File(filename).existsSync())) { |
- throw "Executable '$filename' does not exist"; |
+ if (!configuration['list'] && !existsCache.doesFileExist(filename)) { |
+ throw "'$filename' does not exist"; |
} |
} |