Pruebas HAL conscientes del nombre del servicio

Android 9 incluye soporte para obtener el nombre del servicio de una instancia HAL determinada según el dispositivo en el que se ejecutan las pruebas de Vendor Test Suite (VTS). La ejecución de pruebas VTS HAL que reconocen el nombre del servicio permite a los desarrolladores automatizar las pruebas de extensiones de proveedores, múltiples HAL y múltiples instancias HAL en ejecuciones de pruebas VTS tanto del lado de destino como del host.

Acerca de los nombres de servicios

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 recurrir al nombre de servicio predeterminado. Las desventajas de este enfoque incluyeron:

  • Confianza 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 el nombre del servicio cambia).

En Android 9, los desarrolladores pueden obtener automáticamente el nombre del servicio para una instancia HAL determinada según el dispositivo bajo prueba. 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 del proveedor con un nombre de servicio personalizado, VTS puede identificar la instancia del proveedor y ejecutar la prueba en ella.
  • Múltiples instancias HAL . Por ejemplo, cuando el HAL graphics.composer tiene dos instancias (una con el nombre de servicio "default" 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 utiliza cuando se prueban múltiples HAL con múltiples instancias. Por ejemplo, cuando se ejecuta la prueba VTS que verifica cómo el HAL maestro de claves y el guardián funcionan juntos, VTS puede probar todas las combinaciones de instancias de servicio para esos HAL.

Pruebas del lado objetivo

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

  • Regístrese como objetivo HAL(s) en la prueba.
  • Enumere todos los HAL registrados.
  • Obtenga los nombres de servicio para HAL registrados proporcionados por el marco VTS.

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

  • Preprocesamiento del 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 para cada instancia (recuperado según vendor/manifest.xml ).
  • Calcular 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 en el lado objetivo

Configurar pruebas del lado objetivo que tengan en cuenta el nombre del servicio

Para configurar su entorno de prueba para pruebas que reconozcan el nombre del servicio del lado de destino:

  1. Defina un testEnvironment basado en VtsHalHidlTargetTestEnvBase y registre los 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. Soporte de 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 los HAL de prueba registrados del script de prueba, identifica los nombres de servicio correspondientes para el HAL de prueba y luego genera combinaciones de nombres de servicio (para pruebas de múltiples HAL) 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 lógica para aceptar una lista de parámetros y ejecutar todos los casos de prueba dados en 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 determinado.

Configurar pruebas del lado del host que reconozcan el nombre del servicio

Para configurar su entorno de prueba para pruebas que reconozcan el 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 ver ejemplos adicionales, consulte VtsHalMediaOmxStoreV1_0HostTest.py .

Registrar HAL de prueba

En versiones anteriores de Android, VTS identificaba la HAL de prueba 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 contenía solo 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 reconocimiento del nombre del servicio. Los HAL de prueba registrados también son útiles para:

  • Comprobaciones de condiciones previas . Antes de ejecutar una prueba HAL, VTS puede confirmar que la prueba HAL 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 la cobertura del código entre procesos a través del conocimiento sobre los servicios HAL de prueba que desea medir (es decir, eliminar la cobertura del proceso del servicio hal).