# Copyright 2012 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 = "ChromeOS Team"
NAME = "firmware_UpdateFirmwareVersion"
METADATA = {
        "contacts": ["chromeos-faft@google.com", "jbettis@chromium.org"],
        "bug_component": "b:792402", # ChromeOS > Platform > Enablement > Firmware > FAFT
        "criteria": "Servo based firmware update test which checks the firmware version",
        "requirements": ["sys-fw-0021-v01", "sys-fw-0024-v01", "sys-fw-0025-v01"],
}
ATTRIBUTES = "suite:faft_bios, suite:faft_bios_ro_qual, suite:faft_bios_rw_qual, suite:faft_lv5, suite:faft_smoke"
DEPENDENCIES = "servo_state:WORKING, servo_usb_state:NORMAL"
TIME = "SHORT"
TEST_TYPE = "server"
JOB_RETRIES = 0

DOC = """
This test requires a USB test image plugged in. The firmware id
the current running firmware must matches the system shellball's, or user
can provide a shellball to do this test. In this way, the client will be
update with the given shellball first. On runtime, this test modifies the
firmware version of the shellball and runs autoupdate. Check firmware
version after boot with firmware B, and then recover firmware A and B to
original shellball.
"""

args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run_updatefirmwareversion(machine):
    host = hosts.create_host(machine, servo_args=servo_args)
    job.run_test("firmware_UpdateFirmwareVersion", host=host, cmdline_args=args,
                 disable_sysinfo=True)

parallel_simple(run_updatefirmwareversion, machines)
