1#!/usr/bin/env python 2# 3# Copyright (C) 2018 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17 18import logging 19import time 20import usb1 21 22from vts.runners.host import asserts 23from vts.runners.host import base_test 24from vts.runners.host import const 25from vts.runners.host import test_runner 26from vts.testcases.template.hal_hidl_host_test import hal_hidl_host_test 27from vts.utils.python.controllers import adb 28 29 30class UsbGadgetHidlTest(hal_hidl_host_test.HalHidlHostTest): 31 """A host-side test for USB Gadget HAL. 32 33 This test requires Android framework to run. 34 """ 35 36 TEST_HAL_SERVICES = {"android.hardware.usb.gadget@1.0::IUsbGadget"} 37 38 def setUpClass(self): 39 """Creates an adb session and reads sysprop values.""" 40 super(UsbGadgetHidlTest, self).setUpClass() 41 42 self.adb = self.dut.adb 43 try: 44 self.adb.root() 45 self.adb.wait_for_device() 46 except adb.AdbError as e: 47 logging.exception(e) 48 self.serialno = self.adb.shell("getprop ro.serialno") 49 50 def checkProtocol(self, usb_class, usb_sub_class, usb_protocol): 51 """Queries the host USB bus to see if the interface is present. 52 53 Args: 54 usb_class: usbClass id of the interface. 55 usb_sub_class: usbSubClass id of the interface. 56 usb_protocol: usbProtocol id of the interface. 57 58 Returns: 59 True if the usb interface was present. False otherwise. 60 """ 61 with usb1.USBContext() as context: 62 for device in context.getDeviceIterator(skip_on_error=True): 63 logging.info("ID %04x:%04x ", device.getVendorID(), 64 device.getProductID()) 65 for config in device.iterConfigurations(): 66 logging.info("config: %d", config.getConfigurationValue()) 67 interfaces_list = iter(config) 68 for interface in interfaces_list: 69 altsettings_list = iter(interface) 70 for altsetting in altsettings_list: 71 logging.info("interfaceNum:%d altSetting:%d " 72 "class:%d subclass:%d protocol:%d", 73 altsetting.getNumber(), 74 altsetting.getAlternateSetting(), 75 altsetting.getClass(), 76 altsetting.getSubClass(), 77 altsetting.getProtocol()) 78 if altsetting.getClass() == usb_class and \ 79 altsetting.getSubClass() == usb_sub_class and \ 80 altsetting.getProtocol() == usb_protocol: 81 return True 82 return False 83 84 def testAdb(self): 85 """Check for ADB""" 86 asserts.assertTrue(self.checkProtocol(255, 66, 1), "ADB not present") 87 88 def testMtp(self): 89 """Check for MTP. 90 91 Enables mtp and checks the host to see if mtp interface is present. 92 MTP: https://en.wikipedia.org/wiki/Media_Transfer_Protocol. 93 """ 94 self.adb.shell("svc usb setFunctions mtp true") 95 time.sleep(3) 96 asserts.assertTrue(self.checkProtocol(6, 1, 1), "MTP not present") 97 98 def testPtp(self): 99 """Check for PTP. 100 101 Enables ptp and checks the host to see if ptp interface is present. 102 PTP: https://en.wikipedia.org/wiki/Picture_Transfer_Protocol. 103 """ 104 self.adb.shell("svc usb setFunctions ptp true") 105 time.sleep(3) 106 asserts.assertTrue(self.checkProtocol(6, 1, 1), "PTP not present") 107 108 def testMIDI(self): 109 """Check for MIDI. 110 111 Enables midi and checks the host to see if midi interface is present. 112 MIDI: https://en.wikipedia.org/wiki/MIDI. 113 """ 114 self.adb.shell("svc usb setFunctions midi true") 115 time.sleep(3) 116 asserts.assertTrue(self.checkProtocol(1, 3, 0), "MIDI not present") 117 118 def testRndis(self): 119 """Check for RNDIS. 120 121 Enables rndis and checks the host to see if rndis interface is present. 122 RNDIS: https://en.wikipedia.org/wiki/RNDIS. 123 """ 124 self.adb.shell("svc usb setFunctions rndis true") 125 time.sleep(3) 126 asserts.assertTrue(self.checkProtocol(10, 0, 0), "RNDIS not present") 127 128 129if __name__ == "__main__": 130 test_runner.main() 131