服务名称感知 HAL 测试

Android 9 包含支持,可以根据运行供应商测试套件 (VTS) 测试的设备,获取给定 HAL 实例的服务名称。运行服务名称感知的 VTS HAL 测试,使开发者能够在目标端和主机端的 VTS 测试运行中,自动化测试供应商扩展、多个 HAL 和多个 HAL 实例。

关于服务名称

正在运行的 HAL 服务的每个实例都会使用服务名称注册自身。

在之前的 Android 版本中,运行 VTS HAL 测试的开发者需要在 getService() 中为测试客户端设置正确的服务名称,或者将名称留空并回退到默认服务名称。这种方法的缺点包括

  • 依赖于测试开发者设置正确服务名称的知识。
  • 默认情况下,限制为针对单个服务实例进行测试。
  • 手动维护服务名称(即,由于名称是硬编码的,如果服务名称更改,则必须手动更新)。

在 Android 9 中,开发者可以根据被测设备自动获取给定 HAL 实例的服务名称。这种方法的优点包括支持测试

  • 供应商 HAL 扩展。例如,当供应商拥有 camera.provider HAL 的实现,该实现在具有自定义服务名称的供应商设备上运行时,VTS 可以识别供应商实例并针对其运行测试。
  • 多个 HAL 实例。例如,当 graphics.composer HAL 有两个实例(一个服务名称为“default”,另一个服务名称为“vr”)时,VTS 可以识别这两个实例并针对每个实例运行测试。
  • 多 HAL 测试。用于测试具有多个实例的多个 HAL。例如,当运行 VTS 测试以验证 keymaster 和 gatekeeper HAL 如何协同工作时,VTS 可以测试这些 HAL 的所有服务实例组合。

目标端测试

为了在目标端测试中启用服务名称感知,Android 9 包含一个可自定义的测试环境 (VtsHalHidlTargetTestEnvBase),该环境提供以下接口:

  • 在测试中注册目标 HAL。
  • 列出所有已注册的 HAL。
  • 获取 VTS 框架提供的已注册 HAL 的服务名称。

此外,VTS 框架还提供以下运行时支持:

  • 预处理测试二进制文件以获取所有已注册的测试 HAL。
  • 识别所有正在运行的服务实例,并获取每个实例的服务名称(基于 vendor/manifest.xml 检索)。
  • 计算所有实例组合(以支持多 HAL 测试)。
  • 为每个服务实例(组合)生成新测试。

示例

Runtime support for target-side testing

图 1. VTS 框架运行时对目标端测试的支持

设置服务名称感知的目标端测试

要为目标端服务名称感知测试设置测试环境

  1. 基于 VtsHalHidlTargetTestEnvBase 定义 testEnvironment 并注册测试 HAL
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. 使用测试环境提供的 getServiceName() 传递服务名称
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. main()initTest 中注册测试环境
    int main(int argc, char** argv) {
            testEnv = new testEnvironment();
            ::testing::AddGlobalTestEnvironment(testEnv);
            ::testing::InitGoogleTest(&argc, argv);
            testEnv->init(argc, argv);
            return RUN_ALL_TESTS();
    }

如需其他示例,请参阅 VtsHalCameraProviderV2_4TargetTest.cpp

VTS 主机端测试

VTS 主机端测试在主机端而不是目标设备上运行测试脚本。为了让这些测试能够识别服务名称,您可以使用主机端模板针对不同参数多次运行相同的测试脚本(类似于 gtest 参数化测试)。

Runtime support for host-side testing

图 2. 用于主机端测试的 VTS 框架运行时支持
  • hal test 脚本指定测试中要定位的 HAL 服务。
  • hal_hidl_host_testparam_test 的子类)从测试脚本中获取注册的测试 HAL,识别测试 HAL 的相应服务名称,然后生成服务名称组合(用于多 HAL 测试)作为测试参数。它还提供了一个方法 getHalServiceName(),该方法根据传递给当前测试用例的参数返回相应的服务名称。
  • param_test 模板支持接受参数列表并针对每个参数运行所有给定测试用例的逻辑。即,对于每个测试用例,它生成 N 个新的参数化测试用例(N = 参数大小),每个测试用例都有一个给定的参数。

设置可识别服务名称的主机端测试

要为主机端可识别服务名称的测试设置测试环境

  1. 在测试脚本中指定目标 HAL 服务
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. 调用 getHalServiceName() 并将名称传递给 init hal
    self.dut.hal.InitHidlHal(
                target_type='foo',
                target_basepaths=self.dut.libPaths,
                target_version=1.0,
                target_package='android.hardware.foo',
                target_component_name='IFoo',
                hw_binder_service_name
                      =self.getHalServiceName("android.hardware.foo@1.0::IFoo"),
                bits=int(self.abi_bitness))

如需其他示例,请参阅 VtsHalMediaOmxStoreV1_0HostTest.py

注册测试 HAL

在以前版本的 Android 中,VTS 使用 AndroidTest.xml 中配置的 <precondition-lshal> 选项来识别测试 HAL。这种方法难以维护(因为它依赖于开发者正确配置测试并相应地更新配置),并且不准确(因为它仅包含软件包和版本信息,而不包含接口信息)。

在 Android 9 中,VTS 使用服务名称识别功能来识别测试 HAL。注册的测试 HAL 也可用于

  • 前提条件检查。在运行 HAL 测试之前,VTS 可以确认目标设备上是否提供了测试 HAL,如果未提供,则跳过测试(请参阅 VTS 可测试性检查)。
  • 覆盖率衡量。VTS 通过了解其要衡量的测试 HAL 服务(即,刷新 hal 服务进程的覆盖率)来支持跨进程代码覆盖率衡量。