| 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 4c60514da05c2191d87874ffa025d68e0dd68da3..d7ac6d7c4a03c587db786640ff027e5a0e5b2a41 100644
|
| --- a/build/android/pylib/device/device_utils_test.py
|
| +++ b/build/android/pylib/device/device_utils_test.py
|
| @@ -10,7 +10,9 @@ Unit tests for the contents of device_utils.py (mostly DeviceUtils).
|
| # pylint: disable=W0212
|
| # pylint: disable=W0613
|
|
|
| +import collections
|
| import os
|
| +import re
|
| import signal
|
| import sys
|
| import unittest
|
| @@ -64,8 +66,9 @@ class DeviceUtilsOldImplTest(unittest.TestCase):
|
|
|
| class AndroidCommandsCalls(object):
|
|
|
| - def __init__(self, test_case, cmd_ret):
|
| + def __init__(self, test_case, cmd_ret, comp):
|
| self._cmds = cmd_ret
|
| + self._comp = comp
|
| self._test_case = test_case
|
| self._total_received = 0
|
|
|
| @@ -74,18 +77,20 @@ class DeviceUtilsOldImplTest(unittest.TestCase):
|
| atr_run_command.RunCommand.side_effect = lambda c, **kw: self._ret(c)
|
|
|
| def _ret(self, actual_cmd):
|
| - on_failure_fmt = ('\n'
|
| - ' received command: %s\n'
|
| - ' expected command: %s')
|
| - self._test_case.assertGreater(
|
| - len(self._cmds), self._total_received,
|
| - msg=on_failure_fmt % (actual_cmd, None))
|
| - expected_cmd, ret = self._cmds[self._total_received]
|
| - self._total_received += 1
|
| - self._test_case.assertEqual(
|
| - actual_cmd, expected_cmd,
|
| - msg=on_failure_fmt % (actual_cmd, expected_cmd))
|
| - return ret
|
| + if sys.exc_info()[0] is None:
|
| + on_failure_fmt = ('\n'
|
| + ' received command: %s\n'
|
| + ' expected command: %s')
|
| + self._test_case.assertGreater(
|
| + len(self._cmds), self._total_received,
|
| + msg=on_failure_fmt % (actual_cmd, None))
|
| + expected_cmd, ret = self._cmds[self._total_received]
|
| + self._total_received += 1
|
| + self._test_case.assertTrue(
|
| + self._comp(expected_cmd, actual_cmd),
|
| + msg=on_failure_fmt % (actual_cmd, expected_cmd))
|
| + return ret
|
| + return ''
|
|
|
| def __exit__(self, exc_type, _exc_val, exc_trace):
|
| if exc_type is None:
|
| @@ -99,18 +104,21 @@ class DeviceUtilsOldImplTest(unittest.TestCase):
|
| for (expected_cmd, _r), (_n, actual_args, actual_kwargs) in zip(
|
| self._cmds, atr_run_command.RunCommand.mock_calls):
|
| self._test_case.assertEqual(1, len(actual_args), msg=on_failure)
|
| - self._test_case.assertEqual(expected_cmd, actual_args[0],
|
| - msg=on_failure)
|
| + self._test_case.assertTrue(self._comp(expected_cmd, actual_args[0]),
|
| + msg=on_failure)
|
| self._test_case.assertTrue('timeout_time' in actual_kwargs,
|
| msg=on_failure)
|
| self._test_case.assertTrue('retry_count' in actual_kwargs,
|
| msg=on_failure)
|
|
|
| - def assertOldImplCalls(self, cmd, ret):
|
| - return type(self).AndroidCommandsCalls(self, [(cmd, ret)])
|
| + def assertNoAdbCalls(self):
|
| + return type(self).AndroidCommandsCalls(self, [], str.__eq__)
|
| +
|
| + def assertOldImplCalls(self, cmd, ret, comp=str.__eq__):
|
| + return type(self).AndroidCommandsCalls(self, [(cmd, ret)], comp)
|
|
|
| - def assertOldImplCallsSequence(self, cmd_ret):
|
| - return type(self).AndroidCommandsCalls(self, cmd_ret)
|
| + def assertOldImplCallsSequence(self, cmd_ret, comp=str.__eq__):
|
| + return type(self).AndroidCommandsCalls(self, cmd_ret, comp)
|
|
|
| def setUp(self):
|
| self.device = device_utils.DeviceUtils(
|
| @@ -717,6 +725,468 @@ class DeviceUtilsOldImplTest(unittest.TestCase):
|
| ''):
|
| self.device.SendKeyEvent(66)
|
|
|
| + def testPushChangedFiles_noHostPath(self):
|
| + with mock.patch('os.path.exists', return_value=False):
|
| + with self.assertRaises(device_errors.CommandFailedError):
|
| + self.device.PushChangedFiles('/test/host/path', '/test/device/path')
|
| +
|
| + def testPushChangedFiles_file_noChange(self):
|
| + self.device.old_interface._push_if_needed_cache = {}
|
| +
|
| + host_file_path = '/test/host/path'
|
| + device_file_path = '/test/device/path'
|
| +
|
| + mock_file_info = {
|
| + '/test/host/path': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 100,
|
| + },
|
| + }
|
| +
|
| + os_path_exists = mock.Mock()
|
| + os_path_exists.side_effect = lambda f: mock_file_info[f]['os.path.exists']
|
| +
|
| + os_path_isdir = mock.Mock()
|
| + os_path_isdir.side_effect = lambda f: mock_file_info[f]['os.path.isdir']
|
| +
|
| + os_path_getsize = mock.Mock()
|
| + os_path_getsize.side_effect = lambda f: mock_file_info[f]['os.path.getsize']
|
| +
|
| + self.device.old_interface.GetFilesChanged = mock.Mock(return_value=[])
|
| +
|
| + with mock.patch('os.path.exists', new=os_path_exists), (
|
| + mock.patch('os.path.isdir', new=os_path_isdir)), (
|
| + mock.patch('os.path.getsize', new=os_path_getsize)):
|
| + # GetFilesChanged is mocked, so its adb calls are omitted.
|
| + with self.assertNoAdbCalls():
|
| + self.device.PushChangedFiles(host_file_path, device_file_path)
|
| +
|
| + @staticmethod
|
| + def createMockOSStatResult(
|
| + 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 testPushChangedFiles_file_changed(self):
|
| + self.device.old_interface._push_if_needed_cache = {}
|
| +
|
| + host_file_path = '/test/host/path'
|
| + device_file_path = '/test/device/path'
|
| +
|
| + mock_file_info = {
|
| + '/test/host/path': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 100,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000000)
|
| + },
|
| + }
|
| +
|
| + os_path_exists = mock.Mock()
|
| + os_path_exists.side_effect = lambda f: mock_file_info[f]['os.path.exists']
|
| +
|
| + os_path_isdir = mock.Mock()
|
| + os_path_isdir.side_effect = lambda f: mock_file_info[f]['os.path.isdir']
|
| +
|
| + os_path_getsize = mock.Mock()
|
| + os_path_getsize.side_effect = lambda f: mock_file_info[f]['os.path.getsize']
|
| +
|
| + os_stat = mock.Mock()
|
| + os_stat.side_effect = lambda f: mock_file_info[f]['os.stat']
|
| +
|
| + self.device.old_interface.GetFilesChanged = mock.Mock(
|
| + return_value=[('/test/host/path', '/test/device/path')])
|
| +
|
| + with mock.patch('os.path.exists', new=os_path_exists), (
|
| + mock.patch('os.path.isdir', new=os_path_isdir)), (
|
| + mock.patch('os.path.getsize', new=os_path_getsize)), (
|
| + mock.patch('os.stat', new=os_stat)):
|
| + with self.assertOldImplCalls('adb -s 0123456789abcdef push '
|
| + '/test/host/path /test/device/path', '100 B/s (100 B in 1.000s)\r\n'):
|
| + self.device.PushChangedFiles(host_file_path, device_file_path)
|
| +
|
| + def testPushChangedFiles_directory_nothingChanged(self):
|
| + self.device.old_interface._push_if_needed_cache = {}
|
| +
|
| + host_file_path = '/test/host/path'
|
| + device_file_path = '/test/device/path'
|
| +
|
| + mock_file_info = {
|
| + '/test/host/path': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': True,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000000)
|
| + },
|
| + '/test/host/path/file1': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 251,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000001)
|
| + },
|
| + '/test/host/path/file2': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 252,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000002)
|
| + },
|
| + }
|
| +
|
| + os_path_exists = mock.Mock()
|
| + os_path_exists.side_effect = lambda f: mock_file_info[f]['os.path.exists']
|
| +
|
| + os_path_isdir = mock.Mock()
|
| + os_path_isdir.side_effect = lambda f: mock_file_info[f]['os.path.isdir']
|
| +
|
| + os_path_getsize = mock.Mock()
|
| + os_path_getsize.side_effect = lambda f: mock_file_info[f]['os.path.getsize']
|
| +
|
| + os_stat = mock.Mock()
|
| + os_stat.side_effect = lambda f: mock_file_info[f]['os.stat']
|
| +
|
| + self.device.old_interface.GetFilesChanged = mock.Mock(return_value=[])
|
| +
|
| + with mock.patch('os.path.exists', new=os_path_exists), (
|
| + mock.patch('os.path.isdir', new=os_path_isdir)), (
|
| + mock.patch('os.path.getsize', new=os_path_getsize)), (
|
| + mock.patch('os.stat', new=os_stat)):
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell 'mkdir -p \"/test/device/path\"'",
|
| + '')]):
|
| + self.device.PushChangedFiles(host_file_path, device_file_path)
|
| +
|
| + def testPushChangedFiles_directory_somethingChanged(self):
|
| + self.device.old_interface._push_if_needed_cache = {}
|
| +
|
| + host_file_path = '/test/host/path'
|
| + device_file_path = '/test/device/path'
|
| +
|
| + mock_file_info = {
|
| + '/test/host/path': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': True,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000000),
|
| + 'os.walk': [('/test/host/path', [], ['file1', 'file2'])]
|
| + },
|
| + '/test/host/path/file1': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000001)
|
| + },
|
| + '/test/host/path/file2': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000002)
|
| + },
|
| + }
|
| +
|
| + os_path_exists = mock.Mock()
|
| + os_path_exists.side_effect = lambda f: mock_file_info[f]['os.path.exists']
|
| +
|
| + os_path_isdir = mock.Mock()
|
| + os_path_isdir.side_effect = lambda f: mock_file_info[f]['os.path.isdir']
|
| +
|
| + os_path_getsize = mock.Mock()
|
| + os_path_getsize.side_effect = lambda f: mock_file_info[f]['os.path.getsize']
|
| +
|
| + os_stat = mock.Mock()
|
| + os_stat.side_effect = lambda f: mock_file_info[f]['os.stat']
|
| +
|
| + os_walk = mock.Mock()
|
| + os_walk.side_effect = lambda f: mock_file_info[f]['os.walk']
|
| +
|
| + self.device.old_interface.GetFilesChanged = mock.Mock(
|
| + return_value=[('/test/host/path/file1', '/test/device/path/file1')])
|
| +
|
| + with mock.patch('os.path.exists', new=os_path_exists), (
|
| + mock.patch('os.path.isdir', new=os_path_isdir)), (
|
| + mock.patch('os.path.getsize', new=os_path_getsize)), (
|
| + mock.patch('os.stat', new=os_stat)), (
|
| + mock.patch('os.walk', new=os_walk)):
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell 'mkdir -p \"/test/device/path\"'",
|
| + ''),
|
| + ('adb -s 0123456789abcdef push '
|
| + '/test/host/path/file1 /test/device/path/file1',
|
| + '256 B/s (256 B in 1.000s)\r\n')]):
|
| + self.device.PushChangedFiles(host_file_path, device_file_path)
|
| +
|
| + def testPushChangedFiles_directory_everythingChanged(self):
|
| + self.device.old_interface._push_if_needed_cache = {}
|
| +
|
| + host_file_path = '/test/host/path'
|
| + device_file_path = '/test/device/path'
|
| +
|
| + mock_file_info = {
|
| + '/test/host/path': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': True,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000000)
|
| + },
|
| + '/test/host/path/file1': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000001)
|
| + },
|
| + '/test/host/path/file2': {
|
| + 'os.path.exists': True,
|
| + 'os.path.isdir': False,
|
| + 'os.path.getsize': 256,
|
| + 'os.stat': self.createMockOSStatResult(st_mtime=1000000002)
|
| + },
|
| + }
|
| +
|
| + os_path_exists = mock.Mock()
|
| + os_path_exists.side_effect = lambda f: mock_file_info[f]['os.path.exists']
|
| +
|
| + os_path_isdir = mock.Mock()
|
| + os_path_isdir.side_effect = lambda f: mock_file_info[f]['os.path.isdir']
|
| +
|
| + os_path_getsize = mock.Mock()
|
| + os_path_getsize.side_effect = lambda f: mock_file_info[f]['os.path.getsize']
|
| +
|
| + os_stat = mock.Mock()
|
| + os_stat.side_effect = lambda f: mock_file_info[f]['os.stat']
|
| +
|
| + self.device.old_interface.GetFilesChanged = mock.Mock(
|
| + return_value=[('/test/host/path/file1', '/test/device/path/file1'),
|
| + ('/test/host/path/file2', '/test/device/path/file2')])
|
| +
|
| + with mock.patch('os.path.exists', new=os_path_exists), (
|
| + mock.patch('os.path.isdir', new=os_path_isdir)), (
|
| + mock.patch('os.path.getsize', new=os_path_getsize)), (
|
| + mock.patch('os.stat', new=os_stat)):
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell 'mkdir -p \"/test/device/path\"'",
|
| + ''),
|
| + ('adb -s 0123456789abcdef push /test/host/path /test/device/path',
|
| + '768 B/s (768 B in 1.000s)\r\n')]):
|
| + self.device.PushChangedFiles(host_file_path, device_file_path)
|
| +
|
| + def testFileExists_usingTest_fileExists(self):
|
| + with self.assertOldImplCalls(
|
| + "adb -s 0123456789abcdef shell "
|
| + "'test -e \"/data/app/test.file.exists\"; echo $?'",
|
| + '0\r\n'):
|
| + self.assertTrue(self.device.FileExists('/data/app/test.file.exists'))
|
| +
|
| + def testFileExists_usingTest_fileDoesntExist(self):
|
| + with self.assertOldImplCalls(
|
| + "adb -s 0123456789abcdef shell "
|
| + "'test -e \"/data/app/test.file.does.not.exist\"; echo $?'",
|
| + '1\r\n'):
|
| + self.assertFalse(self.device.FileExists(
|
| + '/data/app/test.file.does.not.exist'))
|
| +
|
| + def testFileExists_usingLs_fileExists(self):
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'test -e \"/data/app/test.file.exists\"; echo $?'",
|
| + 'test: not found\r\n'),
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'ls \"/data/app/test.file.exists\" >/dev/null 2>&1; echo $?'",
|
| + '0\r\n')]):
|
| + self.assertTrue(self.device.FileExists('/data/app/test.file.exists'))
|
| +
|
| + def testFileExists_usingLs_fileDoesntExist(self):
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'test -e \"/data/app/test.file.does.not.exist\"; echo $?'",
|
| + 'test: not found\r\n'),
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'ls \"/data/app/test.file.does.not.exist\" "
|
| + ">/dev/null 2>&1; echo $?'",
|
| + '1\r\n')]):
|
| + self.assertFalse(self.device.FileExists(
|
| + '/data/app/test.file.does.not.exist'))
|
| +
|
| + def testPullFile_existsOnDevice(self):
|
| + with mock.patch('os.path.exists', return_value=True):
|
| + with self.assertOldImplCallsSequence([
|
| + ('adb -s 0123456789abcdef shell '
|
| + 'ls /data/app/test.file.exists',
|
| + '/data/app/test.file.exists'),
|
| + ('adb -s 0123456789abcdef pull '
|
| + '/data/app/test.file.exists /test/file/host/path',
|
| + '100 B/s (100 bytes in 1.000s)\r\n')]):
|
| + self.device.PullFile('/data/app/test.file.exists',
|
| + '/test/file/host/path')
|
| +
|
| + def testPullFile_doesntExistOnDevice(self):
|
| + with mock.patch('os.path.exists', return_value=True):
|
| + with self.assertOldImplCalls(
|
| + 'adb -s 0123456789abcdef shell '
|
| + 'ls /data/app/test.file.does.not.exist',
|
| + '/data/app/test.file.does.not.exist: No such file or directory\r\n'):
|
| + with self.assertRaises(device_errors.CommandFailedError):
|
| + self.device.PullFile('/data/app/test.file.does.not.exist',
|
| + '/test/file/host/path')
|
| +
|
| + def testReadFile_exists(self):
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'cat \"/read/this/test/file\" 2>/dev/null'",
|
| + 'this is a test file')]):
|
| + self.assertEqual(['this is a test file'],
|
| + self.device.ReadFile('/read/this/test/file'))
|
| +
|
| + def testReadFile_doesNotExist(self):
|
| + with self.assertOldImplCalls(
|
| + "adb -s 0123456789abcdef shell "
|
| + "'cat \"/this/file/does.not.exist\" 2>/dev/null'",
|
| + ''):
|
| + self.device.ReadFile('/this/file/does.not.exist')
|
| +
|
| + def testReadFile_asRoot_withRoot(self):
|
| + self.device.old_interface._privileged_command_runner = (
|
| + self.device.old_interface.RunShellCommand)
|
| + self.device.old_interface._protected_file_access_method_initialized = True
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'cat \"/this/file/must.be.read.by.root\" 2> /dev/null'",
|
| + 'this is a test file\nread by root')]):
|
| + self.assertEqual(
|
| + ['this is a test file', 'read by root'],
|
| + self.device.ReadFile('/this/file/must.be.read.by.root',
|
| + as_root=True))
|
| +
|
| + def testReadFile_asRoot_withSu(self):
|
| + self.device.old_interface._privileged_command_runner = (
|
| + self.device.old_interface.RunShellCommandWithSU)
|
| + self.device.old_interface._protected_file_access_method_initialized = True
|
| + with self.assertOldImplCallsSequence([
|
| + ("adb -s 0123456789abcdef shell "
|
| + "'su -c cat \"/this/file/can.be.read.with.su\" 2> /dev/null'",
|
| + 'this is a test file\nread with su')]):
|
| + self.assertEqual(
|
| + ['this is a test file', 'read with su'],
|
| + self.device.ReadFile('/this/file/can.be.read.with.su',
|
| + as_root=True))
|
| +
|
| + def testReadFile_asRoot_rejected(self):
|
| + self.device.old_interface._privileged_command_runner = None
|
| + self.device.old_interface._protected_file_access_method_initialized = True
|
| + with self.assertRaises(device_errors.CommandFailedError):
|
| + self.device.ReadFile('/this/file/cannot.be.read.by.user',
|
| + as_root=True)
|
| +
|
| + def testWriteFile_basic(self):
|
| + mock_file = mock.MagicMock(spec=file)
|
| + mock_file.name = '/tmp/file/to.be.pushed'
|
| + mock_file.__enter__.return_value = mock_file
|
| + with mock.patch('tempfile.NamedTemporaryFile',
|
| + return_value=mock_file):
|
| + with self.assertOldImplCalls(
|
| + 'adb -s 0123456789abcdef push '
|
| + '/tmp/file/to.be.pushed /test/file/written.to.device',
|
| + '100 B/s (100 bytes in 1.000s)\r\n'):
|
| + self.device.WriteFile('/test/file/written.to.device',
|
| + 'new test file contents')
|
| + mock_file.write.assert_called_once_with('new test file contents')
|
| +
|
| + def testWriteFile_asRoot_withRoot(self):
|
| + self.device.old_interface._external_storage = '/fake/storage/path'
|
| + self.device.old_interface._privileged_command_runner = (
|
| + self.device.old_interface.RunShellCommand)
|
| + self.device.old_interface._protected_file_access_method_initialized = True
|
| +
|
| + mock_file = mock.MagicMock(spec=file)
|
| + mock_file.name = '/tmp/file/to.be.pushed'
|
| + mock_file.__enter__.return_value = mock_file
|
| + with mock.patch('tempfile.NamedTemporaryFile',
|
| + return_value=mock_file):
|
| + with self.assertOldImplCallsSequence(
|
| + cmd_ret=[
|
| + # Create temporary contents file
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'test -e \"/fake/storage/path/temp_file-\d+-\d+\"; "
|
| + "echo \$\?'",
|
| + '1\r\n'),
|
| + # Create temporary script file
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'test -e \"/fake/storage/path/temp_file-\d+-\d+\.sh\"; "
|
| + "echo \$\?'",
|
| + '1\r\n'),
|
| + # Set contents file
|
| + (r'adb -s 0123456789abcdef push /tmp/file/to\.be\.pushed '
|
| + '/fake/storage/path/temp_file-\d+\d+',
|
| + '100 B/s (100 bytes in 1.000s)\r\n'),
|
| + # Set script file
|
| + (r'adb -s 0123456789abcdef push /tmp/file/to\.be\.pushed '
|
| + '/fake/storage/path/temp_file-\d+\d+',
|
| + '100 B/s (100 bytes in 1.000s)\r\n'),
|
| + # Call script
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'sh /fake/storage/path/temp_file-\d+-\d+\.sh'", ''),
|
| + # Remove device temporaries
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'rm /fake/storage/path/temp_file-\d+-\d+\.sh'", ''),
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'rm /fake/storage/path/temp_file-\d+-\d+'", '')],
|
| + comp=re.match):
|
| + self.device.WriteFile('/test/file/written.to.device',
|
| + 'new test file contents', as_root=True)
|
| +
|
| + def testWriteFile_asRoot_withSu(self):
|
| + self.device.old_interface._external_storage = '/fake/storage/path'
|
| + self.device.old_interface._privileged_command_runner = (
|
| + self.device.old_interface.RunShellCommandWithSU)
|
| + self.device.old_interface._protected_file_access_method_initialized = True
|
| +
|
| + mock_file = mock.MagicMock(spec=file)
|
| + mock_file.name = '/tmp/file/to.be.pushed'
|
| + mock_file.__enter__.return_value = mock_file
|
| + with mock.patch('tempfile.NamedTemporaryFile',
|
| + return_value=mock_file):
|
| + with self.assertOldImplCallsSequence(
|
| + cmd_ret=[
|
| + # Create temporary contents file
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'test -e \"/fake/storage/path/temp_file-\d+-\d+\"; "
|
| + "echo \$\?'",
|
| + '1\r\n'),
|
| + # Create temporary script file
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'test -e \"/fake/storage/path/temp_file-\d+-\d+\.sh\"; "
|
| + "echo \$\?'",
|
| + '1\r\n'),
|
| + # Set contents file
|
| + (r'adb -s 0123456789abcdef push /tmp/file/to\.be\.pushed '
|
| + '/fake/storage/path/temp_file-\d+\d+',
|
| + '100 B/s (100 bytes in 1.000s)\r\n'),
|
| + # Set script file
|
| + (r'adb -s 0123456789abcdef push /tmp/file/to\.be\.pushed '
|
| + '/fake/storage/path/temp_file-\d+\d+',
|
| + '100 B/s (100 bytes in 1.000s)\r\n'),
|
| + # Call script
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'su -c sh /fake/storage/path/temp_file-\d+-\d+\.sh'", ''),
|
| + # Remove device temporaries
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'rm /fake/storage/path/temp_file-\d+-\d+\.sh'", ''),
|
| + (r"adb -s 0123456789abcdef shell "
|
| + "'rm /fake/storage/path/temp_file-\d+-\d+'", '')],
|
| + comp=re.match):
|
| + self.device.WriteFile('/test/file/written.to.device',
|
| + 'new test file contents', as_root=True)
|
| +
|
| + def testWriteFile_asRoot_rejected(self):
|
| + self.device.old_interface._privileged_command_runner = None
|
| + self.device.old_interface._protected_file_access_method_initialized = True
|
| + with self.assertRaises(device_errors.CommandFailedError):
|
| + self.device.WriteFile('/test/file/no.permissions.to.write',
|
| + 'new test file contents', as_root=True)
|
| +
|
|
|
| if __name__ == '__main__':
|
| unittest.main(verbosity=2)
|
|
|