Add a test of checking EC battery status report This test checks if EC correctly report battery status to kernel. BUG=chrome-os-partner:9188 TEST=Test passed. Change-Id: Ib1d633de0078ecd6e7dff0a2e89d7aa04b1e4405 Reviewed-on: https://gerrit.chromium.org/gerrit/24169 Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org> Tested-by: Vic Yang <victoryang@chromium.org> Commit-Ready: Vic Yang <victoryang@chromium.org>
diff --git a/server/site_tests/firmware_ECBattery/control b/server/site_tests/firmware_ECBattery/control new file mode 100644 index 0000000..779df18 --- /dev/null +++ b/server/site_tests/firmware_ECBattery/control
@@ -0,0 +1,23 @@ +# Copyright (c) 2011 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. + +AUTHOR = "Chrome OS Team" +NAME = "firmware_ECBattery" +PURPOSE = "Servo based EC battery status report test" +CRITERIA = "This test will fail if EC battery status report misbehalved." +TIME = "LONG" +TEST_CATEGORY = "Functional" +TEST_CLASS = "firmware" +TEST_TYPE = "server" + +DOC = """ +This test check battery status read from EC console and kernel sysfs match. +""" + +def run_ecbattery(machine): + host = hosts.create_host(machine) + job.run_test("firmware_ECBattery", host=host, cmdline_args=args, + use_faft=True, disable_sysinfo=True) + +parallel_simple(run_ecbattery, machines)
diff --git a/server/site_tests/firmware_ECBattery/firmware_ECBattery.py b/server/site_tests/firmware_ECBattery/firmware_ECBattery.py new file mode 100644 index 0000000..0f8123c --- /dev/null +++ b/server/site_tests/firmware_ECBattery/firmware_ECBattery.py
@@ -0,0 +1,75 @@ +# Copyright (c) 2012 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 logging + +from autotest_lib.client.common_lib import error +from autotest_lib.server.cros.faftsequence import FAFTSequence + +class firmware_ECBattery(FAFTSequence): + """ + Servo based EC thermal battery status report test. + """ + version = 1 + + # Battery status path in sysfs + BATTERY_STATUS = '/sys/class/power_supply/BAT0/status' + + # Battery voltage reading path in sysfs + BATTERY_VOLTAGE_READING = '/sys/class/power_supply/BAT0/voltage_now' + + # Battery current reading path in sysfs + BATTERY_CURRENT_READING = '/sys/class/power_supply/BAT0/current_now' + + # Maximum allowed error of voltage reading in mV + VOLTAGE_MV_ERROR_MARGIN = 300 + + # Maximum allowed error of current reading in mA + CURRENT_MA_ERROR_MARGIN = 300 + + + def _check_voltage_match(self): + """Check if voltage reading from kernel and servo match. + + Raises: + error.TestFail: Raised when the two reading mismatch by more than + VOLTAGE_MV_ERROR_MARGIN mV. + """ + servo_reading = int(self.servo.get('ppvar_vbat_mv')) + # Kernel gives voltage value in uV. Convert to mV here. + kernel_reading = int(self.faft_client.run_shell_command_get_output( + 'cat %s' % self.BATTERY_VOLTAGE_READING)[0]) / 1000 + if abs(servo_reading - kernel_reading) > self.VOLTAGE_MV_ERROR_MARGIN: + raise error.TestFail( + "Voltage reading from servo and kernel mismatch.") + + + def _check_current_match(self): + """Check if current reading from kernel and servo match. + + Raises: + error.TestFail: Raised when the two reading mismatch by more than + CURRENT_MA_ERROR_MARGIN mA. + """ + servo_reading = int(self.servo.get('ppvar_vbat_ma')) + # Kernel gives current value in uA. Convert to mA here. + kernel_reading = int(self.faft_client.run_shell_command_get_output( + 'cat %s' % self.BATTERY_CURRENT_READING)[0]) / 1000 + status = self.faft_client.run_shell_command_get_output( + 'cat %s' % self.BATTERY_STATUS)[0] + + # If battery is not discharging, servo gives negative value. + if status != "Discharging": + servo_reading = -servo_reading + if abs(servo_reading - kernel_reading) > self.CURRENT_MA_ERROR_MARGIN: + raise error.TestFail( + "Current reading from servo and kernel mismatch.") + + + def run_once(self, host=None): + logging.info("Checking battery current reading...") + self._check_current_match() + + logging.info("Checking battery voltage reading...") + self._check_voltage_match()