Commit 58368d3e authored by rnephew's avatar rnephew Committed by Commit bot

[Android] Convert to BatteryUtils

Switch all battery related device interaction from
DeviceUtils to BatteryUtils. Currently they reside in device
utils, which has a lot of functionality around a lot of
different device interactions. This will consolidate all
current and future power related phone interactions into one location.

BUG=472763

Review URL: https://codereview.chromium.org/1057563002

Cr-Commit-Position: refs/heads/master@{#323940}
parent 92df3fd0
......@@ -22,6 +22,7 @@ import time
from pylib import android_commands
from pylib import constants
from pylib import device_settings
from pylib.device import battery_utils
from pylib.device import device_blacklist
from pylib.device import device_errors
from pylib.device import device_utils
......@@ -163,20 +164,6 @@ def WipeDeviceIfPossible(device, timeout, options):
pass
def ChargeDeviceToLevel(device, level):
def device_charged():
battery_level = device.GetBatteryInfo().get('level')
if battery_level is None:
logging.warning('Unable to find current battery level.')
battery_level = 100
else:
logging.info('current battery level: %d', battery_level)
battery_level = int(battery_level)
return battery_level >= level
timeout_retry.WaitFor(device_charged, wait_period=60)
def ProvisionDevice(device, options):
if options.reboot_timeout:
reboot_timeout = options.reboot_timeout
......@@ -208,8 +195,8 @@ def ProvisionDevice(device, options):
device, device_settings.NETWORK_DISABLED_SETTINGS)
if options.min_battery_level is not None:
try:
device.SetCharging(True)
ChargeDeviceToLevel(device, options.min_battery_level)
battery = battery_utils.BatteryUtils(device)
battery.ChargeDeviceToLevel(options.min_battery_level)
except device_errors.CommandFailedError as e:
logging.exception('Unable to charge device to specified level.')
......
......@@ -246,3 +246,24 @@ class BatteryUtils(object):
yield
finally:
self.EnableBatteryUpdates(timeout=timeout, retries=retries)
def ChargeDeviceToLevel(self, level, wait_period=60):
"""Enables charging and waits for device to be charged to given level.
Args:
level: level of charge to wait for.
wait_period: time in seconds to wait between checking.
"""
self.SetCharging(True)
def device_charged():
battery_level = self.GetBatteryInfo().get('level')
if battery_level is None:
logging.warning('Unable to find current battery level.')
battery_level = 100
else:
logging.info('current battery level: %s', battery_level)
battery_level = int(battery_level)
return battery_level >= level
timeout_retry.WaitFor(device_charged, wait_period=wait_period)
......@@ -141,6 +141,17 @@ class BatteryUtilsGetPowerData(BatteryUtilsTest):
self.assertEqual(data, {'uid': '1001', 'data': [2.0]})
class BatteryUtilsChargeDevice(BatteryUtilsTest):
@mock.patch('time.sleep', mock.Mock())
def testChargeDeviceToLevel(self):
with self.assertCalls(
(self.call.battery.SetCharging(True)),
(self.call.battery.GetBatteryInfo(), {'level': '50'}),
(self.call.battery.GetBatteryInfo(), {'level': '100'})):
self.battery.ChargeDeviceToLevel(95)
if __name__ == '__main__':
logging.getLogger().setLevel(logging.DEBUG)
unittest.main(verbosity=2)
......@@ -4,12 +4,17 @@
import unittest
from telemetry.core import util
from telemetry.core.platform import android_device
from telemetry.core.platform import android_platform_backend
from telemetry import decorators
from telemetry.unittest_util import options_for_unittests
from telemetry.unittest_util import system_stub
util.AddDirToPythonPath(util.GetTelemetryDir(), 'third_party', 'mock')
import mock # pylint: disable=F0401
util.AddDirToPythonPath(util.GetChromiumSrcDir(), 'build', 'android')
from pylib.device import battery_utils # pylint: disable=F0401
class AndroidPlatformBackendTest(unittest.TestCase):
def setUp(self):
......@@ -22,10 +27,13 @@ class AndroidPlatformBackendTest(unittest.TestCase):
# Skip _FixPossibleAdbInstability by setting psutil to None.
self._actual_ps_util = android_platform_backend.psutil
android_platform_backend.psutil = None
self.battery_patcher = mock.patch.object(battery_utils, 'BatteryUtils')
self.battery_patcher.start()
def tearDown(self):
self._stubs.Restore()
android_platform_backend.psutil = self._actual_ps_util
self.battery_patcher.stop()
@decorators.Disabled('chromeos')
def testGetCpuStats(self):
......
......@@ -6,8 +6,12 @@ from collections import defaultdict
import csv
import logging
from telemetry.core import util
from telemetry.core.platform.power_monitor import sysfs_power_monitor
# Get build/android scripts into path
util.AddDirToPythonPath(util.GetChromiumSrcDir(), 'build', 'android')
from pylib.device import battery_utils # pylint: disable=F0401
class DumpsysPowerMonitor(sysfs_power_monitor.SysfsPowerMonitor):
"""PowerMonitor that relies on the dumpsys batterystats to monitor the power
......@@ -25,6 +29,7 @@ class DumpsysPowerMonitor(sysfs_power_monitor.SysfsPowerMonitor):
super(DumpsysPowerMonitor, self).__init__(platform_backend)
self._browser = None
self._device = device
self._battery = battery_utils.BatteryUtils(device)
def CanMonitorPower(self):
result = self._platform.RunCommand('dumpsys batterystats -c')
......@@ -42,14 +47,14 @@ class DumpsysPowerMonitor(sysfs_power_monitor.SysfsPowerMonitor):
# Disable the charging of the device over USB. This is necessary because the
# device only collects information about power usage when the device is not
# charging.
self._device.DisableBatteryUpdates()
self._battery.DisableBatteryUpdates()
def StopMonitoringPower(self):
if self._browser:
package = self._browser._browser_backend.package
self._browser = None
cpu_stats = super(DumpsysPowerMonitor, self).StopMonitoringPower()
self._device.EnableBatteryUpdates()
self._battery.EnableBatteryUpdates()
# By default, 'dumpsys batterystats' measures power consumption during the
# last unplugged period.
result = self._platform.RunCommand('dumpsys batterystats -c %s' % package)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment