| Index: build/android/pylib/device/device_utils_test.py
|
| diff --git a/build/android/pylib/device/device_utils_test.py b/build/android/pylib/device/device_utils_test.py
|
| index 216fc387cb7131702b545110b745e87fe198c933..bd671d1a4e980a6d98a7c39466345a1279ecb183 100755
|
| --- a/build/android/pylib/device/device_utils_test.py
|
| +++ b/build/android/pylib/device/device_utils_test.py
|
| @@ -72,6 +72,75 @@ class _PatchedFunction(object):
|
| self.mocked = mocked
|
|
|
|
|
| +class MockFileSystem(object):
|
| +
|
| + @staticmethod
|
| + def osStatResult(
|
| + st_mode=None, st_ino=None, st_dev=None, st_nlink=None, st_uid=None,
|
| + st_gid=None, st_size=None, st_atime=None, st_mtime=None, st_ctime=None):
|
| + MockOSStatResult = collections.namedtuple('MockOSStatResult', [
|
| + 'st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid', 'st_gid',
|
| + 'st_size', 'st_atime', 'st_mtime', 'st_ctime'])
|
| + return MockOSStatResult(st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid,
|
| + st_size, st_atime, st_mtime, st_ctime)
|
| +
|
| + MOCKED_FUNCTIONS = [
|
| + ('os.path.abspath', ''),
|
| + ('os.path.dirname', ''),
|
| + ('os.path.exists', False),
|
| + ('os.path.getsize', 0),
|
| + ('os.path.isdir', False),
|
| + ('os.stat', osStatResult.__func__()),
|
| + ('os.walk', []),
|
| + ]
|
| +
|
| + def _get(self, mocked, path, default_val):
|
| + if self._verbose:
|
| + logging.debug('%s(%s)' % (mocked, path))
|
| + return (self.mock_file_info[path][mocked]
|
| + if path in self.mock_file_info
|
| + else default_val)
|
| +
|
| + def _patched(self, target, default_val=None):
|
| + r = lambda f: self._get(target, f, default_val)
|
| + return _PatchedFunction(patched=mock.patch(target, side_effect=r))
|
| +
|
| + def __init__(self, verbose=False):
|
| + self.mock_file_info = {}
|
| + self._patched_functions = [
|
| + self._patched(m, d) for m, d in type(self).MOCKED_FUNCTIONS]
|
| + self._verbose = verbose
|
| +
|
| + def addMockFile(self, path, **kw):
|
| + self._addMockThing(path, False, **kw)
|
| +
|
| + def addMockDirectory(self, path, **kw):
|
| + self._addMockThing(path, True, **kw)
|
| +
|
| + def _addMockThing(self, path, is_dir, size=0, stat=None, walk=None):
|
| + if stat is None:
|
| + stat = self.osStatResult()
|
| + if walk is None:
|
| + walk = []
|
| + self.mock_file_info[path] = {
|
| + 'os.path.abspath': path,
|
| + 'os.path.dirname': '/' + '/'.join(path.strip('/').split('/')[:-1]),
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': is_dir,
|
| + 'os.path.getsize': size,
|
| + 'os.stat': stat,
|
| + 'os.walk': walk,
|
| + }
|
| +
|
| + def __enter__(self):
|
| + for p in self._patched_functions:
|
| + p.mocked = p.patched.__enter__()
|
| +
|
| + def __exit__(self, exc_type, exc_val, exc_tb):
|
| + for p in self._patched_functions:
|
| + p.patched.__exit__()
|
| +
|
| +
|
| class DeviceUtilsOldImplTest(unittest.TestCase):
|
|
|
| class AndroidCommandsCalls(object):
|
| @@ -787,68 +856,6 @@ class DeviceUtilsSendKeyEventTest(DeviceUtilsOldImplTest):
|
|
|
| class DeviceUtilsPushChangedFilesTest(DeviceUtilsOldImplTest):
|
|
|
| - class MockFileSystem(object):
|
| -
|
| - @staticmethod
|
| - def osStatResult(
|
| - st_mode=None, st_ino=None, st_dev=None, st_nlink=None, st_uid=None,
|
| - st_gid=None, st_size=None, st_atime=None, st_mtime=None, st_ctime=None):
|
| - MockOSStatResult = collections.namedtuple('MockOSStatResult', [
|
| - 'st_mode', 'st_ino', 'st_dev', 'st_nlink', 'st_uid', 'st_gid',
|
| - 'st_size', 'st_atime', 'st_mtime', 'st_ctime'])
|
| - return MockOSStatResult(st_mode, st_ino, st_dev, st_nlink, st_uid, st_gid,
|
| - st_size, st_atime, st_mtime, st_ctime)
|
| -
|
| - def _get(self, mocked, path, default_val):
|
| - return (self.mock_file_info[path][mocked]
|
| - if path in self.mock_file_info
|
| - else default_val)
|
| -
|
| - def _patched(self, target, default_val=None):
|
| - r = lambda f: self._get(target, f, default_val)
|
| - return _PatchedFunction(patched=mock.patch(target, side_effect=r))
|
| -
|
| - def __init__(self):
|
| - self.mock_file_info = {}
|
| - self._os_path_exists = self._patched('os.path.exists', default_val=False)
|
| - self._os_path_getsize = self._patched('os.path.getsize', default_val=0)
|
| - self._os_path_isdir = self._patched('os.path.isdir', default_val=False)
|
| - self._os_stat = self._patched('os.stat', default_val=self.osStatResult())
|
| - self._os_walk = self._patched('os.walk', default_val=[])
|
| -
|
| - def addMockFile(self, path, size, **kw):
|
| - self._addMockThing(path, size, False, **kw)
|
| -
|
| - def addMockDirectory(self, path, size, **kw):
|
| - self._addMockThing(path, size, True, **kw)
|
| -
|
| - def _addMockThing(self, path, size, is_dir, stat=None, walk=None):
|
| - if stat is None:
|
| - stat = self.osStatResult()
|
| - if walk is None:
|
| - walk = []
|
| - self.mock_file_info[path] = {
|
| - 'os.path.exists': True,
|
| - 'os.path.isdir': is_dir,
|
| - 'os.path.getsize': size,
|
| - 'os.stat': stat,
|
| - 'os.walk': walk,
|
| - }
|
| -
|
| - def __enter__(self):
|
| - self._os_path_exists.mocked = self._os_path_exists.patched.__enter__()
|
| - self._os_path_getsize.mocked = self._os_path_getsize.patched.__enter__()
|
| - self._os_path_isdir.mocked = self._os_path_isdir.patched.__enter__()
|
| - self._os_stat.mocked = self._os_stat.patched.__enter__()
|
| - self._os_walk.mocked = self._os_walk.patched.__enter__()
|
| -
|
| - def __exit__(self, exc_type, exc_val, exc_tb):
|
| - self._os_walk.patched.__exit__()
|
| - self._os_stat.patched.__exit__()
|
| - self._os_path_isdir.patched.__exit__(exc_type, exc_val, exc_tb)
|
| - self._os_path_getsize.patched.__exit__(exc_type, exc_val, exc_tb)
|
| - self._os_path_exists.patched.__exit__(exc_type, exc_val, exc_tb)
|
| -
|
|
|
| def testPushChangedFiles_noHostPath(self):
|
| with mock.patch('os.path.exists', return_value=False):
|
| @@ -861,8 +868,8 @@ class DeviceUtilsPushChangedFilesTest(DeviceUtilsOldImplTest):
|
| host_file_path = '/test/host/path'
|
| device_file_path = '/test/device/path'
|
|
|
| - mock_fs = self.MockFileSystem()
|
| - mock_fs.addMockFile(host_file_path, 100)
|
| + mock_fs = MockFileSystem()
|
| + mock_fs.addMockFile(host_file_path, size=100)
|
|
|
| self.device.old_interface.GetFilesChanged = mock.Mock(return_value=[])
|
|
|
| @@ -877,10 +884,10 @@ class DeviceUtilsPushChangedFilesTest(DeviceUtilsOldImplTest):
|
| host_file_path = '/test/host/path'
|
| device_file_path = '/test/device/path'
|
|
|
| - mock_fs = self.MockFileSystem()
|
| + mock_fs = MockFileSystem()
|
| mock_fs.addMockFile(
|
| - host_file_path, 100,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000000))
|
| + host_file_path, size=100,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000000))
|
|
|
| self.device.old_interface.GetFilesChanged = mock.Mock(
|
| return_value=[('/test/host/path', '/test/device/path')])
|
| @@ -896,16 +903,16 @@ class DeviceUtilsPushChangedFilesTest(DeviceUtilsOldImplTest):
|
| host_file_path = '/test/host/path'
|
| device_file_path = '/test/device/path'
|
|
|
| - mock_fs = self.MockFileSystem()
|
| + mock_fs = MockFileSystem()
|
| mock_fs.addMockDirectory(
|
| - host_file_path, 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000000))
|
| + host_file_path, size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000000))
|
| mock_fs.addMockFile(
|
| - host_file_path + '/file1', 251,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000001))
|
| + host_file_path + '/file1', size=251,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000001))
|
| mock_fs.addMockFile(
|
| - host_file_path + '/file2', 252,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000002))
|
| + host_file_path + '/file2', size=252,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000002))
|
|
|
| self.device.old_interface.GetFilesChanged = mock.Mock(return_value=[])
|
|
|
| @@ -921,17 +928,17 @@ class DeviceUtilsPushChangedFilesTest(DeviceUtilsOldImplTest):
|
| host_file_path = '/test/host/path'
|
| device_file_path = '/test/device/path'
|
|
|
| - mock_fs = self.MockFileSystem()
|
| + mock_fs = MockFileSystem()
|
| mock_fs.addMockDirectory(
|
| - host_file_path, 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000000),
|
| + host_file_path, size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000000),
|
| walk=[('/test/host/path', [], ['file1', 'file2'])])
|
| mock_fs.addMockFile(
|
| - host_file_path + '/file1', 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000001))
|
| + host_file_path + '/file1', size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000001))
|
| mock_fs.addMockFile(
|
| - host_file_path + '/file2', 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000002))
|
| + host_file_path + '/file2', size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000002))
|
|
|
| self.device.old_interface.GetFilesChanged = mock.Mock(
|
| return_value=[('/test/host/path/file1', '/test/device/path/file1')])
|
| @@ -951,16 +958,16 @@ class DeviceUtilsPushChangedFilesTest(DeviceUtilsOldImplTest):
|
| host_file_path = '/test/host/path'
|
| device_file_path = '/test/device/path'
|
|
|
| - mock_fs = self.MockFileSystem()
|
| + mock_fs = MockFileSystem()
|
| mock_fs.addMockDirectory(
|
| - host_file_path, 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000000))
|
| + host_file_path, size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000000))
|
| mock_fs.addMockFile(
|
| - host_file_path + '/file1', 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000001))
|
| + host_file_path + '/file1', size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000001))
|
| mock_fs.addMockFile(
|
| - host_file_path + '/file2', 256,
|
| - stat=self.MockFileSystem.osStatResult(st_mtime=1000000002))
|
| + host_file_path + '/file2', size=256,
|
| + stat=MockFileSystem.osStatResult(st_mtime=1000000002))
|
|
|
| self.device.old_interface.GetFilesChanged = mock.Mock(
|
| return_value=[('/test/host/path/file1', '/test/device/path/file1'),
|
| @@ -1356,6 +1363,86 @@ class DeviceUtilsSetPropTest(DeviceUtilsOldImplTest):
|
| self.device.SetProp('this.is.a.test.property', 'test_property_value')
|
|
|
|
|
| +class DeviceUtilsGetPidsTest(DeviceUtilsOldImplTest):
|
| +
|
| + def testGetPids_noMatches(self):
|
| + with self.assertCalls(
|
| + "adb -s 0123456789abcdef shell 'ps'",
|
| + 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n'
|
| + 'user 1000 100 1024 1024 ffffffff 00000000 no.match\r\n'):
|
| + self.assertEqual({}, self.device.GetPids('does.not.match'))
|
| +
|
| + def testGetPids_oneMatch(self):
|
| + with self.assertCalls(
|
| + "adb -s 0123456789abcdef shell 'ps'",
|
| + 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n'
|
| + 'user 1000 100 1024 1024 ffffffff 00000000 not.a.match\r\n'
|
| + 'user 1001 100 1024 1024 ffffffff 00000000 one.match\r\n'):
|
| + self.assertEqual({'one.match': '1001'}, self.device.GetPids('one.match'))
|
| +
|
| + def testGetPids_mutlipleMatches(self):
|
| + with self.assertCalls(
|
| + "adb -s 0123456789abcdef shell 'ps'",
|
| + 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n'
|
| + 'user 1000 100 1024 1024 ffffffff 00000000 not\r\n'
|
| + 'user 1001 100 1024 1024 ffffffff 00000000 one.match\r\n'
|
| + 'user 1002 100 1024 1024 ffffffff 00000000 two.match\r\n'
|
| + 'user 1003 100 1024 1024 ffffffff 00000000 three.match\r\n'):
|
| + self.assertEqual(
|
| + {'one.match': '1001', 'two.match': '1002', 'three.match': '1003'},
|
| + self.device.GetPids('match'))
|
| +
|
| + def testGetPids_exactMatch(self):
|
| + with self.assertCalls(
|
| + "adb -s 0123456789abcdef shell 'ps'",
|
| + 'USER PID PPID VSIZE RSS WCHAN PC NAME\r\n'
|
| + 'user 1000 100 1024 1024 ffffffff 00000000 not.exact.match\r\n'
|
| + 'user 1234 100 1024 1024 ffffffff 00000000 exact.match\r\n'):
|
| + self.assertEqual(
|
| + {'not.exact.match': '1000', 'exact.match': '1234'},
|
| + self.device.GetPids('exact.match'))
|
| +
|
| +
|
| +class DeviceUtilsTakeScreenshotTest(DeviceUtilsOldImplTest):
|
| +
|
| + def testTakeScreenshot_fileNameProvided(self):
|
| + mock_fs = MockFileSystem()
|
| + mock_fs.addMockDirectory('/test/host')
|
| + mock_fs.addMockFile('/test/host/screenshot.png')
|
| +
|
| + with mock_fs:
|
| + with self.assertCallsSequence(
|
| + cmd_ret=[
|
| + (r"adb -s 0123456789abcdef shell 'echo \$EXTERNAL_STORAGE'",
|
| + '/test/external/storage\r\n'),
|
| + (r"adb -s 0123456789abcdef shell '/system/bin/screencap -p \S+'",
|
| + ''),
|
| + (r"adb -s 0123456789abcdef shell ls \S+",
|
| + '/test/external/storage/screenshot.png\r\n'),
|
| + (r'adb -s 0123456789abcdef pull \S+ /test/host/screenshot.png',
|
| + '100 B/s (100 B in 1.000s)\r\n'),
|
| + (r"adb -s 0123456789abcdef shell 'rm -f \S+'", '')
|
| + ],
|
| + comp=re.match):
|
| + self.device.TakeScreenshot('/test/host/screenshot.png')
|
| +
|
| +
|
| +class DeviceUtilsGetIOStatsTest(DeviceUtilsOldImplTest):
|
| +
|
| + def testGetIOStats(self):
|
| + with self.assertCalls(
|
| + "adb -s 0123456789abcdef shell 'cat \"/proc/diskstats\" 2>/dev/null'",
|
| + '179 0 mmcblk0 1 2 3 4 5 6 7 8 9 10 11\r\n'):
|
| + self.assertEqual(
|
| + {
|
| + 'num_reads': 1,
|
| + 'num_writes': 5,
|
| + 'read_ms': 4,
|
| + 'write_ms': 8,
|
| + },
|
| + self.device.GetIOStats())
|
| +
|
| +
|
| if __name__ == '__main__':
|
| logging.getLogger().setLevel(logging.DEBUG)
|
| unittest.main(verbosity=2)
|
|
|