# Copyright 2018 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.client.common_lib.cros.cfm.usb import usb_device_spec
from autotest_lib.server.cros.cfm.configurable_test.dsl import *
from autotest_lib.server import utils

AUTHOR = "kerl@google.com, chromeos-meetings@google.com"
NAME = "enterprise_CFM_PeripheralQualification.power_cycle"
PURPOSE = "Stresses a peripheral device by repeatedly power cycling its USB port."
CRITERIA = ("The device detectable as a USB device after each cycle "
            "and no crash files appear")
TIME = "MEDIUM"
TEST_CATEGORY = "Stress"
TEST_TYPE = "server"

DOC = """
Repeatedly power cycle the connected device and verify it appears
as a USB device after each cycle. Verifies that no new crash files
appear.

The test requires a vid_pid argument (e.g. 18d1:8001) that determines which
device to power cycle. This enables testing custom devices from Moblab or from
a local workstation.

In Moblab, add vid_pid=<vid:pid> under Advanced Options -> Args.

Locally, add arguments with --args when running test_that. Example:
test_that --autotest_dir ~/trunk/src/third_party/autotest/files/ \
    --board=guado --args 'servo_host= vid_pid=18d1:8001' \
    chromeos6-row22-rack13-host7 enterprise_CFM_PeripheralQualification.power_cycle
"""

args_dict = utils.args_to_dict(args)
vid,pid = args_dict['vid_pid'].split(':')
# The product is only informational, set it to whatever.
product = args_dict.get('product', 'customProduct')
# Interfaces are only needed when verifying them, set them to empty in this case.
interfaces = []
device = usb_device_spec.UsbDeviceSpec(vid, pid, product, interfaces)
repeat = int(args_dict.get('repeat', 10))

cfm_test = CfmTest(
    configuration=Configuration(skip_enrollment=True),
    scenario=Scenario(
        AssertUsbDevices([device]),
        RepeatTimes(repeat, Scenario(
            PowerCycleUsbPort([device]),
            AssertNoNewCrashes()
        ))
    ),
)

def run_test(machine):
    job.run_test("enterprise_CFM_PeripheralQualification",
                 cfm_test = cfm_test,
                 tag = 'power_cycle',
                 host = hosts.create_host(machine))

parallel_simple(run_test, machines)
