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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « devil/devil/android/device_utils.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2014 The Chromium Authors. All rights reserved. 2 # Copyright 2014 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """ 6 """
7 Unit tests for the contents of device_utils.py (mostly DeviceUtils). 7 Unit tests for the contents of device_utils.py (mostly DeviceUtils).
8 """ 8 """
9 9
10 # pylint: disable=protected-access 10 # pylint: disable=protected-access
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 return self.file 135 return self.file
136 136
137 def __exit__(self, exc_type, exc_val, exc_tb): 137 def __exit__(self, exc_type, exc_val, exc_tb):
138 pass 138 pass
139 139
140 @property 140 @property
141 def name(self): 141 def name(self):
142 return self.file.name 142 return self.file.name
143 143
144 144
145 class MockLogger(mock.Mock):
146 def __init__(self, *args, **kwargs):
147 super(MockLogger, self).__init__(*args, **kwargs)
148 # TODO(perezju): Consider adding traps for error, info, etc.
149 self.warnings = []
150
151 def warning(self, message, *args):
152 self.warnings.append(message % args)
153
154
155 def PatchLogger():
156 return mock.patch(
157 'devil.android.device_utils.logger', new_callable=MockLogger)
158
159
145 class _PatchedFunction(object): 160 class _PatchedFunction(object):
146 161
147 def __init__(self, patched=None, mocked=None): 162 def __init__(self, patched=None, mocked=None):
148 self.patched = patched 163 self.patched = patched
149 self.mocked = mocked 164 self.mocked = mocked
150 165
151 166
152 def _AdbWrapperMock(test_serial, is_ready=True): 167 def _AdbWrapperMock(test_serial, is_ready=True):
153 adb = mock.Mock(spec=adb_wrapper.AdbWrapper) 168 adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
154 adb.__str__ = mock.Mock(return_value=test_serial) 169 adb.__str__ = mock.Mock(return_value=test_serial)
(...skipping 2596 matching lines...) Expand 10 before | Expand all | Expand 10 after
2751 (mock.call.devil.android.device_temp_file.DeviceTempFile( 2766 (mock.call.devil.android.device_temp_file.DeviceTempFile(
2752 self.adb, suffix='.sh'), MockTempFile(mock_temp_file)), 2767 self.adb, suffix='.sh'), MockTempFile(mock_temp_file)),
2753 self.call.device.WriteFile(mock.ANY, mock.ANY), 2768 self.call.device.WriteFile(mock.ANY, mock.ANY),
2754 (self.call.device.RunShellCommand( 2769 (self.call.device.RunShellCommand(
2755 ['source', mock_temp_file], check_return=True, as_root=True)), 2770 ['source', mock_temp_file], check_return=True, as_root=True)),
2756 self.call.adb.WaitForDevice()): 2771 self.call.adb.WaitForDevice()):
2757 self.device.RestartAdbd() 2772 self.device.RestartAdbd()
2758 2773
2759 2774
2760 class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest): 2775 class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
2776 def _PmGrantShellCall(self, package, permissions):
2777 fragment = 'p=%s;for q in %s;' % (package, ' '.join(sorted(permissions)))
2778 results = []
2779 for permission, result in sorted(permissions.iteritems()):
2780 if result:
2781 output, status = result + '\n', 1
2782 else:
2783 output, status = '', 0
2784 results.append(
2785 '{output}{sep}{permission}{sep}{status}{sep}\n'.format(
2786 output=output,
2787 permission=permission,
2788 status=status,
2789 sep=device_utils._SHELL_OUTPUT_SEPARATOR
2790 ))
2791 return (
2792 self.call.device.RunShellCommand(
2793 AnyStringWith(fragment),
2794 shell=True, raw_output=True, large_output=True, check_return=True),
2795 ''.join(results))
2761 2796
2762 def testGrantPermissions_none(self): 2797 def testGrantPermissions_none(self):
2763 self.device.GrantPermissions('package', []) 2798 self.device.GrantPermissions('package', [])
2764 2799
2765 def testGrantPermissions_underM(self): 2800 def testGrantPermissions_underM(self):
2766 with self.patch_call(self.call.device.build_version_sdk, 2801 with self.patch_call(self.call.device.build_version_sdk,
2767 return_value=version_codes.LOLLIPOP): 2802 return_value=version_codes.LOLLIPOP):
2768 self.device.GrantPermissions('package', ['p1']) 2803 self.device.GrantPermissions('package', ['p1'])
2769 2804
2770 def testGrantPermissions_one(self): 2805 def testGrantPermissions_one(self):
2771 permissions_cmd = 'pm grant package p1'
2772 with self.patch_call(self.call.device.build_version_sdk, 2806 with self.patch_call(self.call.device.build_version_sdk,
2773 return_value=version_codes.MARSHMALLOW): 2807 return_value=version_codes.MARSHMALLOW):
2774 with self.assertCalls( 2808 with self.assertCalls(
2775 (self.call.device.RunShellCommand( 2809 self._PmGrantShellCall('package', {'p1': 0})):
2776 permissions_cmd, shell=True, check_return=True), [])):
2777 self.device.GrantPermissions('package', ['p1']) 2810 self.device.GrantPermissions('package', ['p1'])
2778 2811
2779 def testGrantPermissions_multiple(self): 2812 def testGrantPermissions_multiple(self):
2780 permissions_cmd = 'pm grant package p1&&pm grant package p2'
2781 with self.patch_call(self.call.device.build_version_sdk, 2813 with self.patch_call(self.call.device.build_version_sdk,
2782 return_value=version_codes.MARSHMALLOW): 2814 return_value=version_codes.MARSHMALLOW):
2783 with self.assertCalls( 2815 with self.assertCalls(
2784 (self.call.device.RunShellCommand( 2816 self._PmGrantShellCall('package', {'p1': 0, 'p2': 0})):
2785 permissions_cmd, shell=True, check_return=True), [])):
2786 self.device.GrantPermissions('package', ['p1', 'p2']) 2817 self.device.GrantPermissions('package', ['p1', 'p2'])
2787 2818
2788 def testGrantPermissions_WriteExtrnalStorage(self): 2819 def testGrantPermissions_WriteExtrnalStorage(self):
2789 permissions_cmd = ( 2820 WRITE = 'android.permission.WRITE_EXTERNAL_STORAGE'
2790 'pm grant package android.permission.WRITE_EXTERNAL_STORAGE&&' 2821 READ = 'android.permission.READ_EXTERNAL_STORAGE'
2791 'pm grant package android.permission.READ_EXTERNAL_STORAGE') 2822 with PatchLogger() as logger:
2792 with self.patch_call(self.call.device.build_version_sdk, 2823 with self.patch_call(self.call.device.build_version_sdk,
2793 return_value=version_codes.MARSHMALLOW): 2824 return_value=version_codes.MARSHMALLOW):
2794 with self.assertCalls( 2825 with self.assertCalls(
2795 (self.call.device.RunShellCommand( 2826 self._PmGrantShellCall('package', {READ: 0, WRITE: 0})):
2796 permissions_cmd, shell=True, check_return=True), [])): 2827 self.device.GrantPermissions('package', [WRITE])
2797 self.device.GrantPermissions( 2828 self.assertEqual(logger.warnings, [])
2798 'package', ['android.permission.WRITE_EXTERNAL_STORAGE'])
2799 2829
2800 def testGrantPermissions_BlackList(self): 2830 def testGrantPermissions_BlackList(self):
2801 with self.patch_call(self.call.device.build_version_sdk, 2831 with PatchLogger() as logger:
2802 return_value=version_codes.MARSHMALLOW): 2832 with self.patch_call(self.call.device.build_version_sdk,
2803 self.device.GrantPermissions( 2833 return_value=version_codes.MARSHMALLOW):
2804 'package', ['android.permission.ACCESS_MOCK_LOCATION']) 2834 with self.assertCalls(
2835 self._PmGrantShellCall('package', {'p1': 0})):
2836 self.device.GrantPermissions(
2837 'package', ['p1', 'foo.permission.C2D_MESSAGE'])
2838 self.assertEqual(logger.warnings, [])
2839
2840 def testGrantPermissions_unchangeablePermision(self):
2841 error_message = (
2842 'Operation not allowed: java.lang.SecurityException: '
2843 'Permission UNCHANGEABLE is not a changeable permission type')
2844 with PatchLogger() as logger:
2845 with self.patch_call(self.call.device.build_version_sdk,
2846 return_value=version_codes.MARSHMALLOW):
2847 with self.assertCalls(
2848 self._PmGrantShellCall('package', {'UNCHANGEABLE': error_message})):
2849 self.device.GrantPermissions('package', ['UNCHANGEABLE'])
2850 self.assertEqual(
2851 logger.warnings, [mock.ANY, AnyStringWith('UNCHANGEABLE')])
2805 2852
2806 2853
2807 class DeviecUtilsIsScreenOn(DeviceUtilsTest): 2854 class DeviecUtilsIsScreenOn(DeviceUtilsTest):
2808 2855
2809 _L_SCREEN_ON = ['test=test mInteractive=true'] 2856 _L_SCREEN_ON = ['test=test mInteractive=true']
2810 _K_SCREEN_ON = ['test=test mScreenOn=true'] 2857 _K_SCREEN_ON = ['test=test mScreenOn=true']
2811 _L_SCREEN_OFF = ['mInteractive=false'] 2858 _L_SCREEN_OFF = ['mInteractive=false']
2812 _K_SCREEN_OFF = ['mScreenOn=false'] 2859 _K_SCREEN_OFF = ['mScreenOn=false']
2813 2860
2814 def testIsScreenOn_onPreL(self): 2861 def testIsScreenOn_onPreL(self):
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
2948 (self.call.device.GetProp('ro.build.version.sdk', cache=True), '24'), 2995 (self.call.device.GetProp('ro.build.version.sdk', cache=True), '24'),
2949 (self.call.adb.Shell('service call iphonesubinfo 1'), 2996 (self.call.adb.Shell('service call iphonesubinfo 1'),
2950 self.ShellError())): 2997 self.ShellError())):
2951 with self.assertRaises(device_errors.CommandFailedError): 2998 with self.assertRaises(device_errors.CommandFailedError):
2952 self.device.GetIMEI() 2999 self.device.GetIMEI()
2953 3000
2954 3001
2955 if __name__ == '__main__': 3002 if __name__ == '__main__':
2956 logging.getLogger().setLevel(logging.DEBUG) 3003 logging.getLogger().setLevel(logging.DEBUG)
2957 unittest.main(verbosity=2) 3004 unittest.main(verbosity=2)
OLDNEW
« 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