blob: da9abb6295e7bda062146a230759368d6bc5e9cb [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright (C) 2018 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import logging
import time
import usb1
from vts.runners.host import asserts
from vts.runners.host import base_test
from vts.runners.host import const
from vts.runners.host import test_runner
from vts.testcases.template.hal_hidl_host_test import hal_hidl_host_test
from vts.utils.python.controllers import adb
class UsbGadgetHidlTest(hal_hidl_host_test.HalHidlHostTest):
"""A host-side test for USB Gadget HAL.
This test requires Android framework to run.
"""
TEST_HAL_SERVICES = {"android.hardware.usb.gadget@1.0::IUsbGadget"}
def setUpClass(self):
"""Creates an adb session and reads sysprop values."""
super(UsbGadgetHidlTest, self).setUpClass()
self.adb = self.dut.adb
try:
self.adb.root()
self.adb.wait_for_device()
except adb.AdbError as e:
logging.exception(e)
self.serialno = self.adb.shell("\"getprop ro.serialno\"")
def checkProtocol(self, usb_class, usb_sub_class, usb_protocol):
"""Queries the host USB bus to see if the interface is present.
Args:
usb_class: usbClass id of the interface.
usb_sub_class: usbSubClass id of the interface.
usb_protocol: usbProtocol id of the interface.
Returns:
True if the usb interface was present. False otherwise.
"""
with usb1.USBContext() as context:
for device in context.getDeviceIterator(skip_on_error=True):
logging.info("ID %04x:%04x ", device.getVendorID(),
device.getProductID())
for config in device.iterConfigurations():
logging.info("config: %d", config.getConfigurationValue())
interfaces_list = iter(config)
for interface in interfaces_list:
altsettings_list = iter(interface)
for altsetting in altsettings_list:
logging.info("interfaceNum:%d altSetting:%d "
"class:%d subclass:%d protocol:%d",
altsetting.getNumber(),
altsetting.getAlternateSetting(),
altsetting.getClass(),
altsetting.getSubClass(),
altsetting.getProtocol())
if altsetting.getClass() == usb_class and \
altsetting.getSubClass() == usb_sub_class and \
altsetting.getProtocol() == usb_protocol:
return True
return False
def testAdb(self):
"""Check for ADB"""
asserts.assertTrue(self.checkProtocol(255, 66, 1), "ADB not present")
def testMtp(self):
"""Check for MTP.
Enables mtp and checks the host to see if mtp interface is present.
MTP: https://en.wikipedia.org/wiki/Media_Transfer_Protocol.
"""
self.adb.shell("svc usb setFunctions mtp true")
time.sleep(3)
asserts.assertTrue(self.checkProtocol(6, 1, 1), "MTP not present")
def testPtp(self):
"""Check for PTP.
Enables ptp and checks the host to see if ptp interface is present.
PTP: https://en.wikipedia.org/wiki/Picture_Transfer_Protocol.
"""
self.adb.shell("svc usb setFunctions ptp true")
time.sleep(3)
asserts.assertTrue(self.checkProtocol(6, 1, 1), "PTP not present")
def testMIDI(self):
"""Check for MIDI.
Enables midi and checks the host to see if midi interface is present.
MIDI: https://en.wikipedia.org/wiki/MIDI.
"""
self.adb.shell("svc usb setFunctions midi true")
time.sleep(3)
asserts.assertTrue(self.checkProtocol(1, 3, 0), "MIDI not present")
def testRndis(self):
"""Check for RNDIS.
Enables rndis and checks the host to see if rndis interface is present.
RNDIS: https://en.wikipedia.org/wiki/RNDIS.
"""
self.adb.shell("svc usb setFunctions rndis true")
time.sleep(3)
asserts.assertTrue(self.checkProtocol(10, 0, 0), "RNDIS not present")
if __name__ == "__main__":
test_runner.main()