# Copyright (c) 2010 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_ShellBall"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "firmware"
TEST_TYPE = "server"

DOC = """
chromeos-firmwareupdate functional testing.

This script first copies shellball to DUT and runs all functional tests.

Syntax:
   ./test_that --board=<BOARD> <IP> -a "xml_config=<xml_config_file>
   shellball_path=<shellball_directory> shellball_name=<shellball_name>
   servo_serial=<serial number>" firmware_ShellBall/control
"""
from autotest_lib.client.common_lib import error

# Convert autoserv args to something usable.
opts = dict([[k, v] for (k, _, v) in [x.partition('=') for x in args]])

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

def run_shellball(machine):
    # Verify bios path arg.
    if 'shellball_path' and 'shellball_name' not in opts:
        raise error.TestFail('Invalid shellball information.')
    # Setup the client machine.
    host = hosts.create_host(machine, servo_args=servo_args)
    job.run_test("firmware_ShellBall", host=host,
                 cmdline_args=args,
                 shellball_path=opts['shellball_path'],
                 shellball_name=opts['shellball_name'],
                 disable_sysinfo=True)

parallel_simple(run_shellball, machines)
