# Copyright 2020 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 = "servo_Verification"
PURPOSE = "Ensure a dut/servo pair provide required lab functionality."
ATTRIBUTES = "suite:servo_verification"
TIME = "MEDIUM"
TEST_CATEGORY = "Benchmark"
TEST_CLASS = "platform"
TEST_TYPE = "server"

DOC = """
This test is a wrapper around a few functionality tests surrounding servo,
servod, and basic lab functionality. As this test is designed to test the
labstation serving servod itself, instead of specific DUTs functionality,
it should be independent of what DUT is on the other side.

This is the dut/servo implementation of this test and this test simply runs
the suite:
- servo_lab

This test will fail if no usb stick is attached to the servo setup.

.local version assumes that there is an image already installed on the USB stick
This allows the test to skip download times or avoid any devserver flakiness
and can be used for local image validation. Just make sure the image on the
stick is actually an image for the DUT that is connected.

A note on failures:
- Failures might occur if the test to install test images fails to query
the right devserver. This will cause platform_InstallTestImage and the
subsequent test to fail as well. This is a known issue when kicking it off
from a workstation for example. (crbug.com/c/953113).

Sample usage:
test_that <dut ip> servo_Verification --args "servo_host=<labstation ip>
                                              servo_port=<port on labstation>"
"""

# Workaround to make it compatible with moblab autotest UI.
global args_dict
try:
    args_dict
except NameError:
    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("servo_Verification", host=host, disable_sysinfo=True)

parallel_simple(run, machines)
