Teste de HAL com reconhecimento de nome de serviço

O Android 9 inclui suporte para obter o nome do serviço de uma determinada instância HAL com base no dispositivo no qual os testes Vendor Test Suite (VTS) estão sendo executados. A execução de testes VTS HAL com reconhecimento de nome de serviço permite que os desenvolvedores automatizem o teste de extensões de fornecedores, várias HALs e várias instâncias HAL em execuções de teste VTS de destino e de host.

Sobre nomes de serviço

Cada instância do serviço HAL em execução se registra com um nome de serviço.

Nas versões anteriores do Android, os desenvolvedores que executavam testes VTS HAL eram obrigados a definir o nome de serviço correto para o cliente de teste em getService() ou deixar o nome em branco e retornar ao nome de serviço padrão. As desvantagens dessa abordagem incluíam:

  • Confiança no conhecimento do desenvolvedor de teste para definir o nome de serviço correto.
  • Limitado a testes em uma única instância de serviço por padrão.
  • Manutenção manual de nomes de serviço (ou seja, como os nomes são codificados, eles devem ser atualizados manualmente se o nome do serviço for alterado.

No Android 9, os desenvolvedores podem obter automaticamente o nome do serviço para uma determinada instância HAL com base no dispositivo em teste. As vantagens dessa abordagem incluem suporte para testes:

  • Extensões HAL do fornecedor . Por exemplo, quando um fornecedor tem uma implementação de camera.provider HAL que é executada em dispositivos do fornecedor com um nome de serviço personalizado, o VTS pode identificar a instância do fornecedor e executar o teste nela.
  • Múltiplas instâncias HAL . Por exemplo, quando o HAL do graphics.composer tiver duas instâncias (uma com nome de serviço "padrão" e outra com nome de serviço "vr"), o VTS pode identificar ambas as instâncias e executar o teste em cada uma delas.
  • Teste multi-HAL . Usado ao testar vários HALs com várias instâncias Por exemplo, ao executar o teste VTS que verifica como o keymaster e o gatekeeper HAL funcionam juntos, o VTS pode testar todas as combinações de instâncias de serviço para esses HALs.

Testes do lado do alvo

Para habilitar o conhecimento do nome do serviço para testes do lado do destino, o Android 9 inclui um ambiente de teste personalizável ( VtsHalHidlTargetTestEnvBase ) que fornece interfaces para:

  • Registre HAL(s) de segmentação no teste.
  • Liste todos os HAL(s) registrados.
  • Obtenha o(s) nome(s) de serviço para HAL(s) registrado(s) fornecido(s) pela estrutura VTS.

Além disso, a estrutura VTS fornece suporte de tempo de execução para:

  • Pré-processar o binário de teste para obter todos os HAL(s) de teste registrados.
  • Identificar todas as instâncias de serviço em execução e obter o nome do serviço para cada instância (recuperado com base em vendor/manifest.xml ).
  • Cálculo de todas as combinações de instâncias (para dar suporte a vários testes de HAL).
  • Gerando um novo teste para cada instância de serviço (combinação).

Exemplo:

Runtime support for target-side testing

Figura 1. Suporte de tempo de execução da estrutura VTS para teste do lado do destino

Configurar testes de destino com reconhecimento de nome de serviço

Para configurar seu ambiente de teste para teste de reconhecimento de nome de serviço do lado do destino:

  1. Defina um testEnvironment com base em VtsHalHidlTargetTestEnvBase e registre HALs de teste:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Use getServiceName() fornecido pelo ambiente de teste para passar o nome do serviço:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Registre o ambiente de teste em 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 exemplos adicionais, consulte VtsHalCameraProviderV2_4TargetTest.cpp .

Testes do lado do host VTS

Os testes do lado do host VTS executam scripts de teste no lado do host, em vez de binários de teste no dispositivo de destino. Para habilitar o reconhecimento de nome de serviço para esses testes, você pode usar modelos do lado do host para executar o mesmo script de teste várias vezes em parâmetros diferentes (semelhante ao teste parametrizado gtest).

Runtime support for host-side testing

Figura 2. Suporte de tempo de execução da estrutura VTS para testes no lado do host
  • O script de teste hal especifica o(s) serviço(s) HAL de destino no teste.
  • O hal_hidl_host_test (subclasse de param_test ) pega o(s) HAL(s) de teste registrado(s) do script de teste, identifica o(s) nome(s) de serviço correspondente(s) para o HAL de teste e, em seguida, gera combinações de nome de serviço (para teste multi-HAL) como parâmetros de teste. Ele também fornece um método getHalServiceName() que retorna o nome do serviço correspondente de acordo com o parâmetro passado para o caso de teste atual.
  • O modelo param_test oferece suporte à lógica para aceitar uma lista de parâmetros e executar todos os casos de teste fornecidos em cada parâmetro. Ou seja, para cada caso de teste gera N novos casos de teste parametrizados (N = tamanho dos parâmetros), cada um com um determinado parâmetro.

Configurar testes do lado do host com reconhecimento de nome de serviço

Para configurar seu ambiente de teste para teste de reconhecimento de nome de serviço do lado do host:

  1. Especifique o serviço HAL de destino no script de teste:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
    
  2. Chame getHalServiceName() e passe o nome para 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 obter exemplos adicionais, consulte VtsHalMediaOmxStoreV1_0HostTest.py .

Registrar HALs de teste

Nas versões anteriores do Android, o VTS identificava o HAL de teste usando a opção <precondition-lshal> configurada em AndroidTest.xml . Essa abordagem era difícil de manter (já que dependia dos desenvolvedores para configurar o teste adequadamente e atualizar a configuração de acordo) e imprecisa (pois continha apenas as informações do pacote e da versão e não as informações da interface).

No Android 9, o VTS identifica o HAL de teste usando o conhecimento do nome do serviço. Os HALs de teste registrados também são úteis para:

  • Verificações de pré-condição . Antes de executar um teste HAL, o VTS pode confirmar se o HAL de teste está disponível no dispositivo de destino e pular os testes se não estiver (consulte a verificação de testabilidade do VTS ).
  • Medição de cobertura . O VTS oferece suporte à medição de cobertura de código de processo cruzado por meio do conhecimento sobre os serviços HAL de teste que deseja medir (ou seja, liberar a cobertura para o processo de serviço hal).