# Copyright 2017 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_Cr50BID"
PURPOSE = "Verify cr50 response to board id"
ATTRIBUTES = "suite:faft_cr50_experimental"
TIME = "LONG"
TEST_TYPE = "server"
DEPENDENCIES = "servo"

DOC = """
Verify cr50 board id behavior on a board id locked image.

Check that cr50 will not accept mismatched board ids when it is running a board
id locked image.

Set the board id on a non board id locked image and verify cr50 will rollback
when it is updated to a mismatched board id image.

All of the path args are optional. If they are given, then the test will use
the local images to run the test. If they aren't, the test will download the
needed cr50 images.

The board id locked test image will be found using the given bid_path or
downloaded from google storage using the information in bid, bid_mask, and
bid_flags. If these aren't given the debug image with TEST:0xffff:0xff00 will
be used.

@param iterations: Number of times to run the test
@param dev_path: local path for the dev image
@param bid_path: local path for the board id locked image. If this is given, the
                 board id, mask and flags will be gotten from the image. Bid,
                 bid_mask, and bid_flags will be ignored.
@param release_ver: The version string. ${rw_ver}/${image_bid}. This is needed
                    to run the test with a released board id locked image.
@param basic: True if the test should just use test cases to do basic
              verification.
"""

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))
    dev_path = args_dict.get("dev_path", "")
    bid_path = args_dict.get("bid_path", "")
    release_ver = args_dict.get("release_ver", "")
    basic = args_dict.get("basic", "").lower() == 'true'

    job.run_test("firmware_Cr50BID", host=host, cmdline_args=args,
                 iterations=iterations, dev_path=dev_path, bid_path=bid_path,
                 release_ver=release_ver, basic=basic, full_args=args_dict)

parallel_simple(run, machines)
