Testes de HAL com reconhecimento de nome de serviço

O Android 9 inclui suporte para a obtenção do nome do serviço de uma determinada instância da HAL com base no dispositivo em que os testes do VTS estão sendo executados. Executar testes VTS HAL com reconhecimento de nome de serviço permite que os desenvolvedores automatizem extensões de fornecedores de teste, vários HALs e várias instâncias de HAL em execuções de teste VTS do lado do host e do destino.

Sobre nomes de serviços

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

Em versões anteriores do Android, os desenvolvedores que executavam testes de HAL do VTS precisavam definir o nome de serviço correto para o cliente de teste em getService() ou deixar o nome vazio e usar o nome de serviço padrão. As desvantagens dessa abordagem incluem:

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

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

  • Extensões de HAL do fornecedor. Por exemplo, quando um fornecedor tem uma implementação da HAL camera.provider 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.
  • Várias instâncias de HAL. Por exemplo, quando a HAL graphics.composer tem duas instâncias (uma com o nome de serviço "default" e outra com o nome de serviço "vr"), o VTS pode identificar as duas instâncias e executar o teste em cada uma delas.
  • Teste de várias HALs. Usado ao testar vários HALs com várias instâncias. Por exemplo, ao executar o teste do VTS que verifica como os HALs KeyMint (antes Keymaster) e Gatekeeper funcionam juntos, o VTS pode testar todas as combinações de instâncias de serviço para esses HALs.

Testes do lado do destino

Para ativar o reconhecimento 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 as HALs de segmentação no teste.
  • Liste todos os HALs registrados.
  • Receba os nomes dos serviços para HALs registrados fornecidos pela estrutura do VTS.

Além disso, o framework VTS oferece suporte de tempo de execução para:

  • Pré-processar o binário de teste para receber todas as HALs de teste registradas.
  • Identificar todas as instâncias de serviço em execução e receber o nome de serviço de cada instância (recuperado com base em vendor/manifest.xml).
  • Cálculo de todas as combinações de instâncias (para oferecer suporte a vários testes de HAL).
  • Gerar um novo teste para cada instância de serviço (combinação).

Exemplo:

Suporte de ambiente de execução para testes do lado do destino

Figura 1. Suporte de tempo de execução do framework VTS para testes do lado de destino

Configurar testes do lado da meta com reconhecimento de nome de serviço

Para configurar seu ambiente de teste para testes com reconhecimento de nome de serviço do lado da meta:

  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 transmitir 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 mais exemplos, consulte VtsHalCameraProviderV2_4TargetTest.cpp.

Testes VTS do lado do host

Os testes do lado do host do VTS executam scripts de teste no lado do host em vez de binários de teste no dispositivo de destino. Para ativar o reconhecimento do nome do serviço nesses testes, use modelos do lado do host para executar o mesmo script de teste várias vezes com parâmetros diferentes, semelhante ao teste parametrizado do gtest.

Suporte de ambiente de execução para testes no host

Figura 2. Suporte de tempo de execução do framework VTS para testes do lado do host
  • O script hal test especifica os serviços de HAL de destino no teste.
  • O hal_hidl_host_test (subclasse de param_test) usa as HALs de teste registradas do script de teste, identifica os nomes de serviço correspondentes para a HAL de teste e gera combinações de nomes de serviço (para testes de várias HALs) 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 transmitido para o caso de teste atual.
  • O modelo param_test aceita uma lista de parâmetros e executa todos os casos de teste fornecidos em relação a cada parâmetro. Ou seja, para cada caso de teste, ele 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 testes com 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 transmita 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 mais exemplos, consulte VtsHalMediaOmxStoreV1_0HostTest.py.

Registrar HALs de teste

Em 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 corretamente e atualizar a configuração de acordo com isso) e imprecisa (já que continha apenas as informações do pacote e da versão, e não da interface).

No Android 9, o VTS identifica a HAL de teste usando o reconhecimento 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 de HAL, o VTS pode confirmar se a HAL de teste está disponível no dispositivo de destino e ignorar os testes se não estiver. Consulte a Verificação de capacidade de teste do VTS.
  • Medição de cobertura. O VTS oferece suporte à medição de cobertura de código entre processos usando o conhecimento sobre os serviços de HAL de teste que ele quer medir (ou seja, para limpar a cobertura do processo de serviço de HAL).