blob: f381e72f107a3cfa8eaba5fbfe27d135129a02bb [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for the cmd_helper module."""
import unittest
from devil import devil_env
from devil.utils import lsusb
from devil.utils import mock_calls
with devil_env.SysPath(devil_env.PYMOCK_PATH):
import mock # pylint: disable=import-error
RAW_OUTPUT = """
Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x18d1 Google Inc.
idProduct 0x4ee2 Nexus 4 (debug)
bcdDevice 2.28
iManufacturer 1 LGE
iProduct 2 Nexus 4
iSerial 3 01d2450ea194a93b
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 62
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 0
iInterface 4 MTP
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x001c 1x 28 bytes
bInterval 6
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 66
bInterfaceProtocol 1
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
"""
DEVICE_LIST = 'Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)'
EXPECTED_RESULT = {
'device': '007',
'bus': '003',
'desc': 'ID 18d1:4ee2 Google Inc. Nexus 4 (debug)',
'Device': {
'_value': 'Status:',
'_desc': '0x0000',
'(Bus': {
'_value': 'Powered)',
'_desc': None
}
},
'Device Descriptor': {
'bLength': {'_value': '18', '_desc': None},
'bcdDevice': {'_value': '2.28', '_desc': None},
'bDeviceSubClass': {'_value': '0', '_desc': None},
'idVendor': {'_value': '0x18d1', '_desc': 'Google Inc.'},
'bcdUSB': {'_value': '2.00', '_desc': None},
'bDeviceProtocol': {'_value': '0', '_desc': None},
'bDescriptorType': {'_value': '1', '_desc': None},
'Configuration Descriptor': {
'bLength': {'_value': '9', '_desc': None},
'wTotalLength': {'_value': '62', '_desc': None},
'bConfigurationValue': {'_value': '1', '_desc': None},
'Interface Descriptor': {
'bLength': {'_value': '9', '_desc': None},
'bAlternateSetting': {'_value': '0', '_desc': None},
'bInterfaceNumber': {'_value': '1', '_desc': None},
'bNumEndpoints': {'_value': '2', '_desc': None},
'bDescriptorType': {'_value': '4', '_desc': None},
'bInterfaceSubClass': {'_value': '66', '_desc': None},
'bInterfaceClass': {
'_value': '255',
'_desc': 'Vendor Specific Class'
},
'bInterfaceProtocol': {'_value': '1', '_desc': None},
'Endpoint Descriptor': {
'bLength': {'_value': '7', '_desc': None},
'bEndpointAddress': {'_value': '0x02', '_desc': 'EP 2 OUT'},
'bInterval': {'_value': '0', '_desc': None},
'bDescriptorType': {'_value': '5', '_desc': None},
'bmAttributes': {
'_value': '2',
'Transfer': {'_value': 'Type', '_desc': 'Bulk'},
'Usage': {'_value': 'Type', '_desc': 'Data'},
'_desc': None,
'Synch': {'_value': 'Type', '_desc': 'None'}
},
'wMaxPacketSize': {
'_value': '0x0040',
'_desc': '1x 64 bytes'
}
},
'iInterface': {'_value': '0', '_desc': None}
},
'bDescriptorType': {'_value': '2', '_desc': None},
'iConfiguration': {'_value': '0', '_desc': None},
'bmAttributes': {
'_value': '0x80',
'_desc': None,
'(Bus': {'_value': 'Powered)', '_desc': None}
},
'bNumInterfaces': {'_value': '2', '_desc': None},
'MaxPower': {'_value': '500mA', '_desc': None}
},
'iSerial': {'_value': '3', '_desc': '01d2450ea194a93b'},
'idProduct': {'_value': '0x4ee2', '_desc': 'Nexus 4 (debug)'},
'iManufacturer': {'_value': '1', '_desc': 'LGE'},
'bDeviceClass': {
'_value': '0',
'_desc': '(Defined at Interface level)'
},
'iProduct': {'_value': '2', '_desc': 'Nexus 4'},
'bMaxPacketSize0': {'_value': '64', '_desc': None},
'bNumConfigurations': {'_value': '1', '_desc': None}
},
'Device Qualifier (for other device speed)': {
'bLength': {'_value': '10', '_desc': None},
'bNumConfigurations': {'_value': '1', '_desc': None},
'bDeviceSubClass': {'_value': '0', '_desc': None},
'bcdUSB': {'_value': '2.00', '_desc': None},
'bDeviceProtocol': {'_value': '0', '_desc': None},
'bDescriptorType': {'_value': '6', '_desc': None},
'bDeviceClass': {
'_value': '0',
'_desc': '(Defined at Interface level)'
},
'bMaxPacketSize0': {'_value': '64', '_desc': None}
}
}
class LsusbTest(mock_calls.TestCase):
"""Test Lsusb parsing."""
def testLsusb(self):
with self.assertCalls(
(mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
['lsusb'], timeout=10), (None, DEVICE_LIST)),
(mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
self.assertDictEqual(lsusb.lsusb().pop(), EXPECTED_RESULT)
def testGetSerial(self):
with self.assertCalls(
(mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
['lsusb'], timeout=10), (None, DEVICE_LIST)),
(mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
self.assertEqual(lsusb.get_android_devices(), ['01d2450ea194a93b'])
def testGetLsusbSerial(self):
with self.assertCalls(
(mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
['lsusb'], timeout=10), (None, DEVICE_LIST)),
(mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
out = lsusb.lsusb().pop()
self.assertEqual(lsusb.get_lsusb_serial(out), '01d2450ea194a93b')
if __name__ == '__main__':
unittest.main()