# Copyright (c) 2010 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"
TIME = "LONG"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"
DEPENDENCIES = "rpm"

DOC = """
This test suite runs automated power tests that should all pass and that
require the power to be connected with a remote power manager.
"""

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

# Run power tests that don't take a long time
TESTS = [
  'power_Backlight',
  'power_CPUFreq',
  'power_CPUIdle',
  'power_Draw',
  'power_Idle',
  'power_StatsCPUFreq',
  'power_StatsCPUIdle',
  'power_StatsUSB',
]


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

  if client.has_power():
    client.power_on()
  else:
    raise error.TestNAError("No power switch configured")

  # Charge battery to at least 50% first
  client_at.run_test('power_BatteryCharge', percent_target_charge=50,
                     max_run_time=60*60*4, tag='CHARGE_50')

  try:
    client.power_off()
    for test in TESTS:
        client_at.run_test(test)

    if not client_attributes.has_resume_bug:
        client_at.run_test('power_Resume')

  finally:
    client.power_on()

  # Run the 60/20/10/10 load test
  # 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=99,
                     max_run_time=60*60*5, tag='CHARGE_99')

  # Turn off power and run power_LoadTest. The power_LoadTest can take
  # up to 9 hours to run to completion
  # TODO (snanda):
  # 1. Make the test run over wifi instead of ethernet
  # 2. Make the test login automatically to facebook and gmail
  # 3. Add audiovideo_V4L2 webcam test
  client.power_off()

  try:
    if hasattr(client_attributes, 'wifi'):
      wifi_ap, wifi_sec, wifi_pw = client_attributes.wifi.split(',')

      client_at.run_test('power_LoadTest', loop_count=9, loop_time=3600,
                         force_wifi=True, wifi_ap=wifi_ap, wifi_sec=wifi_sec,
                         wifi_pw=wifi_pw, tag='WIFI')
    else:
      client_at.run_test('power_LoadTest', loop_count=9, loop_time=3600,
                         check_network=False, tag='WIRED')
  finally:
    client.power_on()


job.parallel_on_machines(run_client_test, machines)
