# 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 per-build tests"
TIME = "MEDIUM"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
ATTRIBUTES = "suite:power_build"
TEST_TYPE = "server"
DEPENDENCIES = "rpm"

DOC = """
This test suite runs automated power tests that should all pass. These
tests are run on every build and thefore each test should be short
and not take more than 5 minutes to run.

This suite runs the test list on systems with AC off (on battery)
since they require use of the rpm.

The tests that run with AC on are run through their normal control
files since they do not need to interact with the RPM.
"""

import logging

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


def _iterate_tests(client, machine):
    client_at = autotest.Autotest(client)

    tag = 'AC_OFFLINE'

    # Tests that are also run on AC from their control file.
    client_at.run_test('power_CPUFreq', tag=tag)
    client_at.run_test('power_CPUIdle', tag=tag)
    client_at.run_test('power_ProbeDriver', tag=tag, test_which='Battery')
    client_at.run_test('power_StatsCPUFreq', tag=tag)
    client_at.run_test('power_StatsCPUIdle', tag=tag)
    client_at.run_test('power_StatsUSB', tag=tag)
    client_at.run_test('power_Resume', tag=tag)
    client_at.run_test('power_UiResume', tag=tag)

    # Tests that are only run on battery power here.
    client_at.run_test('power_Backlight', tag=tag)
    client_at.run_test('power_Draw', tag=tag)
    client_at.run_test('power_Idle',tag=tag)

    # Run the short version of power_Consumption
    client_at.run_test('power_Consumption', short=True)

    client_attributes = site_host_attributes.HostAttributes(client.hostname)
    if not client_attributes.has_resume_bug:
        client_at.run_test('power_Resume', tag=tag)
        client_at.run_test('power_UiResume', tag=tag)


def _run_client_test(machine):
    """Runs client tests - all with battery actively discharging."""
    client = hosts.create_host(machine)
    if not client.has_power():
        # Because this is a control file these test errors do not
        # get printed...logging ensures test_that users can see it.
        msg = 'This test requires RPM support.'
        logging.info('********************%s', msg)
        raise error.TestError(msg)

    try:
        client.power_off()
        _iterate_tests(client, machine)
    finally:
        client.power_on()


job.parallel_on_machines(_run_client_test, machines)
