Prueba HAL consciente 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 de Vendor Test Suite (VTS). La ejecución de pruebas HAL de VTS que tienen en cuenta el nombre del servicio permite a los desarrolladores automatizar las pruebas de extensiones de proveedores, múltiples HAL y múltiples instancias de HAL en ejecuciones de prueba de VTS del lado del destino y del host.

Acerca de los nombres de servicio

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

En versiones anteriores de Android, los desarrolladores que ejecutaban pruebas VTS HAL debían establecer el nombre de servicio correcto para el cliente de prueba en getService() o dejar el nombre vacío y volver al nombre de servicio predeterminado. Las desventajas de este enfoque incluyen:

  • Confíe en el conocimiento del desarrollador de la prueba para establecer el nombre de servicio correcto.
  • Limitado a realizar 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 manualmente si cambia el nombre del servicio).

En Android 9, los desarrolladores pueden obtener automáticamente el nombre del servicio para una instancia de HAL determinada según el dispositivo que se está probando. Las ventajas de este enfoque incluyen soporte para pruebas:

  • Extensiones HAL del proveedor . Por ejemplo, cuando un proveedor tiene una implementación de camera.provider HAL que se ejecuta en dispositivos de proveedores con un nombre de servicio personalizado, VTS puede identificar la instancia del proveedor y ejecutar la prueba en su contra.
  • Múltiples instancias de HAL . Por ejemplo, cuando graphics.composer HAL tiene dos instancias (una con el nombre de servicio "predeterminado" y otra con el nombre de servicio "vr"), VTS puede identificar ambas instancias y ejecutar la prueba en cada una de ellas.
  • Pruebas multi-HAL . Se usa cuando se prueban múltiples HAL con múltiples instancias. Por ejemplo, cuando se ejecuta la prueba VTS que verifica cómo el maestro de claves y el gatekeeper HAL funcionan juntos, VTS puede probar todas las combinaciones de instancias de servicio para esas HAL.

Pruebas del lado del objetivo

Para habilitar el conocimiento del nombre del servicio para las pruebas del lado del objetivo, Android 9 incluye un entorno de prueba personalizable ( VtsHalHidlTargetTestEnvBase ) que proporciona interfaces para:

  • Regístrese apuntando a HAL(s) en la prueba.
  • Enumere todas las HAL registradas.
  • Obtenga los nombres de servicio para las HAL registradas proporcionadas por el marco VTS.

Además, el marco VTS proporciona soporte de tiempo de ejecución para:

  • Procesamiento previo del binario de prueba para obtener todas las HAL de prueba registradas.
  • Identificar todas las instancias de servicio en ejecución y obtener el nombre del servicio para cada instancia (recuperado en función del vendor/manifest.xml ).
  • Cálculo de todas las combinaciones de instancias (para admitir múltiples pruebas HAL).
  • Generando una nueva prueba para cada instancia de servicio (combinación).

Ejemplo:

Runtime support for target-side testing

Figura 1. Compatibilidad con el tiempo de ejecución del marco VTS para pruebas del lado del destino

Configuración de pruebas del lado del destino conscientes del nombre del servicio

Para configurar su entorno de prueba para pruebas conscientes del nombre del servicio del lado del destino:

  1. Defina un entorno de VtsHalHidlTargetTestEnvBase testEnvironment registre las HAL de prueba:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Utilice getServiceName() proporcionado por 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. Registre el entorno de prueba en main() e 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 ver ejemplos adicionales, consulte VtsHalCameraProviderV2_4TargetTest.cpp .

Pruebas del lado del host VTS

Las pruebas del lado del host de VTS ejecutan scripts de prueba en el lado del host en lugar de archivos binarios de prueba en el dispositivo de destino. Para habilitar el conocimiento del nombre del servicio para estas pruebas, puede usar plantillas del lado del host para ejecutar el mismo script de prueba varias veces con diferentes parámetros (similar a la prueba parametrizada gtest).

Runtime support for host-side testing

Figura 2. Compatibilidad con el tiempo de ejecución del marco VTS para pruebas del lado del host
  • El script de prueba hal especifica los servicios HAL de destino en la prueba.
  • hal_hidl_host_test (subclase de param_test ) toma las HAL de prueba registradas del script de prueba, identifica los nombres de servicio correspondientes para la HAL de prueba y luego genera combinaciones de nombres de servicio (para pruebas de HAL múltiple) como parámetros de prueba. También proporciona un método getHalServiceName() que devuelve el nombre del servicio correspondiente según el parámetro pasado al caso de prueba actual.
  • La plantilla param_test admite la lógica para aceptar una lista de parámetros y ejecutar todos los casos de prueba dados contra cada parámetro. Es decir, para cada caso de prueba genera N nuevos casos de prueba parametrizados (N = tamaño de los parámetros), cada uno con un parámetro dado.

Configuración de pruebas del lado del host que reconocen el nombre del servicio

Para configurar su entorno de prueba para pruebas conscientes del nombre del servicio del lado del host:

  1. Especifique el servicio HAL de destino en el script de prueba:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
    
  2. Llame getHalServiceName() y pase 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 obtener ejemplos adicionales, consulte VtsHalMediaOmxStoreV1_0HostTest.py .

Registro de HAL de prueba

En versiones anteriores de Android, VTS identificaba la prueba HAL mediante la opción <precondition-lshal> configurada en AndroidTest.xml . Este enfoque era difícil de mantener (ya que dependía de los desarrolladores para configurar la prueba correctamente y actualizar la configuración en consecuencia) e inexacto (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 la HAL de prueba mediante el conocimiento del nombre del servicio. Las HAL de prueba registradas también son útiles para:

  • Comprobaciones de condiciones previas . Antes de ejecutar una prueba HAL, VTS puede confirmar que la HAL de prueba está disponible en el dispositivo de destino y omitir las pruebas si no lo está (consulte Verificación de capacidad de prueba de VTS ).
  • Medición de cobertura . VTS admite la medición de cobertura de código de proceso cruzado a través del conocimiento sobre los servicios HAL de prueba que desea medir (es decir, vaciar la cobertura para el proceso de servicio hal).