# Copyright (c) 2011 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.

import glob, re

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_ui, cros_ui_test

class hardware_USB20(cros_ui_test.UITest):
    version = 1

    def run_once(self):
        # 'lsusb' gives a bunch of USB device lines like:
        # Bus 001 Device 009: ID 0930:6544 Toshiba Corp. Kingston DataTravel...
        # The bus and device fields are at [1] and [3].
        cmd = 'lsusb'
        original_lsusb = utils.system_output(cmd).split('\n')

        dialog = cros_ui.Dialog(question="Please plug a USB 2.0 device in.",
                           choices=["OK"])
        result = dialog.get_result()
        plugin_lsusb = utils.system_output(cmd).split('\n')
        new_lsusb = [e for e in plugin_lsusb if e not in original_lsusb]

        if not new_lsusb:
            raise error.TestFail("No USB device detected after plugging in");

        # For each new device, find its bus and device fields and verify 2.0.
        for usb_dev in new_lsusb:
            usb_version = "unknown"
            bus = usb_dev.split(' ')[1]
            dev = usb_dev.split(' ')[3]

            # 'lsusb -s BUS:DEV -v' gives verbose output including at least one
            # bcdUSB line which describes its USB version.  Confirm 2.0.
            verbose_cmd = "lsusb -s %s:%s -v" % (bus, dev)
            linesout = utils.system_output(verbose_cmd).split('\n')
            for line in linesout:
                version_pattern = re.search(r' *bcdUSB *([^ ]+)', line)
                if version_pattern:
                    usb_version = version_pattern.group(1)
                    break

            if usb_version != "2.00":
                raise error.TestFail("usb_dev %s gives version %s" %
                                     (usb_dev, usb_version))

        dialog.init(question="Detected:<br>%s.<hr>Please unplug the device." %
                    ", <br>".join(new_lsusb), choices=["OK"])
        result = dialog.get_result()

        unplug_lsusb = utils.system_output(cmd).split('\n')
        if original_lsusb != unplug_lsusb:
            raise error.TestFail("The USB devices are not the same as before "
                                 "after unplugging")
