Prueba de HAL del nombre del servicio

Android 9 incluye compatibilidad para obtener el nombre del servicio de una instancia de HAL determinada en función del dispositivo en el que se ejecutan las pruebas del Paquete de pruebas del proveedor (VTS). Ejecutar pruebas de HAL de VTS que reconozcan el nombre del servicio permite a los desarrolladores automatizar las pruebas de extensiones de proveedores, varios HAL y varias instancias de HAL en ejecuciones de pruebas de VTS del destino y del host.

Acerca de los nombres de los servicios

Cada instancia del servicio de HAL en ejecución se registra con un nombre de servicio.

En versiones anteriores de Android, los desarrolladores que ejecutaban pruebas de HAL de VTS debían establecer el nombre de servicio correcto para el cliente de prueba en getService() o dejar el nombre vacío y usar como resguardo el nombre de servicio predeterminado. Entre las desventajas de este enfoque, se incluyen las siguientes:

  • Dependencia del conocimiento del desarrollador de pruebas para establecer el nombre correcto del servicio
  • Se limita a las pruebas en una única instancia de servicio de forma predeterminada.
  • Mantenimiento manual de los nombres de los servicios (es decir, debido a que los nombres están codificados, deben actualizarse de forma manual si cambia el nombre del servicio)

En Android 9, los desarrolladores pueden obtener automáticamente el nombre del servicio de una instancia de HAL determinada en función del dispositivo en prueba. Las ventajas de este enfoque incluyen la compatibilidad con las pruebas:

  • Extensiones de HAL del proveedor: Por ejemplo, cuando un proveedor tiene una implementación de HAL de camera.provider que se ejecuta en dispositivos del proveedor con un nombre de servicio personalizado, VTS puede identificar la instancia del proveedor y ejecutar la prueba en ella.
  • Varias instancias de HAL: Por ejemplo, cuando la HAL de graphics.composer tiene dos instancias (una con el nombre de servicio "default" y otra con el nombre de servicio "vr"), el VTS puede identificar ambas instancias y ejecutar la prueba en cada una de ellas.
  • Prueba de varias HAL. Se usa cuando se prueban varios HAL con varias instancias. Por ejemplo, cuando se ejecuta la prueba de VTS que verifica cómo funcionan juntos el HAL de Keymaster y el de gatekeeper, VTS puede probar todas las combinaciones de instancias de servicio para esos HAL.

Pruebas del objetivo

Para habilitar el reconocimiento de nombres de servicios para las pruebas del entorno de destino, Android 9 incluye un entorno de prueba personalizable (VtsHalHidlTargetTestEnvBase) que proporciona interfaces para lo siguiente:

  • Registra los HAL de segmentación en la prueba.
  • Enumera todos los HAL registrados.
  • Obtén los nombres de los servicios para los HAL registrados que proporciona el framework de VTS.

Además, el framework de VTS proporciona compatibilidad con el entorno de ejecución para lo siguiente:

  • Procesamiento previo del objeto binario de prueba para obtener todos los HAL de prueba registrados
  • Identificar todas las instancias de servicio en ejecución y obtener el nombre del servicio de cada instancia (recuperado en función de vendor/manifest.xml)
  • Cálculo de todas las combinaciones de instancias (para admitir varias pruebas de HAL)
  • Generarás una prueba nueva para cada instancia de servicio (combinación).

Ejemplo:

Compatibilidad del entorno de ejecución para pruebas del lado del destino

Figura 1: Compatibilidad del entorno de ejecución del framework de VTS para pruebas del lado del destino

Configura pruebas del destino que reconocen el nombre del servicio

Para configurar tu entorno de prueba para las pruebas de nombre de servicio del destino, haz lo siguiente:

  1. Define un testEnvironment basado en VtsHalHidlTargetTestEnvBase y registra los HAL de prueba:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Usa getServiceName() que proporciona el entorno de prueba para pasar el nombre del servicio:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Registra el entorno de prueba en main() y 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();
    }

Para obtener ejemplos adicionales, consulta VtsHalCameraProviderV2_4TargetTest.cpp.

Pruebas del host del VTS

Las pruebas de VTS del host ejecutan secuencias de comandos de prueba en el lado del host en lugar de los objetos binarios de prueba en el dispositivo de destino. Para habilitar el reconocimiento de nombres de servicio para estas pruebas, puedes usar plantillas del host para ejecutar la misma secuencia de comandos de prueba varias veces con diferentes parámetros (similar a la prueba parametrizada de gtest).

Compatibilidad del entorno de ejecución para pruebas del host

Figura 2: Compatibilidad del tiempo de ejecución del framework de VTS para pruebas del lado del host
  • La secuencia de comandos hal test especifica los servicios HAL de destino de la prueba.
  • hal_hidl_host_test (subclase de param_test) toma los HAL de prueba registrados de la secuencia de comandos de prueba, identifica los nombres de servicio correspondientes para el HAL de prueba y, luego, genera combinaciones de nombres de servicio (para pruebas de varios HAL) como parámetros de prueba. También proporciona un método getHalServiceName() que muestra el nombre del servicio correspondiente según el parámetro que se pasó al caso de prueba actual.
  • La plantilla param_test admite lógica para aceptar una lista de parámetros y ejecutar todos los casos de prueba determinados en cada parámetro. Es decir, para cada caso de prueba, genera N casos de prueba parametrizados nuevos (N = tamaño de los parámetros), cada uno con un parámetro determinado.

Configura pruebas del host que reconocen el nombre del servicio

Para configurar tu entorno de prueba para las pruebas de nombre de servicio del host, haz lo siguiente:

  1. Especifica el servicio de HAL de destino en la secuencia de comandos de prueba:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. Llama a getHalServiceName() y pasa el nombre a 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))

Para ver ejemplos adicionales, consulta VtsHalMediaOmxStoreV1_0HostTest.py.

Cómo registrar HAL de prueba

En versiones anteriores de Android, VTS identificaba el HAL de prueba con la opción <precondition-lshal> configurada en AndroidTest.xml. Este enfoque era difícil de mantener (ya que dependía de que los desarrolladores configuraran la prueba correctamente y actualizaran la configuración según corresponda) y poco preciso (ya que solo contenía la información del paquete y la versión, y no la información de la interfaz).

En Android 9, VTS identifica el HAL de prueba mediante el reconocimiento del nombre del servicio. Las HAL de prueba registradas también son útiles para lo siguiente:

  • Verificaciones de condiciones previas. Antes de ejecutar una prueba de HAL, VTS puede confirmar que el HAL de prueba esté disponible en el dispositivo de destino y omitir las pruebas si no es así (consulta la verificación de capacidad de prueba de VTS).
  • Medición de la cobertura: VTS admite la medición de la cobertura de código entre procesos a través del conocimiento de los servicios de HAL de prueba que desea medir (es decir, para borrar la cobertura del proceso de servicio de HAL).