Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1056)

Unified Diff: build/android/pylib/perf/setup.py

Issue 301183004: Android: adds device affinity for perf tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/android/pylib/device/device_list.py ('k') | build/android/pylib/perf/test_runner.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « build/android/pylib/device/device_list.py ('k') | build/android/pylib/perf/test_runner.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698