Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Unified Diff: devil/devil/android/device_utils_test.py

Issue 2973293002: [devil] Set permissions on install and gracefully handle errors (Closed)
Patch Set: small fix Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « devil/devil/android/device_utils.py ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: devil/devil/android/device_utils_test.py
diff --git a/devil/devil/android/device_utils_test.py b/devil/devil/android/device_utils_test.py
index 433a36b4ed79d2312221fed760c26b77f63726ba..67a552bfd66057a59f051143e5904ef18fb39807 100755
--- a/devil/devil/android/device_utils_test.py
+++ b/devil/devil/android/device_utils_test.py
@@ -142,6 +142,21 @@ class MockTempFile(object):
return self.file.name
+class MockLogger(mock.Mock):
+ def __init__(self, *args, **kwargs):
+ super(MockLogger, self).__init__(*args, **kwargs)
+ # TODO(perezju): Consider adding traps for error, info, etc.
+ self.warnings = []
+
+ def warning(self, message, *args):
+ self.warnings.append(message % args)
+
+
+def PatchLogger():
+ return mock.patch(
+ 'devil.android.device_utils.logger', new_callable=MockLogger)
+
+
class _PatchedFunction(object):
def __init__(self, patched=None, mocked=None):
@@ -2758,6 +2773,26 @@ class DeviceUtilsRestartAdbdTest(DeviceUtilsTest):
class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
+ def _PmGrantShellCall(self, package, permissions):
+ fragment = 'p=%s;for q in %s;' % (package, ' '.join(sorted(permissions)))
+ results = []
+ for permission, result in sorted(permissions.iteritems()):
+ if result:
+ output, status = result + '\n', 1
+ else:
+ output, status = '', 0
+ results.append(
+ '{output}{sep}{permission}{sep}{status}{sep}\n'.format(
+ output=output,
+ permission=permission,
+ status=status,
+ sep=device_utils._SHELL_OUTPUT_SEPARATOR
+ ))
+ return (
+ self.call.device.RunShellCommand(
+ AnyStringWith(fragment),
+ shell=True, raw_output=True, large_output=True, check_return=True),
+ ''.join(results))
def testGrantPermissions_none(self):
self.device.GrantPermissions('package', [])
@@ -2768,40 +2803,52 @@ class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
self.device.GrantPermissions('package', ['p1'])
def testGrantPermissions_one(self):
- permissions_cmd = 'pm grant package p1'
with self.patch_call(self.call.device.build_version_sdk,
return_value=version_codes.MARSHMALLOW):
with self.assertCalls(
- (self.call.device.RunShellCommand(
- permissions_cmd, shell=True, check_return=True), [])):
+ self._PmGrantShellCall('package', {'p1': 0})):
self.device.GrantPermissions('package', ['p1'])
def testGrantPermissions_multiple(self):
- permissions_cmd = 'pm grant package p1&&pm grant package p2'
with self.patch_call(self.call.device.build_version_sdk,
return_value=version_codes.MARSHMALLOW):
with self.assertCalls(
- (self.call.device.RunShellCommand(
- permissions_cmd, shell=True, check_return=True), [])):
+ self._PmGrantShellCall('package', {'p1': 0, 'p2': 0})):
self.device.GrantPermissions('package', ['p1', 'p2'])
def testGrantPermissions_WriteExtrnalStorage(self):
- permissions_cmd = (
- 'pm grant package android.permission.WRITE_EXTERNAL_STORAGE&&'
- 'pm grant package android.permission.READ_EXTERNAL_STORAGE')
- with self.patch_call(self.call.device.build_version_sdk,
- return_value=version_codes.MARSHMALLOW):
- with self.assertCalls(
- (self.call.device.RunShellCommand(
- permissions_cmd, shell=True, check_return=True), [])):
- self.device.GrantPermissions(
- 'package', ['android.permission.WRITE_EXTERNAL_STORAGE'])
+ WRITE = 'android.permission.WRITE_EXTERNAL_STORAGE'
+ READ = 'android.permission.READ_EXTERNAL_STORAGE'
+ with PatchLogger() as logger:
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ with self.assertCalls(
+ self._PmGrantShellCall('package', {READ: 0, WRITE: 0})):
+ self.device.GrantPermissions('package', [WRITE])
+ self.assertEqual(logger.warnings, [])
def testGrantPermissions_BlackList(self):
- with self.patch_call(self.call.device.build_version_sdk,
- return_value=version_codes.MARSHMALLOW):
- self.device.GrantPermissions(
- 'package', ['android.permission.ACCESS_MOCK_LOCATION'])
+ with PatchLogger() as logger:
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ with self.assertCalls(
+ self._PmGrantShellCall('package', {'p1': 0})):
+ self.device.GrantPermissions(
+ 'package', ['p1', 'foo.permission.C2D_MESSAGE'])
+ self.assertEqual(logger.warnings, [])
+
+ def testGrantPermissions_unchangeablePermision(self):
+ error_message = (
+ 'Operation not allowed: java.lang.SecurityException: '
+ 'Permission UNCHANGEABLE is not a changeable permission type')
+ with PatchLogger() as logger:
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ with self.assertCalls(
+ self._PmGrantShellCall('package', {'UNCHANGEABLE': error_message})):
+ self.device.GrantPermissions('package', ['UNCHANGEABLE'])
+ self.assertEqual(
+ logger.warnings, [mock.ANY, AnyStringWith('UNCHANGEABLE')])
class DeviecUtilsIsScreenOn(DeviceUtilsTest):
« no previous file with comments | « devil/devil/android/device_utils.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698