[autotest] Fix bug in _verify_usb_device_ok.

A UsbDevice has a list of interfaces. Since the values are not unique, we can't use set operations to check if a UsbDevice matches the spec.

BUG=chromium:784396
TEST=unit test

Change-Id: I05671795178101bed53a58c9e3bbd0886f25196c
Reviewed-on: https://chromium-review.googlesource.com/775956
Reviewed-by: Denis Tosic <dtosic@chromium.org>
Reviewed-by: Claes Malmnäs <malmnas@google.com>
Commit-Queue: Claes Malmnäs <malmnas@google.com>
Tested-by: Claes Malmnäs <malmnas@google.com>
Trybot-Ready: Claes Malmnäs <malmnas@google.com>
diff --git a/client/common_lib/cros/get_usb_devices.py b/client/common_lib/cros/get_usb_devices.py
index 165e30e..8b40897 100644
--- a/client/common_lib/cros/get_usb_devices.py
+++ b/client/common_lib/cros/get_usb_devices.py
@@ -151,14 +151,16 @@
     device_found = False
     # Retrieve a spec for this vid:pid
     usb_device = cfm_usb_devices.get_usb_device(vid_pid)
-    # Set of expected interfaces. This might be a subset of the actual set of
-    # interfaces.
-    expected_interfaces = set(usb_device.interfaces)
+    # List of expected interfaces. This might be a sublist of the actual list of
+    # interfaces. Note: we have to use lists and not sets since the list of
+    # interfaces might contain duplicates.
+    expected_interfaces = sorted(usb_device.interfaces)
+    length = len(expected_interfaces)
     # Find all actual UsbDevices matching the vid:pid
     for _data in _filter_by_vid_pid(usbdata, vid_pid):
         device_found = True
-        actual_interfaces = set(_data['intdriver'])
-        if not expected_interfaces.issubset(actual_interfaces):
+        actual_interfaces = sorted(_data['intdriver'])[0:length]
+        if not actual_interfaces == expected_interfaces:
             raise RuntimeError(
                 'Device %s has unexpected interfaces.' % vid_pid)
     if not device_found:
diff --git a/client/common_lib/cros/get_usb_devices_unittest.py b/client/common_lib/cros/get_usb_devices_unittest.py
index f621c47..a5a6aee 100644
--- a/client/common_lib/cros/get_usb_devices_unittest.py
+++ b/client/common_lib/cros/get_usb_devices_unittest.py
@@ -3,6 +3,7 @@
 from autotest_lib.client.common_lib.cros import get_usb_devices
 from autotest_lib.client.common_lib.cros.cfm import cfm_usb_devices
 
+# pylint:disable=missing-docstring
 
 class GetDevicesTest(unittest.TestCase):
   """Unit test for file get_usb_devices."""
@@ -39,14 +40,15 @@
       self.assertEquals(pid, '456')
 
   def test_verify_usb_device_ok(self):
-      vid_pid = '17e9:016b'
       usbdata = [
           {
-              'Vendor': '17e9',
-              'ProdID': '016b',
-              'intdriver': ['udl']
+              'Vendor': '18d1',
+              'ProdID': '8001',
+              'intdriver': ['snd-usb-audio', 'snd-usb-audio', 'snd-usb-audio',
+                            'usbhid'],
           },
        ]
+      vid_pid = '%s:%s' % (usbdata[0]['Vendor'], usbdata[0]['ProdID'])
       get_usb_devices._verify_usb_device_ok(usbdata, vid_pid)
 
       usbdata[0]['intdriver'] = []