| Index: tools/testing/dart/test_options.dart | 
| =================================================================== | 
| --- tools/testing/dart/test_options.dart	(revision 5854) | 
| +++ tools/testing/dart/test_options.dart	(working copy) | 
| @@ -62,42 +62,54 @@ | 
| ['all', 'debug', 'release'], | 
| 'debug'), | 
| new _TestOptionSpecification( | 
| -              'component', | 
| -              ''' | 
| -Controls how dart code is compiled and executed. | 
| +              'compiler', | 
| +              '''Specify any compilation step (if needed). | 
|  | 
| -   vm: Run dart code on the standalone dart vm. | 
| +   none: Do not compile the Dart code (run native Dart code on the VM). | 
| +         (only valid with the following runtimes: vm, drt) | 
|  | 
| -   frog: Compile dart code by running frog on the standalone dart vm, and | 
| -       run the resulting javascript on D8. | 
| +   frog: Compile dart code to JavaScript by running the frog compiler. | 
| +         (only valid with the following runtimes: d8, drt, chrome, safari, ie, | 
| +         firefox, opera, none (compile only)) | 
|  | 
| -   dart2js: Compile dart code by running dart2js on the standalone | 
| -       dart vm, and run the resulting javascript on D8. | 
| +   dart2js: Compile dart code to JavaScript by running dart2js (leg). | 
| +            (only valid with the following runtimes: same as frog) | 
|  | 
| -   frogsh: Compile dart code by running frog on node.js, and run the | 
| -       resulting javascript on the same instance of node.js. | 
| - | 
| -   dartium: Run dart code in a type="application/dart" script tag in a | 
| -       dartium build of DumpRenderTree. | 
| - | 
| -   frogium: Compile dart code by running frog on the standalone dart vm, | 
| -       and run the resulting javascript in a javascript script tag in | 
| -       a dartium build of DumpRenderTree. | 
| - | 
| -   legium: Compile dart code by running dart2js on the standalone dart | 
| -       vm, and run the resulting javascript in a javascript script tag | 
| -       in a dartium build of DumpRenderTree. | 
| - | 
| -   webdriver: Compile dart code by running frog on the standalone dart vm, | 
| -       and then run the resulting javascript in the browser that is specified | 
| -       by the --browser switch (e.g. chrome, safari, ff, etc.). | 
| - | 
| -   dartc: Run dart code through the dartc static analyzer (does not | 
| -       execute dart code). | 
| -''', | 
| -              ['-c', '--component'], | 
| -              ['most', 'vm', 'frog', 'dart2js', 'frogsh', 'dartium',  'frogium', | 
| -               'legium', 'webdriver', 'dartc'], | 
| +   dartc: Perform static analysis on Dart code by running dartc. | 
| +          (only valid with the following runtimes: none) | 
| + | 
| +   frogsh: Compile dart code to JavaScript by running the frog compiler on | 
| +           node.js, and run the resulting JavaScript on the same instance of | 
| +           node.js. | 
| +           (only valid with the following runtimes: same as frog)''', | 
| +              ['-c', '--compiler'], | 
| +              ['none', 'frog', 'dart2js', 'dartc', 'frogsh'], | 
| +              'none'), | 
| +          new _TestOptionSpecification( | 
| +              'runtime', | 
| +              '''Where the tests should be run. | 
| +    vm: Run Dart code on the standalone dart vm. | 
| + | 
| +    d8: Run JavaScript from the command line using v8. | 
| + | 
| +    drt: Run Dart or JavaScript in the headless version of Chrome, | 
| +         DumpRenderTree. | 
| + | 
| +    ff or firefox: Run JavaScript in Firefox. | 
| + | 
| +    chrome: Run JavaScript in Chrome. | 
| + | 
| +    safari: Run JavaScript in Safari. | 
| + | 
| +    ie: Run JavaScript in Internet Explorer. | 
| + | 
| +    opera: Run JavaScript in Opera. | 
| + | 
| +    none: No runtime, compile only (for example, used for dartc static analysis | 
| +          tests).''', | 
| +              ['-r', '--runtime'], | 
| +              ['vm', 'd8', 'drt', 'ff', 'firefox', 'chrome', | 
| +              'safari', 'ie', 'opera', 'none'], | 
| 'vm'), | 
| new _TestOptionSpecification( | 
| 'arch', | 
| @@ -202,30 +214,12 @@ | 
| false, | 
| 'bool'), | 
| new _TestOptionSpecification( | 
| -              'browser', | 
| -              'Web browser to use on webdriver tests', | 
| -              ['-b', '--browser'], | 
| -              ['ff', 'chrome', 'safari', 'ie', 'opera'], | 
| -              'chrome'), | 
| -          new _TestOptionSpecification( | 
| -              'frog', | 
| -              'Path to frog executable', | 
| -              ['--frog'], | 
| -              [], | 
| -              ''), | 
| -          new _TestOptionSpecification( | 
| 'drt', | 
| 'Path to DumpRenderTree executable', | 
| ['--drt'], | 
| [], | 
| ''), | 
| new _TestOptionSpecification( | 
| -              'froglib', | 
| -              'Path to frog library', | 
| -              ['--froglib'], | 
| -              [], | 
| -              ''), | 
| -          new _TestOptionSpecification( | 
| 'noBatch', | 
| 'Do not run browser tests in batch mode', | 
| ['-n', '--nobatch'], | 
| @@ -349,9 +343,45 @@ | 
| } | 
| } | 
|  | 
| -    return _expandConfigurations(configuration); | 
| +    List<Map> expandedConfigs = _expandConfigurations(configuration); | 
| +    return expandedConfigs.filter(_isValidConfig); | 
| } | 
|  | 
| +  /** | 
| +   * Determine if a particular configuration has a valid combination of compiler | 
| +   * and runtime elements. | 
| +   */ | 
| +  bool _isValidConfig(Map config) { | 
| +    bool isValid = true; | 
| +      switch (config['compiler']) { | 
| +        case 'frog': | 
| +        case 'dart2js': | 
| +        case 'frogsh': | 
| +          // Note: by adding 'none' as a configuration, if the user | 
| +          // runs test.py -c dart2js -r drt,none the dart2js_none and | 
| +          // dart2js_drt will be duplicating work. If later we don't need 'none' | 
| +          // with dart2js, we should remove it from here. | 
| +          isValid = (const ['d8', 'drt', 'ff', 'chrome', 'safari', 'ie', | 
| +              'opera', 'none']).indexOf(config['runtime']) >= 0; | 
| +          break; | 
| +        case 'dartc': | 
| +          isValid = config['runtime'] == 'none'; | 
| +          break; | 
| +        case 'none': | 
| +          isValid = (const ['vm', 'drt']).indexOf(config['runtime']) >= 0; | 
| +      } | 
| +    if (!isValid) { | 
| +      print("Warning: combination of ${config['compiler']} and " + | 
| +          "${config['runtime']} is invalid. Skipping this combination."); | 
| +    } | 
| +    if (config['runtime'] == 'ie' && | 
| +        new Platform().operatingSystem() != 'windows') { | 
| +      isValid = false; | 
| +      print("Warning cannot run Internet Explorer on non-Windows operating" + | 
| +          " systems."); | 
| +    } | 
| +    return isValid; | 
| +  } | 
|  | 
| /** | 
| * Recursively expand a configuration with multiple values per key | 
| @@ -365,9 +395,6 @@ | 
| if (configuration['mode'] == 'all') { | 
| configuration['mode'] = 'debug,release'; | 
| } | 
| -    if (configuration['component'] == 'most') { | 
| -      configuration['component'] = 'vm,dartc'; | 
| -    } | 
| if (configuration['valgrind']) { | 
| // TODO(ager): Get rid of this when there is only one checkout and | 
| // we don't have to special case for the runtime checkout. | 
| @@ -390,6 +417,10 @@ | 
| configuration['unchecked'] = !configuration['checked']; | 
| configuration['host_unchecked'] = !configuration['host_checked']; | 
|  | 
| +    if (configuration['runtime'] == 'firefox') { | 
| +      configuration['runtime'] == 'ff'; | 
| +    } | 
| + | 
| // Expand the test selectors into a suite name and a simple | 
| // regular expressions to be used on the full path of a test file | 
| // in that test suite. If no selectors are explicitly given use | 
| @@ -423,55 +454,36 @@ | 
| } | 
|  | 
| // Expand the architectures. | 
| -    var archs = configuration['arch']; | 
| -    if (archs.contains(',')) { | 
| -      var result = new List<Map>(); | 
| -      for (var arch in archs.split(',')) { | 
| -        var newConfiguration = new Map.from(configuration); | 
| -        newConfiguration['arch'] = arch; | 
| -        result.addAll(_expandConfigurations(newConfiguration)); | 
| -      } | 
| -      return result; | 
| +    if (configuration['arch'].contains(',')) { | 
| +      return _expandHelper('arch', configuration); | 
| } | 
|  | 
| // Expand modes. | 
| -    var modes = configuration['mode']; | 
| -    if (modes.contains(',')) { | 
| -      var result = new List<Map>(); | 
| -      for (var mode in modes.split(',')) { | 
| -        var newConfiguration = new Map.from(configuration); | 
| -        newConfiguration['mode'] = mode; | 
| -        result.addAll(_expandConfigurations(newConfiguration)); | 
| -      } | 
| -      return result; | 
| +    if (configuration['mode'].contains(',')) { | 
| +      return _expandHelper('mode', configuration); | 
| } | 
| + | 
| +    // Expand compilers. | 
| +    if (configuration['compiler'].contains(',')) { | 
| +      return _expandHelper('compiler', configuration); | 
| +    } | 
|  | 
| -    // Expand components. | 
| -    var components = configuration['component']; | 
| -    if (components.contains(',')) { | 
| -      var result = new List<Map>(); | 
| -      for (var component in components.split(',')) { | 
| -        var newConfiguration = new Map.from(configuration); | 
| -        newConfiguration['component'] = component; | 
| -        result.addAll(_expandConfigurations(newConfiguration)); | 
| -      } | 
| -      return result; | 
| +    // Expand runtimes. | 
| +    var runtimes = configuration['runtime']; | 
| +    if (runtimes.contains(',')) { | 
| +      return _expandHelper('runtime', configuration); | 
| } else { | 
| -      // All components eventually go through this path, after expansion. | 
| -      if (DumpRenderTreeUpdater.componentRequiresDRT(components)) { | 
| +      // All runtimes eventually go through this path, after expansion. | 
| +      if (runtimes == 'drt') { | 
| DumpRenderTreeUpdater.update(); | 
| } | 
| } | 
|  | 
| -    // Adjust default timeout based on mode and component. | 
| +    // Adjust default timeout based on mode, compiler, and sometimes runtime. | 
| if (configuration['timeout'] == -1) { | 
| var timeout = 60; | 
| -      switch (configuration['component']) { | 
| +      switch (configuration['compiler']) { | 
| case 'dartc': | 
| -        case 'dartium': | 
| -        case 'frogium': | 
| -        case 'legium': | 
| -        case 'webdriver': | 
| timeout *= 4; | 
| break; | 
| case 'dart2js': | 
| @@ -482,11 +494,18 @@ | 
| if (configuration['host_checked']) { | 
| timeout *= 16; | 
| } | 
| +          if ((const ['ie', 'ff', 'chrome', 'safari', | 
| +            'opera']).indexOf(configuration['runtime']) >= 0) { | 
| +            timeout *= 4; // Allow additional time for browser testing to run. | 
| +          } | 
| break; | 
| default: | 
| if (configuration['mode'] == 'debug') { | 
| timeout *= 2; | 
| } | 
| +          if (configuration['runtime'] == 'drt') { | 
| +            timeout *= 4; | 
| +          } | 
| break; | 
| } | 
| configuration['timeout'] = timeout; | 
| @@ -495,7 +514,27 @@ | 
| return [configuration]; | 
| } | 
|  | 
| +  /** | 
| +   * Helper for _expandConfigurations. Creates a new configuration and adds it | 
| +   * to a list, for use in a case when a particular configuration has multiple | 
| +   * results (separated by a ','). | 
| +   * Arguments: | 
| +   * option: The particular test option we are expanding. | 
| +   * configuration: The map containing all test configuration information | 
| +   * specified. | 
| +   */ | 
| +  List<Map> _expandHelper(String option, Map configuration) { | 
| +    var result = new List<Map>(); | 
| +    var configs = configuration[option]; | 
| +    for (var config in configs.split(',')) { | 
| +      var newConfiguration = new Map.from(configuration); | 
| +      newConfiguration[option] = config; | 
| +      result.addAll(_expandConfigurations(newConfiguration)); | 
| +    } | 
| +    return result; | 
| +  } | 
|  | 
| + | 
| /** | 
| * Print out usage information. | 
| */ | 
|  |