# 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 utils
from autotest_lib.server.hosts import cros_host

AUTHOR = 'ncrews'
DEPENDENCIES = "servo_state:WORKING"
NAME = 'policy_DeviceChargingServer.BatteryChargeMode'
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_DeviceCharging'

# When DeviceBatteryChargeMode is set to BATTERY_CHARGE_PRIMARILY_AC_USE, then
# the DUT will not charge when above 86%. In order to test this, we need to be
# above this threshold.
MIN_BATTERY_LEVEL = 87

# A test case consists of the policies, plus the expected power behavior.
TEST_CASES = [
    ({'DeviceBatteryChargeMode': 1}, # BATTERY_CHARGE_STANDARD
     'ON_AC_AND_CHARGING'),
    ({'DeviceBatteryChargeMode': 2}, # BATTERY_CHARGE_EXPRESS_CHARGE
     'ON_AC_AND_CHARGING'),
    ({'DeviceBatteryChargeMode': 3}, # BATTERY_CHARGE_PRIMARILY_AC_USE
     'ON_AC_AND_CHARGING'),
    ({'DeviceBatteryChargeMode': 4}, # `BATTERY_CHARGE_ADAPTIVE
     'ON_AC_AND_CHARGING'),
    ({'DeviceBatteryChargeMode': 5, # BATTERY_CHARGE_CUSTOM
      'DeviceBatteryChargeCustomStartCharging': 50,
      'DeviceBatteryChargeCustomStopCharging': 60},
     'ON_AC_AND_NOT_CHARGING'),
    ({'DeviceBatteryChargeMode': 5, # BATTERY_CHARGE_CUSTOM
      'DeviceBatteryChargeCustomStartCharging': 50,
      'DeviceBatteryChargeCustomStopCharging': 100},
     '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_CHARGING_POLICIES = {
    'DeviceBatteryChargeMode': 1, # BATTERY_CHARGE_STANDARD
}
ON_AC_AND_NOT_CHARGING_POLICIES = {
    'DeviceBatteryChargeMode': 5, # BATTERY_CHARGE_CUSTOM
    'DeviceBatteryChargeCustomStartCharging': 50,
    'DeviceBatteryChargeCustomStopCharging': 60,
}
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'),
}

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)
