# Copyright 2018 The Chromium OS Authors. All rights reserved.
# 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_Cr50Open"
PURPOSE = "Verify cr50 open"
ATTRIBUTES = "suite:faft_cr50_prepvt, suite:faft_cr50_pvt, suite:faft_cr50_tot"
TIME = "SHORT"
TEST_TYPE = "server"
DEPENDENCIES = "servo"

DOC = """
Verify the console can be opened by pressing the power button after the device
has been put into dev mode. Make sure cr50 can't be opened when the device isn't
in dev mode.

This test must be run with servo instead of CCD, because we need to be able to
fake power button presses.
"""

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))
    ccd_open_restricted = args_dict.get("ccd_open_restricted", "true").lower()
    ccd_open_restricted = ccd_open_restricted != "false"

    job.run_test("firmware_Cr50Open", host=host, cmdline_args=args,
                 ccd_open_restricted=ccd_open_restricted, full_args=args_dict,
                 iterations=iterations)

parallel_simple(run, machines)
