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

NAME = "PowerQual.webrtc_full"
METADATA = {
    "contacts": ["chromeos-platform-power@google.com"],
    "author": "isaaclee",
    "bug_component": "b:1361410",
    "criteria": "This test is a benchmark test",
    "hw_agnostic": False,
}
ATTRIBUTES = "suite:power_qual_webrtc_full"
DEPENDENCIES = 'wifi_connected_dut'
TIME = "LENGTHY"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"
EXTENDED_TIMEOUT = 87300  # 24 Hours + 900 second guard.
PY_VERSION = 3

DOC = """
Sequence for qualification for power with webrtc.

Mandatory tests
- power_LoadTest (from full battery to 5%)
- power_BatteryCharge (from 5% to full battery)
- power_VideoPlayback (h264 1080p & vp9 1080p 1 hour each)
- power_VideoCall (2 hours)

Informational tests
- power_Idle
- power_VideoPlayback
- power_VideoEncode
- power_Display.brightness
- power_Display.cabc
"""

import datetime
from autotest_lib.client.common_lib import utils

HOURS=60*60

CLIENT_TESTS = [
    ('power_BatteryCharge', {
        'percent_target_charge' : 100, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_LoadTest', {
        'tag' : 'powerqual_webrtc', 'force_discharge' : True, 'loop_time' : HOURS,
        'loop_count' : 24, 'test_low_batt_p' : 5}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 100, 'max_run_time': 5 * HOURS,
        'tag' : 'powerqual_webrtc'}),
    ('power_WaitForCoolDown', {}),
    ('power_VideoPlayback', {
        'tag' : 'powerqual_webrtc', 'force_discharge' : True, 'secs_per_video' : 3600,
        'videos' : [('h264_1080_30fps', ''), ('vp9_1080_30fps', '')]}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 80, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_VideoCall', {
        'tag' : 'powerqual_webrtc', 'force_discharge' : True,
        'min_run_time_percent': 75,
	'webrtc': True}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 40, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_Idle', {
        'tag' : 'powerqual_webrtc', 'force_discharge' : True}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 35, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_VideoPlayback', {
        'tag' : 'powerqual_webrtc_info', 'force_discharge' : True}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 30, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_VideoEncode', {
        'tag' : 'powerqual_webrtc', 'force_discharge' : True}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 25, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_Display', {
        'tag' : 'powerqual_webrtc_brightness', 'force_discharge' : True,
        'brightness' : 'all', 'pages' : ['white', 'black', 'checker1'],
        'secs_per_page' : 20, 'seconds_period' : 1}),

    ('power_BatteryCharge', {
        'percent_target_charge' : 20, 'max_run_time': 5 * HOURS}),
    ('power_WaitForCoolDown', {}),
    ('power_Display', {
        'tag' : 'powerqual_webrtc_cabc', 'force_discharge' : True,
        'brightness' : 'max', 'secs_per_page' : 20, 'seconds_period' : 1,
        'pages' : ['white', 'black',
                   'white', 'grey10',
                   'white', 'grey20',
                   'white', 'grey30',
                   'white', 'grey40',
                   'white', 'grey50',
                   'white', 'checker1',
                   'white', 'checker90',
                   'white', 'checker80',
                   'white', 'checker70',
                   'white', 'checker60',
                   'white', 'checker50']}),

    ('power_WaitForCoolDown', {}),
    ('power_UiResume', {
        'tag' : 'powerqual_webrtc'}),
]

# 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)
