Para uma interface HAL, pode haver várias implementações. Para testar cada instância de uma implementação de HAL, a maneira padrão é escrever um GTest parametrizado por valor.
Configuração básica do teste
O GTest precisa herdar a classe 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 conjunto 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.
Testar com várias entradas
O GTest aceita tuplas para testes parametrizados por valor. Quando um
teste de HAL exige testes com várias entradas (por exemplo, um teste com
várias interfaces), é possível escrever 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 usar uma estrutura e funções ToString personalizadas do GTest.
Para instanciar o pacote de teste, 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<>);