# Copyright 2019 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 = "Chrome OS Team"
NAME = "firmware_Fingerprint.ObeysRollback"
PURPOSE = """
Verify that fingerprint firmware rollback functions correctly.
"""
CRITERIA = """
Fails if the rollback minimum version is not updated or min rollback version
does not prevent running an older version.
"""
ATTRIBUTES = "suite:fingerprint"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "firmware"
TEST_TYPE = "server"
DEPENDENCIES = "servo_state:WORKING, fingerprint"
JOB_RETRIES = 0

# This test uses futility and dev keys from autotest/files/server/cros/faft.
REQUIRE_SSP = True

DOC = """
Flashes new RW firmware with a rollback ID of '1' and verifies that all
rollback state is set correctly. Then attempts to flash RW firmware with
rollback ID of '0' and verifies that the RO version of firmware is running
(i.e., not running older version). Finally, flashes RW firmware with rollback
ID of '9' and validates that the RW version of '9' is running.
"""

test_images = [ 'TEST_IMAGE_DEV_RB_ZERO',
                'TEST_IMAGE_DEV_RB_ONE',
                'TEST_IMAGE_DEV_RB_NINE']

args_dict = 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)
    job.run_test("firmware_Fingerprint", host=host,
                 test_exe="obeys_rollback.sh",
                 test_exe_args=test_images,
                 use_dev_signed_fw=True)

parallel_simple(run, machines)
