Testes de HAL com reconhecimento de nome de serviço

O Android 9 inclui suporte para obter o serviço de uma determinada instância de HAL com base no dispositivo em que o conjunto de testes de fornecedor (VTS) estão em execução. Como executar testes VTS de HAL que reconhecem o nome de serviço permite que os desenvolvedores automatizem o teste de extensões de fornecedores, várias HALs e várias instâncias de HAL nas execuções de teste VTS do lado do destino e do host.

Sobre os nomes dos serviços

Cada instância do serviço da HAL em execução é registrada com um nome de serviço.

Nas versões anteriores do Android, os desenvolvedores que executavam testes VTS da HAL estavam necessário para definir o nome de serviço correto para o cliente de teste no getService() ou deixe o nome em branco e substitua para o padrão nome do serviço. Estas foram as desvantagens dessa abordagem:

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

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

  • Extensões HAL de fornecedor. Por exemplo, quando um fornecedor tem implementação da HAL de camera.provider que é executada nos dispositivos do fornecedor com uma nome de serviço personalizado, o VTS pode identificar a instância do fornecedor e executar o teste contra ele.
  • Várias instâncias de HAL: Por exemplo, quando A HAL graphics.composer tem duas instâncias (uma com o nome do serviço "padrão" e outra com o nome de serviço "vr", o VTS pode identificar as instâncias e execute o teste em cada uma delas.
  • Testes multi-HAL: Usado ao testar várias HALs com várias instâncias. Por exemplo, ao executar o teste VTS que verifica a HAL do keymaster e do gatekeeper trabalham juntas, a VTS pode testar todas as combinações de instâncias de serviço para essas HALs.

Testes do alvo

Para ativar o reconhecimento de nome de serviço em testes no lado do público-alvo, o Android 9 inclui um ambiente de teste personalizável (VtsHalHidlTargetTestEnvBase) que fornece interfaces para:

  • Registre as HALs de destino no teste.
  • Liste todas as HALs registradas.
  • Consiga os nomes de serviço das HALs registradas fornecidas pelo framework VTS.

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

  • Pré-processar o binário de teste para receber todas as HALs de teste registradas.
  • Como identificar todas as instâncias de serviço em execução e receber o nome do serviço cada instância (recuperada com base em vendor/manifest.xml).
  • calculando todas as combinações de instâncias (para oferecer suporte a várias HALs teste).
  • Gerar um novo teste para cada instância de serviço (combinação).

Exemplo:

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

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

Configurar testes no lado do destino com reconhecimento de nome de serviço

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

  1. Defina um testEnvironment com base VtsHalHidlTargetTestEnvBase e registrar as HALs de teste:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Use o getServiceName() fornecido pelo ambiente de teste para transmitir 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 do lado do host do VTS

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

Suporte ao ambiente de execução para testes no lado do host

Figura 2. Suporte ao ambiente de execução do framework VTS para servidores testes
.
  • O script hal test especifica a HAL de segmentação. serviços no teste.
  • A hal_hidl_host_test (subclasse de param_test) extrai a(s) HAL(s) de teste registrada(s) do de teste, identifica os nomes de serviço correspondentes para a HAL de teste, gera combinações de nomes de serviço (para testes multi-HAL) como teste parâmetros. Ela também fornece um método getHalServiceName(), que retorna o nome de serviço correspondente de acordo com o parâmetro passado ao caso de teste atual.
  • A param_test (link em inglês) modelo suporta lógica para aceitar uma lista de parâmetros e executar todos os casos de teste para cada parâmetro. Por exemplo: para cada caso de teste, ela gera N novas caso de teste parametrizado (N = tamanho dos parâmetros), cada um com um determinado .

Configurar testes no 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 no 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

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

No Android 9, o VTS identifica a HAL de teste usando reconhecimento de nomes de serviço. As HALs de teste registradas também são úteis para:

  • Verificações de pré-condição. Antes de executar um teste da HAL, o VTS pode confirmar se a HAL de teste está disponível no dispositivo de destino e pular os testes caso contrário (consulte VTS verificação da capacidade de teste).
  • Medição de cobertura. O VTS aceita código de processo cruzado medição de cobertura com base no conhecimento sobre os testes dos serviços de HAL necessários medir (ou seja, transferir a cobertura para o processo de interrupção do serviço).