OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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) |
OLD | NEW |