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

Side by Side Diff: build/android/pylib/device/battery_utils_test.py

Issue 1314913009: [Android] Move some pylib modules into devil/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: TELEMETRY_DEPS Created 5 years, 3 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
OLDNEW
(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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698