Home | History | Annotate | Download | only in power_ChargeStatus
      1 # Copyright (c) 2013 The Chromium OS 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 re
      6 
      7 from autotest_lib.client.common_lib import error
      8 from autotest_lib.server import test
      9 
     10 
     11 class power_ChargeStatus(test.test):
     12     """
     13     Test power_supply_info AC and BAT "state" on power OFF and ON.
     14 
     15     If DUT is connected to RPM(default) - No need to pass any command line args.
     16     If DUT is connected to USB powerstrip(via servo), Need to pass cmdlineargs
     17     as --args=power_control="servoj10".
     18     If DUT is not connected to servo and RPM. i.e to handle manually, Need to
     19     pass cmdlineargs as --args=power_control="manual".
     20     """
     21     version = 1
     22 
     23     def initialize(self, host, cmdline_args):
     24         args = {}
     25         for arg in cmdline_args:
     26             match = re.search("^(\w+)=(.+)", arg)
     27             if match:
     28                 args[match.group(1)] = match.group(2)
     29         self.power_control = args.get('power_control', host.POWER_CONTROL_RPM)
     30         if self.power_control not in host.POWER_CONTROL_VALID_ARGS:
     31             raise error.TestError('Valid values for --args=power_control '
     32                                   'are %s. But you entered wrong argument '
     33                                   'as "%s".'
     34                                    % (host.POWER_CONTROL_VALID_ARGS,
     35                                    self.power_control))
     36 
     37 
     38     def run_once(self, host):
     39         ac_state = self.get_ac_status(host)
     40         bat_state = self.get_bat_status(host)
     41         self.test_charge_state(ac_state, bat_state)
     42         host.power_off(self.power_control)
     43         ac_state = self.get_ac_status(host)
     44         bat_state = self.get_bat_status(host)
     45         self.test_discharge_state(ac_state, bat_state)
     46         host.power_on(self.power_control)
     47 
     48 
     49     def test_charge_state(self, ac_state, bat_state):
     50         """Tests when on AC- the Main line is "ON" and "Charging/Charged".
     51 
     52         @param ac_state Specifies the power_supply_info "Line Power"
     53                         online value.
     54         @param bat_state Specifies the power_supply_info "Battery"
     55                          charge state value.
     56         """
     57         if not (ac_state == "yes" and (bat_state == "Charging"
     58             or bat_state == "Fully charged")):
     59             raise error.TestFail("AC is not online and BAT state is %s."
     60                                   % bat_state)
     61 
     62 
     63     def test_discharge_state(self, ac_state, bat_state):
     64         """Tests when on DC - the Main line is "No" and "Discharging".
     65 
     66         @param ac_state Specifies the power_supply_info "Line Power"
     67                         online value.
     68         @param bat_state Specifies the power_supply_info "Battery"
     69                          charge state value.
     70         """
     71         if not (ac_state == "no" and bat_state == "Discharging"):
     72             raise error.TestFail("Not Discharging, on AC and BAT state is %s."
     73                                   % bat_state)
     74 
     75 
     76     def get_ac_status(self, host):
     77         """Get the AC state info from "power_supply_info"."""
     78         ac_state_info = host.run(
     79             "power_supply_info | egrep 'online'").stdout.strip()
     80         return self.split_info(ac_state_info)
     81 
     82 
     83     def get_bat_status(self, host):
     84         """ Get the DC state info from "power_supply_info"."""
     85         bat_state_info = host.run(
     86             "power_supply_info | egrep 'state'").stdout.strip()
     87         return self.split_info(bat_state_info)
     88 
     89 
     90     def split_info(self, info_list):
     91         """Splits & trims stdout and returns the AC and BAT state Values.
     92 
     93         @param info_list Specifies the stdout value.
     94         """
     95         split_list = info_list.split(":")
     96         return split_list[-1].strip()
     97