Testowanie HAL z uwzględnieniem nazwy usługi

Android 9 obsługuje pobieranie nazwy usługi danej instancji HAL na podstawie urządzenia, na którym są uruchamiane testy Vendor Test Suite (VTS). Uruchamianie testów VTS HAL, które rozpoznają nazwę usługi umożliwia deweloperom automatyzację testowania rozszerzeń dostawców, wielu HAL i wielu instancji HAL zarówno po stronie docelowej, jak i po stronie hosta.

Nazwy usług

Każda instancja uruchomionej usługi HAL rejestruje się pod nazwą usługi.

W poprzednich wersjach Androida deweloperzy uruchamiający testy VTS HAL musieli ustawić prawidłową nazwę usługi dla klienta testowego w getService() lub pozostawić nazwę pustą i wrócić do domyślnej nazwy usługi. Ta metoda miała następujące wady:

  • Wymagała od dewelopera testu znajomości prawidłowej nazwy usługi.
  • Domyślnie ograniczała się do testowania tylko jednej instancji usługi.
  • Wymagała ręcznego utrzymywania nazw usług (ponieważ nazwy są zakodowane na stałe, trzeba je ręcznie aktualizować, gdy nazwa usługi się zmieni).

W Androidzie 9 deweloperzy mogą automatycznie pobierać nazwę usługi dla danej instancji HAL na podstawie testowanego urządzenia. Ta metoda ma następujące zalety:

  • Rozszerzenia HAL dostawcy. Na przykład, gdy dostawca ma an implementację HAL camera.provider, która działa na urządzeniach dostawcy z a niestandardową nazwą usługi, VTS może zidentyfikować instancję dostawcy i uruchomić the test against it.
  • Wiele instancji HAL. Na przykład, gdy graphics.composer HAL ma 2 instancje (jedną z nazwą usługi „default” i drugą z nazwą usługi „vr”), VTS może zidentyfikować obie instancje i uruchomić na każdej z nich test.
  • Testowanie wielu HAL. Używane podczas testowania wielu HAL z wieloma instancjami. Na przykład podczas uruchamiania testu VTS, który sprawdza, jak współpracują ze sobą HAL KeyMint (wcześniej Keymaster) i Gatekeeper, VTS może przetestować wszystkie kombinacje instancji usług dla tych HAL.

Testy po stronie docelowej

Aby włączyć rozpoznawanie nazwy usługi na potrzeby testowania po stronie docelowej, Android 9 zawiera konfigurowalne środowisko testowe (VtsHalHidlTargetTestEnvBase) które udostępnia interfejsy do:

  • rejestrowania HAL docelowych w teście;
  • wyświetlania listy wszystkich zarejestrowanych HAL;
  • pobierania nazw usług zarejestrowanych HAL udostępnianych przez platformę VTS.

Ponadto platforma VTS zapewnia obsługę w czasie działania:

  • wstępnego przetwarzania pliku binarnego testu w celu uzyskania wszystkich zarejestrowanych HAL testu;
  • identyfikowania wszystkich uruchomionych instancji usługi i pobierania nazwy usługi dla każdej instancji (pobieranej na podstawie vendor/manifest.xml);
  • obliczania wszystkich kombinacji instancji (na potrzeby testowania wielu HAL testowania);
  • generowania nowego testu dla każdej instancji usługi (kombinacji).

Przykład:

Obsługa w czasie działania testowania po stronie docelowej

Rysunek 1. Obsługa w czasie działania platformy VTS na potrzeby testowania po stronie docelowej

Konfigurowanie testów po stronie docelowej, które rozpoznają nazwę usługi

Aby skonfigurować środowisko testowe na potrzeby testowania po stronie docelowej, które rozpoznaje nazwę usługi:

  1. Zdefiniuj testEnvironment na podstawie VtsHalHidlTargetTestEnvBase i zarejestruj HAL testu:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Użyj getServiceName() udostępnianego 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 znajdziesz w VtsHalCameraProviderV2_4TargetTest.cpp.

Testy VTS po stronie hosta

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

Obsługa środowiska wykonawczego na potrzeby testowania po stronie hosta

Rysunek 2. Obsługa w czasie działania platformy VTS na potrzeby testowania po stronie hosta testing
  • Skrypt hal test określa w teście usługi HAL docelowe.
  • The hal_hidl_host_test (podklasa param_test) pobiera zarejestrowane HAL testowania ze scenariusza testowania, identyfikuje odpowiednie nazwy usług dla HAL testowania, a następnie generuje kombinacje nazw usług (na potrzeby testowania wielu HAL) jako testowe parametry. Udostępnia też 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 z każdym parametrem. Oznacza to, że dla każdego przypadku testowego generuje N nowych parametryzowanych przypadków testowych (N = rozmiar parametrów), z których każdy ma dany parametr.

Konfigurowanie testów po stronie hosta, które rozpoznają nazwę usługi

Aby skonfigurować środowisko testowe na potrzeby testowania po stronie hosta, które rozpoznaje nazwę usługi:

  1. Określ docelową usługę HAL w scenariuszu testowania:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. Wywołaj 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 znajdziesz w VtsHalMediaOmxStoreV1_0HostTest.py.

Rejestrowanie HAL testu

W poprzednich wersjach Androida VTS identyfikował HAL testu za pomocą opcji <precondition-lshal> skonfigurowanej w AndroidTest.xml. Ta metoda była trudna w utrzymaniu (ponieważ wymagała od deweloperów prawidłowego skonfigurowania testu i odpowiedniego zaktualizowania konfiguracji) i niedokładna (ponieważ zawierała tylko informacje o pakiecie i wersji, a nie o interfejsie).

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

  • Sprawdzania warunków wstępnych. Przed uruchomieniem testu HAL VTS może potwierdzić, że HAL testu jest dostępny na urządzeniu docelowym, i pominąć testy jeśli nie jest (więcej informacji znajdziesz w artykule Sprawdzanie możliwości testowania VTS).
  • Pomiaru pokrycia. VTS obsługuje pomiar pokrycia kodu w różnych procesach dzięki informacjom o usługach HAL testu, które chce zmierzyć (czyli opróżnić pokrycie procesu usługi HAL).