168 lines
5.6 KiB
Python
168 lines
5.6 KiB
Python
#
|
|
# Copyright (C) 2016 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
|
|
|
|
from vts.runners.host import errors
|
|
|
|
_DEFAULT_HWBINDER_SERVICE = "default"
|
|
|
|
COMPONENT_CLASS_DICT = {
|
|
"hal_conventional": 1,
|
|
"hal_conventional_submodule": 2,
|
|
"hal_legacy": 3,
|
|
"hal_hidl": 4,
|
|
"hal_hidl_wrapped_conventional": 5,
|
|
"lib_shared": 11
|
|
}
|
|
|
|
COMPONENT_TYPE_DICT = {
|
|
"audio": 1,
|
|
"camera": 2,
|
|
"gps": 3,
|
|
"gnss": 3,
|
|
"light": 4,
|
|
"wifi": 5,
|
|
"mobile": 6,
|
|
"bluetooth": 7,
|
|
"nfc": 8,
|
|
"vibrator": 12,
|
|
"thermal": 13,
|
|
"tv_input": 14,
|
|
"tv_cec": 15,
|
|
"sensors": 16,
|
|
"vehicle": 17,
|
|
"vr": 18,
|
|
"graphics_allocator": 19,
|
|
"graphics_mapper": 20,
|
|
"radio": 21,
|
|
"contexthub": 22,
|
|
"graphics_composer": 23,
|
|
"media_omx": 24,
|
|
"tests_msgq": 25,
|
|
"tests_memory": 26,
|
|
"dumpstate": 27,
|
|
"media_c2": 28,
|
|
"bionic_libm": 1001,
|
|
"bionic_libc": 1002,
|
|
"vndk_libcutils": 1101
|
|
}
|
|
|
|
|
|
class MirrorObject(object):
|
|
"""The class that mirrors objects on the native side.
|
|
|
|
Attributes:
|
|
_client: VtsTcpClient, the client instance that can be used to send
|
|
commands to the target-side's agent.
|
|
_caller_uid: string, the caller's UID if not None.
|
|
"""
|
|
|
|
def __init__(self, client, caller_uid=None):
|
|
self._client = client
|
|
self._caller_uid = caller_uid
|
|
|
|
def CleanUp(self):
|
|
if self._client:
|
|
self._client.Disconnect()
|
|
|
|
def SetCallerUid(self, uid):
|
|
"""Sets target-side caller's UID.
|
|
|
|
Args:
|
|
uid: string, the caller's UID.
|
|
"""
|
|
self._caller_uid = uid
|
|
|
|
def LaunchMirrorDriver(self,
|
|
driver_type,
|
|
target_class,
|
|
target_type,
|
|
target_version_major,
|
|
target_version_minor,
|
|
target_package="",
|
|
target_filename=None,
|
|
target_component_name=None,
|
|
handler_name=None,
|
|
service_name=None,
|
|
hw_binder_service_name=_DEFAULT_HWBINDER_SERVICE,
|
|
bits=64,
|
|
is_test_hal=False):
|
|
"""Initiates the driver for a lib on the target device and creates a top
|
|
level MirroObject for it.
|
|
|
|
Args:
|
|
driver_type: type of
|
|
target_class: string, the target class name (e.g., lib).
|
|
target_type: string, the target type name (e.g., light, camera).
|
|
target_version_major:
|
|
int, the target component major version (e.g. 1.0 -> 1).
|
|
target_version_minor:
|
|
int, the target component minor version (e.g. 1.0 -> 0).
|
|
target_basepaths: list of strings, the paths to look for target
|
|
files in. Default is _DEFAULT_TARGET_BASE_PATHS.
|
|
target_package: . separated string (e.g., a.b.c) to denote the
|
|
package name of target component.
|
|
target_filename: string, the target file name (e.g., libm.so).
|
|
handler_name: string, the name of the handler. target_type is used
|
|
by default.
|
|
bits: integer, processor architecture indicator: 32 or 64.
|
|
Default is 64 bits.
|
|
is_test_hal: bool, whether the HAL service is a test HAL
|
|
(e.g. msgq).
|
|
|
|
Raises:
|
|
errors.ComponentLoadingError is raised when error occurs trying to
|
|
create a MirrorObject.
|
|
"""
|
|
if bits not in [32, 64]:
|
|
raise error.ComponentLoadingError(
|
|
"Invalid value for bits: %s" % bits)
|
|
if not handler_name:
|
|
handler_name = target_type
|
|
if not service_name:
|
|
service_name = "vts_driver_%s" % handler_name
|
|
|
|
# Launch the corresponding driver of the requested HAL on the target.
|
|
logging.debug("Init the driver service for %s", target_type)
|
|
target_class_id = COMPONENT_CLASS_DICT[target_class.lower()]
|
|
target_type_id = COMPONENT_TYPE_DICT[target_type.lower()]
|
|
|
|
driver_id = self._client.LaunchDriverService(
|
|
driver_type=driver_type,
|
|
service_name=service_name,
|
|
bits=bits,
|
|
file_path=target_filename,
|
|
target_class=target_class_id,
|
|
target_type=target_type_id,
|
|
target_version_major=target_version_major,
|
|
target_version_minor=target_version_minor,
|
|
target_package=target_package,
|
|
target_component_name=target_component_name,
|
|
hw_binder_service_name=hw_binder_service_name,
|
|
is_test_hal=is_test_hal)
|
|
|
|
if driver_id == -1:
|
|
raise errors.ComponentLoadingError(
|
|
"Failed to launch driver service %s from file path %s" %
|
|
(target_type, target_filename))
|
|
|
|
return driver_id
|
|
|
|
def Ping(self):
|
|
"""Returns true iff pinging the agent is successful, False otherwise."""
|
|
return self._client.Ping()
|