Testowanie HAL rozpoznające nazwę usługi

Android 9 obsługuje pobieranie nazwy usługi danego wystąpienia HAL na podstawie urządzenia, na którym są wykonywane testy z pakietu testów dostawcy (VTS). Przeprowadzam testy HAL VTS, które rozpoznają nazwy usługi pozwala programistom na automatyzację testowania rozszerzeń dostawców, wielu HAL oraz wiele instancji HAL podczas testów VTS po stronie miejsca docelowego i 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 VTS HAL byli wymagane do ustawienia prawidłowej nazwy usługi dla klienta testowego w getService() lub pozostaw nazwę pustą i użyj wartości domyślnej nazwa usługi. Wady tego podejścia obejmują:

  • poleganie na wiedzy dewelopera testu w celu ustawienia prawidłowej nazwy usługi;
  • Domyślnie ograniczone do testowania w ramach pojedynczej instancji usługi.
  • ręczną konserwację nazw usług (np. gdy nazwy są zakodowane na stałe, jeśli nazwa usługi się zmieni, trzeba będzie zaktualizować ją 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 dostawców. 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. Na przykład, gdy tag HAL graphics.composer ma 2 instancje (jedną z nazwą usługi) „domyślna” i jednej o nazwie usługi „vr”), VTS może identyfikować zarówno instancje, przeprowadź test na 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 interfejsów HAL.
  • Pobieranie nazw usług dla zarejestrowanych HAL udostępnianych przez platformę VTS.

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

  • Wstępne przetwarzanie testowego pliku binarnego w celu pobrania wszystkich zarejestrowanych wartości HAL testowych.
  • Identyfikowanie wszystkich działających instancji usługi i pobieranie nazwy usługi dla każdej instancji (pobrane na podstawie parametru vendor/manifest.xml).
  • Obliczam wszystkie kombinacje instancji (na potrzeby obsługi wielu HAL testowanie).
  • Generowanie nowego testu dla każdej instancji usługi (kombinacji).

Przykład:

Obsługa środowiska wykonawczego na potrzeby testów po stronie docelowej

Rysunek 1. Obsługa środowiska wykonawczego platformy VTS na potrzeby 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 zdać, użyj pakietu getServiceName() udostępnionego przez środowisko testowe nazwa 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()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 artykule 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 framework w czasie wykonywania na potrzeby testowania po stronie hosta
  • Skrypt hal test określa wartość HAL kierowania. usług objętych testem.
  • hal_hidl_host_test (podklasa param_test) pobiera zarejestrowane HAL do testów z skrypt testowy, identyfikuje odpowiednie nazwy usług dla testowej listy HAL, a następnie generuje kombinacje nazw usług (na potrzeby testowania wielu HAL) w ramach testu . Udostępnia też metodę getHalServiceName(), która zwraca nazwę odpowiedniej usługi na podstawie parametru przekazanego bieżącemu testowi.
  • param_test pozwala na akceptowanie listy parametrów i uruchamianie w przypadku poszczególnych parametrów. Na przykład dla każdego przypadku testowego generuje N nowych z parametrami przypadku testowego (N = rozmiar parametrów), każdy z określonym .

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. 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ż 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 artykule VtsHalMediaOmxStoreV1_0HostTest.py.

Rejestrowanie testowych 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 w obsłudze (ponieważ poprawnie skonfigurować test i zaktualizować konfiguracji) i niedokładną (ponieważ zawierała tylko pakiet i wersji, a nie interfejsu).

W Androidzie 9 VTS identyfikuje testowany HAL za pomocą rozpoznawania nazwy usługi. Zarejestrowane interfejsy HAL do testowania są też przydatne do:

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