OLD | NEW |
| (Empty) |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import unittest | |
6 | |
7 from telemetry import decorators | |
8 from telemetry.internal.platform import android_device | |
9 from telemetry.internal.platform import android_platform_backend | |
10 from telemetry.testing import options_for_unittests | |
11 from telemetry.testing import system_stub | |
12 import mock | |
13 | |
14 from devil.android import battery_utils | |
15 from devil.android import device_errors | |
16 from devil.android import device_utils | |
17 | |
18 class AndroidPlatformBackendTest(unittest.TestCase): | |
19 def setUp(self): | |
20 self._options = options_for_unittests.GetCopy() | |
21 self._stubs = system_stub.Override( | |
22 android_platform_backend, | |
23 ['perf_control', 'thermal_throttle', 'certutils', 'adb_install_cert', | |
24 'platformsettings']) | |
25 | |
26 # Skip _FixPossibleAdbInstability by setting psutil to None. | |
27 self._actual_ps_util = android_platform_backend.psutil | |
28 android_platform_backend.psutil = None | |
29 self.battery_patcher = mock.patch.object(battery_utils, 'BatteryUtils') | |
30 self.battery_patcher.start() | |
31 | |
32 def get_prop(name, cache=None): | |
33 del cache # unused | |
34 return {'ro.product.cpu.abi': 'armeabi-v7a'}.get(name) | |
35 | |
36 self.device_patcher = mock.patch.multiple( | |
37 device_utils.DeviceUtils, | |
38 HasRoot=mock.MagicMock(return_value=True), | |
39 GetProp=mock.MagicMock(side_effect=get_prop)) | |
40 self.device_patcher.start() | |
41 | |
42 def tearDown(self): | |
43 self._stubs.Restore() | |
44 android_platform_backend.psutil = self._actual_ps_util | |
45 self.battery_patcher.stop() | |
46 self.device_patcher.stop() | |
47 | |
48 @decorators.Disabled('chromeos') | |
49 def testIsSvelte(self): | |
50 with mock.patch('devil.android.device_utils.DeviceUtils.RunShellCommand', | |
51 return_value=0): | |
52 backend = android_platform_backend.AndroidPlatformBackend( | |
53 android_device.AndroidDevice('12345'), self._options) | |
54 self.assertTrue(backend.IsSvelte()) | |
55 | |
56 @decorators.Disabled('chromeos') | |
57 def testIsNotSvelte(self): | |
58 with mock.patch('devil.android.device_utils.DeviceUtils.RunShellCommand', | |
59 side_effect=device_errors.AdbCommandFailedError('m', 'n')): | |
60 backend = android_platform_backend.AndroidPlatformBackend( | |
61 android_device.AndroidDevice('12345'), self._options) | |
62 self.assertFalse(backend.IsSvelte()) | |
63 | |
64 @decorators.Disabled('chromeos') | |
65 def testGetCpuStats(self): | |
66 proc_stat_content = ( | |
67 '7702 (.android.chrome) S 167 167 0 0 -1 1077936448 ' | |
68 '3247 0 0 0 4 1 0 0 20 0 9 0 5603962 337379328 5867 ' | |
69 '4294967295 1074458624 1074463824 3197495984 3197494152 ' | |
70 '1074767676 0 4612 0 38136 4294967295 0 0 17 0 0 0 0 0 0 ' | |
71 '1074470376 1074470912 1102155776\n') | |
72 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
73 return_value=proc_stat_content): | |
74 backend = android_platform_backend.AndroidPlatformBackend( | |
75 android_device.AndroidDevice('12345'), self._options) | |
76 cpu_stats = backend.GetCpuStats('7702') | |
77 self.assertEquals(cpu_stats, {'CpuProcessTime': 0.05}) | |
78 | |
79 @decorators.Disabled('chromeos') | |
80 def testGetCpuStatsInvalidPID(self): | |
81 # Mock an empty /proc/pid/stat. | |
82 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
83 return_value=''): | |
84 backend = android_platform_backend.AndroidPlatformBackend( | |
85 android_device.AndroidDevice('1234'), self._options) | |
86 cpu_stats = backend.GetCpuStats('7702') | |
87 self.assertEquals(cpu_stats, {}) | |
88 | |
89 def testAndroidParseCpuStates(self): | |
90 cstate = { | |
91 'cpu0': 'C0\nC1\n103203424\n5342040\n300\n500\n1403232500', | |
92 'cpu1': 'C0\n124361858\n300\n1403232500' | |
93 } | |
94 expected_cstate = { | |
95 'cpu0': { | |
96 'WFI': 103203424, | |
97 'C0': 1403232391454536, | |
98 'C1': 5342040 | |
99 }, | |
100 'cpu1': { | |
101 'WFI': 124361858, | |
102 'C0': 1403232375638142 | |
103 } | |
104 } | |
105 # Use mock start and end times to allow for the test to calculate C0. | |
106 result = android_platform_backend.AndroidPlatformBackend.ParseCStateSample( | |
107 cstate) | |
108 for cpu in result: | |
109 for state in result[cpu]: | |
110 self.assertAlmostEqual(result[cpu][state], expected_cstate[cpu][state]) | |
111 | |
112 def testInstallTestCaFailure(self): | |
113 backend = android_platform_backend.AndroidPlatformBackend( | |
114 android_device.AndroidDevice('failure'), self._options) | |
115 backend.InstallTestCa() | |
116 self.assertFalse(backend.is_test_ca_installed) | |
117 | |
118 def testInstallTestCaSuccess(self): | |
119 backend = android_platform_backend.AndroidPlatformBackend( | |
120 android_device.AndroidDevice('success'), self._options) | |
121 backend.InstallTestCa() | |
122 self.assertTrue(backend.is_test_ca_installed) | |
123 | |
124 def testIsScreenLockedTrue(self): | |
125 test_input = ['a=b', 'mHasBeenInactive=true'] | |
126 backend = android_platform_backend.AndroidPlatformBackend( | |
127 android_device.AndroidDevice('success'), self._options) | |
128 self.assertTrue(backend._IsScreenLocked(test_input)) | |
129 | |
130 def testIsScreenLockedFalse(self): | |
131 test_input = ['a=b', 'mHasBeenInactive=false'] | |
132 backend = android_platform_backend.AndroidPlatformBackend( | |
133 android_device.AndroidDevice('success'), self._options) | |
134 self.assertFalse(backend._IsScreenLocked(test_input)) | |
135 | |
136 | |
137 class AndroidPlatformBackendPsutilTest(unittest.TestCase): | |
138 | |
139 class psutil_1_0(object): | |
140 version_info = (1, 0) | |
141 def __init__(self): | |
142 self.set_cpu_affinity_args = [] | |
143 class Process(object): | |
144 def __init__(self, parent): | |
145 self._parent = parent | |
146 self.name = 'adb' | |
147 def set_cpu_affinity(self, cpus): | |
148 self._parent.set_cpu_affinity_args.append(cpus) | |
149 def process_iter(self): | |
150 return [self.Process(self)] | |
151 | |
152 class psutil_2_0(object): | |
153 version_info = (2, 0) | |
154 def __init__(self): | |
155 self.set_cpu_affinity_args = [] | |
156 class Process(object): | |
157 def __init__(self, parent): | |
158 self._parent = parent | |
159 self.set_cpu_affinity_args = [] | |
160 def name(self): | |
161 return 'adb' | |
162 def cpu_affinity(self, cpus=None): | |
163 self._parent.set_cpu_affinity_args.append(cpus) | |
164 def process_iter(self): | |
165 return [self.Process(self)] | |
166 | |
167 def setUp(self): | |
168 self._options = options_for_unittests.GetCopy() | |
169 self._stubs = system_stub.Override( | |
170 android_platform_backend, | |
171 ['perf_control']) | |
172 self.battery_patcher = mock.patch.object(battery_utils, 'BatteryUtils') | |
173 self.battery_patcher.start() | |
174 self._actual_ps_util = android_platform_backend.psutil | |
175 | |
176 def get_prop(name, cache=None): | |
177 del cache # unused | |
178 return {'ro.product.cpu.abi': 'armeabi-v7a'}.get(name) | |
179 | |
180 self.device_patcher = mock.patch.multiple( | |
181 device_utils.DeviceUtils, | |
182 FileExists=mock.MagicMock(return_value=False), | |
183 GetProp=mock.MagicMock(side_effect=get_prop), | |
184 HasRoot=mock.MagicMock(return_value=True)) | |
185 self.device_patcher.start() | |
186 | |
187 def tearDown(self): | |
188 self._stubs.Restore() | |
189 android_platform_backend.psutil = self._actual_ps_util | |
190 self.battery_patcher.stop() | |
191 self.device_patcher.stop() | |
192 | |
193 @decorators.Disabled('chromeos') | |
194 def testPsutil1(self): | |
195 psutil = self.psutil_1_0() | |
196 android_platform_backend.psutil = psutil | |
197 | |
198 # Mock an empty /proc/pid/stat. | |
199 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
200 return_value=''): | |
201 backend = android_platform_backend.AndroidPlatformBackend( | |
202 android_device.AndroidDevice('1234'), self._options) | |
203 cpu_stats = backend.GetCpuStats('7702') | |
204 self.assertEquals({}, cpu_stats) | |
205 self.assertEquals([[0]], psutil.set_cpu_affinity_args) | |
206 | |
207 @decorators.Disabled('chromeos') | |
208 def testPsutil2(self): | |
209 psutil = self.psutil_2_0() | |
210 android_platform_backend.psutil = psutil | |
211 | |
212 # Mock an empty /proc/pid/stat. | |
213 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
214 return_value=''): | |
215 backend = android_platform_backend.AndroidPlatformBackend( | |
216 android_device.AndroidDevice('1234'), self._options) | |
217 cpu_stats = backend.GetCpuStats('7702') | |
218 self.assertEquals({}, cpu_stats) | |
219 self.assertEquals([[0]], psutil.set_cpu_affinity_args) | |
OLD | NEW |