OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
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 | |
4 # found in the LICENSE file. | |
5 | |
6 """ | |
7 Unit tests for the contents of battery_utils.py | |
8 """ | |
9 | |
10 # pylint: disable=W0613 | |
11 | |
12 import logging | |
13 import os | |
14 import sys | |
15 import unittest | |
16 | |
17 from pylib import constants | |
18 from pylib.device import battery_utils | |
19 from pylib.device import device_errors | |
20 from pylib.device import device_utils | |
21 from pylib.device import device_utils_test | |
22 from pylib.utils import mock_calls | |
23 | |
24 sys.path.append(os.path.join( | |
25 constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) | |
26 import mock # pylint: disable=F0401 | |
27 | |
28 _DUMPSYS_OUTPUT = [ | |
29 '9,0,i,uid,1000,test_package1', | |
30 '9,0,i,uid,1001,test_package2', | |
31 '9,1000,l,pwi,uid,1', | |
32 '9,1001,l,pwi,uid,2' | |
33 ] | |
34 | |
35 | |
36 class BatteryUtilsTest(mock_calls.TestCase): | |
37 | |
38 _NEXUS_5 = { | |
39 'name': 'Nexus 5', | |
40 'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT', | |
41 'enable_command': ( | |
42 'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && ' | |
43 'echo 1 > /sys/class/power_supply/usb/online'), | |
44 'disable_command': ( | |
45 'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && ' | |
46 'chmod 644 /sys/class/power_supply/usb/online && ' | |
47 'echo 0 > /sys/class/power_supply/usb/online'), | |
48 'charge_counter': None, | |
49 'voltage': None, | |
50 'current': None, | |
51 } | |
52 | |
53 _NEXUS_6 = { | |
54 'name': 'Nexus 6', | |
55 'witness_file': None, | |
56 'enable_command': None, | |
57 'disable_command': None, | |
58 'charge_counter': ( | |
59 '/sys/class/power_supply/max170xx_battery/charge_counter_ext'), | |
60 'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now', | |
61 'current': '/sys/class/power_supply/max170xx_battery/current_now', | |
62 } | |
63 | |
64 _NEXUS_10 = { | |
65 'name': 'Nexus 10', | |
66 'witness_file': None, | |
67 'enable_command': None, | |
68 'disable_command': None, | |
69 'charge_counter': ( | |
70 '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'), | |
71 'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now', | |
72 'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now', | |
73 } | |
74 | |
75 def ShellError(self, output=None, status=1): | |
76 def action(cmd, *args, **kwargs): | |
77 raise device_errors.AdbShellCommandFailedError( | |
78 cmd, output, status, str(self.device)) | |
79 if output is None: | |
80 output = 'Permission denied\n' | |
81 return action | |
82 | |
83 def setUp(self): | |
84 self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef') | |
85 self.device = device_utils.DeviceUtils( | |
86 self.adb, default_timeout=10, default_retries=0) | |
87 self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial']) | |
88 self.battery = battery_utils.BatteryUtils( | |
89 self.device, default_timeout=10, default_retries=0) | |
90 | |
91 | |
92 class BatteryUtilsInitTest(unittest.TestCase): | |
93 | |
94 def testInitWithDeviceUtil(self): | |
95 serial = '0fedcba987654321' | |
96 d = device_utils.DeviceUtils(serial) | |
97 b = battery_utils.BatteryUtils(d) | |
98 self.assertEqual(d, b._device) | |
99 | |
100 def testInitWithMissing_fails(self): | |
101 with self.assertRaises(TypeError): | |
102 battery_utils.BatteryUtils(None) | |
103 with self.assertRaises(TypeError): | |
104 battery_utils.BatteryUtils('') | |
105 | |
106 | |
107 class BatteryUtilsSetChargingTest(BatteryUtilsTest): | |
108 | |
109 @mock.patch('time.sleep', mock.Mock()) | |
110 def testSetCharging_enabled(self): | |
111 self.battery._cache['profile'] = self._NEXUS_5 | |
112 with self.assertCalls( | |
113 (self.call.device.RunShellCommand( | |
114 mock.ANY, check_return=True, as_root=True, large_output=True), []), | |
115 (self.call.battery.GetCharging(), False), | |
116 (self.call.battery.GetCharging(), True)): | |
117 self.battery.SetCharging(True) | |
118 | |
119 def testSetCharging_alreadyEnabled(self): | |
120 self.battery._cache['profile'] = self._NEXUS_5 | |
121 with self.assertCalls( | |
122 (self.call.device.RunShellCommand( | |
123 mock.ANY, check_return=True, as_root=True, large_output=True), []), | |
124 (self.call.battery.GetCharging(), True)): | |
125 self.battery.SetCharging(True) | |
126 | |
127 @mock.patch('time.sleep', mock.Mock()) | |
128 def testSetCharging_disabled(self): | |
129 self.battery._cache['profile'] = self._NEXUS_5 | |
130 with self.assertCalls( | |
131 (self.call.device.RunShellCommand( | |
132 mock.ANY, check_return=True, as_root=True, large_output=True), []), | |
133 (self.call.battery.GetCharging(), True), | |
134 (self.call.battery.GetCharging(), False)): | |
135 self.battery.SetCharging(False) | |
136 | |
137 | |
138 class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest): | |
139 | |
140 @mock.patch('time.sleep', mock.Mock()) | |
141 def testBatteryMeasurementWifi(self): | |
142 with self.assertCalls( | |
143 (self.call.device.RunShellCommand( | |
144 mock.ANY, retries=0, single_line=True, | |
145 timeout=10, check_return=True), '22'), | |
146 (self.call.battery._ClearPowerData(), True), | |
147 (self.call.device.RunShellCommand( | |
148 ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), | |
149 (self.call.device.RunShellCommand( | |
150 ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), | |
151 (self.call.battery.GetCharging(), False), | |
152 (self.call.device.RunShellCommand( | |
153 ['dumpsys', 'battery', 'reset'], check_return=True), []), | |
154 (self.call.battery.GetCharging(), False), | |
155 (self.call.device.RunShellCommand( | |
156 ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), | |
157 (self.call.battery.GetCharging(), False), | |
158 (self.call.device.RunShellCommand( | |
159 ['dumpsys', 'battery'], check_return=True), [])): | |
160 with self.battery.BatteryMeasurement(): | |
161 pass | |
162 | |
163 @mock.patch('time.sleep', mock.Mock()) | |
164 def testBatteryMeasurementUsb(self): | |
165 with self.assertCalls( | |
166 (self.call.device.RunShellCommand( | |
167 mock.ANY, retries=0, single_line=True, | |
168 timeout=10, check_return=True), '22'), | |
169 (self.call.battery._ClearPowerData(), True), | |
170 (self.call.device.RunShellCommand( | |
171 ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), | |
172 (self.call.device.RunShellCommand( | |
173 ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), | |
174 (self.call.battery.GetCharging(), False), | |
175 (self.call.device.RunShellCommand( | |
176 ['dumpsys', 'battery', 'reset'], check_return=True), []), | |
177 (self.call.battery.GetCharging(), False), | |
178 (self.call.device.RunShellCommand( | |
179 ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), | |
180 (self.call.battery.GetCharging(), True)): | |
181 with self.battery.BatteryMeasurement(): | |
182 pass | |
183 | |
184 | |
185 class BatteryUtilsGetPowerData(BatteryUtilsTest): | |
186 | |
187 def testGetPowerData(self): | |
188 with self.assertCalls( | |
189 (self.call.device.RunShellCommand( | |
190 ['dumpsys', 'batterystats', '-c'], | |
191 check_return=True, large_output=True), | |
192 _DUMPSYS_OUTPUT)): | |
193 data = self.battery.GetPowerData() | |
194 check = { | |
195 'test_package1': {'uid': '1000', 'data': [1.0]}, | |
196 'test_package2': {'uid': '1001', 'data': [2.0]} | |
197 } | |
198 self.assertEqual(data, check) | |
199 | |
200 def testGetPowerData_packageCollisionSame(self): | |
201 self.battery._cache['uids'] = {'test_package1': '1000'} | |
202 with self.assertCall( | |
203 self.call.device.RunShellCommand( | |
204 ['dumpsys', 'batterystats', '-c'], | |
205 check_return=True, large_output=True), | |
206 _DUMPSYS_OUTPUT): | |
207 data = self.battery.GetPowerData() | |
208 check = { | |
209 'test_package1': {'uid': '1000', 'data': [1.0]}, | |
210 'test_package2': {'uid': '1001', 'data': [2.0]} | |
211 } | |
212 self.assertEqual(data, check) | |
213 | |
214 def testGetPowerData_packageCollisionDifferent(self): | |
215 self.battery._cache['uids'] = {'test_package1': '1'} | |
216 with self.assertCall( | |
217 self.call.device.RunShellCommand( | |
218 ['dumpsys', 'batterystats', '-c'], | |
219 check_return=True, large_output=True), | |
220 _DUMPSYS_OUTPUT): | |
221 with self.assertRaises(device_errors.CommandFailedError): | |
222 self.battery.GetPowerData() | |
223 | |
224 def testGetPowerData_cacheCleared(self): | |
225 with self.assertCalls( | |
226 (self.call.device.RunShellCommand( | |
227 ['dumpsys', 'batterystats', '-c'], | |
228 check_return=True, large_output=True), | |
229 _DUMPSYS_OUTPUT)): | |
230 self.battery._cache.clear() | |
231 data = self.battery.GetPowerData() | |
232 check = { | |
233 'test_package1': {'uid': '1000', 'data': [1.0]}, | |
234 'test_package2': {'uid': '1001', 'data': [2.0]} | |
235 } | |
236 self.assertEqual(data, check) | |
237 | |
238 def testGetPackagePowerData(self): | |
239 with self.assertCalls( | |
240 (self.call.device.RunShellCommand( | |
241 ['dumpsys', 'batterystats', '-c'], | |
242 check_return=True, large_output=True), | |
243 _DUMPSYS_OUTPUT)): | |
244 data = self.battery.GetPackagePowerData('test_package2') | |
245 self.assertEqual(data, {'uid': '1001', 'data': [2.0]}) | |
246 | |
247 def testGetPackagePowerData_badPackage(self): | |
248 with self.assertCalls( | |
249 (self.call.device.RunShellCommand( | |
250 ['dumpsys', 'batterystats', '-c'], | |
251 check_return=True, large_output=True), | |
252 _DUMPSYS_OUTPUT)): | |
253 data = self.battery.GetPackagePowerData('not_a_package') | |
254 self.assertEqual(data, None) | |
255 | |
256 | |
257 class BatteryUtilsChargeDevice(BatteryUtilsTest): | |
258 | |
259 @mock.patch('time.sleep', mock.Mock()) | |
260 def testChargeDeviceToLevel(self): | |
261 with self.assertCalls( | |
262 (self.call.battery.SetCharging(True)), | |
263 (self.call.battery.GetBatteryInfo(), {'level': '50'}), | |
264 (self.call.battery.GetBatteryInfo(), {'level': '100'})): | |
265 self.battery.ChargeDeviceToLevel(95) | |
266 | |
267 | |
268 class BatteryUtilsDischargeDevice(BatteryUtilsTest): | |
269 | |
270 @mock.patch('time.sleep', mock.Mock()) | |
271 def testDischargeDevice_exact(self): | |
272 with self.assertCalls( | |
273 (self.call.battery.GetBatteryInfo(), {'level': '100'}), | |
274 (self.call.battery.SetCharging(False)), | |
275 (self.call.battery.SetCharging(True)), | |
276 (self.call.battery.GetBatteryInfo(), {'level': '99'})): | |
277 self.battery._DischargeDevice(1) | |
278 | |
279 @mock.patch('time.sleep', mock.Mock()) | |
280 def testDischargeDevice_over(self): | |
281 with self.assertCalls( | |
282 (self.call.battery.GetBatteryInfo(), {'level': '100'}), | |
283 (self.call.battery.SetCharging(False)), | |
284 (self.call.battery.SetCharging(True)), | |
285 (self.call.battery.GetBatteryInfo(), {'level': '50'})): | |
286 self.battery._DischargeDevice(1) | |
287 | |
288 @mock.patch('time.sleep', mock.Mock()) | |
289 def testDischargeDevice_takeslong(self): | |
290 with self.assertCalls( | |
291 (self.call.battery.GetBatteryInfo(), {'level': '100'}), | |
292 (self.call.battery.SetCharging(False)), | |
293 (self.call.battery.SetCharging(True)), | |
294 (self.call.battery.GetBatteryInfo(), {'level': '100'}), | |
295 (self.call.battery.SetCharging(False)), | |
296 (self.call.battery.SetCharging(True)), | |
297 (self.call.battery.GetBatteryInfo(), {'level': '99'}), | |
298 (self.call.battery.SetCharging(False)), | |
299 (self.call.battery.SetCharging(True)), | |
300 (self.call.battery.GetBatteryInfo(), {'level': '98'}), | |
301 (self.call.battery.SetCharging(False)), | |
302 (self.call.battery.SetCharging(True)), | |
303 (self.call.battery.GetBatteryInfo(), {'level': '97'})): | |
304 self.battery._DischargeDevice(3) | |
305 | |
306 @mock.patch('time.sleep', mock.Mock()) | |
307 def testDischargeDevice_dischargeTooClose(self): | |
308 with self.assertCalls( | |
309 (self.call.battery.GetBatteryInfo(), {'level': '100'})): | |
310 self.battery._DischargeDevice(99) | |
311 | |
312 @mock.patch('time.sleep', mock.Mock()) | |
313 def testDischargeDevice_percentageOutOfBounds(self): | |
314 with self.assertCalls( | |
315 (self.call.battery.GetBatteryInfo(), {'level': '100'})): | |
316 with self.assertRaises(ValueError): | |
317 self.battery._DischargeDevice(100) | |
318 with self.assertCalls( | |
319 (self.call.battery.GetBatteryInfo(), {'level': '100'})): | |
320 with self.assertRaises(ValueError): | |
321 self.battery._DischargeDevice(0) | |
322 | |
323 | |
324 class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest): | |
325 | |
326 def testGetBatteryInfo_normal(self): | |
327 with self.assertCall( | |
328 self.call.device.RunShellCommand( | |
329 ['dumpsys', 'battery'], check_return=True), | |
330 [ | |
331 'Current Battery Service state:', | |
332 ' AC powered: false', | |
333 ' USB powered: true', | |
334 ' level: 100', | |
335 ' temperature: 321', | |
336 ]): | |
337 self.assertEquals( | |
338 { | |
339 'AC powered': 'false', | |
340 'USB powered': 'true', | |
341 'level': '100', | |
342 'temperature': '321', | |
343 }, | |
344 self.battery.GetBatteryInfo()) | |
345 | |
346 def testGetBatteryInfo_nothing(self): | |
347 with self.assertCall( | |
348 self.call.device.RunShellCommand( | |
349 ['dumpsys', 'battery'], check_return=True), []): | |
350 self.assertEquals({}, self.battery.GetBatteryInfo()) | |
351 | |
352 | |
353 class BatteryUtilsGetChargingTest(BatteryUtilsTest): | |
354 | |
355 def testGetCharging_usb(self): | |
356 with self.assertCall( | |
357 self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}): | |
358 self.assertTrue(self.battery.GetCharging()) | |
359 | |
360 def testGetCharging_usbFalse(self): | |
361 with self.assertCall( | |
362 self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}): | |
363 self.assertFalse(self.battery.GetCharging()) | |
364 | |
365 def testGetCharging_ac(self): | |
366 with self.assertCall( | |
367 self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}): | |
368 self.assertTrue(self.battery.GetCharging()) | |
369 | |
370 def testGetCharging_wireless(self): | |
371 with self.assertCall( | |
372 self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}): | |
373 self.assertTrue(self.battery.GetCharging()) | |
374 | |
375 def testGetCharging_unknown(self): | |
376 with self.assertCall( | |
377 self.call.battery.GetBatteryInfo(), {'level': '42'}): | |
378 self.assertFalse(self.battery.GetCharging()) | |
379 | |
380 | |
381 class BatteryUtilsGetNetworkDataTest(BatteryUtilsTest): | |
382 | |
383 def testGetNetworkData_noDataUsage(self): | |
384 with self.assertCalls( | |
385 (self.call.device.RunShellCommand( | |
386 ['dumpsys', 'batterystats', '-c'], | |
387 check_return=True, large_output=True), | |
388 _DUMPSYS_OUTPUT), | |
389 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), | |
390 self.ShellError()), | |
391 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), | |
392 self.ShellError())): | |
393 self.assertEquals(self.battery.GetNetworkData('test_package1'), (0, 0)) | |
394 | |
395 def testGetNetworkData_badPackage(self): | |
396 with self.assertCall( | |
397 self.call.device.RunShellCommand( | |
398 ['dumpsys', 'batterystats', '-c'], | |
399 check_return=True, large_output=True), | |
400 _DUMPSYS_OUTPUT): | |
401 self.assertEqual(self.battery.GetNetworkData('asdf'), None) | |
402 | |
403 def testGetNetworkData_packageNotCached(self): | |
404 with self.assertCalls( | |
405 (self.call.device.RunShellCommand( | |
406 ['dumpsys', 'batterystats', '-c'], | |
407 check_return=True, large_output=True), | |
408 _DUMPSYS_OUTPUT), | |
409 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), | |
410 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): | |
411 self.assertEqual(self.battery.GetNetworkData('test_package1'), (1,2)) | |
412 | |
413 def testGetNetworkData_packageCached(self): | |
414 self.battery._cache['uids'] = {'test_package1': '1000'} | |
415 with self.assertCalls( | |
416 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), | |
417 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): | |
418 self.assertEqual(self.battery.GetNetworkData('test_package1'), (1,2)) | |
419 | |
420 def testGetNetworkData_clearedCache(self): | |
421 with self.assertCalls( | |
422 (self.call.device.RunShellCommand( | |
423 ['dumpsys', 'batterystats', '-c'], | |
424 check_return=True, large_output=True), | |
425 _DUMPSYS_OUTPUT), | |
426 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), | |
427 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): | |
428 self.battery._cache.clear() | |
429 self.assertEqual(self.battery.GetNetworkData('test_package1'), (1,2)) | |
430 | |
431 | |
432 class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest): | |
433 | |
434 @mock.patch('time.sleep', mock.Mock()) | |
435 def testLetBatteryCoolToTemperature_startUnder(self): | |
436 self.battery._cache['profile'] = self._NEXUS_6 | |
437 with self.assertCalls( | |
438 (self.call.battery.EnableBatteryUpdates(), []), | |
439 (self.call.battery.GetBatteryInfo(), {'temperature': '500'})): | |
440 self.battery.LetBatteryCoolToTemperature(600) | |
441 | |
442 @mock.patch('time.sleep', mock.Mock()) | |
443 def testLetBatteryCoolToTemperature_startOver(self): | |
444 self.battery._cache['profile'] = self._NEXUS_6 | |
445 with self.assertCalls( | |
446 (self.call.battery.EnableBatteryUpdates(), []), | |
447 (self.call.battery.GetBatteryInfo(), {'temperature': '500'}), | |
448 (self.call.battery.GetBatteryInfo(), {'temperature': '400'})): | |
449 self.battery.LetBatteryCoolToTemperature(400) | |
450 | |
451 @mock.patch('time.sleep', mock.Mock()) | |
452 def testLetBatteryCoolToTemperature_nexus5Hot(self): | |
453 self.battery._cache['profile'] = self._NEXUS_5 | |
454 with self.assertCalls( | |
455 (self.call.battery.EnableBatteryUpdates(), []), | |
456 (self.call.battery.GetBatteryInfo(), {'temperature': '500'}), | |
457 (self.call.battery._DischargeDevice(1), []), | |
458 (self.call.battery.GetBatteryInfo(), {'temperature': '400'})): | |
459 self.battery.LetBatteryCoolToTemperature(400) | |
460 | |
461 @mock.patch('time.sleep', mock.Mock()) | |
462 def testLetBatteryCoolToTemperature_nexus5Cool(self): | |
463 self.battery._cache['profile'] = self._NEXUS_5 | |
464 with self.assertCalls( | |
465 (self.call.battery.EnableBatteryUpdates(), []), | |
466 (self.call.battery.GetBatteryInfo(), {'temperature': '400'})): | |
467 self.battery.LetBatteryCoolToTemperature(400) | |
468 | |
469 | |
470 class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest): | |
471 | |
472 def testSupportsFuelGauge_false(self): | |
473 self.battery._cache['profile'] = self._NEXUS_5 | |
474 self.assertFalse(self.battery.SupportsFuelGauge()) | |
475 | |
476 def testSupportsFuelGauge_trueMax(self): | |
477 self.battery._cache['profile'] = self._NEXUS_6 | |
478 # TODO(rnephew): Change this to assertTrue when we have support for | |
479 # disabling hardware charging on nexus 6. | |
480 self.assertFalse(self.battery.SupportsFuelGauge()) | |
481 | |
482 def testSupportsFuelGauge_trueDS(self): | |
483 self.battery._cache['profile'] = self._NEXUS_10 | |
484 # TODO(rnephew): Change this to assertTrue when we have support for | |
485 # disabling hardware charging on nexus 10. | |
486 self.assertFalse(self.battery.SupportsFuelGauge()) | |
487 | |
488 | |
489 class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest): | |
490 | |
491 def testGetFuelGaugeChargeCounter_noFuelGauge(self): | |
492 self.battery._cache['profile'] = self._NEXUS_5 | |
493 with self.assertRaises(device_errors.CommandFailedError): | |
494 self.battery.GetFuelGaugeChargeCounter() | |
495 | |
496 def testGetFuelGaugeChargeCounter_fuelGaugePresent(self): | |
497 self.battery._cache['profile']= self._NEXUS_6 | |
498 with self.assertCalls( | |
499 (self.call.battery.SupportsFuelGauge(), True), | |
500 (self.call.device.ReadFile(mock.ANY), '123')): | |
501 self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123) | |
502 | |
503 | |
504 class BatteryUtilsTieredSetCharging(BatteryUtilsTest): | |
505 | |
506 @mock.patch('time.sleep', mock.Mock()) | |
507 def testTieredSetCharging_softwareSetTrue(self): | |
508 self.battery._cache['profile'] = self._NEXUS_6 | |
509 with self.assertCalls( | |
510 (self.call.battery.GetCharging(), False), | |
511 (self.call.device.RunShellCommand( | |
512 ['dumpsys', 'battery', 'reset'], check_return=True), []), | |
513 (self.call.battery.GetCharging(), False), | |
514 (self.call.device.RunShellCommand( | |
515 ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), | |
516 (self.call.battery.GetCharging(), True)): | |
517 self.battery.TieredSetCharging(True) | |
518 | |
519 @mock.patch('time.sleep', mock.Mock()) | |
520 def testTieredSetCharging_softwareSetFalse(self): | |
521 self.battery._cache['profile'] = self._NEXUS_6 | |
522 with self.assertCalls( | |
523 (self.call.battery.GetCharging(), True), | |
524 (self.call.battery._ClearPowerData(), True), | |
525 (self.call.device.RunShellCommand( | |
526 ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), | |
527 (self.call.device.RunShellCommand( | |
528 ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), | |
529 (self.call.battery.GetCharging(), False)): | |
530 self.battery.TieredSetCharging(False) | |
531 | |
532 @mock.patch('time.sleep', mock.Mock()) | |
533 def testTieredSetCharging_hardwareSetTrue(self): | |
534 self.battery._cache['profile'] = self._NEXUS_5 | |
535 with self.assertCalls( | |
536 (self.call.battery.GetCharging(), False), | |
537 (self.call.battery.SetCharging(True))): | |
538 self.battery.TieredSetCharging(True) | |
539 | |
540 @mock.patch('time.sleep', mock.Mock()) | |
541 def testTieredSetCharging_hardwareSetFalse(self): | |
542 self.battery._cache['profile'] = self._NEXUS_5 | |
543 with self.assertCalls( | |
544 (self.call.battery.GetCharging(), True), | |
545 (self.call.battery._ClearPowerData(), True), | |
546 (self.call.battery.SetCharging(False))): | |
547 self.battery.TieredSetCharging(False) | |
548 | |
549 def testTieredSetCharging_expectedStateAlreadyTrue(self): | |
550 with self.assertCalls((self.call.battery.GetCharging(), True)): | |
551 self.battery.TieredSetCharging(True) | |
552 | |
553 def testTieredSetCharging_expectedStateAlreadyFalse(self): | |
554 with self.assertCalls((self.call.battery.GetCharging(), False)): | |
555 self.battery.TieredSetCharging(False) | |
556 | |
557 | |
558 class BatteryUtilsPowerMeasurement(BatteryUtilsTest): | |
559 | |
560 def testPowerMeasurement_hardware(self): | |
561 self.battery._cache['profile'] = self._NEXUS_5 | |
562 with self.assertCalls( | |
563 (self.call.battery.GetCharging(), True), | |
564 (self.call.battery._ClearPowerData(), True), | |
565 (self.call.battery.SetCharging(False)), | |
566 (self.call.battery.GetCharging(), False), | |
567 (self.call.battery.SetCharging(True))): | |
568 with self.battery.PowerMeasurement(): | |
569 pass | |
570 | |
571 @mock.patch('time.sleep', mock.Mock()) | |
572 def testPowerMeasurement_software(self): | |
573 self.battery._cache['profile'] = self._NEXUS_6 | |
574 with self.assertCalls( | |
575 (self.call.battery.GetCharging(), True), | |
576 (self.call.battery._ClearPowerData(), True), | |
577 (self.call.device.RunShellCommand( | |
578 ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), | |
579 (self.call.device.RunShellCommand( | |
580 ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), | |
581 (self.call.battery.GetCharging(), False), | |
582 (self.call.battery.GetCharging(), False), | |
583 (self.call.device.RunShellCommand( | |
584 ['dumpsys', 'battery', 'reset'], check_return=True), []), | |
585 (self.call.battery.GetCharging(), False), | |
586 (self.call.device.RunShellCommand( | |
587 ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']), | |
588 (self.call.battery.GetCharging(), True)): | |
589 with self.battery.PowerMeasurement(): | |
590 pass | |
591 | |
592 | |
593 class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest): | |
594 | |
595 def testDiscoverDeviceProfile_known(self): | |
596 with self.assertCalls( | |
597 (self.call.adb.Shell('getprop ro.product.model'), "Nexus 4")): | |
598 self.battery._DiscoverDeviceProfile() | |
599 self.assertEqual(self.battery._cache['profile']['name'], "Nexus 4") | |
600 | |
601 def testDiscoverDeviceProfile_unknown(self): | |
602 with self.assertCalls( | |
603 (self.call.adb.Shell('getprop ro.product.model'), "Other")): | |
604 self.battery._DiscoverDeviceProfile() | |
605 self.assertEqual(self.battery._cache['profile']['name'], None) | |
606 | |
607 | |
608 class BatteryUtilsClearPowerData(BatteryUtilsTest): | |
609 | |
610 def testClearPowerData_preL(self): | |
611 with self.assertCalls( | |
612 (self.call.device.RunShellCommand(mock.ANY, retries=0, | |
613 single_line=True, timeout=10, check_return=True), '20')): | |
614 self.assertFalse(self.battery._ClearPowerData()) | |
615 | |
616 def testClearPowerData_clearedL(self): | |
617 with self.assertCalls( | |
618 (self.call.device.RunShellCommand(mock.ANY, retries=0, | |
619 single_line=True, timeout=10, check_return=True), '22'), | |
620 (self.call.device.RunShellCommand( | |
621 ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True), []), | |
622 (self.call.device.RunShellCommand( | |
623 ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []), | |
624 (self.call.device.RunShellCommand( | |
625 ['dumpsys', 'batterystats', '--reset'], check_return=True), []), | |
626 (self.call.device.RunShellCommand( | |
627 ['dumpsys', 'batterystats', '--charged', '-c'], | |
628 check_return=True, large_output=True), []), | |
629 (self.call.device.RunShellCommand( | |
630 ['dumpsys', 'battery', 'reset'], check_return=True), [])): | |
631 self.assertTrue(self.battery._ClearPowerData()) | |
632 | |
633 def testClearPowerData_notClearedL(self): | |
634 with self.assertCalls( | |
635 (self.call.device.RunShellCommand(mock.ANY, retries=0, | |
636 single_line=True, timeout=10, check_return=True), '22'), | |
637 (self.call.device.RunShellCommand( | |
638 ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True), []), | |
639 (self.call.device.RunShellCommand( | |
640 ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []), | |
641 (self.call.device.RunShellCommand( | |
642 ['dumpsys', 'batterystats', '--reset'], check_return=True), []), | |
643 (self.call.device.RunShellCommand( | |
644 ['dumpsys', 'batterystats', '--charged', '-c'], | |
645 check_return=True, large_output=True), | |
646 ['9,1000,l,pwi,uid,0.0327']), | |
647 (self.call.device.RunShellCommand( | |
648 ['dumpsys', 'battery', 'reset'], check_return=True), [])): | |
649 with self.assertRaises(device_errors.CommandFailedError): | |
650 self.battery._ClearPowerData() | |
651 | |
652 | |
653 if __name__ == '__main__': | |
654 logging.getLogger().setLevel(logging.DEBUG) | |
655 unittest.main(verbosity=2) | |
OLD | NEW |