| Index: tools/testing/dart/test_runner.dart
 | 
| diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
 | 
| index ac387a5b485d125734e1438b592ae31abf4b5469..0d641366b737a25db8168df207f5e5105243306f 100644
 | 
| --- a/tools/testing/dart/test_runner.dart
 | 
| +++ b/tools/testing/dart/test_runner.dart
 | 
| @@ -39,10 +39,14 @@ typedef void EnqueueMoreWork(ProcessQueue queue);
 | 
|  
 | 
|  // Some IO tests use these variables and get confused if the host environment
 | 
|  // variables are inherited so they are excluded.
 | 
| -const List<String> EXCLUDED_ENVIRONMENT_VARIABLES =
 | 
| -    const ['http_proxy', 'https_proxy', 'no_proxy',
 | 
| -           'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY'];
 | 
| -
 | 
| +const List<String> EXCLUDED_ENVIRONMENT_VARIABLES = const [
 | 
| +  'http_proxy',
 | 
| +  'https_proxy',
 | 
| +  'no_proxy',
 | 
| +  'HTTP_PROXY',
 | 
| +  'HTTPS_PROXY',
 | 
| +  'NO_PROXY'
 | 
| +];
 | 
|  
 | 
|  /** A command executed as a step in a test case. */
 | 
