# Copyright (c) 2018 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 = "puthik"
NAME = "power_Dashboard.fast"
TIME = "MEDIUM"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
Sequence to make sure that power_Dashboard tests work fine.
"""

from autotest_lib.client.common_lib import utils

# Need separate list for client and server test due to how these test work.
CLIENT_TESTS = [
    ('power_Standby', {
        'tag' : '36sec', 'sample_hours' : 0.01, 'test_hours' : 0.01}),
    ('power_LoadTest', {
        'tag' : 'fast', 'loop_time' : 180, 'loop_count' : 1,
        'test_low_batt_p' : 6, 'check_network': False, 'ac_ok' : True,
        'gaia_login' : False}),
    ('power_Idle', {
        'tag' : 'fast', 'warmup_secs' : 2, 'idle_secs' : 10}),
    ('power_VideoPlayback', {
        'tag' : 'fast', 'secs_per_video' : 2}),
    ('power_VideoPlayback', {
        'tag' : 'sw_decoder_fast', 'use_hw_decode' : False,
        'secs_per_video' : 2}),
    ('power_Display', {
        'tag' : 'fast', 'secs_per_page' : 2}),
    ('power_WebGL', {
        'tag' : 'fast', 'duration' : 10}),
]

# Tagged test name and sweetberry interval
SWEETBERRY_TESTS = [
    ('power_Standby.36sec', 1),
    ('power_LoadTest.fast', 1),
    ('power_Idle.fast', 1),
    ('power_VideoPlayback.fast', 1),
    ('power_VideoPlayback.sw_decoder_fast', 1),
    ('power_Display.fast', 1),
    ('power_WebGL.fast', 1),
]

POWERLOG_TESTNAME = 'power_PowerlogWrapper'

# Workaround to make it compatible with moblab autotest UI.
global args_dict
try:
    args_dict
except NameError:
    args_dict = utils.args_to_dict(args)

pdash_note = args_dict.get('pdash_note', '')
sweetberry_serial = args_dict.get('sweetberry_serial', None)

def run_client_test(machine):
    client = hosts.create_host(machine)
    client_at = autotest.Autotest(client)
    for test, argv in CLIENT_TESTS:
        client.reboot()
        argv['pdash_note'] = pdash_note
        client_at.run_test(test, **argv)

def run_sweetberry_wrapper_test(machine):
    client = hosts.create_host(machine)
    for test, sweetberry_interval in SWEETBERRY_TESTS:
        client.reboot()
        argv = {
            'pdash_note': pdash_note,
            'test': test,
            'sweetberry_interval': sweetberry_interval,
        }
        job.run_test(POWERLOG_TESTNAME, host=client, config=argv, tag=test)


if sweetberry_serial:
    parallel_simple(run_sweetberry_wrapper_test, machines)
else:
    job.parallel_on_machines(run_client_test, machines)
