# Copyright 2017 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 = "mzhuo@chromium.org"
NAME = "enterprise_CFM_USBPeripheralRebootStress"
TIME = "LONG"
TEST_CATEGORY = "Functional"
TEST_CLASS = "enterprise"
TEST_TYPE = "server"
ATTRIBUTES = "suite:hotrod"
JOB_RETRIES = 1

DOC = """
This test initially checks the number of USB devices connected to CFM.
Verify Hotrod can detect speaker, mic and camera. If not, test is aborted.
After that the test will run number of loops where it does:
1. Join a hangout session
2. leave hangout session
3. Check number of USBPeripheral devices and compare it to the initial ones. If
   difference is detected test will report failure.
4. Repeat 1, 2 and 3 for random times
4. Reboot CfM
4. Check number of USBPeripheral devices and compare it to the initial ones. If
   difference is detected test will report failure.
5. Verify Hotrod can detect speaker, mic and camera. If any of these missing
   test will report failure.
"""

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

def run_test(machine):
    repeat = int(args_dict.get('repeat', 100))
    hangout = args_dict.get('hangout', 'cfm-usb-test')
    host = hosts.create_host(machine, servo_args=servo_args)
    job.run_test('enterprise_CFM_USBPeripheralRebootStress',
                 host=host,
                 hangout=hangout,
                 reboot_cycles=repeat)

parallel_simple(run_test, machines)
