Testowanie HAL rozpoznające nazwę usługi

Android 9 obsługuje pobieranie nazwy usługi danej instancji HAL na podstawie urządzenia, na którym są wykonywane testy z pakietu testów dostawcy (VTS). Uruchamianie testów HAL VTS, które uwzględniają nazwę usługi, umożliwia deweloperom zautomatyzowanie testowania rozszerzeń dostawców, wielu HAL-i i wielu instancji HAL-i zarówno w ramach testów VTS na stronie docelowej, jak i na 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 użyć domyślnej nazwy usługi. Wady tego podejścia:

  • poleganie na wiedzy dewelopera testu w celu ustawienia prawidłowej nazwy usługi;
  • Domyślnie ograniczone do testowania pojedynczej instancji usługi.
  • ręczne zarządzanie nazwami usług (np. ze względu na to, że są one zakodowane na stałe, w przypadku zmiany nazwy usługi należy je zaktualizować 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 z użyciem 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 dostarczanych 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 działających instancji usługi i uzyskiwanie nazwy usługi dla każdej instancji (pobieranie na podstawie vendor/manifest.xml);
  • Obliczanie wszystkich kombinacji instancji (w celu obsługi 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 działania

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 do testowania z uwzględnieniem nazwy usługi 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();
    }

Więcej przykładów znajdziesz w VtsHalCameraProviderV2_4TargetTest.cpp.

Testy VTS po stronie hosta

Testy VTS po stronie hosta uruchamiają skrypty testowe po stronie hosta, a nie testowe pliki binarne 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 na potrzeby testowania po stronie hosta w czasie wykonywania
  • Skrypt hal test określa usługi HAL do kierowania w teście.
  • Funkcja hal_hidl_host_test (podklasa param_test) pobiera zarejestrowane HAL-e testowe ze skryptu testowego, identyfikuje odpowiadające nazwy usług dla testowanego HAL-a, a następnie generuje kombinacje nazw usług (na potrzeby testowania wielu HAL-i) jako parametry testu. 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 nowych przypadków testowych z parametrami (N = wielkość parametrów), z których każdy zawiera dany parametr.

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. Wywołaj funkcję getHalServiceName() i przekaż jej nazwę do funkcji 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))

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

Rejestrowanie testowych interfejsów HAL

We wcześniejszych wersjach Androida VTS rozpoznawał interfejs HAL do testowania 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 VTS identyfikuje testowany HAL za pomocą rozpoznawania nazwy usługi. Zarejestrowane interfejsy HAL do testowania są też przydatne do:

  • Sprawdzanie 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).