# 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(client.hostname)
    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)
