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

from autotest_lib.server import utils

AUTHOR = "mruthven"
NAME = "firmware_Cr50DeviceState.manual_suspend"
METADATA = {
        "contacts": ["chromeos-faft@google.com", "mruthven@chromium.org"],
        "bug_component": "b:792402", # ChromeOS > Platform > Enablement > Firmware > FAFT
        "criteria": "Verify DUT can suspend and resume from non-default power states"
}
ATTRIBUTES = "suite:faft_gsc_nightly, suite:faft_cr50_pvt, suite:faft_cr50_prepvt, suite:faft_ti50_qual"
TIME = "SHORT"
TEST_TYPE = "server"
DEPENDENCIES = "servo_state:WORKING"

DOC = """
Verify Cr50 tracks the EC and AP state correctly.

Put the device through S0, S0ix, S3, and G3. Cr50 responds to these state
changes by enabling/disabling uart and changing its suspend type. Verify that
none of these cause any interrupt storms on Cr50. Make sure that there aren't
any interrupt storms and that Cr50 enters regular or deep sleep reasonable
amount of times.
"""

if 'args_dict' not in locals():
    args_dict = {}

args_dict.update(utils.args_to_dict(args))
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run(machine):
    host = hosts.create_host(machine, servo_args=servo_args)

    iterations = int(args_dict.get("iterations", 1))

    job.run_test("firmware_Cr50DeviceState", host=host, cmdline_args=args,
                 full_args=args_dict, iterations=iterations,
                 manual_suspend=True, default_suspend=False,
                 tag="manual_suspend")

parallel_simple(run, machines)
