blob: 1fbf54dc409b23cc2515ef5894eafe2213a47507 [file] [log] [blame]
// Copyright (c) 2014, 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.
library runtime_configuration;
import 'compiler_configuration.dart' show
CommandArtifact;
// TODO(ahe): Remove this import, we can precompute all the values required
// from TestSuite once the refactoring is complete.
import 'test_suite.dart' show
TestSuite;
import 'test_runner.dart' show
Command,
CommandBuilder;
// TODO(ahe): I expect this class will become abstract very soon.
class RuntimeConfiguration {
// TODO(ahe): Remove this constructor and move the switch to
// test_options.dart. We probably want to store an instance of
// [RuntimeConfiguration] in [configuration] there.
factory RuntimeConfiguration(Map configuration) {
String runtime = configuration['runtime'];
switch (runtime) {
case 'ContentShellOnAndroid':
case 'DartiumOnAndroid':
case 'chrome':
case 'chromeOnAndroid':
case 'dartium':
case 'ff':
case 'firefox':
case 'ie11':
case 'ie10':
case 'ie9':
case 'opera':
case 'safari':
case 'safarimobilesim':
// TODO(ahe): Replace this with one or more browser runtimes.
return new DummyRuntimeConfiguration();
case 'jsshell':
return new JsshellRuntimeConfiguration();
case 'd8':
return new D8RuntimeConfiguration();
case 'none':
return new NoneRuntimeConfiguration();
case 'vm':
return new StandaloneDartRuntimeConfiguration();
case 'drt':
return new DrtRuntimeConfiguration();
default:
throw "Unknown runtime '$runtime'";
}
}
RuntimeConfiguration._subclass();
int computeTimeoutMultiplier({
bool isDebug: false,
bool isChecked: false,
String arch}) {
return 1;
}
List<Command> computeRuntimeCommands(
TestSuite suite,
CommandBuilder commandBuilder,
CommandArtifact artifact,
List<String> arguments,
Map<String, String> environmentOverrides) {
// TODO(ahe): Make this method abstract.
throw "Unimplemented runtime '$runtimeType'";
}
List<String> dart2jsPreambles(Uri preambleDir) => [];
}
/// The 'none' runtime configuration.
class NoneRuntimeConfiguration extends RuntimeConfiguration {
NoneRuntimeConfiguration()
: super._subclass();
List<Command> computeRuntimeCommands(
TestSuite suite,
CommandBuilder commandBuilder,
CommandArtifact artifact,
List<String> arguments,
Map<String, String> environmentOverrides) {
return <Command>[];
}
}
class CommandLineJavaScriptRuntime extends RuntimeConfiguration {
final String moniker;
CommandLineJavaScriptRuntime(this.moniker)
: super._subclass();
void checkArtifact(CommandArtifact artifact) {
String type = artifact.mimeType;
if (type != 'application/javascript') {
throw "Runtime '$moniker' cannot run files of type '$type'.";
}
}
}
/// Chrome/V8-based development shell (d8).
class D8RuntimeConfiguration extends CommandLineJavaScriptRuntime {
D8RuntimeConfiguration()
: super('d8');
List<Command> computeRuntimeCommands(
TestSuite suite,
CommandBuilder commandBuilder,
CommandArtifact artifact,
List<String> arguments,
Map<String, String> environmentOverrides) {
// TODO(ahe): Avoid duplication of this method between d8 and jsshell.
checkArtifact(artifact);
return <Command>[
commandBuilder.getJSCommandlineCommand(
moniker, suite.d8FileName, arguments, environmentOverrides)];
}
List<String> dart2jsPreambles(Uri preambleDir) {
return [preambleDir.resolve('d8.js').toFilePath()];
}
}
/// Firefox/SpiderMonkey-based development shell (jsshell).
class JsshellRuntimeConfiguration extends CommandLineJavaScriptRuntime {
JsshellRuntimeConfiguration()
: super('jsshell');
List<Command> computeRuntimeCommands(
TestSuite suite,
CommandBuilder commandBuilder,
CommandArtifact artifact,
List<String> arguments,
Map<String, String> environmentOverrides) {
checkArtifact(artifact);
return <Command>[
commandBuilder.getJSCommandlineCommand(
moniker, suite.jsShellFileName, arguments, environmentOverrides)];
}
List<String> dart2jsPreambles(Uri preambleDir) {
return ['-f', preambleDir.resolve('jsshell.js').toFilePath(), '-f'];
}
}
/// Common runtime configuration for runtimes based on the Dart VM.
class DartVmRuntimeConfiguration extends RuntimeConfiguration {
DartVmRuntimeConfiguration()
: super._subclass();
int computeTimeoutMultiplier({
bool isDebug: false,
bool isChecked: false,
String arch}) {
int multiplier = 1;
switch (arch) {
case 'simarm':
case 'arm':
case' simarmv5te':
case 'armv5te':
case 'simmips':
case 'mips':
case 'simarm64':
multiplier *= 4;
break;
}
if (isDebug) {
multiplier *= 2;
}
return multiplier;
}
}
/// Runtime configuration for Content Shell. We previously used a similar
/// program named Dump Render Tree, hence the name.
class DrtRuntimeConfiguration extends DartVmRuntimeConfiguration {
int computeTimeoutMultiplier({
bool isDebug: false,
bool isChecked: false,
String arch}) {
return 4 // Allow additional time for browser testing to run.
// TODO(ahe): We might need to distinquish between DRT for running
// JavaScript and Dart code. I'm not convinced the inherited timeout
// multiplier is relevant for JavaScript.
* super.computeTimeoutMultiplier(
isDebug: isDebug, isChecked: isChecked);
}
}
/// The standalone Dart VM binary, "dart" or "dart.exe".
class StandaloneDartRuntimeConfiguration extends DartVmRuntimeConfiguration {
List<Command> computeRuntimeCommands(
TestSuite suite,
CommandBuilder commandBuilder,
CommandArtifact artifact,
List<String> arguments,
Map<String, String> environmentOverrides) {
String script = artifact.filename;
String type = artifact.mimeType;
if (script != null && type != 'application/dart') {
throw "Dart VM cannot run files of type '$type'.";
}
return <Command>[commandBuilder.getVmCommand(
suite.dartVmBinaryFileName, arguments, environmentOverrides)];
}
}
/// Temporary runtime configuration for browser runtimes that haven't been
/// migrated yet.
// TODO(ahe): Remove this class.
class DummyRuntimeConfiguration extends DartVmRuntimeConfiguration {
List<Command> computeRuntimeCommands(
TestSuite suite,
CommandBuilder commandBuilder,
CommandArtifact artifact,
List<String> arguments,
Map<String, String> environmentOverrides) {
throw "Unimplemented runtime '$runtimeType'";
}
}