# Copyright 2021 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 = "ThermalQual.lab"
TIME = "LENGTHY"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"
EXTENDED_TIMEOUT = 3600 # 1 hour
DOC = """
Shorter thermal qual sequence for lab regression test. This should be able to
detect if there is a thermal issue most of the time. And full thermal qual can
be used to pin point which workload that caused the issue.

* 30 minutes subtest instead of 2 to 2.5 hours.
* Don't wait for cooldown between each subtest to make total heavy load time
  to be about 2 hours.
* power_BatteryCharge is not expected to run in normal lab environment.
  Lab DUTs should have near-full battery charge.

"""

import datetime
from autotest_lib.client.common_lib import utils

MINUTES=60

# Need separate list for client and server test due to how these test work.
CLIENT_TESTS = [
    ('power_WaitForCoolDown', {}),
    ('power_Speedometer2', {'tag' : 'thermal_qual_lab_before'}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 30, 'max_run_time': 30 * MINUTES}),
    ('power_WaitForCoolDown', {}),

    ('power_ThermalLoad', {
        'tag' : 'thermal_qual_lab_discharge', 'force_discharge' : True,
        'duration': 30 * MINUTES}),
    ('power_VideoCall', {
        'tag' : 'thermal_qual_lab_discharge', 'force_discharge' : True,
        'duration': 30 * MINUTES}),
    ('power_ThermalLoad', {
        'tag' : 'thermal_qual_lab_charge', 'duration': 30 * MINUTES}),
    ('power_VideoCall', {
        'tag' : 'thermal_qual_lab_charge', 'duration': 30 * MINUTES}),

    ('power_Speedometer2', {'tag' : 'thermal_qual_lab_after'})
]

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

# Use time as pdash_note if not supplied to track all tests in same suite.
pdash_note = args_dict.get('pdash_note',
                           NAME + '_' + datetime.datetime.utcnow().isoformat())

def run_client_test(machine):
    client = hosts.create_host(machine)
    client_at = autotest.Autotest(client)

    for test, argv in CLIENT_TESTS:
        argv['pdash_note'] = pdash_note
        client_at.run_test(test, timeout=EXTENDED_TIMEOUT, **argv)

job.parallel_on_machines(run_client_test, machines)