|  class Command {
 | 
| @@ -70,7 +74,8 @@ class Command {
 | 
|      return _cachedHashCode;
 | 
|    }
 | 
|  
 | 
| -  operator ==(other) => identical(this, other) ||
 | 
| +  operator ==(other) =>
 | 
| +      identical(this, other) ||
 | 
|        (runtimeType == other.runtimeType && _equal(other));
 | 
|  
 | 
|    void _buildHashCode(HashCodeBuilder builder) {
 | 
| @@ -78,8 +83,7 @@ class Command {
 | 
|    }
 | 
|  
 | 
|    bool _equal(Command other) =>
 | 
| -      hashCode == other.hashCode &&
 | 
| -      displayName == other.displayName;
 | 
| +      hashCode == other.hashCode && displayName == other.displayName;
 | 
|  
 | 
|    String toString() => reproductionCommand;
 | 
|  
 | 
| @@ -99,10 +103,8 @@ class ProcessCommand extends Command {
 | 
|    /** Working directory for the command */
 | 
|    final String workingDirectory;
 | 
|  
 | 
| -  ProcessCommand._(String displayName, this.executable,
 | 
| -                   this.arguments,
 | 
| -                   [this.environmentOverrides = null,
 | 
| -                    this.workingDirectory = null])
 | 
| +  ProcessCommand._(String displayName, this.executable, this.arguments,
 | 
| +      [this.environmentOverrides = null, this.workingDirectory = null])
 | 
|        : super._(displayName) {
 | 
|      if (io.Platform.operatingSystem == 'windows') {
 | 
|        // Windows can't handle the first command if it is a .bat file or the like
 | 
| @@ -130,11 +132,12 @@ class ProcessCommand extends Command {
 | 
|    String get reproductionCommand {
 | 
|      var env = new StringBuffer();
 | 
|      environmentOverrides.forEach((key, value) =>
 | 
| -        (io.Platform.operatingSystem == 'windows') ?
 | 
| -            env.write('set $key=${escapeCommandLineArgument(value)} & ') :
 | 
| -            env.write('$key=${escapeCommandLineArgument(value)} '));
 | 
| +        (io.Platform.operatingSystem == 'windows')
 | 
| +            ? env.write('set $key=${escapeCommandLineArgument(value)} & ')
 | 
| +            : env.write('$key=${escapeCommandLineArgument(value)} '));
 | 
|      var command = ([executable]..addAll(arguments))
 | 
| -        .map(escapeCommandLineArgument).join(' ');
 | 
| +        .map(escapeCommandLineArgument)
 | 
| +        .join(' ');
 | 
|      if (workingDirectory != null) {
 | 
|        command = "$command (working directory: $workingDirectory)";
 | 
|      }
 | 
| @@ -149,13 +152,14 @@ class CompilationCommand extends ProcessCommand {
 | 
|    final bool _neverSkipCompilation;
 | 
|    final List<Uri> _bootstrapDependencies;
 | 
|  
 | 
| -  CompilationCommand._(String displayName,
 | 
| -                       this._outputFile,
 | 
| -                       this._neverSkipCompilation,
 | 
| -                       this._bootstrapDependencies,
 | 
| -                       String executable,
 | 
| -                       List<String> arguments,
 | 
| -                       Map<String, String> environmentOverrides)
 | 
| +  CompilationCommand._(
 | 
| +      String displayName,
 | 
| +      this._outputFile,
 | 
| +      this._neverSkipCompilation,
 | 
| +      this._bootstrapDependencies,
 | 
| +      String executable,
 | 
| +      List<String> arguments,
 | 
| +      Map<String, String> environmentOverrides)
 | 
|        : super._(displayName, executable, arguments, environmentOverrides);
 | 
|  
 | 
|    Future<bool> get outputIsUpToDate {
 | 
| @@ -181,8 +185,8 @@ class CompilationCommand extends ProcessCommand {
 | 
|      return readDepsFile("$_outputFile.deps").then((dependencies) {
 | 
|        if (dependencies != null) {
 | 
|          dependencies.addAll(_bootstrapDependencies);
 | 
| -        var jsOutputLastModified = TestUtils.lastModifiedCache.getLastModified(
 | 
| -            new Uri(scheme: 'file', path: _outputFile));
 | 
| +        var jsOutputLastModified = TestUtils.lastModifiedCache
 | 
| +            .getLastModified(new Uri(scheme: 'file', path: _outputFile));
 | 
|          if (jsOutputLastModified != null) {
 | 
|            for (var dependency in dependencies) {
 | 
|              var dependencyLastModified =
 | 
| @@ -220,37 +224,36 @@ class AddFlagsKey {
 | 
|    AddFlagsKey(this.flags, this.env);
 | 
|    // Just use object identity for environment map
 | 
|    bool operator ==(other) =>
 | 
| -    other is AddFlagsKey && flags == other.flags && env == other.env;
 | 
| +      other is AddFlagsKey && flags == other.flags && env == other.env;
 | 
|    int get hashCode => flags.hashCode ^ env.hashCode;
 | 
|  }
 | 
|  
 | 
|  class ContentShellCommand extends ProcessCommand {
 | 
| -  ContentShellCommand._(String executable,
 | 
| -                        String htmlFile,
 | 
| -                        List<String> options,
 | 
| -                        List<String> dartFlags,
 | 
| -                        Map<String, String> environmentOverrides)
 | 
| -      : super._("content_shell",
 | 
| -               executable,
 | 
| -               _getArguments(options, htmlFile),
 | 
| -               _getEnvironment(environmentOverrides, dartFlags));
 | 
| +  ContentShellCommand._(
 | 
| +      String executable,
 | 
| +      String htmlFile,
 | 
| +      List<String> options,
 | 
| +      List<String> dartFlags,
 | 
| +      Map<String, String> environmentOverrides)
 | 
| +      : super._("content_shell", executable, _getArguments(options, htmlFile),
 | 
| +            _getEnvironment(environmentOverrides, dartFlags));
 | 
|  
 | 
|    // Cache the modified environments in a map from the old environment and
 | 
|    // the string of Dart flags to the new environment.  Avoid creating new
 | 
|    // environment object for each command object.
 | 
| -  static Map<AddFlagsKey, Map> environments =
 | 
| -      new Map<AddFlagsKey, Map>();
 | 
| +  static Map<AddFlagsKey, Map> environments = new Map<AddFlagsKey, Map>();
 | 
|  
 | 
|    static Map _getEnvironment(Map env, List<String> dartFlags) {
 | 
|      var needDartFlags = dartFlags != null && dartFlags.length > 0;
 | 
|      if (needDartFlags) {
 | 
|        if (env == null) {
 | 
| -        env = const { };
 | 
| +        env = const {};
 | 
|        }
 | 
|        var flags = dartFlags.join(' ');
 | 
| -      return environments.putIfAbsent(new AddFlagsKey(flags, env),
 | 
| +      return environments.putIfAbsent(
 | 
| +          new AddFlagsKey(flags, env),
 | 
|            () => new Map.from(env)
 | 
| -              ..addAll({'DART_FLAGS': flags, 'DART_FORWARDING_PRINT': '1'}));
 | 
| +            ..addAll({'DART_FLAGS': flags, 'DART_FORWARDING_PRINT': '1'}));
 | 
|      }
 | 
|      return env;
 | 
|    }
 | 
| @@ -270,11 +273,10 @@ class BrowserTestCommand extends Command {
 | 
|    final Map configuration;
 | 
|    final bool retry;
 | 
|  
 | 
| -  BrowserTestCommand._(String _browser,
 | 
| -                       this.url,
 | 
| -                       this.configuration,
 | 
| -                       this.retry)
 | 
| -      : super._(_browser), browser = _browser;
 | 
| +  BrowserTestCommand._(
 | 
| +      String _browser, this.url, this.configuration, this.retry)
 | 
| +      : super._(_browser),
 | 
| +        browser = _browser;
 | 
|  
 | 
|    void _buildHashCode(HashCodeBuilder builder) {
 | 
|      super._buildHashCode(builder);
 | 
| @@ -292,10 +294,12 @@ class BrowserTestCommand extends Command {
 | 
|        retry == other.retry;
 | 
|  
 | 
|    String get reproductionCommand {
 | 
| -    var parts = [io.Platform.resolvedExecutable,
 | 
| -                'tools/testing/dart/launch_browser.dart',
 | 
| -                browser,
 | 
| -                url];
 | 
| +    var parts = [
 | 
| +      io.Platform.resolvedExecutable,
 | 
| +      'tools/testing/dart/launch_browser.dart',
 | 
| +      browser,
 | 
| +      url
 | 
| +    ];
 | 
|      return parts.map(escapeCommandLineArgument).join(' ');
 | 
|    }
 | 
|  
 | 
| @@ -304,11 +308,8 @@ class BrowserTestCommand extends Command {
 | 
|  
 | 
|  class BrowserHtmlTestCommand extends BrowserTestCommand {
 | 
|    List<String> expectedMessages;
 | 
| -  BrowserHtmlTestCommand._(String browser,
 | 
| -                           String url,
 | 
| -                           Map configuration,
 | 
| -                           this.expectedMessages,
 | 
| -                           bool retry)
 | 
| +  BrowserHtmlTestCommand._(String browser, String url, Map configuration,
 | 
| +      this.expectedMessages, bool retry)
 | 
|        : super._(browser, url, configuration, retry);
 | 
|  
 | 
|    void _buildHashCode(HashCodeBuilder builder) {
 | 
| @@ -324,11 +325,8 @@ class BrowserHtmlTestCommand extends BrowserTestCommand {
 | 
|  class AnalysisCommand extends ProcessCommand {
 | 
|    final String flavor;
 | 
|  
 | 
| -  AnalysisCommand._(this.flavor,
 | 
| -                    String displayName,
 | 
| -                    String executable,
 | 
| -                    List<String> arguments,
 | 
| -                    Map<String, String> environmentOverrides)
 | 
| +  AnalysisCommand._(this.flavor, String displayName, String executable,
 | 
| +      List<String> arguments, Map<String, String> environmentOverrides)
 | 
|        : super._(displayName, executable, arguments, environmentOverrides);
 | 
|  
 | 
|    void _buildHashCode(HashCodeBuilder builder) {
 | 
| @@ -337,40 +335,34 @@ class AnalysisCommand extends ProcessCommand {
 | 
|    }
 | 
|  
 | 
|    bool _equal(AnalysisCommand other) =>
 | 
| -      super._equal(other) &&
 | 
| -      flavor == other.flavor;
 | 
| +      super._equal(other) && flavor == other.flavor;
 | 
|  }
 | 
|  
 | 
|  class VmCommand extends ProcessCommand {
 | 
| -  VmCommand._(String executable,
 | 
| -              List<String> arguments,
 | 
| -              Map<String,String> environmentOverrides)
 | 
| +  VmCommand._(String executable, List<String> arguments,
 | 
| +      Map<String, String> environmentOverrides)
 | 
|        : super._("vm", executable, arguments, environmentOverrides);
 | 
|  }
 | 
|  
 | 
|  class JSCommandlineCommand extends ProcessCommand {
 | 
| -  JSCommandlineCommand._(String displayName,
 | 
| -                         String executable,
 | 
| -                         List<String> arguments,
 | 
| -                         [Map<String, String> environmentOverrides = null])
 | 
| -      : super._(displayName,
 | 
| -                executable,
 | 
| -                arguments,
 | 
| -                environmentOverrides);
 | 
| +  JSCommandlineCommand._(
 | 
| +      String displayName, String executable, List<String> arguments,
 | 
| +      [Map<String, String> environmentOverrides = null])
 | 
| +      : super._(displayName, executable, arguments, environmentOverrides);
 | 
|  }
 | 
|  
 | 
|  class PubCommand extends ProcessCommand {
 | 
|    final String command;
 | 
|  
 | 
| -  PubCommand._(String pubCommand,
 | 
| -               String pubExecutable,
 | 
| -               String pubspecYamlDirectory,
 | 
| -               String pubCacheDirectory)
 | 
| -      : super._('pub_$pubCommand',
 | 
| -                new io.File(pubExecutable).absolute.path,
 | 
| -                [pubCommand],
 | 
| -                {'PUB_CACHE' : pubCacheDirectory},
 | 
| -                pubspecYamlDirectory), command = pubCommand;
 | 
| +  PubCommand._(String pubCommand, String pubExecutable,
 | 
| +      String pubspecYamlDirectory, String pubCacheDirectory)
 | 
| +      : super._(
 | 
| +            'pub_$pubCommand',
 | 
| +            new io.File(pubExecutable).absolute.path,
 | 
| +            [pubCommand],
 | 
| +            {'PUB_CACHE': pubCacheDirectory},
 | 
| +            pubspecYamlDirectory),
 | 
| +        command = pubCommand;
 | 
|  
 | 
|    void _buildHashCode(HashCodeBuilder builder) {
 | 
|      super._buildHashCode(builder);
 | 
| @@ -378,8 +370,7 @@ class PubCommand extends ProcessCommand {
 | 
|    }
 | 
|  
 | 
|    bool _equal(PubCommand other) =>
 | 
| -      super._equal(other) &&
 | 
| -      command == other.command;
 | 
| +      super._equal(other) && command == other.command;
 | 
|  }
 | 
|  
 | 
|  /* [ScriptCommand]s are executed by dart code. */
 | 
| @@ -394,7 +385,7 @@ class CleanDirectoryCopyCommand extends ScriptCommand {
 | 
|    final String _destinationDirectory;
 | 
|  
 | 
|    CleanDirectoryCopyCommand._(this._sourceDirectory, this._destinationDirectory)
 | 
| -    : super._('dir_copy');
 | 
| +      : super._('dir_copy');
 | 
|  
 | 
|    String get reproductionCommand =>
 | 
|        "Copying '$_sourceDirectory' to '$_destinationDirectory'.";
 | 
| @@ -440,10 +431,9 @@ class ModifyPubspecYamlCommand extends ScriptCommand {
 | 
|    String _destinationFile;
 | 
|    Map<String, Map> _dependencyOverrides;
 | 
|  
 | 
| -  ModifyPubspecYamlCommand._(this._pubspecYamlFile,
 | 
| -                             this._destinationFile,
 | 
| -                             this._dependencyOverrides)
 | 
| -    : super._("modify_pubspec") {
 | 
| +  ModifyPubspecYamlCommand._(
 | 
| +      this._pubspecYamlFile, this._destinationFile, this._dependencyOverrides)
 | 
| +      : super._("modify_pubspec") {
 | 
|      assert(_pubspecYamlFile.endsWith("pubspec.yaml"));
 | 
|      assert(_destinationFile.endsWith("pubspec.yaml"));
 | 
|    }
 | 
| @@ -455,9 +445,9 @@ class ModifyPubspecYamlCommand extends ScriptCommand {
 | 
|    Future<ScriptCommandOutputImpl> run() {
 | 
|      var watch = new Stopwatch()..start();
 | 
|  
 | 
| -    var pubspecLockFile =
 | 
| -        _destinationFile.substring(0, _destinationFile.length - ".yaml".length)
 | 
| -        + ".lock";
 | 
| +    var pubspecLockFile = _destinationFile.substring(
 | 
| +            0, _destinationFile.length - ".yaml".length) +
 | 
| +        ".lock";
 | 
|  
 | 
|      var file = new io.File(_pubspecYamlFile);
 | 
|      var destinationFile = new io.File(_destinationFile);
 | 
| @@ -465,15 +455,14 @@ class ModifyPubspecYamlCommand extends ScriptCommand {
 | 
|      return file.readAsString().then((String yamlString) {
 | 
|        var dependencyOverrideSection = new StringBuffer();
 | 
|        if (_dependencyOverrides.isNotEmpty) {
 | 
| -        dependencyOverrideSection.write(
 | 
| -            "\n"
 | 
| +        dependencyOverrideSection.write("\n"
 | 
|              "# This section was autogenerated by test.py!\n"
 | 
|              "dependency_overrides:\n");
 | 
|          _dependencyOverrides.forEach((String packageName, Map override) {
 | 
|            dependencyOverrideSection.write("  $packageName:\n");
 | 
|            override.forEach((overrideKey, overrideValue) {
 | 
| -            dependencyOverrideSection.write(
 | 
| -                "    $overrideKey: $overrideValue\n");
 | 
| +            dependencyOverrideSection
 | 
| +                .write("    $overrideKey: $overrideValue\n");
 | 
|            });
 | 
|          });
 | 
|        }
 | 
| @@ -529,9 +518,9 @@ class MakeSymlinkCommand extends ScriptCommand {
 | 
|        }
 | 
|        var link = new io.Link(_link);
 | 
|  
 | 
| -      return link.exists()
 | 
| -          .then((bool exists) { if (exists) return link.delete(); })
 | 
| -          .then((_) => link.create(_target));
 | 
| +      return link.exists().then((bool exists) {
 | 
| +        if (exists) return link.delete();
 | 
| +      }).then((_) => link.create(_target));
 | 
|      }).then((_) {
 | 
|        return new ScriptCommandOutputImpl(
 | 
|            this, Expectation.PASS, "", watch.elapsed);
 | 
| @@ -548,9 +537,7 @@ class MakeSymlinkCommand extends ScriptCommand {
 | 
|    }
 | 
|  
 | 
|    bool _equal(MakeSymlinkCommand other) =>
 | 
| -      super._equal(other) &&
 | 
| -      _link == other._link &&
 | 
| -      _target == other._target;
 | 
| +      super._equal(other) && _link == other._link && _target == other._target;
 | 
|  }
 | 
|  
 | 
|  class CommandBuilder {
 | 
| @@ -566,45 +553,46 @@ class CommandBuilder {
 | 
|      _cleared = true;
 | 
|    }
 | 
|  
 | 
| -  ContentShellCommand getContentShellCommand(String executable,
 | 
| -                                             String htmlFile,
 | 
| -                                             List<String> options,
 | 
| -                                             List<String> dartFlags,
 | 
| -                                             Map<String, String> environment) {
 | 
| +  ContentShellCommand getContentShellCommand(
 | 
| +      String executable,
 | 
| +      String htmlFile,
 | 
| +      List<String> options,
 | 
| +      List<String> dartFlags,
 | 
| +      Map<String, String> environment) {
 | 
|      ContentShellCommand command = new ContentShellCommand._(
 | 
|          executable, htmlFile, options, dartFlags, environment);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| -  BrowserTestCommand getBrowserTestCommand(String browser,
 | 
| -                                           String url,
 | 
| -                                           Map configuration,
 | 
| -                                           bool retry) {
 | 
| +  BrowserTestCommand getBrowserTestCommand(
 | 
| +      String browser, String url, Map configuration, bool retry) {
 | 
|      var command = new BrowserTestCommand._(browser, url, configuration, retry);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| -  BrowserHtmlTestCommand getBrowserHtmlTestCommand(String browser,
 | 
| -                                               String url,
 | 
| -                                               Map configuration,
 | 
| -                                               List<String> expectedMessages,
 | 
| -                                               bool retry) {
 | 
| +  BrowserHtmlTestCommand getBrowserHtmlTestCommand(String browser, String url,
 | 
| +      Map configuration, List<String> expectedMessages, bool retry) {
 | 
|      var command = new BrowserHtmlTestCommand._(
 | 
|          browser, url, configuration, expectedMessages, retry);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| -  CompilationCommand getCompilationCommand(String displayName,
 | 
| -                                           outputFile,
 | 
| -                                           neverSkipCompilation,
 | 
| -                                           List<Uri> bootstrapDependencies,
 | 
| -                                           String executable,
 | 
| -                                           List<String> arguments,
 | 
| -                                           Map<String, String> environment) {
 | 
| -    var command =
 | 
| -        new CompilationCommand._(
 | 
| -            displayName, outputFile, neverSkipCompilation,
 | 
| -            bootstrapDependencies, executable, arguments, environment);
 | 
| +  CompilationCommand getCompilationCommand(
 | 
| +      String displayName,
 | 
| +      outputFile,
 | 
| +      neverSkipCompilation,
 | 
| +      List<Uri> bootstrapDependencies,
 | 
| +      String executable,
 | 
| +      List<String> arguments,
 | 
| +      Map<String, String> environment) {
 | 
| +    var command = new CompilationCommand._(
 | 
| +        displayName,
 | 
| +        outputFile,
 | 
| +        neverSkipCompilation,
 | 
| +        bootstrapDependencies,
 | 
| +        executable,
 | 
| +        arguments,
 | 
| +        environment);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| @@ -616,41 +604,36 @@ class CommandBuilder {
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| -  VmCommand getVmCommand(String executable,
 | 
| -                         List<String> arguments,
 | 
| -                         Map<String, String> environmentOverrides) {
 | 
| +  VmCommand getVmCommand(String executable, List<String> arguments,
 | 
| +      Map<String, String> environmentOverrides) {
 | 
|      var command = new VmCommand._(executable, arguments, environmentOverrides);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
|    Command getJSCommandlineCommand(String displayName, executable, arguments,
 | 
| -                                  [environment = null]) {
 | 
| -    var command = new JSCommandlineCommand._(displayName, executable, arguments,
 | 
| -                                             environment);
 | 
| +      [environment = null]) {
 | 
| +    var command = new JSCommandlineCommand._(
 | 
| +        displayName, executable, arguments, environment);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
|    Command getProcessCommand(String displayName, executable, arguments,
 | 
| -                     [environment = null, workingDirectory = null]) {
 | 
| -    var command = new ProcessCommand._(displayName, executable, arguments,
 | 
| -                                       environment, workingDirectory);
 | 
| +      [environment = null, workingDirectory = null]) {
 | 
| +    var command = new ProcessCommand._(
 | 
| +        displayName, executable, arguments, environment, workingDirectory);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
|    Command getCopyCommand(String sourceDirectory, String destinationDirectory) {
 | 
| -    var command = new CleanDirectoryCopyCommand._(sourceDirectory,
 | 
| -                                                  destinationDirectory);
 | 
| +    var command =
 | 
| +        new CleanDirectoryCopyCommand._(sourceDirectory, destinationDirectory);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| -  Command getPubCommand(String pubCommand,
 | 
| -                        String pubExecutable,
 | 
| -                        String pubspecYamlDirectory,
 | 
| -                        String pubCacheDirectory) {
 | 
| -    var command = new PubCommand._(pubCommand,
 | 
| -                                   pubExecutable,
 | 
| -                                   pubspecYamlDirectory,
 | 
| -                                   pubCacheDirectory);
 | 
| +  Command getPubCommand(String pubCommand, String pubExecutable,
 | 
| +      String pubspecYamlDirectory, String pubCacheDirectory) {
 | 
| +    var command = new PubCommand._(
 | 
| +        pubCommand, pubExecutable, pubspecYamlDirectory, pubCacheDirectory);
 | 
|      return _getUniqueCommand(command);
 | 
|    }
 | 
|  
 | 
| @@ -659,7 +642,7 @@ class CommandBuilder {
 | 
|    }
 | 
|  
 | 
|    Command getModifyPubspecCommand(String pubspecYamlFile, Map depsOverrides,
 | 
| -                                  {String destinationFile: null}) {
 | 
| +      {String destinationFile: null}) {
 | 
|      if (destinationFile == null) destinationFile = pubspecYamlFile;
 | 
|      return _getUniqueCommand(new ModifyPubspecYamlCommand._(
 | 
|          pubspecYamlFile, destinationFile, depsOverrides));
 | 
| @@ -716,7 +699,8 @@ class TestCase extends UniqueObject {
 | 
|     * compiling multiple sources that are run in isolation.
 | 
|     */
 | 
|    List<Command> commands;
 | 
| -  Map<Command, CommandOutput> commandOutputs = new Map<Command,CommandOutput>();
 | 
| +  Map<Command, CommandOutput> commandOutputs =
 | 
| +      new Map<Command, CommandOutput>();
 | 
|  
 | 
|    Map configuration;
 | 
|    String displayName;
 | 
| @@ -724,19 +708,16 @@ class TestCase extends UniqueObject {
 | 
|    int hash = 0;
 | 
|    Set<Expectation> expectedOutcomes;
 | 
|  
 | 
| -  TestCase(this.displayName,
 | 
| -           this.commands,
 | 
| -           this.configuration,
 | 
| -           this.expectedOutcomes,
 | 
| -           {isNegative: false,
 | 
| -            TestInformation info: null}) {
 | 
| +  TestCase(this.displayName, this.commands, this.configuration,
 | 
| +      this.expectedOutcomes,
 | 
| +      {isNegative: false, TestInformation info: null}) {
 | 
|      if (isNegative || displayName.contains("negative_test")) {
 | 
|        _expectations |= IS_NEGATIVE;
 | 
|      }
 | 
|      if (info != null) {
 | 
|        _setExpectations(info);
 | 
| -      hash = info.originTestPath.relativeTo(TestUtils.dartDir)
 | 
| -          .toString().hashCode;
 | 
| +      hash =
 | 
| +          info.originTestPath.relativeTo(TestUtils.dartDir).toString().hashCode;
 | 
|      }
 | 
|    }
 | 
|  
 | 
| @@ -777,8 +758,8 @@ class TestCase extends UniqueObject {
 | 
|    CommandOutput get lastCommandOutput {
 | 
|      if (commandOutputs.length == 0) {
 | 
|        throw new Exception("CommandOutputs is empty, maybe no command was run? ("
 | 
| -                          "displayName: '$displayName', "
 | 
| -                          "configurationString: '$configurationString')");
 | 
| +          "displayName: '$displayName', "
 | 
| +          "configurationString: '$configurationString')");
 | 
|      }
 | 
|      return commandOutputs[commands[commandOutputs.length - 1]];
 | 
|    }
 | 
| @@ -786,8 +767,8 @@ class TestCase extends UniqueObject {
 | 
|    Command get lastCommandExecuted {
 | 
|      if (commandOutputs.length == 0) {
 | 
|        throw new Exception("CommandOutputs is empty, maybe no command was run? ("
 | 
| -                          "displayName: '$displayName', "
 | 
| -                          "configurationString: '$configurationString')");
 | 
| +          "displayName: '$displayName', "
 | 
| +          "configurationString: '$configurationString')");
 | 
|      }
 | 
|      return commands[commandOutputs.length - 1];
 | 
|    }
 | 
| @@ -815,34 +796,34 @@ class TestCase extends UniqueObject {
 | 
|    }
 | 
|  
 | 
|    bool get isFlaky {
 | 
| -      if (expectedOutcomes.contains(Expectation.SKIP) ||
 | 
| -          expectedOutcomes.contains(Expectation.SKIP_BY_DESIGN)) {
 | 
| -        return false;
 | 
| -      }
 | 
| +    if (expectedOutcomes.contains(Expectation.SKIP) ||
 | 
| +        expectedOutcomes.contains(Expectation.SKIP_BY_DESIGN)) {
 | 
| +      return false;
 | 
| +    }
 | 
|  
 | 
| -      return expectedOutcomes
 | 
| -        .where((expectation) => !expectation.isMetaExpectation).length > 1;
 | 
| +    return expectedOutcomes
 | 
| +            .where((expectation) => !expectation.isMetaExpectation)
 | 
| +            .length >
 | 
| +        1;
 | 
|    }
 | 
|  
 | 
|    bool get isFinished {
 | 
|      return commandOutputs.length > 0 &&
 | 
|          (!lastCommandOutput.successful ||
 | 
| -         commands.length == commandOutputs.length);
 | 
| +            commands.length == commandOutputs.length);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /**
 | 
|   * BrowserTestCase has an extra compilation command that is run in a separate
 | 
|   * process, before the regular test is run as in the base class [TestCase].
 | 
|   * If the compilation command fails, then the rest of the test is not run.
 | 
|   */
 | 
|  class BrowserTestCase extends TestCase {
 | 
| -
 | 
| -  BrowserTestCase(displayName, commands, configuration,
 | 
| -                  expectedOutcomes, info, isNegative, this._testingUrl)
 | 
| -    : super(displayName, commands, configuration,
 | 
| -            expectedOutcomes, isNegative: isNegative, info: info);
 | 
| +  BrowserTestCase(displayName, commands, configuration, expectedOutcomes, info,
 | 
| +      isNegative, this._testingUrl)
 | 
| +      : super(displayName, commands, configuration, expectedOutcomes,
 | 
| +            isNegative: isNegative, info: info);
 | 
|  
 | 
|    String _testingUrl;
 | 
|  
 | 
| @@ -858,14 +839,13 @@ class UnittestSuiteMessagesMixin {
 | 
|      return testOutput.contains("unittest-suite-success");
 | 
|    }
 | 
|  
 | 
| -  Expectation _negateOutcomeIfIncompleteAsyncTest(Expectation outcome,
 | 
| -                                                  String testOutput) {
 | 
| +  Expectation _negateOutcomeIfIncompleteAsyncTest(
 | 
| +      Expectation outcome, String testOutput) {
 | 
|      // If this is an asynchronous test and the asynchronous operation didn't
 | 
|      // complete successfully, it's outcome is Expectation.FAIL.
 | 
|      // TODO: maybe we should introduce a AsyncIncomplete marker or so
 | 
|      if (outcome == Expectation.PASS) {
 | 
| -      if (_isAsyncTest(testOutput) &&
 | 
| -          !_isAsyncTestSuccessful(testOutput)) {
 | 
| +      if (_isAsyncTest(testOutput) && !_isAsyncTestSuccessful(testOutput)) {
 | 
|          return Expectation.FAIL;
 | 
|        }
 | 
|      }
 | 
| @@ -930,14 +910,15 @@ class CommandOutputImpl extends UniqueObject implements CommandOutput {
 | 
|    bool alreadyPrintedWarning = false;
 | 
|  
 | 
|    // TODO(kustermann): Remove testCase from this class.
 | 
| -  CommandOutputImpl(Command this.command,
 | 
| -                    int this.exitCode,
 | 
| -                    bool this.timedOut,
 | 
| -                    List<int> this.stdout,
 | 
| -                    List<int> this.stderr,
 | 
| -                    Duration this.time,
 | 
| -                    bool this.compilationSkipped,
 | 
| -                    int this.pid) {
 | 
| +  CommandOutputImpl(
 | 
| +      Command this.command,
 | 
| +      int this.exitCode,
 | 
| +      bool this.timedOut,
 | 
| +      List<int> this.stdout,
 | 
| +      List<int> this.stderr,
 | 
| +      Duration this.time,
 | 
| +      bool this.compilationSkipped,
 | 
| +      int this.pid) {
 | 
|      diagnostics = [];
 | 
|    }
 | 
|  
 | 
| @@ -991,8 +972,8 @@ class CommandOutputImpl extends UniqueObject implements CommandOutput {
 | 
|      return testCase.isNegative ? !didFail(testCase) : didFail(testCase);
 | 
|    }
 | 
|  
 | 
| -  Expectation _negateOutcomeIfNegativeTest(Expectation outcome,
 | 
| -                                           bool isNegative) {
 | 
| +  Expectation _negateOutcomeIfNegativeTest(
 | 
| +      Expectation outcome, bool isNegative) {
 | 
|      if (!isNegative) return outcome;
 | 
|  
 | 
|      if (outcome.canBeOutcomeOf(Expectation.FAIL)) {
 | 
| @@ -1012,21 +993,9 @@ class BrowserCommandOutputImpl extends CommandOutputImpl {
 | 
|    bool _failedBecauseOfMissingXDisplay;
 | 
|  
 | 
|    BrowserCommandOutputImpl(
 | 
| -      command,
 | 
| -      exitCode,
 | 
| -      timedOut,
 | 
| -      stdout,
 | 
| -      stderr,
 | 
| -      time,
 | 
| -      compilationSkipped) :
 | 
| -    super(command,
 | 
| -          exitCode,
 | 
| -          timedOut,
 | 
| -          stdout,
 | 
| -          stderr,
 | 
| -          time,
 | 
| -          compilationSkipped,
 | 
| -          0) {
 | 
| +      command, exitCode, timedOut, stdout, stderr, time, compilationSkipped)
 | 
| +      : super(command, exitCode, timedOut, stdout, stderr, time,
 | 
| +            compilationSkipped, 0) {
 | 
|      _failedBecauseOfMissingXDisplay = _didFailBecauseOfMissingXDisplay();
 | 
|      if (_failedBecauseOfMissingXDisplay) {
 | 
|        DebugLogger.warning("Warning: Test failure because of missing XDisplay");
 | 
| @@ -1128,7 +1097,7 @@ class BrowserCommandOutputImpl extends CommandOutputImpl {
 | 
|        }
 | 
|        if (!containsFail && !containsPass) {
 | 
|          DebugLogger.warning("Test had neither 'FAIL' nor 'PASS' in stdout. "
 | 
| -                            "($command)");
 | 
| +            "($command)");
 | 
|          return true;
 | 
|        }
 | 
|        if (containsFail) {
 | 
| @@ -1137,43 +1106,31 @@ class BrowserCommandOutputImpl extends CommandOutputImpl {
 | 
|        assert(containsPass);
 | 
|        if (exitCode != 0) {
 | 
|          var message = "All tests passed, but exitCode != 0. "
 | 
| -                      "Actual exitcode: $exitCode. "
 | 
| -                      "($command)";
 | 
| +            "Actual exitcode: $exitCode. "
 | 
| +            "($command)";
 | 
|          DebugLogger.warning(message);
 | 
|          diagnostics.add(message);
 | 
|        }
 | 
|        return (!hasCrashed &&
 | 
| -              exitCode != 0 &&
 | 
| -              (!isWindows || exitCode != WHITELISTED_CONTENTSHELL_EXITCODE));
 | 
| +          exitCode != 0 &&
 | 
| +          (!isWindows || exitCode != WHITELISTED_CONTENTSHELL_EXITCODE));
 | 
|      }
 | 
|      DebugLogger.warning("Couldn't find 'Content-Type: text/plain' in output. "
 | 
| -                        "($command).");
 | 
| +        "($command).");
 | 
|      return true;
 | 
|    }
 | 
|  }
 | 
|  
 | 
|  class HTMLBrowserCommandOutputImpl extends BrowserCommandOutputImpl {
 | 
| - HTMLBrowserCommandOutputImpl(
 | 
| -      command,
 | 
| -      exitCode,
 | 
| -      timedOut,
 | 
| -      stdout,
 | 
| -      stderr,
 | 
| -      time,
 | 
| -      compilationSkipped) :
 | 
| -    super(command,
 | 
| -          exitCode,
 | 
| -          timedOut,
 | 
| -          stdout,
 | 
| -          stderr,
 | 
| -          time,
 | 
| -          compilationSkipped);
 | 
| +  HTMLBrowserCommandOutputImpl(
 | 
| +      command, exitCode, timedOut, stdout, stderr, time, compilationSkipped)
 | 
| +      : super(command, exitCode, timedOut, stdout, stderr, time,
 | 
| +            compilationSkipped);
 | 
|  
 | 
|    bool didFail(TestCase testCase) {
 | 
|      return _getOutcome() != Expectation.PASS;
 | 
|    }
 | 
|  
 | 
| -
 | 
|    bool get _browserTestFailure {
 | 
|      // We should not need to convert back and forward.
 | 
|      var output = decodeUtf8(super.stdout);
 | 
| @@ -1183,10 +1140,16 @@ class HTMLBrowserCommandOutputImpl extends BrowserCommandOutputImpl {
 | 
|  }
 | 
|  
 | 
|  class BrowserTestJsonResult {
 | 
| -  static const ALLOWED_TYPES =
 | 
| -      const ['sync_exception', 'window_onerror', 'script_onerror',
 | 
| -             'window_compilationerror', 'print', 'message_received', 'dom',
 | 
| -             'debug'];
 | 
| +  static const ALLOWED_TYPES = const [
 | 
| +    'sync_exception',
 | 
| +    'window_onerror',
 | 
| +    'script_onerror',
 | 
| +    'window_compilationerror',
 | 
| +    'print',
 | 
| +    'message_received',
 | 
| +    'dom',
 | 
| +    'debug'
 | 
| +  ];
 | 
|  
 | 
|    final Expectation outcome;
 | 
|    final String htmlDom;
 | 
| @@ -1198,7 +1161,7 @@ class BrowserTestJsonResult {
 | 
|      void validate(String assertion, bool value) {
 | 
|        if (!value) {
 | 
|          throw "InvalidFormat sent from browser driving page: $assertion:\n\n"
 | 
| -               "$content";
 | 
| +            "$content";
 | 
|        }
 | 
|      }
 | 
|  
 | 
| @@ -1218,12 +1181,11 @@ class BrowserTestJsonResult {
 | 
|            var value = entry['value'];
 | 
|            var timestamp = entry['timestamp'];
 | 
|  
 | 
| -          validate("'type' of an entry must be a String",
 | 
| -                   type is String);
 | 
| +          validate("'type' of an entry must be a String", type is String);
 | 
|            validate("'type' has to be in $ALLOWED_TYPES.",
 | 
| -                   ALLOWED_TYPES.contains(type));
 | 
| -          validate("'timestamp' of an entry must be a number",
 | 
| -                   timestamp is num);
 | 
| +              ALLOWED_TYPES.contains(type));
 | 
| +          validate(
 | 
| +              "'timestamp' of an entry must be a number", timestamp is num);
 | 
|  
 | 
|            messagesByType[type].add(value);
 | 
|          }
 | 
| @@ -1238,7 +1200,7 @@ class BrowserTestJsonResult {
 | 
|          return new BrowserTestJsonResult(
 | 
|              _getOutcome(messagesByType), dom, events);
 | 
|        }
 | 
| -    } catch(error) {
 | 
| +    } catch (error) {
 | 
|        // If something goes wrong, we know the content was not in the correct
 | 
|        // JSON format. So we can't parse it.
 | 
|        // The caller is responsible for falling back to the old way of
 | 
| @@ -1275,11 +1237,11 @@ class BrowserTestJsonResult {
 | 
|      // the unittest implementation posts these messages using
 | 
|      // "window.postMessage()" instead of the normal "print()" them.
 | 
|  
 | 
| -    var isAsyncTest = searchForMsg(['print', 'message_received'],
 | 
| -                                   'unittest-suite-wait-for-done');
 | 
| +    var isAsyncTest = searchForMsg(
 | 
| +        ['print', 'message_received'], 'unittest-suite-wait-for-done');
 | 
|      var isAsyncSuccess =
 | 
|          searchForMsg(['print', 'message_received'], 'unittest-suite-success') ||
 | 
| -        searchForMsg(['print', 'message_received'], 'unittest-suite-done');
 | 
| +            searchForMsg(['print', 'message_received'], 'unittest-suite-done');
 | 
|  
 | 
|      if (isAsyncTest) {
 | 
|        if (isAsyncSuccess) {
 | 
| @@ -1301,22 +1263,23 @@ class BrowserTestJsonResult {
 | 
|  }
 | 
|  
 | 
|  class BrowserControllerTestOutcome extends CommandOutputImpl
 | 
| -                                   with UnittestSuiteMessagesMixin {
 | 
| +    with UnittestSuiteMessagesMixin {
 | 
|    BrowserTestOutput _result;
 | 
|    Expectation _rawOutcome;
 | 
|  
 | 
| -  factory BrowserControllerTestOutcome(Command command,
 | 
| -                                       BrowserTestOutput result) {
 | 
| +  factory BrowserControllerTestOutcome(
 | 
| +      Command command, BrowserTestOutput result) {
 | 
|      void validate(String assertion, bool value) {
 | 
|        if (!value) {
 | 
|          throw "InvalidFormat sent from browser driving page: $assertion:\n\n"
 | 
| -              "${result.lastKnownMessage}";
 | 
| +            "${result.lastKnownMessage}";
 | 
|        }
 | 
|      }
 | 
|  
 | 
|      String indent(String string, int numSpaces) {
 | 
|        var spaces = new List.filled(numSpaces, ' ').join('');
 | 
| -      return string.replaceAll('\r\n', '\n')
 | 
| +      return string
 | 
| +          .replaceAll('\r\n', '\n')
 | 
|            .split('\n')
 | 
|            .map((line) => "$spaces$line")
 | 
|            .join('\n');
 | 
| @@ -1344,13 +1307,13 @@ class BrowserControllerTestOutcome extends CommandOutputImpl
 | 
|      if (result.didTimeout) {
 | 
|        if (result.delayUntilTestStarted != null) {
 | 
|          stderr = "This test timed out. The delay until the test actually "
 | 
| -                 "started was: ${result.delayUntilTestStarted}.";
 | 
| +            "started was: ${result.delayUntilTestStarted}.";
 | 
|        } else {
 | 
|          // TODO(ricow/kustermann) as soon as we record the state periodically,
 | 
|          // we will have more information and can remove this warning.
 | 
|          stderr = "This test has not notified test.py that it started running. "
 | 
| -                 "This could be a bug in test.py! "
 | 
| -                 "Please contact ricow/whesse";
 | 
| +            "This could be a bug in test.py! "
 | 
| +            "Please contact ricow/whesse";
 | 
|        }
 | 
|      }
 | 
|  
 | 
| @@ -1360,8 +1323,7 @@ class BrowserControllerTestOutcome extends CommandOutputImpl
 | 
|        stdout = "message:\n${indent(result.lastKnownMessage, 2)}\n\n";
 | 
|      }
 | 
|  
 | 
| -    stderr =
 | 
| -        '$stderr\n\n'
 | 
| +    stderr = '$stderr\n\n'
 | 
|          'BrowserOutput while running the test (* EXPERIMENTAL *):\n'
 | 
|          'BrowserOutput.stdout:\n'
 | 
|          '${indent(result.browserOutput.stdout.toString(), 2)}\n'
 | 
| @@ -1369,20 +1331,23 @@ class BrowserControllerTestOutcome extends CommandOutputImpl
 | 
|          '${indent(result.browserOutput.stderr.toString(), 2)}\n'
 | 
|          '\n';
 | 
|      return new BrowserControllerTestOutcome._internal(
 | 
| -      command, result, outcome, encodeUtf8(stdout), encodeUtf8(stderr));
 | 
| +        command, result, outcome, encodeUtf8(stdout), encodeUtf8(stderr));
 | 
|    }
 | 
|  
 | 
|    BrowserControllerTestOutcome._internal(
 | 
| -      Command command, BrowserTestOutput result, this._rawOutcome,
 | 
| -      List<int> stdout, List<int> stderr)
 | 
| +      Command command,
 | 
| +      BrowserTestOutput result,
 | 
| +      this._rawOutcome,
 | 
| +      List<int> stdout,
 | 
| +      List<int> stderr)
 | 
|        : super(command, 0, result.didTimeout, stdout, stderr, result.duration,
 | 
| -              false, 0) {
 | 
| +            false, 0) {
 | 
|      _result = result;
 | 
|    }
 | 
|  
 | 
|    Expectation result(TestCase testCase) {
 | 
|      // Handle timeouts first
 | 
| -    if (_result.didTimeout)  return Expectation.TIMEOUT;
 | 
| +    if (_result.didTimeout) return Expectation.TIMEOUT;
 | 
|  
 | 
|      // Multitests are handled specially
 | 
|      if (testCase.hasRuntimeError) {
 | 
| @@ -1394,7 +1359,6 @@ class BrowserControllerTestOutcome extends CommandOutputImpl
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  class AnalysisCommandOutputImpl extends CommandOutputImpl {
 | 
|    // An error line has 8 fields that look like:
 | 
|    // ERROR|COMPILER|MISSING_SOURCE|file:/tmp/t.dart|15|1|24|Missing source.
 | 
| @@ -1403,21 +1367,10 @@ class AnalysisCommandOutputImpl extends CommandOutputImpl {
 | 
|    final int FILENAME = 3;
 | 
|    final int FORMATTED_ERROR = 7;
 | 
|  
 | 
| -  AnalysisCommandOutputImpl(command,
 | 
| -                            exitCode,
 | 
| -                            timedOut,
 | 
| -                            stdout,
 | 
| -                            stderr,
 | 
| -                            time,
 | 
| -                            compilationSkipped) :
 | 
| -    super(command,
 | 
| -          exitCode,
 | 
| -          timedOut,
 | 
| -          stdout,
 | 
| -          stderr,
 | 
| -          time,
 | 
| -          compilationSkipped,
 | 
| -          0);
 | 
| +  AnalysisCommandOutputImpl(
 | 
| +      command, exitCode, timedOut, stdout, stderr, time, compilationSkipped)
 | 
| +      : super(command, exitCode, timedOut, stdout, stderr, time,
 | 
| +            compilationSkipped, 0);
 | 
|  
 | 
|    Expectation result(TestCase testCase) {
 | 
|      // TODO(kustermann): If we run the analyzer not in batch mode, make sure
 | 
| @@ -1455,9 +1408,8 @@ class AnalysisCommandOutputImpl extends CommandOutputImpl {
 | 
|        return Expectation.STATIC_WARNING;
 | 
|      }
 | 
|  
 | 
| -    assert (errors.length == 0 && warnings.length == 0);
 | 
| -    assert (!testCase.hasCompileError &&
 | 
| -            !testCase.hasStaticWarning);
 | 
| +    assert(errors.length == 0 && warnings.length == 0);
 | 
| +    assert(!testCase.hasCompileError && !testCase.hasStaticWarning);
 | 
|      return Expectation.PASS;
 | 
|    }
 | 
|  
 | 
| @@ -1468,7 +1420,7 @@ class AnalysisCommandOutputImpl extends CommandOutputImpl {
 | 
|        StringBuffer field = new StringBuffer();
 | 
|        List<String> result = [];
 | 
|        bool escaped = false;
 | 
| -      for (var i = 0 ; i < line.length; i++) {
 | 
| +      for (var i = 0; i < line.length; i++) {
 | 
|          var c = line[i];
 | 
|          if (!escaped && c == '\\') {
 | 
|            escaped = true;
 | 
| @@ -1503,13 +1455,12 @@ class AnalysisCommandOutputImpl extends CommandOutputImpl {
 | 
|  }
 | 
|  
 | 
|  class VmCommandOutputImpl extends CommandOutputImpl
 | 
| -                          with UnittestSuiteMessagesMixin {
 | 
| +    with UnittestSuiteMessagesMixin {
 | 
|    static const DART_VM_EXITCODE_COMPILE_TIME_ERROR = 254;
 | 
|    static const DART_VM_EXITCODE_UNCAUGHT_EXCEPTION = 255;
 | 
|  
 | 
|    VmCommandOutputImpl(Command command, int exitCode, bool timedOut,
 | 
| -                      List<int> stdout, List<int> stderr, Duration time,
 | 
| -                      int pid)
 | 
| +      List<int> stdout, List<int> stderr, Duration time, int pid)
 | 
|        : super(command, exitCode, timedOut, stdout, stderr, time, false, pid);
 | 
|  
 | 
|    Expectation result(TestCase testCase) {
 | 
| @@ -1553,11 +1504,16 @@ class VmCommandOutputImpl extends CommandOutputImpl
 | 
|  class CompilationCommandOutputImpl extends CommandOutputImpl {
 | 
|    static const DART2JS_EXITCODE_CRASH = 253;
 | 
|  
 | 
| -  CompilationCommandOutputImpl(Command command, int exitCode, bool timedOut,
 | 
| -      List<int> stdout, List<int> stderr, Duration time,
 | 
| +  CompilationCommandOutputImpl(
 | 
| +      Command command,
 | 
| +      int exitCode,
 | 
| +      bool timedOut,
 | 
| +      List<int> stdout,
 | 
| +      List<int> stderr,
 | 
| +      Duration time,
 | 
|        bool compilationSkipped)
 | 
|        : super(command, exitCode, timedOut, stdout, stderr, time,
 | 
| -              compilationSkipped, 0);
 | 
| +            compilationSkipped, 0);
 | 
|  
 | 
|    Expectation result(TestCase testCase) {
 | 
|      // Handle general crash/timeout detection.
 | 
| @@ -1596,7 +1552,7 @@ class CompilationCommandOutputImpl extends CommandOutputImpl {
 | 
|  }
 | 
|  
 | 
|  class JsCommandlineOutputImpl extends CommandOutputImpl
 | 
| -                              with UnittestSuiteMessagesMixin {
 | 
| +    with UnittestSuiteMessagesMixin {
 | 
|    JsCommandlineOutputImpl(Command command, int exitCode, bool timedOut,
 | 
|        List<int> stdout, List<int> stderr, Duration time)
 | 
|        : super(command, exitCode, timedOut, stdout, stderr, time, false, 0);
 | 
| @@ -1620,7 +1576,7 @@ class JsCommandlineOutputImpl extends CommandOutputImpl
 | 
|  class PubCommandOutputImpl extends CommandOutputImpl {
 | 
|    PubCommandOutputImpl(PubCommand command, int exitCode, bool timedOut,
 | 
|        List<int> stdout, List<int> stderr, Duration time)
 | 
| -  : super(command, exitCode, timedOut, stdout, stderr, time, false, 0);
 | 
| +      : super(command, exitCode, timedOut, stdout, stderr, time, false, 0);
 | 
|  
 | 
|    Expectation result(TestCase testCase) {
 | 
|      // Handle crashes and timeouts first
 | 
| @@ -1641,8 +1597,8 @@ class ScriptCommandOutputImpl extends CommandOutputImpl {
 | 
|    final Expectation _result;
 | 
|  
 | 
|    ScriptCommandOutputImpl(ScriptCommand command, this._result,
 | 
| -                          String scriptExecutionInformation, Duration time)
 | 
| -  : super(command, 0, false, [], [], time, false, 0) {
 | 
| +      String scriptExecutionInformation, Duration time)
 | 
| +      : super(command, 0, false, [], [], time, false, 0) {
 | 
|      var lines = scriptExecutionInformation.split("\n");
 | 
|      diagnostics.addAll(lines);
 | 
|    }
 | 
| @@ -1652,29 +1608,20 @@ class ScriptCommandOutputImpl extends CommandOutputImpl {
 | 
|    bool get canRunDependendCommands => _result == Expectation.PASS;
 | 
|  
 | 
|    bool get successful => _result == Expectation.PASS;
 | 
| -
 | 
|  }
 | 
|  
 | 
| -CommandOutput createCommandOutput(Command command,
 | 
| -                                  int exitCode,
 | 
| -                                  bool timedOut,
 | 
| -                                  List<int> stdout,
 | 
| -                                  List<int> stderr,
 | 
| -                                  Duration time,
 | 
| -                                  bool compilationSkipped,
 | 
| -                                  [int pid = 0]) {
 | 
| +CommandOutput createCommandOutput(Command command, int exitCode, bool timedOut,
 | 
| +    List<int> stdout, List<int> stderr, Duration time, bool compilationSkipped,
 | 
| +    [int pid = 0]) {
 | 
|    if (command is ContentShellCommand) {
 | 
|      return new BrowserCommandOutputImpl(
 | 
| -        command, exitCode, timedOut, stdout, stderr,
 | 
| -        time, compilationSkipped);
 | 
| +        command, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
 | 
|    } else if (command is BrowserTestCommand) {
 | 
|      return new HTMLBrowserCommandOutputImpl(
 | 
| -        command, exitCode, timedOut, stdout, stderr,
 | 
| -        time, compilationSkipped);
 | 
| +        command, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
 | 
|    } else if (command is AnalysisCommand) {
 | 
|      return new AnalysisCommandOutputImpl(
 | 
| -        command, exitCode, timedOut, stdout, stderr,
 | 
| -        time, compilationSkipped);
 | 
| +        command, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
 | 
|    } else if (command is VmCommand) {
 | 
|      return new VmCommandOutputImpl(
 | 
|          command, exitCode, timedOut, stdout, stderr, time, pid);
 | 
| @@ -1694,12 +1641,10 @@ CommandOutput createCommandOutput(Command command,
 | 
|          command, exitCode, timedOut, stdout, stderr, time);
 | 
|    }
 | 
|  
 | 
| -  return new CommandOutputImpl(
 | 
| -      command, exitCode, timedOut, stdout, stderr,
 | 
| +  return new CommandOutputImpl(command, exitCode, timedOut, stdout, stderr,
 | 
|        time, compilationSkipped, pid);
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /**
 | 
|   * An OutputLog records the output from a test, but truncates it if
 | 
|   * it is longer than MAX_HEAD characters, and just keeps the head and
 | 
| @@ -1734,10 +1679,9 @@ class OutputLog {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  List<int> _truncatedTail() =>
 | 
| -    tail.length > TAIL_LENGTH ?
 | 
| -        tail.sublist(tail.length - TAIL_LENGTH) :
 | 
| -        tail;
 | 
| +  List<int> _truncatedTail() => tail.length > TAIL_LENGTH
 | 
| +      ? tail.sublist(tail.length - TAIL_LENGTH)
 | 
| +      : tail;
 | 
|  
 | 
|    List<int> toList() {
 | 
|      if (complete == null) {
 | 
| @@ -1751,7 +1695,8 @@ Data removed due to excessive length
 | 
|  
 | 
|  *****************************************************************************
 | 
|  
 | 
| -""".codeUnits);
 | 
| +"""
 | 
| +            .codeUnits);
 | 
|          complete.addAll(_truncatedTail());
 | 
|        } else if (tail != null) {
 | 
|          complete.addAll(tail);
 | 
| @@ -1801,11 +1746,10 @@ class RunningProcess {
 | 
|          _commandComplete(0);
 | 
|        } else {
 | 
|          var processEnvironment = _createProcessEnvironment();
 | 
| -        Future processFuture =
 | 
| -            io.Process.start(command.executable,
 | 
| -                             command.arguments,
 | 
| -                             environment: processEnvironment,
 | 
| -                             workingDirectory: command.workingDirectory);
 | 
| +        Future processFuture = io.Process.start(
 | 
| +            command.executable, command.arguments,
 | 
| +            environment: processEnvironment,
 | 
| +            workingDirectory: command.workingDirectory);
 | 
|          processFuture.then((io.Process process) {
 | 
|            StreamSubscription stdoutSubscription =
 | 
|                _drainStream(process.stdout, stdout);
 | 
| @@ -1871,14 +1815,14 @@ class RunningProcess {
 | 
|                });
 | 
|              }
 | 
|  
 | 
| -            Future.wait([stdoutCompleter.future,
 | 
| -                         stderrCompleter.future]).then((_) {
 | 
| +            Future.wait([stdoutCompleter.future, stderrCompleter.future]).then(
 | 
| +                (_) {
 | 
|                _commandComplete(exitCode);
 | 
|              });
 | 
|            });
 | 
|  
 | 
| -          timeoutTimer = new Timer(new Duration(seconds: timeout),
 | 
| -                                   timeoutHandler);
 | 
| +          timeoutTimer =
 | 
| +              new Timer(new Duration(seconds: timeout), timeoutHandler);
 | 
|          }).catchError((e) {
 | 
|            // TODO(floitsch): should we try to report the stacktrace?
 | 
|            print("Process error:");
 | 
| @@ -1912,8 +1856,8 @@ class RunningProcess {
 | 
|      return commandOutput;
 | 
|    }
 | 
|  
 | 
| -  StreamSubscription _drainStream(Stream<List<int>> source,
 | 
| -                                  OutputLog destination) {
 | 
| +  StreamSubscription _drainStream(
 | 
| +      Stream<List<int>> source, OutputLog destination) {
 | 
|      return source.listen(destination.add);
 | 
|    }
 | 
|  
 | 
| @@ -1957,7 +1901,7 @@ class BatchRunnerProcess {
 | 
|    BatchRunnerProcess();
 | 
|  
 | 
|    Future<CommandOutput> runCommand(String runnerType, ProcessCommand command,
 | 
| -                                   int timeout, List<String> arguments) {
 | 
| +      int timeout, List<String> arguments) {
 | 
|      assert(_completer == null);
 | 
|      assert(!_currentlyRunning);
 | 
|  
 | 
| @@ -2011,15 +1955,14 @@ class BatchRunnerProcess {
 | 
|      _status = null;
 | 
|      _stdoutCompleter = new Completer();
 | 
|      _stderrCompleter = new Completer();
 | 
| -    _timer = new Timer(new Duration(seconds: timeout),
 | 
| -                       _timeoutHandler);
 | 
| +    _timer = new Timer(new Duration(seconds: timeout), _timeoutHandler);
 | 
|  
 | 
|      var line = _createArgumentsLine(_arguments, timeout);
 | 
|      _process.stdin.write(line);
 | 
|      _stdoutSubscription.resume();
 | 
|      _stderrSubscription.resume();
 | 
| -    Future.wait([_stdoutCompleter.future,
 | 
| -                 _stderrCompleter.future]).then((_) => _reportResult());
 | 
| +    Future.wait([_stdoutCompleter.future, _stderrCompleter.future]).then(
 | 
| +        (_) => _reportResult());
 | 
|    }
 | 
|  
 | 
|    String _createArgumentsLine(List<String> arguments, int timeout) {
 | 
| @@ -2034,13 +1977,14 @@ class BatchRunnerProcess {
 | 
|      var exitCode = 0;
 | 
|      if (outcome == "CRASH") exitCode = CRASHING_BROWSER_EXITCODE;
 | 
|      if (outcome == "FAIL" || outcome == "TIMEOUT") exitCode = 1;
 | 
| -    var output = createCommandOutput(_command,
 | 
| -                        exitCode,
 | 
| -                        (outcome == "TIMEOUT"),
 | 
| -                        _testStdout.toList(),
 | 
| -                        _testStderr.toList(),
 | 
| -                        new DateTime.now().difference(_startTime),
 | 
| -                        false);
 | 
| +    var output = createCommandOutput(
 | 
| +        _command,
 | 
| +        exitCode,
 | 
| +        (outcome == "TIMEOUT"),
 | 
| +        _testStdout.toList(),
 | 
| +        _testStderr.toList(),
 | 
| +        new DateTime.now().difference(_startTime),
 | 
| +        false);
 | 
|      assert(_completer != null);
 | 
|      _completer.complete(output);
 | 
|      _completer = null;
 | 
| @@ -2055,7 +1999,8 @@ class BatchRunnerProcess {
 | 
|          _stdoutSubscription.cancel();
 | 
|          _stderrSubscription.cancel();
 | 
|          _startProcess(_reportResult);
 | 
| -      } else {  // No active test case running.
 | 
| +      } else {
 | 
| +        // No active test case running.
 | 
|          _process = null;
 | 
|        }
 | 
|      }
 | 
| @@ -2077,16 +2022,13 @@ class BatchRunnerProcess {
 | 
|          environment[key] = _processEnvironmentOverrides[key];
 | 
|        }
 | 
|      }
 | 
| -    Future processFuture = io.Process.start(executable,
 | 
| -                                            arguments,
 | 
| -                                            environment: environment);
 | 
| +    Future processFuture =
 | 
| +        io.Process.start(executable, arguments, environment: environment);
 | 
|      processFuture.then((io.Process p) {
 | 
|        _process = p;
 | 
|  
 | 
|        var _stdoutStream =
 | 
| -          _process.stdout
 | 
| -              .transform(UTF8.decoder)
 | 
| -              .transform(new LineSplitter());
 | 
| +          _process.stdout.transform(UTF8.decoder).transform(new LineSplitter());
 | 
|        _stdoutSubscription = _stdoutStream.listen((String line) {
 | 
|          if (line.startsWith('>>> TEST')) {
 | 
|            _status = line;
 | 
| @@ -2107,9 +2049,7 @@ class BatchRunnerProcess {
 | 
|        _stdoutSubscription.pause();
 | 
|  
 | 
|        var _stderrStream =
 | 
| -          _process.stderr
 | 
| -              .transform(UTF8.decoder)
 | 
| -              .transform(new LineSplitter());
 | 
| +          _process.stderr.transform(UTF8.decoder).transform(new LineSplitter());
 | 
|        _stderrSubscription = _stderrStream.listen((String line) {
 | 
|          if (line.startsWith('>>> EOF STDERR')) {
 | 
|            _stderrSubscription.pause();
 | 
| @@ -2156,7 +2096,6 @@ class BatchRunnerProcess {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /**
 | 
|   * [TestCaseEnqueuer] takes a list of TestSuites, generates TestCases and
 | 
|   * builds a dependency graph of all commands in every TestSuite.
 | 
| @@ -2223,7 +2162,6 @@ class TestCaseEnqueuer {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /*
 | 
|   * [CommandEnqueuer] will
 | 
|   *  - change node.state to NodeState.Enqueuing as soon as all dependencies have
 | 
| @@ -2232,11 +2170,15 @@ class TestCaseEnqueuer {
 | 
|   *    have a state of NodeState.Failed/NodeState.UnableToRun.
 | 
|   */
 | 
|  class CommandEnqueuer {
 | 
| -  static final INIT_STATES = [dgraph.NodeState.Initialized,
 | 
| -                              dgraph.NodeState.Waiting];
 | 
| -  static final FINISHED_STATES = [dgraph.NodeState.Successful,
 | 
| -                                  dgraph.NodeState.Failed,
 | 
| -                                  dgraph.NodeState.UnableToRun];
 | 
| +  static final INIT_STATES = [
 | 
| +    dgraph.NodeState.Initialized,
 | 
| +    dgraph.NodeState.Waiting
 | 
| +  ];
 | 
| +  static final FINISHED_STATES = [
 | 
| +    dgraph.NodeState.Successful,
 | 
| +    dgraph.NodeState.Failed,
 | 
| +    dgraph.NodeState.UnableToRun
 | 
| +  ];
 | 
|    final dgraph.Graph _graph;
 | 
|  
 | 
|    CommandEnqueuer(this._graph) {
 | 
| @@ -2248,9 +2190,9 @@ class CommandEnqueuer {
 | 
|      });
 | 
|  
 | 
|      eventCondition((e) => e is dgraph.StateChangedEvent).listen((event) {
 | 
| -      if ([dgraph.NodeState.Waiting,
 | 
| -           dgraph.NodeState.Processing].contains(event.from)) {
 | 
| -        if (FINISHED_STATES.contains(event.to)){
 | 
| +      if ([dgraph.NodeState.Waiting, dgraph.NodeState.Processing]
 | 
| +          .contains(event.from)) {
 | 
| +        if (FINISHED_STATES.contains(event.to)) {
 | 
|            for (var dependendNode in event.node.neededFor) {
 | 
|              _changeNodeStateIfNecessary(dependendNode);
 | 
|            }
 | 
| @@ -2263,16 +2205,17 @@ class CommandEnqueuer {
 | 
|    // changed it's state.
 | 
|    void _changeNodeStateIfNecessary(dgraph.Node node) {
 | 
|      if (INIT_STATES.contains(node.state)) {
 | 
| -      bool anyDependenciesUnsuccessful = node.dependencies.any(
 | 
| -          (dep) => [dgraph.NodeState.Failed,
 | 
| -                    dgraph.NodeState.UnableToRun].contains(dep.state));
 | 
| +      bool anyDependenciesUnsuccessful = node.dependencies.any((dep) => [
 | 
| +            dgraph.NodeState.Failed,
 | 
| +            dgraph.NodeState.UnableToRun
 | 
| +          ].contains(dep.state));
 | 
|  
 | 
|        var newState = dgraph.NodeState.Waiting;
 | 
|        if (anyDependenciesUnsuccessful) {
 | 
|          newState = dgraph.NodeState.UnableToRun;
 | 
|        } else {
 | 
| -        bool allDependenciesSuccessful = node.dependencies.every(
 | 
| -            (dep) => dep.state == dgraph.NodeState.Successful);
 | 
| +        bool allDependenciesSuccessful = node.dependencies
 | 
| +            .every((dep) => dep.state == dgraph.NodeState.Successful);
 | 
|  
 | 
|          if (allDependenciesSuccessful) {
 | 
|            newState = dgraph.NodeState.Enqueuing;
 | 
| @@ -2304,8 +2247,8 @@ class CommandQueue {
 | 
|    final TestCaseEnqueuer enqueuer;
 | 
|  
 | 
|    final Queue<Command> _runQueue = new Queue<Command>();
 | 
| -  final _commandOutputStream =  new StreamController<CommandOutput>(sync: true);
 | 
| -  final _completer =  new Completer();
 | 
| +  final _commandOutputStream = new StreamController<CommandOutput>(sync: true);
 | 
| +  final _completer = new Completer();
 | 
|  
 | 
|    int _numProcesses = 0;
 | 
|    int _maxProcesses;
 | 
| @@ -2314,23 +2257,23 @@ class CommandQueue {
 | 
|    bool _finishing = false;
 | 
|    bool _verbose = false;
 | 
|  
 | 
| -  CommandQueue(this.graph, this.enqueuer, this.executor,
 | 
| -               this._maxProcesses, this._maxBrowserProcesses, this._verbose) {
 | 
| +  CommandQueue(this.graph, this.enqueuer, this.executor, this._maxProcesses,
 | 
| +      this._maxBrowserProcesses, this._verbose) {
 | 
|      var eventCondition = graph.events.where;
 | 
|      eventCondition((event) => event is dgraph.StateChangedEvent)
 | 
|          .listen((event) {
 | 
| -          if (event.to == dgraph.NodeState.Enqueuing) {
 | 
| -            assert(event.from == dgraph.NodeState.Initialized ||
 | 
| -                   event.from == dgraph.NodeState.Waiting);
 | 
| -            graph.changeState(event.node, dgraph.NodeState.Processing);
 | 
| -            var command = event.node.userData;
 | 
| -            if (event.node.dependencies.length > 0) {
 | 
| -              _runQueue.addFirst(command);
 | 
| -            } else {
 | 
| -              _runQueue.add(command);
 | 
| -            }
 | 
| -            Timer.run(() => _tryRunNextCommand());
 | 
| -          }
 | 
| +      if (event.to == dgraph.NodeState.Enqueuing) {
 | 
| +        assert(event.from == dgraph.NodeState.Initialized ||
 | 
| +            event.from == dgraph.NodeState.Waiting);
 | 
| +        graph.changeState(event.node, dgraph.NodeState.Processing);
 | 
| +        var command = event.node.userData;
 | 
| +        if (event.node.dependencies.length > 0) {
 | 
| +          _runQueue.addFirst(command);
 | 
| +        } else {
 | 
| +          _runQueue.add(command);
 | 
| +        }
 | 
| +        Timer.run(() => _tryRunNextCommand());
 | 
| +      }
 | 
|      });
 | 
|      // We're finished if the graph is sealed and all nodes are in a finished
 | 
|      // state (Successful, Failed or UnableToRun).
 | 
| @@ -2374,8 +2317,8 @@ class CommandQueue {
 | 
|        // If a command is part of many TestCases we set the timeout to be
 | 
|        // the maximum over all [TestCase.timeout]s. At some point, we might
 | 
|        // eliminate [TestCase.timeout] completely and move it to [Command].
 | 
| -      int timeout = testCases.map((TestCase test) => test.timeout)
 | 
| -          .fold(0, math.max);
 | 
| +      int timeout =
 | 
| +          testCases.map((TestCase test) => test.timeout).fold(0, math.max);
 | 
|  
 | 
|        if (_verbose) {
 | 
|          print('Running "${command.displayName}" command: $command');
 | 
| @@ -2422,7 +2365,7 @@ class CommandQueue {
 | 
|      print("CommandQueue state:");
 | 
|      print("  Processes: used: $_numProcesses max: $_maxProcesses");
 | 
|      print("  BrowserProcesses: used: $_numBrowserProcesses "
 | 
| -          "max: $_maxBrowserProcesses");
 | 
| +        "max: $_maxBrowserProcesses");
 | 
|      print("  Finishing: $_finishing");
 | 
|      print("  Queue (length = ${_runQueue.length}):");
 | 
|      for (var command in _runQueue) {
 | 
| @@ -2431,7 +2374,6 @@ class CommandQueue {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  /*
 | 
|   * [CommandExecutor] is responsible for executing commands. It will make sure
 | 
|   * that the the following two constraints are satisfied
 | 
| @@ -2494,7 +2436,7 @@ class CommandExecutorImpl implements CommandExecutor {
 | 
|        return _runCommand(command, timeout).then((CommandOutput output) {
 | 
|          if (retriesLeft > 0 && shouldRetryCommand(output)) {
 | 
|            DebugLogger.warning("Rerunning Command: ($retriesLeft "
 | 
| -                              "attempt(s) remains) [cmd: $command]");
 | 
| +              "attempt(s) remains) [cmd: $command]");
 | 
|            return runCommand(retriesLeft - 1);
 | 
|          } else {
 | 
|            return new Future.value(output);
 | 
| @@ -2545,8 +2487,8 @@ class CommandExecutorImpl implements CommandExecutor {
 | 
|      var completer = new Completer<CommandOutput>();
 | 
|  
 | 
|      var callback = (BrowserTestOutput output) {
 | 
| -      completer.complete(
 | 
| -          new BrowserControllerTestOutcome(browserCommand, output));
 | 
| +      completer
 | 
| +          .complete(new BrowserControllerTestOutcome(browserCommand, output));
 | 
|      };
 | 
|  
 | 
|      BrowserTest browserTest;
 | 
| @@ -2564,12 +2506,12 @@ class CommandExecutorImpl implements CommandExecutor {
 | 
|      return completer.future;
 | 
|    }
 | 
|  
 | 
| -  Future<BrowserTestRunner> _getBrowserTestRunner(String browser,
 | 
| -                                                  Map configuration) async {
 | 
| +  Future<BrowserTestRunner> _getBrowserTestRunner(
 | 
| +      String browser, Map configuration) async {
 | 
|      var localIp = globalConfiguration['local_ip'];
 | 
|      if (_browserTestRunners[configuration] == null) {
 | 
|        var testRunner = new BrowserTestRunner(
 | 
| -            configuration, localIp, browser, maxBrowserProcesses);
 | 
| +          configuration, localIp, browser, maxBrowserProcesses);
 | 
|        if (globalConfiguration['verbose']) {
 | 
|          testRunner.logger = DebugLogger.info;
 | 
|        }
 | 
| @@ -2583,8 +2525,7 @@ class CommandExecutorImpl implements CommandExecutor {
 | 
|  class RecordingCommandExecutor implements CommandExecutor {
 | 
|    TestCaseRecorder _recorder;
 | 
|  
 | 
| -  RecordingCommandExecutor(Path path)
 | 
| -      : _recorder = new TestCaseRecorder(path);
 | 
| +  RecordingCommandExecutor(Path path) : _recorder = new TestCaseRecorder(path);
 | 
|  
 | 
|    Future<CommandOutput> runCommand(node, ProcessCommand command, int timeout) {
 | 
|      assert(node.dependencies.length == 0);
 | 
| @@ -2606,8 +2547,7 @@ class RecordingCommandExecutor implements CommandExecutor {
 | 
|      if (environment == null) return true;
 | 
|      return environment.length == 0 ||
 | 
|          (environment.length == 1 &&
 | 
| -         environment.containsKey("DART_CONFIGURATION"));
 | 
| -
 | 
| +            environment.containsKey("DART_CONFIGURATION"));
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -2643,7 +2583,7 @@ bool shouldRetryCommand(CommandOutput output) {
 | 
|        // "xvfb-run" issue 7564, try re-running the test.
 | 
|        bool containsFailureMsg(String line) {
 | 
|          return line.contains(MESSAGE_CANNOT_OPEN_DISPLAY) ||
 | 
| -               line.contains(MESSAGE_FAILED_TO_RUN_COMMAND);
 | 
| +            line.contains(MESSAGE_FAILED_TO_RUN_COMMAND);
 | 
|        }
 | 
|        if (stdout.any(containsFailureMsg) || stderr.any(containsFailureMsg)) {
 | 
|          return true;
 | 
| @@ -2671,8 +2611,10 @@ bool shouldRetryCommand(CommandOutput output) {
 | 
|   * closed.
 | 
|   */
 | 
|  class TestCaseCompleter {
 | 
| -  static final COMPLETED_STATES = [dgraph.NodeState.Failed,
 | 
| -                                   dgraph.NodeState.Successful];
 | 
| +  static final COMPLETED_STATES = [
 | 
| +    dgraph.NodeState.Failed,
 | 
| +    dgraph.NodeState.Successful
 | 
| +  ];
 | 
|    final dgraph.Graph graph;
 | 
|    final TestCaseEnqueuer enqueuer;
 | 
|    final CommandQueue commandQueue;
 | 
| @@ -2700,26 +2642,26 @@ class TestCaseCompleter {
 | 
|      // changes.
 | 
|      eventCondition((event) => event is dgraph.StateChangedEvent)
 | 
|          .listen((dgraph.StateChangedEvent event) {
 | 
| -          if (event.from == dgraph.NodeState.Processing &&
 | 
| -              !finishedRemainingTestCases ) {
 | 
| -            var command = event.node.userData;
 | 
| +      if (event.from == dgraph.NodeState.Processing &&
 | 
| +          !finishedRemainingTestCases) {
 | 
| +        var command = event.node.userData;
 | 
|  
 | 
| -            assert(COMPLETED_STATES.contains(event.to));
 | 
| -            assert(_outputs[command] != null);
 | 
| +        assert(COMPLETED_STATES.contains(event.to));
 | 
| +        assert(_outputs[command] != null);
 | 
|  
 | 
| -            _completeTestCasesIfPossible(enqueuer.command2testCases[command]);
 | 
| -            _checkDone();
 | 
| -          }
 | 
| +        _completeTestCasesIfPossible(enqueuer.command2testCases[command]);
 | 
| +        _checkDone();
 | 
| +      }
 | 
|      });
 | 
|  
 | 
|      // Listen also for GraphSealedEvent's. If there is not a single node in the
 | 
|      // graph, we still want to finish after the graph was sealed.
 | 
|      eventCondition((event) => event is dgraph.GraphSealedEvent)
 | 
|          .listen((dgraph.GraphSealedEvent event) {
 | 
| -          if (!_closed && enqueuer.remainingTestCases.isEmpty) {
 | 
| -            _controller.close();
 | 
| -            _closed = true;
 | 
| -          }
 | 
| +      if (!_closed && enqueuer.remainingTestCases.isEmpty) {
 | 
| +        _controller.close();
 | 
| +        _closed = true;
 | 
| +      }
 | 
|      });
 | 
|    }
 | 
|  
 | 
| @@ -2763,7 +2705,6 @@ class TestCaseCompleter {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -
 | 
|  class ProcessQueue {
 | 
|    Map _globalConfiguration;
 | 
|  
 | 
| @@ -2771,32 +2712,28 @@ class ProcessQueue {
 | 
|    final dgraph.Graph _graph = new dgraph.Graph();
 | 
|    List<EventListener> _eventListener;
 | 
|  
 | 
| -  ProcessQueue(this._globalConfiguration,
 | 
| -               maxProcesses,
 | 
| -               maxBrowserProcesses,
 | 
| -               DateTime startTime,
 | 
| -               testSuites,
 | 
| -               this._eventListener,
 | 
| -               this._allDone,
 | 
| -               [bool verbose = false,
 | 
| -                String recordingOutputFile,
 | 
| -                String recordedInputFile]) {
 | 
| +  ProcessQueue(this._globalConfiguration, maxProcesses, maxBrowserProcesses,
 | 
| +      DateTime startTime, testSuites, this._eventListener, this._allDone,
 | 
| +      [bool verbose = false,
 | 
| +      String recordingOutputFile,
 | 
| +      String recordedInputFile]) {
 | 
|      void setupForListing(TestCaseEnqueuer testCaseEnqueuer) {
 | 
| -      _graph.events.where((event) => event is dgraph.GraphSealedEvent)
 | 
| -        .listen((dgraph.GraphSealedEvent event) {
 | 
| -          var testCases = new List.from(testCaseEnqueuer.remainingTestCases);
 | 
| -          testCases.sort((a, b) => a.displayName.compareTo(b.displayName));
 | 
| -
 | 
| -          print("\nGenerating all matching test cases ....\n");
 | 
| -
 | 
| -          for (TestCase testCase in testCases) {
 | 
| -            eventFinishedTestCase(testCase);
 | 
| -            print("${testCase.displayName}   "
 | 
| -                  "Expectations: ${testCase.expectedOutcomes.join(', ')}   "
 | 
| -                  "Configuration: '${testCase.configurationString}'");
 | 
| -          }
 | 
| -          eventAllTestsKnown();
 | 
| -        });
 | 
| +      _graph.events
 | 
| +          .where((event) => event is dgraph.GraphSealedEvent)
 | 
| +          .listen((dgraph.GraphSealedEvent event) {
 | 
| +        var testCases = new List.from(testCaseEnqueuer.remainingTestCases);
 | 
| +        testCases.sort((a, b) => a.displayName.compareTo(b.displayName));
 | 
| +
 | 
| +        print("\nGenerating all matching test cases ....\n");
 | 
| +
 | 
| +        for (TestCase testCase in testCases) {
 | 
| +          eventFinishedTestCase(testCase);
 | 
| +          print("${testCase.displayName}   "
 | 
| +              "Expectations: ${testCase.expectedOutcomes.join(', ')}   "
 | 
| +              "Configuration: '${testCase.configurationString}'");
 | 
| +        }
 | 
| +        eventAllTestsKnown();
 | 
| +      });
 | 
|      }
 | 
|  
 | 
|      var testCaseEnqueuer;
 | 
| @@ -2818,17 +2755,18 @@ class ProcessQueue {
 | 
|          cancelDebugTimer();
 | 
|          _debugTimer = new Timer(debugTimerDuration, () {
 | 
|            print("The debug timer of test.dart expired. Please report this issue"
 | 
| -                " to ricow/whesse and provide the following information:");
 | 
| +              " to ricow/whesse and provide the following information:");
 | 
|            print("");
 | 
|            print("Graph is sealed: ${_graph.isSealed}");
 | 
|            print("");
 | 
|            _graph.DumpCounts();
 | 
|            print("");
 | 
|            var unfinishedNodeStates = [
 | 
| -              dgraph.NodeState.Initialized,
 | 
| -              dgraph.NodeState.Waiting,
 | 
| -              dgraph.NodeState.Enqueuing,
 | 
| -              dgraph.NodeState.Processing];
 | 
| +            dgraph.NodeState.Initialized,
 | 
| +            dgraph.NodeState.Waiting,
 | 
| +            dgraph.NodeState.Enqueuing,
 | 
| +            dgraph.NodeState.Processing
 | 
| +          ];
 | 
|  
 | 
|            for (var nodeState in unfinishedNodeStates) {
 | 
|              if (_graph.stateCount(nodeState) > 0) {
 | 
| @@ -2842,7 +2780,7 @@ class ProcessQueue {
 | 
|                    print("  Command: $command");
 | 
|                    for (var testCase in testCases) {
 | 
|                      print("    Enqueued by: ${testCase.configurationString} "
 | 
| -                          "-- ${testCase.displayName}");
 | 
| +                        "-- ${testCase.displayName}");
 | 
|                    }
 | 
|                    print("");
 | 
|                  }
 | 
| @@ -2863,9 +2801,10 @@ class ProcessQueue {
 | 
|  
 | 
|        // When the graph building is finished, notify event listeners.
 | 
|        _graph.events
 | 
| -        .where((event) => event is dgraph.GraphSealedEvent).listen((event) {
 | 
| -          eventAllTestsKnown();
 | 
| -        });
 | 
| +          .where((event) => event is dgraph.GraphSealedEvent)
 | 
| +          .listen((event) {
 | 
| +        eventAllTestsKnown();
 | 
| +      });
 | 
|  
 | 
|        // Queue commands as they become "runnable"
 | 
|        var commandEnqueuer = new CommandEnqueuer(_graph);
 | 
| @@ -2883,30 +2822,27 @@ class ProcessQueue {
 | 
|  
 | 
|        // Run "runnable commands" using [executor] subject to
 | 
|        // maxProcesses/maxBrowserProcesses constraint
 | 
| -      commandQueue = new CommandQueue(
 | 
| -          _graph, testCaseEnqueuer, executor, maxProcesses, maxBrowserProcesses,
 | 
| -          verbose);
 | 
| +      commandQueue = new CommandQueue(_graph, testCaseEnqueuer, executor,
 | 
| +          maxProcesses, maxBrowserProcesses, verbose);
 | 
|  
 | 
|        // Finish test cases when all commands were run (or some failed)
 | 
|        var testCaseCompleter =
 | 
|            new TestCaseCompleter(_graph, testCaseEnqueuer, commandQueue);
 | 
| -      testCaseCompleter.finishedTestCases.listen(
 | 
| -          (TestCase finishedTestCase) {
 | 
| -            resetDebugTimer();
 | 
| +      testCaseCompleter.finishedTestCases.listen((TestCase finishedTestCase) {
 | 
| +        resetDebugTimer();
 | 
|  
 | 
| -            // If we're recording, we don't report any TestCases to listeners.
 | 
| -            if (!recording) {
 | 
| -              eventFinishedTestCase(finishedTestCase);
 | 
| -            }
 | 
| -          },
 | 
| -          onDone: () {
 | 
| -            // Wait until the commandQueue/execturo is done (it may need to stop
 | 
| -            // batch runners, browser controllers, ....)
 | 
| -            commandQueue.done.then((_) {
 | 
| -              cancelDebugTimer();
 | 
| -              eventAllTestsDone();
 | 
| -            });
 | 
| -          });
 | 
| +        // If we're recording, we don't report any TestCases to listeners.
 | 
| +        if (!recording) {
 | 
| +          eventFinishedTestCase(finishedTestCase);
 | 
| +        }
 | 
| +      }, onDone: () {
 | 
| +        // Wait until the commandQueue/execturo is done (it may need to stop
 | 
| +        // batch runners, browser controllers, ....)
 | 
| +        commandQueue.done.then((_) {
 | 
| +          cancelDebugTimer();
 | 
| +          eventAllTestsDone();
 | 
| +        });
 | 
| +      });
 | 
|  
 | 
|        resetDebugTimer();
 | 
|      }
 | 
| 
 |