Testowanie HAL rozpoznające nazwę usługi

Android 9 umożliwia uzyskiwanie nazwy usługi dla danej instancji HAL na podstawie urządzenia, na którym uruchomione są testy VTS dostawcy zewnętrznego. Uruchamianie testów VTS HAL z uwzględnieniem nazwy usługi umożliwia deweloperom zautomatyzowanie testowania rozszerzeń dostawców, wielu HAL-i i wielu instancji HAL-i zarówno w przypadku testów VTS po stronie docelowej, jak i po stronie hosta.

Nazwy usług

Każda instancja uruchomionej usługi HAL rejestruje się za pomocą nazwy usługi.

W poprzednich wersjach Androida deweloperzy przeprowadzający testy HAL VTS musieli ustawić prawidłową nazwę usługi dla klienta testowego w pliku getService() lub pozostawić nazwę pustą i przełączyć się na domyślną nazwę usługi. Wady tego podejścia:

  • poleganie na wiedzy dewelopera testu w celu ustawienia prawidłowej nazwy usługi;
  • Domyślnie ogranicza testowanie do pojedynczej instancji usługi.
  • Ręczna konserwacja nazw usług (np. nazwy są zakodowane na stałe, dlatego w przypadku zmiany nazwy usługi trzeba je aktualizować ręcznie.

W Androidzie 9 deweloperzy mogą automatycznie pobierać nazwę usługi dla danej instancji HAL na podstawie testowanego urządzenia. Zalety tego podejścia to m.in. możliwość testowania:

  • Rozszerzenia HAL dostawcy. Jeśli na przykład dostawca ma implementację interfejsu HAL camera.provider, która działa na urządzeniach dostawcy z niestandardową nazwą usługi, VTS może zidentyfikować instancję dostawcy i przeprowadzić test.
  • Wiele instancji HAL. Jeśli na przykład graphics.composer HAL ma 2 instancje (jedną o nazwie usługi „default”, a drugą o nazwie usługi „vr”), VTS może zidentyfikować obie instancje i przeprowadzić test w przypadku każdej z nich.
  • Testowanie wielu HAL. Używany podczas testowania wielu HAL-i z wieloma instancjami. Na przykład podczas uruchamiania testu VTS, który sprawdza, jak działają razem kluczowy i bramkowy HAL, VTS może przetestować wszystkie kombinacje instancji usługi dla tych HAL-i.

Testy po stronie docelowej

Aby umożliwić rozpoznawanie nazwy usługi w ramach testów na stronie docelowej, Android 9 zawiera konfigurowalne środowisko testowe (VtsHalHidlTargetTestEnvBase), które udostępnia interfejsy do:

  • Zarejestruj kierowane HAL-e w teście.
  • Wyświetla listę wszystkich zarejestrowanych HAL-i.
  • Pobieranie nazw usług dla zarejestrowanych HAL-i dostarczonych przez framework VTS.

Dodatkowo framework VTS zapewnia obsługę w czasie wykonywania dla:

  • wstępne przetworzenie binarnego pliku testowego w celu uzyskania wszystkich zarejestrowanych HAL-i testowych;
  • identyfikowanie wszystkich uruchomionych instancji usługi i uzyskiwanie nazwy usługi dla każdej instancji (pobieranie na podstawie vendor/manifest.xml);
  • Obliczam wszystkie kombinacje instancji (na potrzeby testowania wielu HAL).
  • Generowanie nowego testu dla każdego wystąpienia usługi (połączenia).

Przykład:

Obsługa testów po stronie docelowej w czasie wykonywania

Rysunek 1. Obsługa VTS framework w czasie wykonywania w przypadku testowania po stronie docelowej

Konfigurowanie testów po stronie docelowej z uwzględnieniem nazwy usługi

Aby skonfigurować środowisko testowe na potrzeby testowania nazw usług po stronie docelowej:

  1. Zdefiniuj testEnvironment na podstawie VtsHalHidlTargetTestEnvBase i zarejestruj testowe HAL:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Aby przekazać getServiceName(), użyj nazwy usługi podanej przez środowisko testowe:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Zarejestruj środowisko testowe w main()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 znajdziesz tutaj: VtsHalCameraProviderV2_4TargetTest.cpp.

Testy VTS po stronie hosta

Testy po stronie hosta VTS uruchamiają skrypty testowe po stronie hosta zamiast testowych plików binarnych na urządzeniu docelowym. Aby umożliwić rozpoznawanie nazwy usługi w przypadku tych testów, możesz użyć szablonów po stronie hosta, aby uruchomić ten sam skrypt testowy kilka razy z różnymi parametrami (podobnie jak w przypadku testu parametryzowanego gtest).

Obsługa testów po stronie hosta w czasie wykonywania

Rysunek 2. Obsługa VTS framework w czasie wykonywania na potrzeby testowania po stronie hosta
  • Skrypt hal test określa kierowanie usług HAL w teście.
  • hal_hidl_host_test (podklasa klasy param_test) pobiera zarejestrowane testowe HAL ze skryptu testowego, identyfikuje odpowiednie nazwy usług na potrzeby testowania HAL, a następnie generuje kombinacje nazw usług (na potrzeby testowania wielu HAL) jako parametry testowe. Udostępnia też metodę getHalServiceName(), która zwraca nazwę odpowiedniej usługi na podstawie parametru przekazanego bieżącemu testowi.
  • Szablon param_test obsługuje logikę, która przyjmuje listę parametrów i uruchamia wszystkie podane przypadki testowe dla każdego parametru. Oznacza to, że dla każdego przypadku testowego generuje N nowy przypadek testowy z parametrami (N = rozmiar parametrów), każdy z określonym parametrem.

Konfigurowanie testów po stronie hosta z uwzględnieniem nazwy usługi

Aby skonfigurować środowisko testowe do testowania po stronie hosta z uwzględnieniem nazwy usługi:

  1. W skrypcie testowym określ docelową usługę HAL:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. Zadzwoń do użytkownika getHalServiceName() i przekaż nazwę, aby zainicjować 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))

Więcej przykładów znajdziesz w VtsHalMediaOmxStoreV1_0HostTest.py.

Rejestrowanie testowych interfejsów HAL

W poprzednich wersjach Androida narzędzie VTS wykrywało testową wartość HAL za pomocą opcji <precondition-lshal> skonfigurowanej w AndroidTest.xml. Takie podejście było trudne do utrzymania (oparte na prawidłowym konfigurowaniu testu i odpowiednim aktualizowaniu konfiguracji przez deweloperów) oraz nieprecyzyjne (zawierało tylko informacje o pakiecie i wersji, a nie o interfejsie).

W Androidzie 9 narzędzie VTS identyfikuje testową wartość HAL, wykorzystując świadomość nazwy usługi. Zarejestrowane wartości HAL testów są też przydatne w przypadku:

  • Kontrole warunków wstępnych. Przed uruchomieniem testu HAL VTS może sprawdzić, czy testowany interfejs HAL jest dostępny na urządzeniu docelowym, i jeśli nie jest, pominąć testy (patrz sprawdzanie możliwości testowania VTS).
  • Pomiar zasięgu. VTS obsługuje pomiar pokrycia kodu w różnych procesach dzięki znajomości usług HAL do testowania, które chce mierzyć (czyli do czyszczenia pokrycia w procesie usługi HAL).