| Index: scripts/slave/recipe_modules/swarming/api.py
 | 
| diff --git a/scripts/slave/recipe_modules/swarming/api.py b/scripts/slave/recipe_modules/swarming/api.py
 | 
| index da5afa4fa99aee6f42037ffb3c88659aba0d93e0..87eb67ed3700dcf251bd89f2aca1ab1cbb7370af 100644
 | 
| --- a/scripts/slave/recipe_modules/swarming/api.py
 | 
| +++ b/scripts/slave/recipe_modules/swarming/api.py
 | 
| @@ -8,6 +8,7 @@ import functools
 | 
|  
 | 
|  from recipe_engine import recipe_api
 | 
|  
 | 
| +from . import results_merger
 | 
|  
 | 
|  # Minimally supported version of swarming.py script (reported by --version).
 | 
|  MINIMAL_SWARMING_VERSION = (0, 8, 6)
 | 
| @@ -730,7 +731,6 @@ class SwarmingApi(recipe_api.RecipeApi):
 | 
|              link_name = 'shard #%d isolated out' % index
 | 
|              p.links[link_name] = outputs_ref['view_url']
 | 
|  
 | 
| -
 | 
|    def _merge_isolated_script_chartjson_ouput_shards(self, task, step_result):
 | 
|      # Taken from third_party/catapult/telemetry/telemetry/internal/results/
 | 
|      # chart_json_output_formatter.py, the json entries are as follows:
 | 
| @@ -770,23 +770,8 @@ class SwarmingApi(recipe_api.RecipeApi):
 | 
|              merged_results[key][add_key] = chartjson_results_json[key][add_key]
 | 
|      return merged_results
 | 
|  
 | 
| -
 | 
|    def _merge_isolated_script_shards(self, task, step_result):
 | 
| -    # This code is unfortunately specialized to the "simplified"
 | 
| -    # JSON format that used to be the standard for recipes. The
 | 
| -    # isolated scripts should be changed to use the now-standard
 | 
| -    # Chromium JSON test results format:
 | 
| -    # https://www.chromium.org/developers/the-json-test-results-format
 | 
| -    # . Note that gtests, above, don't seem to conform to this
 | 
| -    # format yet, so it didn't seem like a good prerequisite to
 | 
| -    # switch the isolated tests over when adding sharding support.
 | 
| -    #
 | 
| -    # These are the only keys we pay attention to in the output JSON.
 | 
| -    merged_results = {
 | 
| -      'successes': [],
 | 
| -      'failures': [],
 | 
| -      'valid': True,
 | 
| -    }
 | 
| +    shard_results_list = []
 | 
|      for i in xrange(task.shards):
 | 
|        path = self.m.path.join(str(i), 'output.json')
 | 
|        if path not in step_result.raw_io.output_dir:
 | 
| @@ -794,19 +779,10 @@ class SwarmingApi(recipe_api.RecipeApi):
 | 
|        results_raw = step_result.raw_io.output_dir[path]
 | 
|        try:
 | 
|          results_json = self.m.json.loads(results_raw)
 | 
| +        shard_results_list.append(results_json)
 | 
|        except Exception as e:
 | 
|          raise Exception('error decoding JSON results from shard #%d' % i)
 | 
| -      for key in merged_results:
 | 
| -        if key in results_json:
 | 
| -          if isinstance(merged_results[key], list):
 | 
| -            merged_results[key].extend(results_json[key])
 | 
| -          elif isinstance(merged_results[key], bool):
 | 
| -            merged_results[key] = merged_results[key] and results_json[key]
 | 
| -          else:
 | 
| -            raise recipe_api.InfraFailure(
 | 
| -              'Unknown key type ' + type(merged_results[key]) +
 | 
| -              ' when handling key ' + key + '.')  # pragma: no cover
 | 
| -    return merged_results
 | 
| +    return results_merger.merge_test_results(shard_results_list)
 | 
|  
 | 
|    def _isolated_script_collect_step(self, task, **kwargs):
 | 
|      step_test_data = kwargs.pop('step_test_data', None)
 | 
| 
 |