# 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 LV1"
TIME = "SHORT"
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-1 tests.
"""

TESTS_ON_NORMAL_MODE = [
    ('firmware_DevMode', {}),
]

TESTS_ON_DEV_MODE = [
]

TESTS_ON_BOTH_MODES = [
    ('firmware_TryFwB', {}),
]


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)
