Test HAL attenti al nome del servizio

Android 9 include il supporto per l'ottenimento del nome del servizio di una determinata istanza HAL in base al dispositivo su cui vengono eseguiti i test di Vendor Test Suite (VTS). L'esecuzione dei test HAL VTS che riconoscono il nome del servizio consente agli sviluppatori di automatizzare i test delle estensioni del fornitore, di più HAL e di più istanze HAL nelle esecuzioni dei test VTS lato host e lato target.

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 i test HAL VTS erano tenuti a impostare il nome del servizio corretto per il client di test in getService() o lasciare il nome vuoto e tornare al nome del servizio predefinito. Gli svantaggi di questo approccio includono:

  • Affidamento sulle conoscenze dello sviluppatore del test per impostare il nome del servizio corretto
  • Per impostazione predefinita, è possibile eseguire test su una singola istanza del 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 fase di test. I vantaggi di questo approccio includono il supporto per i test:

  • Estensioni HAL del fornitore. Ad esempio, quando un fornitore ha un implementazione di camera.provider HAL che viene eseguita sui dispositivi del fornitore 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' graphics.composer HAL ha due istanze (una con il nome del servizio "default" e una con il nome del servizio "vr"), VTS può identificare entrambe le istanze ed eseguire il test su ciascuna di esse.
  • Test multi-HAL. Utilizzato per testare più HAL con più istanze. Ad esempio, quando si esegue il test VTS che verifica il funzionamento congiunto degli HAL KeyMint (in precedenza Keymaster) e Gatekeeper, VTS può testare tutte le combinazioni di istanze di servizio per questi HAL.

Test lato target

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

  • Registrare gli HAL di targeting nel test.
  • Elencare tutti gli HAL registrati.
  • Ottenere i nomi dei servizi per gli HAL registrati forniti dal framework VTS.

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

  • Pre-elaborare il file binario di test per ottenere tutti gli HAL di test registrati.
  • Identificare tutte le istanze del servizio in esecuzione e ottenere il nome del servizio per ogni istanza (recuperata in base a vendor/manifest.xml).
  • Calcolare tutte le combinazioni di istanze (per supportare i test multi-HAL testing).
  • Generare un nuovo test per ogni istanza (combinazione) del servizio.

Esempio:

Supporto del runtime per i test lato target

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

Configurare i test lato target che riconoscono il nome del servizio

Per configurare l'ambiente di test per i test lato target che riconoscono il nome del servizio:

  1. Definisci un testEnvironment basato su 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 passare 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 VTS lato host

I test VTS lato host eseguono script di test lato host anziché file binari di test sul dispositivo di destinazione. Per abilitare il riconoscimento del nome del servizio per questi test, puoi utilizzare i modelli lato host per eseguire lo stesso script per il test più volte con parametri diversi (analogamente al test con parametri gtest).

Supporto del runtime per i test lato host

Figura 2. Supporto di runtime del framework VTS per i test lato host
  • Lo script hal test specifica i servizi HAL di targeting nel test.
  • The hal_hidl_host_test (sottoclasse di param_test) prende gli HAL di test registrati dallo script per il test, identifica i nomi dei servizi corrispondenti per l'HAL di test, quindi genera combinazioni di nomi di servizi (per i test multi-HAL) come parametri di test. Fornisce anche un metodo getHalServiceName() che restituisce il nome del servizio corrispondente in base al parametro passato a il caso di test corrente.
  • Il modello param_test supporta la logica per accettare un elenco di parametri ed eseguire tutti i casi di test specificati su ogni parametro. Ovvero, per ogni caso di test genera N nuovi casi di test con parametri (N = dimensione dei parametri), ognuno con un determinato parametro.

Configurare i test lato host che riconoscono il nome del servizio

Per configurare l'ambiente di test per i test lato host che riconoscono il nome del servizio:

  1. Specifica il servizio HAL di destinazione nello script per il 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.

Registrare gli HAL di test

Nelle versioni precedenti di Android, VTS identificava l'HAL di test utilizzando l' <precondition-lshal> opzione configurata in AndroidTest.xml. Questo approccio era difficile da gestire (in quanto si basava sulla configurazione corretta del test da parte degli sviluppatori e sull'aggiornamento della configurazione di conseguenza) e impreciso (in quanto conteneva solo le informazioni sul pacchetto e sulla versione e non le informazioni 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 delle precondizioni. Prima di eseguire un test HAL, VTS può verificare che l'HAL di test sia disponibile sul dispositivo di destinazione e saltare i test in caso contrario (consulta Controllo della testabilità VTS).
  • Misurazione della copertura. VTS supporta la misurazione della copertura del codice tra processi tramite la conoscenza dei servizi HAL di test che vuole misurare (ovvero per scaricare la copertura per il processo del servizio HAL).