blob: 135b4dafd19e4c6395bea01f631881b08bcb74c6 [file] [log] [blame]
# Copyright 2019 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.
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.enterprise import enterprise_policy_base
from autotest_lib.client.cros.power import power_status
class ChargingPolicyTest(enterprise_policy_base.EnterprisePolicyTest):
"""
A Client test that verifies that AC usage and battery charging is consistent
with policy settings. As of this writing, these features are only present on
the Wilco platform.
"""
# The Wilco EC updates it's charging behavior every 60 seconds,
# so give ourselves 120 seconds to notice a change in behavior.
POLICY_CHANGE_TIMEOUT = 120
def run_once(self, test_cases, min_battery_level, prep_policies):
"""
Test a collection of cases.
@param test_cases: Collection of (policies, expected_behavior) pairs,
where expected_behavior is one of values accepted by
power_status.poll_for_charging_behavior().
@param min_battery_level: For the policy to affect the behavior
correctly, the battery level may need to be
above a certain percentage.
@param prep_policies: To test that policies P1 cause behavior B1, we
need to start in a state P2 where behavior B2 is
not B1, so we can notice the change to B1.
prep_policies is a dict that maps B1 => (P2, B2),
so that we can look up how to prep for testing
P1.
"""
self.setup_case(enroll=True)
failures = []
for policies, expected_behavior in test_cases:
setup_policies, prep_behavior = prep_policies[expected_behavior]
err = self._test_policies(setup_policies, prep_behavior,
min_battery_level)
if err is not None:
failures.append(err)
# Now that we are set up, test the actual test case.
err = self._test_policies(policies, expected_behavior,
min_battery_level)
if err is not None:
failures.append(err)
if failures:
raise error.TestFail('Failed the following cases: {}'.format(
str(failures)))
def _test_policies(self, policies, expected_behavior, min_battery_level):
self.update_policies(device_policies=policies)
try:
self._assert_battery_is_testable(min_battery_level)
power_status.poll_for_charging_behavior(expected_behavior,
self.POLICY_CHANGE_TIMEOUT)
except BaseException as e:
msg = ('Expected to be {} using policies {}. Got this instead: {}'.
format(expected_behavior, policies, str(e)))
return msg
return None
def _assert_battery_is_testable(self, min_battery_level):
status = power_status.get_status()
if status.battery_full():
raise error.TestError('The battery is full, but should not be')
status.assert_battery_in_range(min_battery_level, 100)