blob: 539fb36ebc117ef98e45a30ce6e5371e209af6a3 [file] [log] [blame]
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json, re, time
from autotest_lib.client.common_lib import error
from autotest_lib.server import hosts
from autotest_lib.server import test
_TIME_TO_SUSPEND = 10
_EXTRA_DELAY = 10
class power_BatteryStateOnResume(test.test):
"""
Test to verify the battery charge state of the DUT on resume after the AC
charger gets unplugged and plugged in its suspend state.
If DUT is connected to RPM(default) - No need to pass any command line args.
If DUT is connected to USB powerstrip(via servo), Need to pass cmdlineargs
as --args=power_control="servoj10".
If DUT is not connected to servo and RPM. i.e to handle manually, Need to
pass cmdlineargs as --args=power_control="manual".
"""
version = 1
def initialize(self, host, client_ip, cmdline_args):
self._client = hosts.create_host(client_ip)
self.ensure_battery_present()
args = {}
for arg in cmdline_args:
match = re.search("^(\w+)=(.+)", arg)
if match:
args[match.group(1)] = match.group(2)
self.power_control = args.get('power_control', host.POWER_CONTROL_RPM)
if self.power_control not in host.POWER_CONTROL_VALID_ARGS:
raise error.TestError('Valid values for --args=power_control '
'are %s. But you entered wrong argument '
'as "%s".'
% (host.POWER_CONTROL_VALID_ARGS,
self.power_control))
def run_once(self, host):
if not self.loggedin(host):
raise error.TestError("Not logged in!")
self.unplug_ac_on_suspend(host)
self.test_discharge_state(host)
self.plug_ac_on_suspend(host)
self.test_charge_state(host)
def unplug_ac_on_suspend(self, host):
"""Unplugs AC when device in Suspend state."""
host.servo.lid_close()
time.sleep(_TIME_TO_SUSPEND + _EXTRA_DELAY)
host.power_off(self.power_control)
host.servo.lid_open()
time.sleep(_EXTRA_DELAY)
def plug_ac_on_suspend(self, host):
"""Plugs AC when device in Suspend state."""
host.servo.lid_close()
time.sleep(_TIME_TO_SUSPEND + _EXTRA_DELAY)
host.power_on(self.power_control)
host.servo.lid_open()
time.sleep(_EXTRA_DELAY)
def ensure_battery_present(self):
"""Ensure we have battery exists in DUT."""
result = self._client.run('power_supply_info | egrep present')
if 'yes' not in result.stdout:
raise error.TestError('Find no batteries')
def loggedin(self, host):
"""
Checks if the host has a logged in user.
@return True if a user is logged in on the device.
"""
try:
cmd_out = host.run('cryptohome --action=status').stdout.strip()
except:
return False
status = json.loads(cmd_out)
return any((mount['mounted'] for mount in status['mounts']))
def test_charge_state(self, host):
"""Tests whether battery is in 'Charging/Charged' state."""
bat_state = self.get_bat_status(host)
if not (bat_state == 'Charging' or bat_state == 'Fully charged'):
raise error.TestFail('Not Charging. BAT state is %s.' % bat_state)
def test_discharge_state(self, host):
"""Tests whether battery is in 'Discharging' state."""
bat_state = self.get_bat_status(host)
if not bat_state == 'Discharging':
raise error.TestFail(
'Not Discharging. BAT state is %s.' % bat_state)
def get_bat_status(self, host):
"""Returns the battery state per the 'power_supply_info' tool.
@return battery power 'state' value. (i.e, Charging/Discharging ..)
"""
bat_state_info = host.run(
'power_supply_info | egrep state').stdout.strip()
split_list = bat_state_info.split(":")
return split_list[-1].strip()