# Copyright (c) 2012 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 LV3"
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.

All BIOS tests are categorized into 4 test levels:
  Level-1: Basic BIOS tests which verify basic vboot functions.
  Level-2: Recovery BIOS tests which need external USB disk.
  Level-3: Corruption BIOS tests which modify firmware/kernel image.
           These tests may corrupt the system if any failure happens.
  Level-4: Advanced BIOS tests which verify not-so-critical features.

This suite runs all Level-3 tests.
"""

TESTS_ON_NORMAL_MODE = [
]

TESTS_ON_DEV_MODE = [
]

TESTS_ON_BOTH_MODES = [
    ('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)
