Index: build/android/pylib/perf/setup.py |
diff --git a/build/android/pylib/perf/setup.py b/build/android/pylib/perf/setup.py |
index cf844560f00c944a178ff4d0858e8afc436003ab..5314d36fa8a874ffd5d447c250524b6384567c48 100644 |
--- a/build/android/pylib/perf/setup.py |
+++ b/build/android/pylib/perf/setup.py |
@@ -6,15 +6,73 @@ |
import json |
import fnmatch |
+import logging |
import os |
import shutil |
+from pylib import android_commands |
from pylib import constants |
from pylib import forwarder |
+from pylib.device import device_list |
from pylib.perf import test_runner |
from pylib.utils import test_environment |
+def _GetAllDevices(): |
+ devices_path = os.path.join(os.environ.get('CHROMIUM_OUT_DIR', 'out'), |
+ device_list.LAST_DEVICES_FILENAME) |
+ try: |
+ devices = device_list.GetPersistentDeviceList(devices_path) |
+ except IOError as e: |
+ logging.error('Unable to find %s [%s]', devices_path, e) |
+ devices = android_commands.GetAttachedDevices() |
+ return sorted(devices) |
+ |
+ |
+def _GetStepsDictFromSingleStep(test_options): |
+ # Running a single command, build the tests structure. |
+ steps_dict = { |
+ 'version': 1, |
+ 'steps': { |
+ 'single_step': { |
+ 'device_affinity': 0, |
+ 'cmd': test_options.single_step |
+ }, |
+ } |
+ } |
+ return steps_dict |
+ |
+# TODO(bulach): remove once it rolls downstream, crbug.com/378862. |
+def _GetStepsDictFromV0(steps_v0): |
+ steps_dict = { |
+ 'version': 1, |
+ 'steps': {}, |
+ } |
+ affinity = 0 |
+ for step in steps_v0: |
+ steps_dict['steps'][step[0]] = { |
+ 'device_affinity': affinity, |
+ 'cmd': step[1], |
+ } |
+ affinity += 1 |
+ return steps_dict |
+ |
+ |
+def _GetStepsDict(test_options): |
+ if test_options.single_step: |
+ return _GetStepsDictFromSingleStep(test_options) |
+ if test_options.steps: |
+ with file(test_options.steps, 'r') as f: |
+ steps = json.load(f) |
+ # TODO(bulach): remove once it rolls downstream, crbug.com/378862. |
+ if isinstance(steps, list): |
+ return _GetStepsDictFromV0(steps) |
+ |
+ # Already using the new format. |
+ assert steps['version'] == 1 |
+ return steps |
+ |
+ |
def Setup(test_options): |
"""Create and return the test runner factory and tests. |
@@ -22,7 +80,7 @@ def Setup(test_options): |
test_options: A PerformanceOptions object. |
Returns: |
- A tuple of (TestRunnerFactory, tests). |
+ A tuple of (TestRunnerFactory, tests, devices). |
""" |
# TODO(bulach): remove this once the bot side lands. BUG=318369 |
constants.SetBuildType('Release') |
@@ -34,33 +92,24 @@ def Setup(test_options): |
test_environment.CleanupLeftoverProcesses() |
forwarder.Forwarder.UseMultiprocessing() |
- if test_options.single_step: |
- # Running a single command, build the tests structure. |
- tests = [['single_step', test_options.single_step]] |
- |
- if test_options.steps: |
- with file(test_options.steps, 'r') as f: |
- tests = json.load(f) |
+ # We want to keep device affinity, so return all devices ever seen. |
+ all_devices = _GetAllDevices() |
- # The list is necessary to keep the steps order, but internally |
- # the format is squashed from a list of lists into a single dict: |
- # [["A", "cmd"], ["B", "cmd"]] into {"A": "cmd", "B": "cmd"} |
- sorted_test_names = [i[0] for i in tests] |
- tests_dict = dict(tests) |
+ steps_dict = _GetStepsDict(test_options) |
+ sorted_step_names = sorted(steps_dict['steps'].keys()) |
if test_options.test_filter: |
- sorted_test_names = fnmatch.filter(sorted_test_names, |
+ sorted_step_names = fnmatch.filter(sorted_step_names, |
test_options.test_filter) |
- tests_dict = dict((k, v) for k, v in tests_dict.iteritems() |
- if k in sorted_test_names) |
flaky_steps = [] |
if test_options.flaky_steps: |
with file(test_options.flaky_steps, 'r') as f: |
flaky_steps = json.load(f) |
- def TestRunnerFactory(device, _shard_index): |
+ def TestRunnerFactory(device, shard_index): |
return test_runner.TestRunner( |
- test_options, device, tests_dict, flaky_steps) |
+ test_options, device, shard_index, len(all_devices), |
+ steps_dict, flaky_steps) |
- return (TestRunnerFactory, sorted_test_names) |
+ return (TestRunnerFactory, sorted_step_names, all_devices) |