| Index: dart/tools/testing/dart/runtime_configuration.dart | 
| diff --git a/dart/tools/testing/dart/runtime_configuration.dart b/dart/tools/testing/dart/runtime_configuration.dart | 
| index 383ad3f8786c335f7d3d95190e5a7851849b8145..fd30dd9931b165908781672498d332ab5ec5a407 100644 | 
| --- a/dart/tools/testing/dart/runtime_configuration.dart | 
| +++ b/dart/tools/testing/dart/runtime_configuration.dart | 
| @@ -2,7 +2,19 @@ | 
| // 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 compiler_configuration; | 
| +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 { | 
| @@ -16,20 +28,31 @@ class RuntimeConfiguration { | 
| case 'DartiumOnAndroid': | 
| case 'chrome': | 
| case 'chromeOnAndroid': | 
| -      case 'd8': | 
| case 'dartium': | 
| case 'ff': | 
| case 'firefox': | 
| case 'ie10': | 
| case 'ie9': | 
| -      case 'jsshell': | 
| -      case 'none': | 
| case 'opera': | 
| case 'safari': | 
| +        // 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 RuntimeConfiguration._subclass(); | 
| +        return new StandaloneDartRuntimeConfiguration(); | 
| + | 
| case 'drt': | 
| return new DrtRuntimeConfiguration(); | 
| + | 
| default: | 
| throw "Unknown runtime '$runtime'"; | 
| } | 
| @@ -41,6 +64,95 @@ class RuntimeConfiguration { | 
| 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'"; | 
| +  } | 
| +} | 
| + | 
| +/// 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)]; | 
| +  } | 
| +} | 
| + | 
| +/// 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)]; | 
| +  } | 
| +} | 
| + | 
| +/// 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': | 
| @@ -57,16 +169,50 @@ class RuntimeConfiguration { | 
| } | 
| } | 
|  | 
| -class DrtRuntimeConfiguration extends RuntimeConfiguration { | 
| -  DrtRuntimeConfiguration() | 
| -      : super._subclass(); | 
| - | 
| +/// 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'"; | 
| +  } | 
| +} | 
|  |