# Copyright (c) 2011 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 = "FAFT BIOS"
TIME = "MEDIUM"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This test suite runs FAFT (Fully Automated Firmware Test) for BIOS that should
all pass and that verifies the BIOS fit Chrome OS verified-boot requirements.
"""

TESTS_ON_NORMAL_MODE = [
    ('firmware_DevMode', {}),
    ('firmware_FAFTSetup', {}),
    ('firmware_DevTriggerRecovery', {}),
    ('firmware_InvalidUSB', {}),
    ('firmware_CgptState', {}),
]

TESTS_ON_DEV_MODE = [
    ('firmware_DevFwNormalBoot', {}),
    ('firmware_DevBootUSB', {}),
    ('firmware_DevScreenTimeout', {}),
    ('firmware_FwScreenPressPower', {}),
    ('firmware_FwScreenCloseLid', {}),
]

TESTS_ON_BOTH_MODES = [
    ('firmware_TryFwB', {}),
    ('firmware_UserRequestRecovery', {}),
    ('firmware_RecoveryButton', {}),
    ('firmware_CorruptFwSigA', {}),
    ('firmware_CorruptFwSigB', {}),
    ('firmware_CorruptBothFwSigAB', {}),
    ('firmware_CorruptFwBodyA', {}),
    ('firmware_CorruptFwBodyB', {}),
    ('firmware_CorruptBothFwBodyAB', {}),
    ('firmware_CorruptKernelA', {}),
    ('firmware_CorruptKernelB', {}),
    ('firmware_CorruptBothKernelAB', {}),
    ('firmware_RollbackFirmware', {}),
    ('firmware_RollbackKernel', {}),
    ('firmware_RONormalBoot', {}),
]


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

def run_server_test(machine):
    client = hosts.create_host(machine, servo_args=servo_args)
    for test, argv in TESTS_ON_BOTH_MODES + TESTS_ON_NORMAL_MODE:
        job.run_test(test, host=client, cmdline_args=args,
                     disable_sysinfo=True, dev_mode=False, tag="normal",
                     **argv)
    for test, argv in TESTS_ON_BOTH_MODES + TESTS_ON_DEV_MODE:
        job.run_test(test, host=client, cmdline_args=args,
                     disable_sysinfo=True, dev_mode=True, tag="dev",
                     **argv)

parallel_simple(run_server_test, machines)
