# 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.

AUTHOR = "mruthven"
NAME = "firmware_Cr50Update"
PURPOSE = "Verify Cr50 update"
ATTRIBUTES = "suite:faft_cr50_experimental"
TIME = "SHORT"
TEST_TYPE = "server"
DEPENDENCIES = "servo_state:WORKING"

DOC = """
This test verifies Cr50 update works or recovery from erased nvmem.

To test postinstall cr50 update script set test to "post_install" or use
firmware_Cr50Update.post_install. To test the startup script leave the test arg
blank

The test will rollback to the oldest Cr50 image and then verify each update to
the next newest image runs successfully. If testing post install, the test will
update using cr50-update.sh. If testing the startup script the updates will be
run with cr50-update.conf after reboot..

The old release needs to have a version lower than the release image. The
release image needs to have a version lower than the dev image. The dev image
has to be newer than all of the images including the original cr50 image on
the dut to be able to guarantee that the original state can be restored.
If no_release path or old_release_path are given, the test will use
old_release_ver and release_ver to fetch the images from gs://.

If a valid path is given the version will be ignored. For example
release_path='/tmp/cr50.bin.prod' or release_ver='0.0.23/ZZAF:ffffffff:7f00'
could be used. The test will attempt to get the cr50 image from
/tmp/cr50.bin.prod first. If that doesn't exist then it will download the
version .23 image stored in google cloud storage. The version string needs to
contain the epoch, major, and minor versions separated by '.' and the image
board id. The image board id is optional. The tests can be run against all
versions since '0.0.13'.

If cr50_dbg_image_path is not specified, then the test will get the cr50
devids and attempt to get the debug image from gs://.

After the test is complete the original Cr50 image will be reflashed onto the
device.

@param iterations: the number of iterations to run
@param cr50_dbg_image_path: the location of the DBG image. Must be built with
                            CR50_DEV=1
@param release_path: the location of the release image
@param release_ver: RW and BID version string used to fetch the image from gs
@param old_release_path: the location of the old release image.
@param old_release_ver: RW version string used to fetch the image from gs
@param test: string representing the update type. use "post_install" if the test
             should verify the cr50-update.sh post install script. Anything else
             the test will run using the cr50-update.conf startup script.
"""

from autotest_lib.client.common_lib import error
from autotest_lib.server import utils

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)

iterations = int(args_dict.get("iterations", 1))
old_release_path = args_dict.get("old_release_path", "")
old_release_ver = args_dict.get("old_release_ver", "")
release_path = args_dict.get("release_path", "")
release_ver = args_dict.get("release_ver", "")
test = args_dict.get("test", "")

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

    job.run_test("firmware_Cr50Update", host=host, cmdline_args=args,
                 release_path=release_path, release_ver=release_ver,
                 old_release_path=old_release_path,
                 old_release_ver=old_release_ver, test=test,
                 iterations=iterations, full_args=args_dict)

parallel_simple(run, machines)
