From d10fd290b1ea2091e9fbaf0e2785b09313e0a7af Mon Sep 17 00:00:00 2001 From: perezju Date: Wed, 3 Dec 2014 03:22:46 -0800 Subject: [PATCH] Make device serial required in AdbWrapper/DeviceUtils As a side effect, we also: - help migrate DeviceUtils.__str__ to AdbWrapper - fix bug with the presubmit pylib.instrumentation.tests_runner_test when no devices are attached. BUG=267773,430731 Review URL: https://codereview.chromium.org/762883002 Cr-Commit-Position: refs/heads/master@{#306585} --- build/android/pylib/device/adb_wrapper.py | 2 ++ build/android/pylib/device/device_utils.py | 16 +++------ .../android/pylib/device/device_utils_test.py | 36 ++++++++----------- .../pylib/instrumentation/test_runner_test.py | 5 ++- build/android/pylib/utils/mock_calls.py | 7 ++-- 5 files changed, 29 insertions(+), 37 deletions(-) diff --git a/build/android/pylib/device/adb_wrapper.py b/build/android/pylib/device/adb_wrapper.py index aef9ca323b00..4981f28df033 100644 --- a/build/android/pylib/device/adb_wrapper.py +++ b/build/android/pylib/device/adb_wrapper.py @@ -45,6 +45,8 @@ def __init__(self, device_serial): Args: device_serial: The device serial number as a string. """ + if not device_serial: + raise ValueError('A device serial must be specified') self._device_serial = str(device_serial) # pylint: disable=unused-argument diff --git a/build/android/pylib/device/device_utils.py b/build/android/pylib/device/device_utils.py index 9a19fa18c3c9..0ff3a8454799 100644 --- a/build/android/pylib/device/device_utils.py +++ b/build/android/pylib/device/device_utils.py @@ -65,8 +65,8 @@ def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT, """DeviceUtils constructor. Args: - device: Either a device serial, an existing AdbWrapper instance, an - an existing AndroidCommands instance, or nothing. + device: Either a device serial, an existing AdbWrapper instance, or an + an existing AndroidCommands instance. default_timeout: An integer containing the default number of seconds to wait for an operation to complete if no explicit value is provided. @@ -85,11 +85,8 @@ def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT, elif isinstance(device, pylib.android_commands.AndroidCommands): self.adb = adb_wrapper.AdbWrapper(device.GetDevice()) self.old_interface = device - elif not device: - self.adb = adb_wrapper.AdbWrapper('') - self.old_interface = pylib.android_commands.AndroidCommands() else: - raise ValueError('Unsupported type passed for argument "device"') + raise ValueError('Unsupported device value: %r' % device) self._commands_installed = None self._default_timeout = default_timeout self._default_retries = default_retries @@ -1145,12 +1142,7 @@ def GetMemoryUsageForPid(self, pid, timeout=None, retries=None): def __str__(self): """Returns the device serial.""" - s = self.old_interface.GetDevice() - if not s: - s = self.old_interface.Adb().GetSerialNumber() - if s == 'unknown': - raise device_errors.NoDevicesError() - return s + return self.adb.GetDeviceSerial() @staticmethod def parallel(devices=None, async=False): diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py index a2bbe0d2662f..760e61fa9476 100755 --- a/build/android/pylib/device/device_utils_test.py +++ b/build/android/pylib/device/device_utils_test.py @@ -43,28 +43,30 @@ class DeviceUtilsTest(unittest.TestCase): def testInitWithStr(self): serial_as_str = str('0123456789abcdef') d = device_utils.DeviceUtils('0123456789abcdef') - self.assertEqual(serial_as_str, d.old_interface.GetDevice()) + self.assertEqual(serial_as_str, d.adb.GetDeviceSerial()) def testInitWithUnicode(self): serial_as_unicode = unicode('fedcba9876543210') d = device_utils.DeviceUtils(serial_as_unicode) - self.assertEqual(serial_as_unicode, d.old_interface.GetDevice()) + self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial()) def testInitWithAdbWrapper(self): serial = '123456789abcdef0' a = adb_wrapper.AdbWrapper(serial) d = device_utils.DeviceUtils(a) - self.assertEqual(serial, d.old_interface.GetDevice()) + self.assertEqual(serial, d.adb.GetDeviceSerial()) def testInitWithAndroidCommands(self): serial = '0fedcba987654321' a = android_commands.AndroidCommands(device=serial) d = device_utils.DeviceUtils(a) - self.assertEqual(serial, d.old_interface.GetDevice()) + self.assertEqual(serial, d.adb.GetDeviceSerial()) - def testInitWithNone(self): - d = device_utils.DeviceUtils(None) - self.assertIsNone(d.old_interface.GetDevice()) + def testInitWithMissing_fails(self): + with self.assertRaises(ValueError): + device_utils.DeviceUtils(None) + with self.assertRaises(ValueError): + device_utils.DeviceUtils('') class MockTempFile(object): @@ -246,7 +248,7 @@ def setUp(self): self.adb.GetDeviceSerial.return_value = test_serial self.device = device_utils.DeviceUtils( self.adb, default_timeout=10, default_retries=0) - self.watchMethodCalls(self.call.adb) + self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial']) def ShellError(self, output=None, exit_code=1): def action(cmd, *args, **kwargs): @@ -1524,23 +1526,13 @@ def testGetMemoryUsageForPid_invalidPid(self): self.assertEqual({}, self.device.GetMemoryUsageForPid(4321)) -class DeviceUtilsStrTest(DeviceUtilsOldImplTest): +class DeviceUtilsStrTest(DeviceUtilsNewImplTest): - def testStr_noAdbCalls(self): - with self.assertNoAdbCalls(): - self.assertEqual('0123456789abcdef', str(self.device)) - - def testStr_noSerial(self): - self.device = device_utils.DeviceUtils(None) - with self.assertCalls('adb get-serialno', '0123456789abcdef'): + def testStr_returnsSerial(self): + with self.assertCalls( + (self.call.adb.GetDeviceSerial(), '0123456789abcdef')): self.assertEqual('0123456789abcdef', str(self.device)) - def testStr_noSerial_noDevices(self): - self.device = device_utils.DeviceUtils(None) - with self.assertCalls('adb get-serialno', 'unknown'), ( - self.assertRaises(device_errors.NoDevicesError)): - str(self.device) - if __name__ == '__main__': logging.getLogger().setLevel(logging.DEBUG) diff --git a/build/android/pylib/instrumentation/test_runner_test.py b/build/android/pylib/instrumentation/test_runner_test.py index 0f2845ea5bfa..fda1e23435c9 100755 --- a/build/android/pylib/instrumentation/test_runner_test.py +++ b/build/android/pylib/instrumentation/test_runner_test.py @@ -27,7 +27,8 @@ def setUp(self): options = mock.Mock() options.tool = '' package = mock.Mock() - self.instance = test_runner.TestRunner(options, None, 0, package) + self.instance = test_runner.TestRunner( + options, '123456789abcdef0', 0, package) def testParseAmInstrumentRawOutput_nothing(self): code, result, statuses = ( @@ -226,6 +227,8 @@ def testGenerateTestResult_testFailed(self): 'test': ['testMethod'], }), ] + self.instance.device.old_interface.DismissCrashDialogIfNeeded = mock.Mock( + return_value=None) result = self.instance._GenerateTestResult( 'test.package.TestClass#testMethod', statuses, 0, 1000) self.assertEqual(base_test_result.ResultType.FAIL, result.GetType()) diff --git a/build/android/pylib/utils/mock_calls.py b/build/android/pylib/utils/mock_calls.py index b10ebc68e167..fab9f2b4ecac 100644 --- a/build/android/pylib/utils/mock_calls.py +++ b/build/android/pylib/utils/mock_calls.py @@ -122,16 +122,19 @@ def watchCalls(self, calls): """ self._watched.update((call.name, call) for call in calls) - def watchMethodCalls(self, call): + def watchMethodCalls(self, call, ignore=None): """Watch all public methods of the target identified by a self.call. Args: call: a self.call instance indetifying an object + ignore: a list of public methods to ignore when watching for calls """ target = self.call_target(call) + if ignore is None: + ignore = [] self.watchCalls(getattr(call, method) for method in dir(target.__class__) - if not method.startswith('_')) + if not method.startswith('_') and not method in ignore) def clearWatched(self): """Clear the set of watched calls."""