# Copyright (c) 2016 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 = "platform_ExternalUsbPeripherals.usb_detect.crashes"
PURPOSE = "Servo based USB boot stress test"
CRITERIA = "This test will fail if any of the actions or checks fail."
TIME = "LONG"
TEST_CATEGORY = "Functional"
TEST_CLASS = "platform"
TEST_TYPE = "server"
ATTRIBUTES = "suite:manual_platform_suite"
DEPENDENCIES = "servo, usb_detect"

DOC = """
This test uses servo to connect/disconnect servo USB hub before and
after events like reboot, login, suspend, resume etc.

The test fails if
- device is pingable when suspended
- wrong action passed through action_sequence flag
- USB detected peripherals are different than expected
- there is no servo board attached
- USB peripherals checks(usb_checks below) on command line fail
Other detection checks can be added for each peripheral

Set of four USB peripherals plugged
- USB headset
- USB HD Webcam - should be Logitech HD Pro Webcam C920
- USB stick with four partitions named ExFAT  Ext4  FAT  NTFS
- USB mouse
- USB 3G modem
- USB SD card reader(one microSD card plugged)
- USB connected phone(optional)
"""

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)

    repeat = int(args_dict.get("repeat", 2))

    default_actions = str("reboot,unplug,plug,login,unplug,plug,"
                          "suspend,resume,unplug,suspend,plug,resume,"
                          "suspend,unplug,resume,plug")

    action_sequence = str(args_dict.get("action_sequence", default_actions))

    usb_list = ["\"Kingston Technology Company Inc.\"",
                "\"Alcor Micro Corp.\"",
                "\"Microsoft Corp.|C-Media Electronics, Inc. Audio Adapter\"",
               ]
    usb_checks = {
        # USB Audio Output devices
        str("cras_test_client --dump_server_info | "
            "awk \"/Output Devices:/,/Output Nodes:/\" | grep -E ") :
            ["\"Microsoft LifeChat LX-3000: USB Audio|C-Media USB Headphone Set: USB Audio\"" ],
        # USB Audio Input devices
        str("loggedin:cras_test_client --dump_server_info | "
            "awk \"/Input Devices:/,/Input Nodes:/\" | grep -E ") :
            ["\"TeckNet: USB Audio|USB 2.0 PC Camera\"",
             "\"Microsoft LifeChat LX-3000: USB Audio|C-Media USB Headphone Set: USB Audio\""],
        # USB stick four partitions volumes
        "loggedin:ls -l /media/removable/ | grep -i " :
            ["\"SD Card\"", "ExFAT", "Ext4", "FAT", "NTFS"],
        # USB Web camera
        "cat /sys/class/video4linux/video*/name | grep -E " :
            ["\"TeckNet|USB 2.0 PC Camera\""],
        }

    job.run_test("platform_ExternalUsbPeripherals", host=host,
                 disable_sysinfo=True, client_autotest="desktopui_SimpleLogin",
                 action_sequence=action_sequence, repeat=repeat,
                 usb_list=usb_list, usb_checks=usb_checks,
                 crash_check=True, tag="usb_detect.crashes")

parallel_simple(run, machines)
