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): |