# Copyright 2020 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 utils from autotest_lib.server.hosts import cros_host AUTHOR = 'ncrews' DEPENDENCIES = "servo_state:WORKING" NAME = 'policy_DeviceChargingServer.PowerPeakShift' TIME = 'LONG' TEST_CATEGORY = 'General' TEST_CLASS = 'enterprise' TEST_TYPE = 'server' ATTRIBUTES = "suite:wilco_bve" DOC = """ Ensures the DUT's battery level is in a testable range, clears the TPM if needed, and then runs the specified client test to verify charging behavior is consistent with policies. """ args_dict = utils.args_to_dict(args) servo_args = cros_host.CrosHost.get_servo_arguments(args_dict) client_test = 'policy_DeviceScheduledCharging' # The lowest |DevicePowerPeakShift.battery_threshold| we can set is 15%. We need # to be able to set it to below our current battery level. MIN_BATTERY_LEVEL = 16 # Various interesting day_config values of the policy, assuming the time # is noon on a Monday. BEFORE_START_DAY_CONFIG = { 'entries': [{'day': 'MONDAY', 'start_time':{'hour':21, 'minute':0}, 'end_time':{'hour':22, 'minute':0}, 'charge_start_time':{'hour':23, 'minute':0}, }] } START_THRU_END_DAY_CONFIG = { 'entries': [{'day': 'MONDAY', 'start_time':{'hour':1, 'minute':0}, 'end_time':{'hour':22, 'minute':0}, 'charge_start_time':{'hour':23, 'minute':0}, }] } END_THRU_CHARGE_START_DAY_CONFIG = { 'entries': [{'day': 'MONDAY', 'start_time':{'hour':1, 'minute':0}, 'end_time':{'hour':2, 'minute':0}, 'charge_start_time':{'hour':23, 'minute':0}, }] } AFTER_CHARGE_START_DAY_CONFIG = { 'entries': [{'day': 'MONDAY', 'start_time':{'hour':1, 'minute':0}, 'end_time':{'hour':2, 'minute':0}, 'charge_start_time':{'hour':3, 'minute':0}, }] } # A test case consists of the policies, plus the expected power behavior. TEST_CASES = [ ({'DevicePowerPeakShiftEnabled': False, 'DevicePowerPeakShiftBatteryThreshold': 0, 'DevicePowerPeakShiftDayConfig':{}}, 'ON_AC_AND_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 15, 'DevicePowerPeakShiftDayConfig': BEFORE_START_DAY_CONFIG}, 'ON_AC_AND_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 15, 'DevicePowerPeakShiftDayConfig': START_THRU_END_DAY_CONFIG}, 'NOT_ON_AC_AND_NOT_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 15, 'DevicePowerPeakShiftDayConfig': END_THRU_CHARGE_START_DAY_CONFIG}, 'ON_AC_AND_NOT_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 15, 'DevicePowerPeakShiftDayConfig': AFTER_CHARGE_START_DAY_CONFIG}, 'ON_AC_AND_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 100, 'DevicePowerPeakShiftDayConfig': BEFORE_START_DAY_CONFIG}, 'ON_AC_AND_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 100, 'DevicePowerPeakShiftDayConfig': START_THRU_END_DAY_CONFIG}, 'ON_AC_AND_NOT_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 100, 'DevicePowerPeakShiftDayConfig': END_THRU_CHARGE_START_DAY_CONFIG}, 'ON_AC_AND_NOT_CHARGING'), ({'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 100, 'DevicePowerPeakShiftDayConfig': AFTER_CHARGE_START_DAY_CONFIG}, 'ON_AC_AND_CHARGING'), ] # These are used to cleanup the DUT and to prep the DUT before each test case. # See the test for more info. ON_AC_AND_NOT_CHARGING_POLICIES = { 'DevicePowerPeakShiftEnabled': True, 'DevicePowerPeakShiftBatteryThreshold': 15, 'DevicePowerPeakShiftDayConfig': END_THRU_CHARGE_START_DAY_CONFIG } ON_AC_AND_CHARGING_POLICIES = { 'DevicePowerPeakShiftEnabled': False, 'DevicePowerPeakShiftBatteryThreshold': 0, 'DevicePowerPeakShiftDayConfig': {} } PREP_POLICIES = { 'ON_AC_AND_CHARGING' : (ON_AC_AND_NOT_CHARGING_POLICIES, 'ON_AC_AND_NOT_CHARGING'), 'ON_AC_AND_NOT_CHARGING' : (ON_AC_AND_CHARGING_POLICIES, 'ON_AC_AND_CHARGING'), 'NOT_ON_AC_AND_NOT_CHARGING' : (ON_AC_AND_CHARGING_POLICIES, 'ON_AC_AND_CHARGING'), } def run(machine): host = hosts.create_host(machine, servo_args=servo_args) job.run_test('policy_DeviceChargingServer', host=host, client_test=client_test, test_cases=TEST_CASES, min_battery_level=MIN_BATTERY_LEVEL, prep_policies=PREP_POLICIES) parallel_simple(run, machines)