# Copyright 2019 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_Cr50RMAOpen.faft_cr50_tot"
METADATA = {
    "contacts": ["chromeos-faft@google.com", "mruthven@chromium.org"],
    "bug_component": "b:792402",  # ChromeOS > Platform > Enablement > Firmware > FAFT
    "criteria": "Verify RMA Open",
}
ATTRIBUTES = "suite:faft_cr50_tot"
TIME = "SHORT"
TEST_TYPE = "server"
DEPENDENCIES = "servo_state:WORKING"

DOC = """
Verify Cr50 RMA behavoior

Verify a couple of things:
    - basic open from AP and command line
    - Rate limiting
    - Authcodes can't be reused once another challenge is generated.
    - if the image is prod signed with mp flags, it isn't using test keys

Generate the challenge and calculate the response using rma_reset -c. Verify
open works and enables all of the ccd features.

If the generated challenge has the wrong version, make sure the challenge
generated with the test key fails.

This test is applicable when using ToT cr50 module.
TODO(crbug.com/1014572) Drop this control file once suites can inject test args.
"""

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)

# crbug.com/1014572: Inject test args.
args_dict["tot_test_run"] = "true"


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

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

    job.run_test(
        "firmware_Cr50RMAOpen",
        host=host,
        cmdline_args=args,
        full_args=args_dict,
        iterations=iterations,
        tag="faft_cr50_tot",
    )


parallel_simple(run, machines)
