Tests HAL de reconnaissance du nom de service

Android 9 permet d'obtenir le nom du service d'une instance HAL donnée en fonction de l'appareil sur lequel les tests VTS (Vendor Test Suite) sont exécutés. L'exécution de tests HAL VTS compatibles avec le nom de service permet aux développeurs d'automatiser les tests des extensions du fournisseur, de plusieurs HAL et de plusieurs instances HAL à la fois côté cible et côté hôte.

À propos des noms de service

Chaque instance du service HAL en cours d'exécution s'enregistre avec un nom de service.

Dans les versions précédentes d'Android, les développeurs exécutant des tests HAL VTS devaient définir le nom de service correct pour le client de test dans getService() ou laisser le nom vide et utiliser le nom de service par défaut. Les inconvénients de cette approche sont les suivants:

  • Recours aux connaissances du développeur de test pour définir le nom de service correct.
  • Limité aux tests sur une seule instance de service par défaut.
  • Maintenance manuelle des noms de service (c'est-à-dire que, comme les noms sont codés en dur, ils doivent être mis à jour manuellement si le nom du service change).

Sous Android 9, les développeurs peuvent obtenir automatiquement le nom du service pour une instance HAL donnée en fonction de l'appareil testé. Les avantages de cette approche incluent la prise en charge des tests:

  • Extensions HAL des fournisseurs. Par exemple, lorsqu'un fournisseur dispose d'une implémentation de l'HAL camera.provider qui s'exécute sur les appareils du fournisseur avec un nom de service personnalisé, VTS peut identifier l'instance du fournisseur et exécuter le test à son encontre.
  • Plusieurs cas d'utilisation HAL Par exemple, lorsque le HAL graphics.composer comporte deux instances (une avec le nom de service "default" et l'autre avec le nom de service "vr"), le VTS peut identifier les deux instances et exécuter le test sur chacune d'elles.
  • Tests multiHAL : Utilisé lors du test de plusieurs HAL avec plusieurs instances. Par exemple, lorsque vous exécutez le test VTS qui vérifie le fonctionnement des HAL keymaster et gatekeeper, VTS peut tester toutes les combinaisons d'instances de service pour ces HAL.

Tests côté cible

Pour activer la détection des noms de service pour les tests côté cible, Android 9 inclut un environnement de test personnalisable (VtsHalHidlTargetTestEnvBase) qui fournit des interfaces pour:

  • Enregistrez les HAL de ciblage dans le test.
  • Répertoriez tous les HAL enregistrés.
  • Obtenez le ou les noms de service pour les HAL enregistrés fournis par le framework VTS.

De plus, le framework VTS est compatible avec les éléments suivants au moment de l'exécution:

  • Prétraiter le binaire de test pour obtenir tous les HAL de test enregistrés
  • Identifier toutes les instances de service en cours d'exécution et obtenir le nom du service pour chaque instance (récupéré à partir de vendor/manifest.xml).
  • Calcul de toutes les combinaisons d'instances (pour prendre en charge plusieurs tests HAL).
  • Générer un nouveau test pour chaque instance de service (combinaison).

Exemple :

Compatibilité des environnements d'exécution avec les tests côté cible

Figure 1. Compatibilité avec l'environnement d'exécution du framework VTS pour les tests côté cible

Configurer des tests côté cible tenant compte du nom du service

Pour configurer votre environnement de test pour les tests respectueux du nom de service côté cible:

  1. Définissez un testEnvironment basé sur VtsHalHidlTargetTestEnvBase et enregistrez des HAL de test:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Utilisez getServiceName() fourni par l'environnement de test pour transmettre le nom du service:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Enregistrez l'environnement de test dans main() et 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();
    }

Pour obtenir d'autres exemples, consultez VtsHalCameraProviderV2_4TargetTest.cpp.

Tests côté hôte de la VTS

Les tests côté hôte VTS exécutent des scripts de test côté hôte au lieu de binaires de test sur l'appareil cible. Pour activer la prise en compte du nom de service pour ces tests, vous pouvez utiliser des modèles côté hôte pour exécuter le même script de test plusieurs fois avec différents paramètres (comme le test paramétré gtest).

Compatibilité avec les environnements d&#39;exécution pour les tests côté hôte

Figure 2. Prise en charge de l'environnement d'exécution du framework VTS pour les tests côté hôte
  • Le script de test hal spécifie le ou les services HAL de ciblage inclus dans le test.
  • hal_hidl_host_test (sous-classe de param_test) récupère les HAL de test enregistrés à partir du script de test, identifie le ou les noms de service correspondants pour le HAL de test, puis génère des combinaisons de noms de service (pour les tests multi-HAL) en tant que paramètres de test. Il fournit également une méthode getHalServiceName() qui renvoie le nom de service correspondant en fonction du paramètre transmis au cas de test en cours.
  • Le modèle param_test accepte une logique permettant d'accepter une liste de paramètres et d'exécuter tous les cas de test donnés pour chaque paramètre. Autrement dit, pour chaque scénario de test, il génère N nouveaux scénarios de test paramétrés (N = taille des paramètres), chacun avec un paramètre donné.

Configurer des tests côté hôte tenant compte du nom du service

Pour configurer votre environnement de test pour les tests de prise en compte du nom de service côté hôte:

  1. Spécifiez le service HAL cible dans le script de test:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. Appelez getHalServiceName() et transmettez le nom à 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))

Pour obtenir des exemples supplémentaires, consultez VtsHalMediaOmxStoreV1_0HostTest.py.

Enregistrer des HAL de test

Dans les versions précédentes d'Android, VTS identifiait le HAL de test à l'aide de l'option <precondition-lshal> configurée dans AndroidTest.xml. Cette approche était difficile à gérer (car elle dépendait des développeurs pour configurer correctement le test et mettre à jour la configuration en conséquence) et inexacte (car elle ne contenait que les informations sur le package et la version, et non les informations sur l'interface).

Dans Android 9, VTS identifie le HAL de test à l'aide de la prise en compte du nom de service. Les HAL de test enregistrés sont également utiles pour:

  • Vérifications de condition préalable. Avant d'exécuter un test HAL, VTS peut confirmer que le HAL de test est disponible sur l'appareil cible et ignorer les tests s'il ne l'est pas (voir la section Vérification de la testabilité VTS).
  • Mesure de la couverture VTS prend en charge la mesure de la couverture du code entre les processus via les connaissances sur les services HAL de test qu'il souhaite mesurer (c'est-à-dire pour effacer la couverture du processus de service HAL).