GTest paramétré pour les tests HAL

Pour une interface HAL, il peut y avoir plusieurs implémentations. Pour tester chaque instance pour une implémentation HAL, la méthode standard consiste à écrire un gtest paramétré par valeur .

Configuration de test de base

Le gtest doit hériter de la classe de base testing::TestWithParam , dont le paramètre est le nom de chaque instance. Dans la méthode SetUp , le service peut être instancié en fonction du nom de l'instance, comme indiqué dans l'extrait de code suivant.

// 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);
...
 }

Pour chaque méthode de test, utilisez la macro TEST_P comme indiqué dans l'exemple ci-dessous.

TEST_P(UsbHidlTest, setCallback) {
...
}

Instanciez la suite avec la macro INSTANTIATE_TEST_SUITE_P , comme indiqué dans l'exemple ci-dessous.

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

Les arguments sont :

  1. InstantiationName , qui peut être tout ce qui correspond à votre test. PerInstance est un nom commun.

  2. Le nom de la classe de test.

  3. Une collection de noms d'instances, qui peuvent être récupérés à partir de la méthode intégrée, par exemple getAllHalInstanceNames .

  4. La méthode pour imprimer le nom de la méthode de test. PrintInstanceNameToString est un nom intégré que vous pouvez utiliser pour compiler un nom de test basé sur le nom de l'instance et le nom de la méthode de test.

Test avec plusieurs entrées

gtest prend en charge les tuples pour les tests paramétrés par valeur. Lorsqu'un test HAL nécessite un test avec plusieurs entrées (par exemple, un test avec plusieurs interfaces), vous pouvez écrire un gtest avec tuple comme paramètre de test. Le code complet peut être trouvé dans VtsHalGraphicsMapperV2_1TargetTest .

Comparé au gtest avec un seul paramètre de test, ce test doit utiliser tuple comme paramètre de test, comme indiqué dans l'exemple ci-dessous.

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())));
…
}

Si des paramètres plus compliqués sont nécessaires, il est recommandé d'utiliser une structure et des fonctions gtest ToString personnalisées.

Pour instancier la suite de tests, la macro INSTANTIATE\_TEST\_CASE\_P est également utilisée, avec deux différences :

  • Le troisième argument est une collection de tuples (contre une collection de chaînes dans le cas de base).
  • La méthode pour compiler un nom de test doit prendre en charge tuple . Vous pouvez utiliser la méthode intégrée PrintInstanceTupleNameToString , qui peut gérer des tuples de chaînes, comme indiqué dans l'exemple ci-dessous.
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<>);