Testowanie HAL świadome nazwy usługi

Android 9 zawiera obsługę uzyskiwania nazwy usługi danej instancji HAL na podstawie urządzenia, na którym uruchomione są testy Vendor Test Suite (VTS). Uruchamianie testów VTS HAL uwzględniających nazwy usług umożliwia programistom automatyzację testowania rozszerzeń dostawców, wielu warstw HAL i wielu instancji HAL zarówno w testach VTS po stronie docelowej, jak i po stronie hosta.

Informacje o nazwach usług

Każde wystąpienie działającej usługi HAL rejestruje się pod nazwą usługi.

W poprzednich wersjach Androida programiści uruchamiający testy VTS HAL musieli ustawić poprawną nazwę usługi dla klienta testowego w getService() lub pozostawić nazwę pustą i powrócić do domyślnej nazwy usługi. Wady tego podejścia obejmowały:

  • Poleganie na wiedzy programisty testu w celu ustawienia prawidłowej nazwy usługi.
  • Domyślnie ograniczone do testowania w odniesieniu do pojedynczej instancji usługi.
  • Ręczna obsługa nazw usług (tzn. ponieważ nazwy są zakodowane na stałe, należy je ręcznie zaktualizować w przypadku zmiany nazwy usługi).

W systemie Android 9 programiści mogą automatycznie uzyskać nazwę usługi dla danej instancji HAL na podstawie testowanego urządzenia. Zalety tego podejścia obejmują wsparcie dla testowania:

  • Rozszerzenia HAL dostawcy . Na przykład, jeśli dostawca ma implementację warstwy HAL Camera.provider, która działa na urządzeniach dostawcy z dostosowaną nazwą usługi, VTS może zidentyfikować instancję dostawcy i przeprowadzić na niej test.
  • Wiele instancji HAL . Na przykład, jeśli warstwa HAL graphics.composer ma dwie instancje (jedna z nazwą usługi „default” i druga z nazwą usługi „vr”), VTS może zidentyfikować obie instancje i przeprowadzić test dla każdej z nich.
  • Testowanie Multi-HAL . Używane podczas testowania wielu warstw HAL z wieloma instancjami. Na przykład podczas uruchamiania testu VTS sprawdzającego współpracę HAL klucza i strażnika, VTS może przetestować wszystkie kombinacje instancji usług dla tych warstw HAL.

Testy po stronie docelowej

Aby umożliwić rozpoznawanie nazw usług na potrzeby testowania po stronie docelowej, system Android 9 zawiera konfigurowalne środowisko testowe ( VtsHalHidlTargetTestEnvBase ), które zapewnia interfejsy do:

  • Zarejestruj w teście kierowanie na HAL.
  • Wymień wszystkie zarejestrowane HAL(y).
  • Uzyskaj nazwy usług dla zarejestrowanych HAL dostarczonych przez platformę VTS.

Ponadto platforma VTS zapewnia obsługę środowiska uruchomieniowego dla:

  • Wstępne przetwarzanie testowego pliku binarnego w celu uzyskania wszystkich zarejestrowanych testowych warstw HAL.
  • Identyfikacja wszystkich uruchomionych instancji usług i uzyskanie nazwy usługi dla każdej instancji (pobranej na podstawie vendor/manifest.xml ).
  • Obliczanie wszystkich kombinacji instancji (w celu obsługi wielu testów HAL).
  • Generowanie nowego testu dla każdej instancji usługi (kombinacji).

Przykład:

Runtime support for target-side testing

Rysunek 1. Obsługa środowiska uruchomieniowego VTS Framework do testowania po stronie docelowej

Skonfiguruj testy po stronie docelowej uwzględniające nazwę usługi

Aby skonfigurować środowisko testowe do testowania uwzględniającego nazwę usługi po stronie docelowej:

  1. Zdefiniuj testEnvironment w oparciu o VtsHalHidlTargetTestEnvBase i zarejestruj testowe warstwy HAL:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Użyj metody getServiceName() dostarczonej przez środowisko testowe, aby przekazać nazwę usługi:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Zarejestruj środowisko testowe w main() i 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();
    }

Dodatkowe przykłady można znaleźć w pliku VtsHalCameraProviderV2_4TargetTest.cpp .

Testy po stronie hosta VTS

Testy po stronie hosta VTS uruchamiają skrypty testowe po stronie hosta zamiast testowych plików binarnych na urządzeniu docelowym. Aby włączyć rozpoznawanie nazw usług w przypadku tych testów, można użyć szablonów po stronie hosta, aby wielokrotnie uruchomić ten sam skrypt testowy z różnymi parametrami (podobnie jak w przypadku testu sparametryzowanego gtest).

Runtime support for host-side testing

Rysunek 2. Obsługa środowiska uruchomieniowego VTS Framework do testowania po stronie hosta
  • Skrypt testowy hal określa docelowe usługi HAL w teście.
  • hal_hidl_host_test (podklasa param_test ) pobiera zarejestrowane testowe warstwy HAL ze skryptu testowego, identyfikuje odpowiednie nazwy usług dla testowej warstwy HAL, a następnie generuje kombinacje nazw usług (dla testów z wieloma HAL) jako parametry testowe. Udostępnia także metodę getHalServiceName() , która zwraca odpowiednią nazwę usługi zgodnie z parametrem przekazanym do bieżącego przypadku testowego.
  • Szablon param_test obsługuje logikę akceptowania listy parametrów i uruchamiania wszystkich podanych przypadków testowych dla każdego parametru. Oznacza to, że dla każdego przypadku testowego generuje N nowych sparametryzowanych przypadków testowych (N = wielkość parametrów), każdy z danym parametrem.

Skonfiguruj testy po stronie hosta uwzględniające nazwę usługi

Aby skonfigurować środowisko testowe do testowania rozpoznawania nazw usług po stronie hosta:

  1. Określ docelową usługę HAL w skrypcie testowym:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
    
  2. Wywołaj funkcję getHalServiceName() i przekaż nazwę do 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))
    

Dodatkowe przykłady można znaleźć w VtsHalMediaOmxStoreV1_0HostTest.py .

Zarejestruj testowe warstwy HAL

W poprzednich wersjach Androida VTS identyfikował testową warstwę HAL za pomocą opcji <precondition-lshal> skonfigurowanej w AndroidTest.xml . Podejście to było trudne w utrzymaniu (ponieważ wymagało od programistów prawidłowego skonfigurowania testu i odpowiedniej aktualizacji konfiguracji) i niedokładne (ponieważ zawierało tylko informacje o pakiecie i wersji, a nie informacje o interfejsie).

W systemie Android 9 VTS identyfikuje testową warstwę HAL na podstawie rozpoznawania nazw usług. Zarejestrowane testowe warstwy HAL są również przydatne do:

  • Sprawdzanie warunków wstępnych . Przed uruchomieniem testu HAL VTS może potwierdzić, że testowa warstwa HAL jest dostępna na urządzeniu docelowym i pominąć testy, jeśli tak nie jest (patrz Sprawdzanie testowalności VTS ).
  • Pomiar pokrycia . VTS wspiera pomiar pokrycia kodu między procesami poprzez wiedzę na temat testowania usług HAL, które chce mierzyć (tj. opróżniać pokrycie dla procesu usługi hal).