# Copyright 2017 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"
METADATA = {
        "contacts": ["chromeos-faft@google.com", "mruthven@chromium.org"],
        "bug_component": "b:792402", # ChromeOS > Platform > Enablement > Firmware > FAFT
        "criteria": "Verify Cr50 tracks the EC and AP state correctly"
}
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))
    # Don't run the manual suspend sequences unless they're requested
    manual_suspend = args_dict.get("manual_suspend", "false").lower() != "false"
    default_suspend = args_dict.get("default_suspend", "true").lower() != "false"

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

parallel_simple(run, machines)
