# Copyright 2011 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

NAME = "Power per-build tests"
METADATA = {
    "contacts": ["chromeos-platform-power@google.com"],
    "author": "ChromeOS Team",
    "bug_component": "b:1361410",
    "criteria": "This test is a benchmark test",
    "hw_agnostic": False,
}
TIME = "MEDIUM"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
ATTRIBUTES = "suite:power_build"
TEST_TYPE = "server"
DEPENDENCIES = "rpm"
PY_VERSION = 3

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_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_Display', 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)
