# 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.AdvancedBatteryChargeMode'
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'

# When AdvancedBatteryChargeMode is enabled, and the time is outside of the work
# period, the battery should not charge above 90%. Therefore we need to be above
# 90% so we can test this.
MIN_BATTERY_LEVEL = 91

# Various interesting day_config values of the policy, assuming the time
# is noon on a Monday.
BEFORE_START_DAY_CONFIG = {
    'entries': [{'day': 'MONDAY',
                 'charge_start_time':{'hour':22, 'minute':0},
                 'charge_end_time':{'hour':23, 'minute':0},
                }]
}
START_THRU_END_DAY_CONFIG = {
    'entries': [{'day': 'MONDAY',
                 'charge_start_time':{'hour':1, 'minute':0},
                 'charge_end_time':{'hour':23, 'minute':0},
                }]
}
AFTER_END_DAY_CONFIG = {
    'entries': [{'day': 'MONDAY',
                 'charge_start_time':{'hour':1, 'minute':0},
                 'charge_end_time':{'hour':2, 'minute':0},
                }]
}

# A test case consists of the policies, plus the expected power behavior.
TEST_CASES = [
    ({'DeviceAdvancedBatteryChargeModeEnabled': False,
      'DeviceAdvancedBatteryChargeModeDayConfig': BEFORE_START_DAY_CONFIG},
     'ON_AC_AND_CHARGING'),
    ({'DeviceAdvancedBatteryChargeModeEnabled': False,
      'DeviceAdvancedBatteryChargeModeDayConfig': START_THRU_END_DAY_CONFIG},
     'ON_AC_AND_CHARGING'),
    ({'DeviceAdvancedBatteryChargeModeEnabled': False,
      'DeviceAdvancedBatteryChargeModeDayConfig': AFTER_END_DAY_CONFIG},
     'ON_AC_AND_CHARGING'),

    ({'DeviceAdvancedBatteryChargeModeEnabled': True,
      'DeviceAdvancedBatteryChargeModeDayConfig': BEFORE_START_DAY_CONFIG},
     'ON_AC_AND_NOT_CHARGING'),
    ({'DeviceAdvancedBatteryChargeModeEnabled': True,
      'DeviceAdvancedBatteryChargeModeDayConfig': START_THRU_END_DAY_CONFIG},
     'ON_AC_AND_CHARGING'),
    ({'DeviceAdvancedBatteryChargeModeEnabled': True,
      'DeviceAdvancedBatteryChargeModeDayConfig': AFTER_END_DAY_CONFIG},
     'ON_AC_AND_NOT_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_CHARGING_POLICIES = {
    'DeviceAdvancedBatteryChargeModeEnabled': False,
    'DeviceAdvancedBatteryChargeModeDayConfig': BEFORE_START_DAY_CONFIG
}
ON_AC_AND_NOT_CHARGING_POLICIES = {
    'DeviceAdvancedBatteryChargeModeEnabled': True,
    'DeviceAdvancedBatteryChargeModeDayConfig': BEFORE_START_DAY_CONFIG
}
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)
