Test HAL sensibile al nome del servizio

Android 9 include il supporto per ottenere il nome del servizio di una determinata istanza HAL in base al dispositivo su cui vengono eseguiti i test della suite di test del fornitore (VTS). L'esecuzione di test VTS HAL sensibili al nome del servizio consente agli sviluppatori di automatizzare i test delle estensioni del fornitore, di più HAL e di più istanze HAL nelle esecuzioni di test VTS lato host e di destinazione.

Informazioni sui nomi dei servizi

Ogni istanza del servizio HAL in esecuzione si registra con un nome di servizio.

Nelle versioni precedenti di Android, gli sviluppatori che eseguivano test HAL VTS dovevano impostare il nome del servizio corretto per il client di test in getService() oppure lasciare vuoto il nome e lasciare il nome del servizio di riserva predefinito. Gli svantaggi di questo approccio includevano:

  • Dipendenza dalle conoscenze dello sviluppatore del test per impostare il nome corretto del servizio.
  • Per impostazione predefinita, è limitato ai test su una singola istanza di servizio.
  • Manutenzione manuale dei nomi dei servizi (ovvero, poiché i nomi sono hardcoded, devono essere aggiornati manualmente se il nome del servizio cambia.

In Android 9, gli sviluppatori possono ottenere automaticamente il nome del servizio per una determinata istanza HAL in base al dispositivo in test. I vantaggi di questo approccio includono il supporto per i test:

  • Estensioni HAL del fornitore. Ad esempio, quando un fornitore ha un'implementazione dell'HAL camera.provider in esecuzione sui suoi dispositivi con un nome di servizio personalizzato, VTS può identificare l'istanza del fornitore ed eseguire il test su di essa.
  • Più istanze HAL. Ad esempio, quando l'HAL graphics.composer ha due istanze (una con nome di servizio "default" e una con nome di servizio "vr"), il VTS può identificare entrambe le istanze ed eseguire il test su ciascuna di esse.
  • Test multi-HAL. Utilizzata per testare più HAL con più istanze. Ad esempio, durante l'esecuzione del test VTS che verifica l'interazione tra keymaster e gatekeeper, VTS può testare tutte le combinazioni di istanze di servizio per questi HAL.

Test lato target

Per abilitare la consapevolezza del nome del servizio per i test lato target, Android 9 include un ambiente di test personalizzabile (VtsHalHidlTargetTestEnvBase) che fornisce interfacce per:

  • Registra gli HAL di targeting nel test.
  • Elenca tutti gli HAL registrati.
  • Recupera i nomi dei servizi per gli HAL registrati forniti dal framework VTS.

Inoltre, il framework VTS fornisce il supporto di runtime per:

  • Pre-elaborazione del file binario di test per ottenere tutti gli HAL di test registrati.
  • Identificazione di tutte le istanze di servizio in esecuzione e recupero del nome del servizio per ciascuna istanza (recuperato in base a vendor/manifest.xml).
  • Calcolo di tutte le combinazioni di istanze (per supportare più test HAL).
  • Generazione di un nuovo test per ogni istanza di servizio (combinazione).

Esempio:

Supporto di runtime per i test lato target

Figura 1. Supporto del runtime del framework VTS per i test lato target

Configura i test lato destinazione sensibili al nome del servizio

Per configurare l'ambiente di test per i test attenti al nome del servizio lato target:

  1. Definisci un testEnvironment in base a VtsHalHidlTargetTestEnvBase e registra gli HAL di test:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Utilizza getServiceName() fornito dall'ambiente di test per trasmettere il nome del servizio:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Registra l'ambiente di test in 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();
    }

Per altri esempi, consulta VtsHalCameraProviderV2_4TargetTest.cpp.

Test lato host VTS

I test lato host VTS eseguono script di test lato host anziché binari di test sul dispositivo di destinazione. Per attivare la consapevolezza del nome del servizio per questi test, puoi utilizzare i modelli lato host per eseguire lo stesso script di test più volte con parametri diversi (in modo simile al test parametrizzato gtest).

Supporto del runtime per i test lato host

Figura 2. Supporto del framework VTS in fase di runtime per i test lato host
  • Lo script hal test specifica i servizi HAL di targeting nel test.
  • hal_hidl_host_test (sottoclasse di param_test) prende gli HAL di test registrati dallo script di test, identifica i nomi di servizio corrispondenti per l'HAL di test e genera combinazioni di nomi di servizio (per i test multi-HAL) come parametri di test. Fornisce inoltre un metodo getHalServiceName() che restituisce il nome del servizio corrispondente in base al parametro passato allo scenario di test corrente.
  • Il modello param_test supporta la logica per accettare un elenco di parametri ed eseguire tutti gli scenari di test specificati su ciascun parametro. In altre parole, per ogni test case genera N nuovi scenari di test parametrici (N = dimensione dei parametri), ciascuno con un determinato parametro.

Configurare i test lato host che riconoscono il nome del servizio

Per configurare l'ambiente di test per i test attenti al nome del servizio lato host:

  1. Specifica il servizio HAL target nello script di test:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. Chiama getHalServiceName() e passa il nome a 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))

Per altri esempi, consulta VtsHalMediaOmxStoreV1_0HostTest.py.

Registra HAL di test

Nelle versioni precedenti di Android, VTS ha identificato l'HAL di test utilizzando l'opzione <precondition-lshal> configurata in AndroidTest.xml. Questo approccio era difficile da gestire (poiché faceva affidamento sugli sviluppatori per configurare correttamente il test e aggiornare la configurazione di conseguenza) e impreciso (poiché conteneva solo le informazioni sul pacchetto e sulla versione e non quelle sull'interfaccia).

In Android 9, VTS identifica l'HAL di test utilizzando il riconoscimento del nome del servizio. Gli HAL di test registrati sono utili anche per:

  • Controlli dei prerequisiti. Prima di eseguire un test HAL, VTS può confermare che l'HAL di test è disponibile sul dispositivo di destinazione e saltare i test in caso contrario (fai riferimento al controllo della verificabilità VTS).
  • Misurazione della copertura. VTS supporta la misurazione della copertura del codice in più processi grazie alla conoscenza dei servizi HAL di test che vuole misurare (ovvero per il flush della copertura per il processo di servizio hal).