# 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.pcr_extend"
METADATA = {
    "contacts": ["chromeos-faft@google.com", "mruthven@chromium.org"],
    "bug_component": "b:792402",  # ChromeOS > Platform > Enablement > Firmware > FAFT
    "criteria": "Verify power states after extending pcr0",
}
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,
        fwmp="0x41",
        pcr_extend=True,
        tag="pcr_extend",
    )


parallel_simple(run, machines)
