From 975fc02186d195c3baf6f0380fed06433c636670 Mon Sep 17 00:00:00 2001 From: jbudorick Date: Mon, 5 Oct 2015 11:31:12 -0700 Subject: [Android] Add a configurable environment for devil/. BUG=476719 Review URL: https://codereview.chromium.org/1316413003 Cr-Commit-Position: refs/heads/master@{#352359} --- build/android/PRESUBMIT.py | 32 ++++- build/android/buildbot/bb_device_status_check.py | 3 + build/android/devil/android/apk_helper.py | 3 - build/android/devil/android/battery_utils_test.py | 6 +- .../android/devil/android/device_temp_file_test.py | 6 +- build/android/devil/android/device_utils.py | 4 +- build/android/devil/android/device_utils_test.py | 32 +++-- build/android/devil/android/logcat_monitor_test.py | 6 +- build/android/devil/android/md5sum.py | 7 +- build/android/devil/android/md5sum_test.py | 18 ++- build/android/devil/android/sdk/aapt.py | 8 +- build/android/devil/android/sdk/adb_wrapper.py | 4 +- build/android/devil/android/sdk/dexdump.py | 5 +- .../android/devil/android/sdk/shared_prefs_test.py | 6 +- build/android/devil/android/sdk/split_select.py | 7 +- build/android/devil/devil_env.py | 159 +++++++++++++++++++++ build/android/devil/utils/lsusb.py | 2 +- build/android/devil/utils/mock_calls.py | 6 +- build/android/devil/utils/mock_calls_test.py | 5 +- build/android/devil_config.json | 63 ++++++++ build/android/provision_devices.py | 3 + build/android/pylib/forwarder.py | 12 +- build/android/pylib/perf/test_runner.py | 2 + build/android/pylintrc | 4 + build/android/test_runner.py | 21 +++ .../dependency_manager/dependency_manager.py | 4 - 26 files changed, 346 insertions(+), 82 deletions(-) create mode 100644 build/android/devil/devil_env.py create mode 100644 build/android/devil_config.json diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py index a75bf94..d7a3ae1 100644 --- a/build/android/PRESUBMIT.py +++ b/build/android/PRESUBMIT.py @@ -12,9 +12,12 @@ details on the presubmit API built into depot_tools. def CommonChecks(input_api, output_api): output = [] + build_android_dir = input_api.PresubmitLocalPath() + chromium_src_dir = input_api.os_path.join(build_android_dir, '..', '..') + def J(*dirs): """Returns a path relative to presubmit directory.""" - return input_api.os_path.join(input_api.PresubmitLocalPath(), *dirs) + return input_api.os_path.join(build_android_dir, *dirs) build_pys = [ r'gyp/.*\.py$', @@ -40,7 +43,7 @@ def CommonChecks(input_api, output_api): pylib_test_env = dict(input_api.environ) pylib_test_env.update({ - 'PYTHONPATH': input_api.PresubmitLocalPath(), + 'PYTHONPATH': build_android_dir, 'PYTHONDONTWRITEBYTECODE': '1', }) output.extend(input_api.canned_checks.RunUnitTests( @@ -48,11 +51,6 @@ def CommonChecks(input_api, output_api): output_api, unit_tests=[ J('.', 'emma_coverage_stats_test.py'), - J('devil', 'android', 'battery_utils_test.py'), - J('devil', 'android', 'device_utils_test.py'), - J('devil', 'android', 'md5sum_test.py'), - J('devil', 'android', 'logcat_monitor_test.py'), - J('devil', 'utils', 'timeout_retry_unittest.py'), J('gyp', 'util', 'md5_check_test.py'), J('pylib', 'base', 'test_dispatcher_unittest.py'), J('pylib', 'gtest', 'gtest_test_instance_test.py'), @@ -61,6 +59,26 @@ def CommonChecks(input_api, output_api): J('pylib', 'results', 'json_results_test.py'), ], env=pylib_test_env)) + + + devil_test_env = dict(pylib_test_env) + devil_test_env.update({ + 'DEVIL_BINARY_DIR': + input_api.os_path.join(chromium_src_dir, 'output', 'directory'), + 'DEVIL_PYMOCK_PATH': + input_api.os_path.join(chromium_src_dir, 'third_party', 'pymock') + }) + output.extend(input_api.canned_checks.RunUnitTests( + input_api, + output_api, + unit_tests=[ + J('devil', 'android', 'battery_utils_test.py'), + J('devil', 'android', 'device_utils_test.py'), + J('devil', 'android', 'md5sum_test.py'), + J('devil', 'android', 'logcat_monitor_test.py'), + J('devil', 'utils', 'timeout_retry_unittest.py'), + ], + env=devil_test_env)) return output diff --git a/build/android/buildbot/bb_device_status_check.py b/build/android/buildbot/bb_device_status_check.py index 0a7cfd6..22e264f 100755 --- a/build/android/buildbot/bb_device_status_check.py +++ b/build/android/buildbot/bb_device_status_check.py @@ -16,6 +16,7 @@ import signal import sys sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from devil import devil_env from devil.android import battery_utils from devil.android import device_blacklist from devil.android import device_errors @@ -287,6 +288,8 @@ def main(): run_tests_helper.SetLogLevel(args.verbose) + devil_env.config.Initialize() + blacklist = (device_blacklist.Blacklist(args.blacklist_file) if args.blacklist_file else None) diff --git a/build/android/devil/android/apk_helper.py b/build/android/devil/android/apk_helper.py index 27a7ed4..7d2740a 100644 --- a/build/android/devil/android/apk_helper.py +++ b/build/android/devil/android/apk_helper.py @@ -4,14 +4,11 @@ """Module containing utilities for apk packages.""" -import os.path import re from devil.android.sdk import aapt -from pylib import constants -_AAPT_PATH = os.path.join(constants.ANDROID_SDK_TOOLS, 'aapt') _MANIFEST_ATTRIBUTE_RE = re.compile( r'\s*A: ([^\(\)= ]*)\([^\(\)= ]*\)=(?:"(.*)" \(Raw: .*\)|\(type.*?\)(.*))$') _MANIFEST_ELEMENT_RE = re.compile(r'\s*(?:E|N): (\S*) .*$') diff --git a/build/android/devil/android/battery_utils_test.py b/build/android/devil/android/battery_utils_test.py index 64253a5..7057bcd 100755 --- a/build/android/devil/android/battery_utils_test.py +++ b/build/android/devil/android/battery_utils_test.py @@ -10,19 +10,17 @@ Unit tests for the contents of battery_utils.py # pylint: disable=protected-access,unused-argument import logging -import os import sys import unittest +from devil import devil_env from devil.android import battery_utils from devil.android import device_errors from devil.android import device_utils from devil.android import device_utils_test from devil.utils import mock_calls -from pylib import constants -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=F0401 _DUMPSYS_OUTPUT = [ diff --git a/build/android/devil/android/device_temp_file_test.py b/build/android/devil/android/device_temp_file_test.py index 76f9cc8..6ba7089 100755 --- a/build/android/devil/android/device_temp_file_test.py +++ b/build/android/devil/android/device_temp_file_test.py @@ -8,18 +8,16 @@ Unit tests for the contents of device_temp_file.py. """ import logging -import os import sys import unittest +from devil import devil_env from devil.android import device_errors from devil.android import device_temp_file from devil.android.sdk import adb_wrapper from devil.utils import mock_calls -from pylib import constants -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=F0401 class DeviceTempFileTest(mock_calls.TestCase): diff --git a/build/android/devil/android/device_utils.py b/build/android/devil/android/device_utils.py index e7bf297..ac95ac2 100644 --- a/build/android/devil/android/device_utils.py +++ b/build/android/devil/android/device_utils.py @@ -21,6 +21,7 @@ import time import zipfile from devil import base_error +from devil import devil_env from devil.utils import cmd_helper from devil.android import apk_helper from devil.android import device_signal @@ -39,7 +40,6 @@ from devil.utils import parallelizer from devil.utils import reraiser_thread from devil.utils import timeout_retry from devil.utils import zip_utils -from pylib import constants from pylib.device.commands import install_commands _DEFAULT_TIMEOUT = 30 @@ -103,7 +103,7 @@ def GetAVDs(): A list containing the configured AVDs. """ lines = cmd_helper.GetCmdOutput([ - os.path.join(constants.ANDROID_SDK_ROOT, 'tools', 'android'), + os.path.join(devil_env.config.android_sdk_path, 'tools', 'android'), 'list', 'avd']).splitlines() avds = [] for line in lines: diff --git a/build/android/devil/android/device_utils_test.py b/build/android/devil/android/device_utils_test.py index 4cb4591..d10e6ea 100755 --- a/build/android/devil/android/device_utils_test.py +++ b/build/android/devil/android/device_utils_test.py @@ -11,10 +11,10 @@ Unit tests for the contents of device_utils.py (mostly DeviceUtils). # pylint: disable=unused-argument import logging -import os import sys import unittest +from devil import devil_env from devil.android import device_errors from devil.android import device_signal from devil.android import device_utils @@ -23,10 +23,8 @@ from devil.android.sdk import intent from devil.android.sdk import version_codes from devil.utils import cmd_helper from devil.utils import mock_calls -from pylib import constants -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=F0401 @@ -58,17 +56,21 @@ class DeviceUtilsInitTest(unittest.TestCase): class DeviceUtilsGetAVDsTest(mock_calls.TestCase): def testGetAVDs(self): - with self.assertCall( - mock.call.devil.utils.cmd_helper.GetCmdOutput( - [mock.ANY, 'list', 'avd']), - 'Available Android Virtual Devices:\n' - ' Name: my_android5.0\n' - ' Path: /some/path/to/.android/avd/my_android5.0.avd\n' - ' Target: Android 5.0 (API level 21)\n' - ' Tag/ABI: default/x86\n' - ' Skin: WVGA800\n'): - self.assertEquals(['my_android5.0'], - device_utils.GetAVDs()) + mocked_attrs = { + 'android_sdk_path': '/my/sdk/path' + } + with mock.patch('devil.devil_env._Environment.__getattr__', + mock.Mock(side_effect=lambda a: mocked_attrs[a])): + with self.assertCall( + mock.call.devil.utils.cmd_helper.GetCmdOutput( + [mock.ANY, 'list', 'avd']), + 'Available Android Virtual Devices:\n' + ' Name: my_android5.0\n' + ' Path: /some/path/to/.android/avd/my_android5.0.avd\n' + ' Target: Android 5.0 (API level 21)\n' + ' Tag/ABI: default/x86\n' + ' Skin: WVGA800\n'): + self.assertEquals(['my_android5.0'], device_utils.GetAVDs()) class DeviceUtilsRestartServerTest(mock_calls.TestCase): diff --git a/build/android/devil/android/logcat_monitor_test.py b/build/android/devil/android/logcat_monitor_test.py index 2b7969c..7a49c5d 100755 --- a/build/android/devil/android/logcat_monitor_test.py +++ b/build/android/devil/android/logcat_monitor_test.py @@ -6,16 +6,14 @@ # pylint: disable=protected-access import itertools -import os import sys import unittest +from devil import devil_env from devil.android import logcat_monitor from devil.android.sdk import adb_wrapper -from pylib import constants -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=F0401 diff --git a/build/android/devil/android/md5sum.py b/build/android/devil/android/md5sum.py index dbd988f..7b12af5 100644 --- a/build/android/devil/android/md5sum.py +++ b/build/android/devil/android/md5sum.py @@ -6,9 +6,9 @@ import os import posixpath import re +from devil import devil_env from devil.android import device_errors from devil.utils import cmd_helper -from pylib import constants MD5SUM_DEVICE_LIB_PATH = '/data/local/tmp/md5sum' MD5SUM_DEVICE_BIN_PATH = MD5SUM_DEVICE_LIB_PATH + '/md5sum_bin' @@ -30,8 +30,7 @@ def CalculateHostMd5Sums(paths): if isinstance(paths, basestring): paths = [paths] - md5sum_bin_host_path = os.path.join( - constants.GetOutDirectory(), 'md5sum_bin_host') + md5sum_bin_host_path = devil_env.config.md5sum_host_path if not os.path.exists(md5sum_bin_host_path): raise IOError('File not built: %s' % md5sum_bin_host_path) out = cmd_helper.GetCmdOutput([md5sum_bin_host_path] + [p for p in paths]) @@ -58,7 +57,7 @@ def CalculateDeviceMd5Sums(paths, device): # Allow generators paths = list(paths) - md5sum_dist_path = os.path.join(constants.GetOutDirectory(), 'md5sum_dist') + md5sum_dist_path = devil_env.config.md5sum_device_path md5sum_dist_bin_path = os.path.join(md5sum_dist_path, 'md5sum_bin') if not os.path.exists(md5sum_dist_path): diff --git a/build/android/devil/android/md5sum_test.py b/build/android/devil/android/md5sum_test.py index e9481b6..4cb5094 100755 --- a/build/android/devil/android/md5sum_test.py +++ b/build/android/devil/android/md5sum_test.py @@ -7,25 +7,29 @@ import os import sys import unittest +from devil import devil_env from devil.android import device_errors from devil.android import md5sum -from pylib import constants -sys.path.append( - os.path.join(constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=import-error TEST_OUT_DIR = os.path.join('test', 'out', 'directory') HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host') +MD5_DIST = os.path.join(TEST_OUT_DIR, 'md5sum_dist') class Md5SumTest(unittest.TestCase): def setUp(self): + mocked_attrs = { + 'md5sum_host_path': HOST_MD5_EXECUTABLE, + 'md5sum_device_path': MD5_DIST, + } self._patchers = [ - mock.patch('pylib.constants.GetOutDirectory', - new=mock.Mock(return_value=TEST_OUT_DIR)), - mock.patch('os.path.exists', - new=mock.Mock(return_value=True)), + mock.patch('devil.devil_env._Environment.__getattr__', + mock.Mock(side_effect=lambda a: mocked_attrs[a])), + mock.patch('os.path.exists', + new=mock.Mock(return_value=True)), ] for p in self._patchers: p.start() diff --git a/build/android/devil/android/sdk/aapt.py b/build/android/devil/android/sdk/aapt.py index 1c051e0..c2efb50 100644 --- a/build/android/devil/android/sdk/aapt.py +++ b/build/android/devil/android/sdk/aapt.py @@ -6,10 +6,9 @@ import os +from devil import devil_env from devil.utils import cmd_helper -from pylib import constants -_AAPT_PATH = os.path.join(constants.ANDROID_SDK_TOOLS, 'aapt') def _RunAaptCmd(args): """Runs an aapt command. @@ -20,13 +19,16 @@ def _RunAaptCmd(args): Returns: The output of the command. """ - cmd = [_AAPT_PATH] + args + aapt_path = os.path.join( + devil_env.config.android_sdk_build_tools_path, 'aapt') + cmd = [aapt_path] + args status, output = cmd_helper.GetCmdStatusAndOutput(cmd) if status != 0: raise Exception('Failed running aapt command: "%s" with output "%s".' % (' '.join(cmd), output)) return output + def Dump(what, apk, assets=None): """Returns the output of the aapt dump command. diff --git a/build/android/devil/android/sdk/adb_wrapper.py b/build/android/devil/android/sdk/adb_wrapper.py index 5a81c7f..63ccc83 100644 --- a/build/android/devil/android/sdk/adb_wrapper.py +++ b/build/android/devil/android/sdk/adb_wrapper.py @@ -14,11 +14,11 @@ import logging import os import re +from devil import devil_env from devil.android import decorators from devil.android import device_errors from devil.utils import cmd_helper from devil.utils import timeout_retry -from pylib import constants _DEFAULT_TIMEOUT = 30 @@ -66,7 +66,7 @@ class AdbWrapper(object): cmd = ['taskset', '-c', str(cpu_affinity)] else: cmd = [] - cmd.append(constants.GetAdbPath()) + cmd.append(devil_env.config.adb_path) if device_serial is not None: cmd.extend(['-s', device_serial]) cmd.extend(args) diff --git a/build/android/devil/android/sdk/dexdump.py b/build/android/devil/android/sdk/dexdump.py index 48d810f..c6a084c 100644 --- a/build/android/devil/android/sdk/dexdump.py +++ b/build/android/devil/android/sdk/dexdump.py @@ -4,10 +4,11 @@ import os +from devil import devil_env from devil.utils import cmd_helper -from pylib import constants -_DEXDUMP_PATH = os.path.join(constants.ANDROID_SDK_TOOLS, 'dexdump') +_DEXDUMP_PATH = os.path.join( + devil_env.config.android_sdk_build_tools_path, 'dexdump') def DexDump(dexfiles, file_summary=False): """A wrapper around the Android SDK's dexdump tool. diff --git a/build/android/devil/android/sdk/shared_prefs_test.py b/build/android/devil/android/sdk/shared_prefs_test.py index 63d9aec..7623f6c 100755 --- a/build/android/devil/android/sdk/shared_prefs_test.py +++ b/build/android/devil/android/sdk/shared_prefs_test.py @@ -8,16 +8,14 @@ Unit tests for the contents of shared_prefs.py (mostly SharedPrefs). """ import logging -import os import sys import unittest +from devil import devil_env from devil.android import device_utils from devil.android.sdk import shared_prefs -from pylib import constants -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=import-error diff --git a/build/android/devil/android/sdk/split_select.py b/build/android/devil/android/sdk/split_select.py index 47fcea3c..4e20bee 100644 --- a/build/android/devil/android/sdk/split_select.py +++ b/build/android/devil/android/sdk/split_select.py @@ -6,10 +6,9 @@ import os +from devil import devil_env from devil.utils import cmd_helper -from pylib import constants -_SPLIT_SELECT_PATH = os.path.join(constants.ANDROID_SDK_TOOLS, 'split-select') def _RunSplitSelectCmd(args): """Runs a split-select command. @@ -20,7 +19,9 @@ def _RunSplitSelectCmd(args): Returns: The output of the command. """ - cmd = [_SPLIT_SELECT_PATH] + args + split_select_path = os.path.join( + devil_env.config.android_sdk_build_tools_path, 'split-select') + cmd = [split_select_path] + args status, output = cmd_helper.GetCmdStatusAndOutput(cmd) if status != 0: raise Exception('Failed running command "%s" with output "%s".' % diff --git a/build/android/devil/devil_env.py b/build/android/devil/devil_env.py new file mode 100644 index 0000000..1fc0220 --- /dev/null +++ b/build/android/devil/devil_env.py @@ -0,0 +1,159 @@ +# Copyright 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import json +import logging +import os +import sys +import tempfile +import threading + +# TODO(jbudorick): Update this once dependency_manager moves to catapult. +_TELEMETRY_PATH = os.path.abspath(os.path.join( + os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, + 'tools', 'telemetry')) +sys.path.append(_TELEMETRY_PATH) +from catapult_base import dependency_manager # pylint: disable=import-error + + +_DEFAULT_CONFIG_FILES = [ + os.path.abspath(os.path.join( + os.path.dirname(__file__), os.pardir, 'devil_config.json')), +] + + +class _Environment(object): + + def __init__(self): + self._config = None + self._config_init_lock = threading.Lock() + + def Initialize(self, configs=None, config_files=None): + """Initialize devil's environment. + + This uses all configurations provided via |configs| and |config_files| + to determine the locations of devil's dependencies. Configurations should + all take the form described by catapult_base.dependency_manager.BaseConfig. + If no configurations are provided, a default one will be used if available. + + Args: + configs: An optional list of dict configurations. + config_files: An optional list of files to load + """ + + # Make sure we only initialize self._config once. + with self._config_init_lock: + if self._config is not None: + return + self._config = {} + + self._InitializeRecursive(configs=configs, config_files=config_files) + + def _InitializeRecursive(self, configs=None, config_files=None): + # This recurses through configs to create temporary files for each and + # take advantage of context managers to appropriately close those files. + # TODO(jbudorick): Remove this recursion if/when dependency_manager + # supports loading configurations directly from a dict. + if configs: + with tempfile.NamedTemporaryFile() as next_config_file: + next_config_file.write(json.dumps(configs[0])) + next_config_file.flush() + self._InitializeRecursive( + configs=configs[1:], + config_files=[next_config_file.name] + (config_files or [])) + else: + self._InitializeImpl(config_files) + + def _InitializeImpl(self, config_files): + if not config_files: + config_files = _DEFAULT_CONFIG_FILES + + dm = dependency_manager.DependencyManager( + [dependency_manager.BaseConfig(c) for c in config_files]) + platform = 'linux_android' + + android_sdk_path = dm.FetchPath('android_sdk', platform) + + if os.path.exists(android_sdk_path): + self._config['android_sdk_path'] = android_sdk_path + + # Chromium's hooks always download the SDK extras even if they aren't + # downloading the SDK, so we have to check for the existence of the + # particular components we care about. + + try: + adb_path = dm.FetchPath('adb_path', platform) + except dependency_manager.NoPathFoundError: + adb_path = os.path.join( + self.android_sdk_path, 'platform-tools', 'adb') + if os.path.exists(adb_path): + self._config['adb_path'] = adb_path + + build_tools_path = os.path.join(self.android_sdk_path, 'build-tools') + if os.path.exists(build_tools_path): + build_tools_contents = os.listdir(build_tools_path) + if build_tools_contents: + if len(build_tools_contents) > 1: + build_tools_contents.sort() + logging.warning( + 'More than one set of build-tools provided by the Android SDK:' + ' %s', ','.join(build_tools_contents)) + logging.warning('Defaulting to %s', build_tools_contents[-1]) + self._config['android_sdk_build_tools_path'] = os.path.join( + self.android_sdk_path, 'build-tools', build_tools_contents[-1]) + + try: + self._config['forwarder_host_path'] = dm.FetchPath( + 'forwarder_host', platform) + self._config['forwarder_device_path'] = dm.FetchPath( + 'forwarder_device', platform) + except dependency_manager.NoPathFoundError as e: + logging.warning(str(e)) + + try: + self._config['md5sum_host_path'] = dm.FetchPath('md5sum_host', platform) + self._config['md5sum_device_path'] = dm.FetchPath( + 'md5sum_device', platform) + except dependency_manager.NoPathFoundError as e: + logging.warning(str(e)) + + try: + self._config['pymock_path'] = dm.FetchPath('pymock', platform) + except dependency_manager.NoPathFoundError as e: + logging.warning(str(e)) + + def __getattr__(self, name): + if self._config is None: + self.Initialize() + + if name not in self._config: + raise AttributeError('devil environment has no %r attribute' % name) + + return self._config[name] + + +config = _Environment() + + +def GenerateDynamicConfig(deps): + """Generate a configuration dict from the provided deps dict. + + Args: + deps: A dict mapping dependency names to lists of local files. + Returns: + A BaseConfig-compatible dict. + """ + return { + 'config_type': 'BaseConfig', + 'dependencies': { + k: { + 'file_info': { + 'linux_android': { + 'local_paths': v + } + } + } for k, v in deps.iteritems() + } + } + diff --git a/build/android/devil/utils/lsusb.py b/build/android/devil/utils/lsusb.py index 9c98fa6..d322e5c 100644 --- a/build/android/devil/utils/lsusb.py +++ b/build/android/devil/utils/lsusb.py @@ -5,7 +5,7 @@ import logging import re -from pylib import cmd_helper +from devil.utils import cmd_helper _INDENTATION_RE = re.compile(r'^( *)') _LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):') diff --git a/build/android/devil/utils/mock_calls.py b/build/android/devil/utils/mock_calls.py index 59167ba..5c01d01 100644 --- a/build/android/devil/utils/mock_calls.py +++ b/build/android/devil/utils/mock_calls.py @@ -6,14 +6,12 @@ A test facility to assert call sequences while mocking their behavior. """ -import os import sys import unittest -from pylib import constants +from devil import devil_env -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=F0401 diff --git a/build/android/devil/utils/mock_calls_test.py b/build/android/devil/utils/mock_calls_test.py index ae2acbb..6caa543 100755 --- a/build/android/devil/utils/mock_calls_test.py +++ b/build/android/devil/utils/mock_calls_test.py @@ -12,12 +12,11 @@ import os import sys import unittest +from devil import devil_env from devil.android.sdk import version_codes from devil.utils import mock_calls -from pylib import constants -sys.path.append(os.path.join( - constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) +sys.path.append(devil_env.config.pymock_path) import mock # pylint: disable=F0401 diff --git a/build/android/devil_config.json b/build/android/devil_config.json new file mode 100644 index 0000000..2516656 --- /dev/null +++ b/build/android/devil_config.json @@ -0,0 +1,63 @@ +{ + "config_type": "BaseConfig", + "dependencies": { + "android_sdk": { + "file_info": { + "linux_android": { + "local_paths": [ + "../../third_party/android_tools/sdk" + ] + } + } + }, + "forwarder_device": { + "file_info": { + "linux_android": { + "local_paths": [ + "../../out/Debug/forwarder_dist", + "../../out/Release/forwarder_dist" + ] + } + } + }, + "forwarder_host": { + "file_info": { + "linux_android": { + "local_paths": [ + "../../out/Debug/host_forwarder", + "../../out/Release/host_forwarder" + ] + } + } + }, + "md5sum_device": { + "file_info": { + "linux_android": { + "local_paths": [ + "../../out/Debug/md5sum_dist", + "../../out/Release/md5sum_dist" + ] + } + } + }, + "md5sum_host": { + "file_info": { + "linux_android": { + "local_paths": [ + "../../out/Debug/md5sum_bin_host", + "../../out/Release/md5sum_bin_host" + ] + } + } + }, + "pymock": { + "file_info": { + "linux_android": { + "local_paths": [ + "../../third_party/pymock" + ] + } + } + } + } +} diff --git a/build/android/provision_devices.py b/build/android/provision_devices.py index 745248b..e7bb5d2 100755 --- a/build/android/provision_devices.py +++ b/build/android/provision_devices.py @@ -21,6 +21,7 @@ import subprocess import sys import time +from devil import devil_env from devil.android import battery_utils from devil.android import device_blacklist from devil.android import device_errors @@ -482,6 +483,8 @@ def main(): run_tests_helper.SetLogLevel(args.verbose) + devil_env.config.Initialize() + return ProvisionDevices(args) diff --git a/build/android/pylib/forwarder.py b/build/android/pylib/forwarder.py index 17a0114..ba4d51a 100644 --- a/build/android/pylib/forwarder.py +++ b/build/android/pylib/forwarder.py @@ -9,6 +9,7 @@ import logging import os import psutil +from devil import devil_env from devil.utils import cmd_helper from pylib import constants from pylib import valgrind_tools @@ -77,7 +78,7 @@ class Forwarder(object): device_serial = str(device) redirection_commands = [ - ['--adb=' + constants.GetAdbPath(), + ['--adb=' + devil_env.config.adb_path, '--serial-id=' + device_serial, '--map', str(device_port), str(host_port)] for device_port, host_port in port_pairs] @@ -197,11 +198,10 @@ class Forwarder(object): self._initialized_devices = set() self._device_to_host_port_map = dict() self._host_to_device_port_map = dict() - self._host_forwarder_path = os.path.join( - constants.GetOutDirectory(), 'host_forwarder') + self._host_forwarder_path = devil_env.config.forwarder_host_path assert os.path.exists(self._host_forwarder_path), 'Please build forwarder2' - self._device_forwarder_path_on_host = os.path.join( - constants.GetOutDirectory(), 'forwarder_dist') + self._device_forwarder_path_on_host = ( + devil_env.config.forwarder_device_path) self._InitHostLocked() @staticmethod @@ -216,7 +216,7 @@ class Forwarder(object): if not serial_with_port in instance._device_to_host_port_map: logging.error('Trying to unmap non-forwarded port %d', device_port) return - redirection_command = ['--adb=' + constants.GetAdbPath(), + redirection_command = ['--adb=' + devil_env.config.adb_path, '--serial-id=' + serial, '--unmap', str(device_port)] logging.info('Undo forwarding using command: %s', redirection_command) diff --git a/build/android/pylib/perf/test_runner.py b/build/android/pylib/perf/test_runner.py index 26e17ad..38887f3 100644 --- a/build/android/pylib/perf/test_runner.py +++ b/build/android/pylib/perf/test_runner.py @@ -74,6 +74,7 @@ _GIT_CR_POS_RE = re.compile(r'^Cr-Commit-Position: refs/heads/master@{#(\d+)}$') def _GetChromiumRevision(): + # pylint: disable=line-too-long """Get the git hash and commit position of the chromium master branch. See: https://chromium.googlesource.com/chromium/tools/build/+/master/scripts/slave/runtest.py#212 @@ -81,6 +82,7 @@ def _GetChromiumRevision(): Returns: A dictionary with 'revision' and 'commit_pos' keys. """ + # pylint: enable=line-too-long status, output = cmd_helper.GetCmdStatusAndOutput( ['git', 'log', '-n', '1', '--pretty=format:%H%n%B', 'HEAD'], constants.DIR_SOURCE_ROOT) diff --git a/build/android/pylintrc b/build/android/pylintrc index 9c2ab5a..8005a5d 100644 --- a/build/android/pylintrc +++ b/build/android/pylintrc @@ -1,3 +1,7 @@ +[FORMAT] + +max-line-length=80 + [MESSAGES CONTROL] disable=abstract-class-not-used,bad-continuation,bad-indentation,duplicate-code,fixme,invalid-name,locally-disabled,locally-enabled,missing-docstring,star-args,too-few-public-methods,too-many-arguments,too-many-branches,too-many-instance-attributes,too-many-lines,too-many-locals,too-many-public-methods,too-many-statements, diff --git a/build/android/test_runner.py b/build/android/test_runner.py index 16a2260..a804e63 100755 --- a/build/android/test_runner.py +++ b/build/android/test_runner.py @@ -17,6 +17,7 @@ import threading import unittest from devil import base_error +from devil import devil_env from devil.android import apk_helper from devil.android import device_blacklist from devil.android import device_errors @@ -49,6 +50,10 @@ from pylib.uiautomator import setup as uiautomator_setup from pylib.uiautomator import test_options as uiautomator_test_options +_DEVIL_STATIC_CONFIG_FILE = os.path.abspath(os.path.join( + constants.DIR_SOURCE_ROOT, 'build', 'android', 'devil_config.json')) + + def AddCommonOptions(parser): """Adds all common options to |parser|.""" @@ -113,6 +118,22 @@ def ProcessCommonOptions(args): constants.SetOutputDirectory(args.output_directory) if args.adb_path: constants.SetAdbPath(args.adb_path) + + output_binary = lambda p: os.path.join(constants.GetOutDirectory(), p) + devil_dynamic_deps = { + 'md5sum_host': [output_binary('md5sum_bin_host')], + 'md5sum_device': [output_binary('md5sum_dist')], + 'forwarder_host': [output_binary('host_forwarder')], + 'forwarder_device': [output_binary('forwarder_dist')], + } + if args.adb_path: + devil_dynamic_deps['adb_path'] = [args.adb_path] + + devil_dynamic_config = devil_env.GenerateDynamicConfig(devil_dynamic_deps) + devil_env.config.Initialize( + configs=[devil_dynamic_config], + config_files=[_DEVIL_STATIC_CONFIG_FILE]) + # Some things such as Forwarder require ADB to be in the environment path. adb_dir = os.path.dirname(constants.GetAdbPath()) if adb_dir and adb_dir not in os.environ['PATH'].split(os.pathsep): diff --git a/tools/telemetry/catapult_base/dependency_manager/dependency_manager.py b/tools/telemetry/catapult_base/dependency_manager/dependency_manager.py index 29f389f..485667f1 100644 --- a/tools/telemetry/catapult_base/dependency_manager/dependency_manager.py +++ b/tools/telemetry/catapult_base/dependency_manager/dependency_manager.py @@ -89,8 +89,6 @@ class DependencyManager(object): """ dependency_info = self._GetDependencyInfo(dependency, platform) if not dependency_info: - logging.error( - 'The dependency_manager was not initialized with the dependency.') if not try_support_binaries: raise exceptions.NoPathFoundError(dependency, platform) # TODO(aiolos): Remove the support_binaries call and always raise @@ -141,8 +139,6 @@ class DependencyManager(object): # system. dependency_info = self._GetDependencyInfo(dependency, platform) if not dependency_info: - logging.error( - 'The dependency_manager was not initialized with the dependency.') if not try_support_binaries: raise exceptions.NoPathFoundError(dependency, platform) return support_binaries.FindLocallyBuiltPath(dependency) -- cgit v1.1