Para uma interface HAL, pode haver várias implementações. Para testar cada instância de uma implementação HAL, a maneira padrão é gravar um GTest parametrizado por valor.
Configuração básica do teste
O GTest precisa herdar a classe de base testing::TestWithParam, em que o parâmetro é o nome de cada instância. No método SetUp, o serviço pode ser instanciado com base no nome da instância, conforme mostrado no snippet de código a seguir.
// The main test class for the USB hidl HAL
class UsbHidlTest : public testing::TestWithParam<std::string> {
virtual void SetUp() override {
usb = IUsb::getService(GetParam());
ASSERT_NE(usb, nullptr);
...
}
Para cada método de teste, use a macro TEST_P, conforme mostrado no exemplo a seguir:
TEST_P(UsbHidlTest, setCallback) {
...
}
Instancie o pacote com a macro INSTANTIATE_TEST_SUITE_P, conforme mostrado no exemplo a seguir:
INSTANTIATE_TEST_SUITE_P(
PerInstance, UsbHidlTest,
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
android::hardware::PrintInstanceNameToString);
Os argumentos são:
InstantiationName, que pode ser qualquer coisa que corresponda ao seu teste.PerInstanceé um nome comum.O nome da classe de teste.
Uma coleção de nomes de instâncias, que podem ser recuperados do método integrado, por exemplo,
getAllHalInstanceNames.O método para imprimir o nome do método de teste.
PrintInstanceNameToStringé um nome integrado que pode ser usado para compilar um nome de teste com base no nome da instância e no nome do método de teste.
Teste com várias entradas
O GTest oferece suporte a tuplas para testes parametrizados por valor. Quando um teste HAL exige testes com várias entradas (por exemplo, um teste com várias interfaces), você pode gravar um GTest com tuple como o parâmetro de teste. O código completo
pode ser encontrado em VtsHalGraphicsMapperV2_1TargetTest.
Em comparação com o GTest com um único parâmetro de teste, esse teste precisa usar tuple como o parâmetro de teste, conforme mostrado no exemplo a seguir:
class GraphicsMapperHidlTest
: public ::testing::TestWithParam<std::tuple<std::string, std::string>> {
protected:
void SetUp() override {
ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>(std::get<0>(GetParam()),
std::get<1>(GetParam())));
…
}
Se forem necessários parâmetros mais complicados, recomendamos o uso de uma estrutura e funções ToString GTest personalizadas.
Para instanciar o pacote de testes, a macro INSTANTIATE\_TEST\_CASE\_P também é usada, com duas diferenças:
- O terceiro argumento é uma coleção de tuplas (em vez de uma coleção de strings no caso básico).
- O método para compilar um nome de teste precisa oferecer suporte a
tuple. Você pode usar o método integradoPrintInstanceTupleNameToString, que pode processar tuplas de strings, conforme mostrado no exemplo a seguir:
INSTANTIATE_TEST_CASE_P(
PerInstance, GraphicsMapperHidlTest,
testing::Combine(
testing::ValuesIn(
android::hardware::getAllHalInstanceNames(IAllocator::descriptor)),
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMapper::descriptor))),
android::hardware::PrintInstanceTupleNameToString<>);