# Copyright (c) 2011 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 daily tests"
ATTRIBUTES = "suite:power_daily"
TIME = "LONG"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"
DEPENDENCIES = "power:battery, rpm"

DOC = """
This test suite runs automated power tests that should all pass. These tests
take a long time (several hours) to run and are run only once a day.
"""

from autotest_lib.server import site_host_attributes
from autotest_lib.client.common_lib import error, global_config

def _run_client_test(machine):
    client = hosts.create_host(machine)
    client_attributes = site_host_attributes.HostAttributes(machine)
    client_at = autotest.Autotest(client)

    job.run_test('power_RPMTest', verify=True, host=client,
                 power_sequence=[True], tag='RPM_ON1')

    # Charge the battery to at least 50% in preparation for the consumption
    # test. Charging the battery from empty to full can take up to 4 hours.
    client_at.run_test('power_BatteryCharge', percent_target_charge=50,
                       max_run_time=60*60*4, tag='CHARGE_50')

    job.run_test('power_RPMTest', verify=True, host=client,
                 power_sequence=[False], tag='RPM_OFF1')

    try:
        client_at.run_test('power_Consumption')
    finally:
        job.run_test('power_RPMTest', verify=True, host=client,
                     power_sequence=[True], tag='RPM_ON2')

    # Charge the battery to at least 99% in preparation for the load
    # test. Charging the battery from empty to full can take up to 4 hours.
    client_at.run_test('power_BatteryCharge', percent_target_charge=67,
                       max_run_time=60*60*4, tag='CHARGE_67')

    # Run 1 iteration (1hr) of power_LoadTest daily.  See suite control.power
    # for full drain parameters
    # TODO (snanda):
    # 1. Make the test login automatically to facebook and gmail
    # 2. Add audiovideo_V4L2 webcam test
    job.run_test('power_RPMTest', verify=True, host=client,
                 power_sequence=[False], tag='RPM_OFF2')

    try:
        client_at.run_test('power_LoadTest', loop_count=1, loop_time=3600,
                           check_network=False, tag='WIRED_1hr')
        wifi_ap = utils.get_wireless_ssid(machine)
        wifi_sec = global_config.global_config.get_config_value('CLIENT',
                'wireless_security', default=None)
        wifi_pw = global_config.global_config.get_config_value('CLIENT',
                'wireless_password', default=None)
        if wifi_ap:
            client_at.run_test('power_LoadTest', loop_count=1, loop_time=3600,
                               force_wifi=True, wifi_ap=wifi_ap,
                               wifi_sec=wifi_sec, wifi_pw=wifi_pw,
                               tag='WIFI_1hr')
    finally:
        job.run_test('power_RPMTest', verify=True, host=client,
                     power_sequence=[True], tag='RPM_ON3')


job.parallel_on_machines(_run_client_test, machines)
