#!/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()