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-Original-Commit-Position: refs/heads/master@{#306585} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: d10fd290b1ea2091e9fbaf0e2785b09313e0a7af
This commit is contained in:
Родитель
dcf5431654
Коммит
e2449ed33b
|
@ -45,6 +45,8 @@ class AdbWrapper(object):
|
|||
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
|
||||
|
|
|
@ -65,8 +65,8 @@ class DeviceUtils(object):
|
|||
"""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 @@ class DeviceUtils(object):
|
|||
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 @@ class DeviceUtils(object):
|
|||
|
||||
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):
|
||||
|
|
|
@ -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 @@ class DeviceUtilsNewImplTest(mock_calls.TestCase):
|
|||
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 @@ class DeviceUtilsGetMemoryUsageForPidTest(DeviceUtilsOldImplTest):
|
|||
self.assertEqual({}, self.device.GetMemoryUsageForPid(4321))
|
||||
|
||||
|
||||
class DeviceUtilsStrTest(DeviceUtilsOldImplTest):
|
||||
class DeviceUtilsStrTest(DeviceUtilsNewImplTest):
|
||||
|
||||
def testStr_noAdbCalls(self):
|
||||
with self.assertNoAdbCalls():
|
||||
def testStr_returnsSerial(self):
|
||||
with self.assertCalls(
|
||||
(self.call.adb.GetDeviceSerial(), '0123456789abcdef')):
|
||||
self.assertEqual('0123456789abcdef', str(self.device))
|
||||
|
||||
def testStr_noSerial(self):
|
||||
self.device = device_utils.DeviceUtils(None)
|
||||
with self.assertCalls('adb get-serialno', '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)
|
||||
|
|
|
@ -27,7 +27,8 @@ class InstrumentationTestRunnerTest(unittest.TestCase):
|
|||
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 @@ class InstrumentationTestRunnerTest(unittest.TestCase):
|
|||
'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())
|
||||
|
|
|
@ -122,16 +122,19 @@ class TestCase(unittest.TestCase):
|
|||
"""
|
||||
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."""
|
||||
|
|
Загрузка…
Ссылка в новой задаче