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

AUTHOR = "Chrome OS Team"
NAME = "Power Requirements tests"
SUITE = "power_requirements"
TIME = "LONG"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This test suite runs automated power tests that should all pass. These tests
take a long time (several hours) to run and are intended to ensure that the DUT
complies with the power subsection of our CrOS Requirements doc.

Current tests with runtimes are:
  power_BatteryCharge : <= 3 hours
  power_Standby       : 12 hours

"""
# TODO(tbroch) Deprecate this control file when SUITES= mechanism detailed @
#    https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-suites
#    has ability to assure power states pre/post conditions.
from autotest_lib.server import site_host_attributes
from autotest_lib.client.common_lib import error

def _run_client_test(machine):
    client = hosts.create_host(machine)
    client_attributes = site_host_attributes.HostAttributes(machine)
    client_at = autotest.Autotest(client)
    if client.has_power():
        client.power_on()
    else:
        raise error.TestNAError("No power switch configured")

    # TODO(tbroch): Add power_Standby here once there's a mechanism to postpone
    # autotest server from checking that DUT is still alive via network

    # Run the full 60/20/10/10 load test, draining a full battery
    client_at.run_test('power_BatteryCharge', percent_target_charge=100,
                       max_run_time=60*60*6, tag='CHARGE_100')
    client.power_off()
    try:
        if hasattr(client_attributes, 'wifi'):
            ap, sec, pw = client_attributes.wifi.split(',')
            client_at.run_test('power_LoadTest', loop_count=12, loop_time=3600,
                               force_wifi=True, wifi_ap=ap, wifi_sec=sec,
                               wifi_pw=pw, tag='WIFI_full')
        else:
            client_at.run_test('power_LoadTest', loop_count=12, loop_time=3600,
                               check_network=False, tag='WIRED_full')
    finally:
        client.power_on()

    # From client/site_tests/suite_HWQual/control.battery_charge_time
    max_hours = 3
    percent_charge_delta = 94.0
    time_limit = max_hours * 60 * 60 * percent_charge_delta / 100.0
    # battery must be at least 80% of design capacity
    percent_battery_wear_allowed = .20

    client_at.run_test('power_BatteryCharge', tag='full',
                 max_run_time=time_limit,
                 percent_charge_to_add=100,
                 percent_initial_charge_max=5,
                 use_design_charge_capacity=False,
                 constraints=[
                     '1.0 - ah_charge_full / ah_charge_full_design <= %f' %
                         percent_battery_wear_allowed,
                     'percent_final_charge - percent_initial_charge >= %f' %
                         percent_charge_delta,
                 ])

job.parallel_on_machines(_run_client_test, machines)
