Dienstnamenbasierter HAL-Test

Android 9 bietet Unterstützung für das Abrufen des Dienstnamens einer bestimmten HAL-Instanz basierend auf dem Gerät, auf dem Vendor Test Suite (VTS)-Tests ausgeführt werden. Durch die Ausführung von VTS-HAL-Tests, die Dienstnamen berücksichtigen, können Entwickler das Testen von Anbietererweiterungen, mehreren HALs und mehreren HAL-Instanzen sowohl bei ziel- als auch hostseitigen VTS-Testläufen automatisieren.

Über Dienstnamen

Jede Instanz des laufenden HAL-Dienstes registriert sich selbst mit einem Dienstnamen.

In früheren Android-Versionen mussten Entwickler, die VTS-HAL-Tests ausführen, in getService() den korrekten Dienstnamen für den Testclient festlegen oder den Namen leer lassen und auf den Standarddienstnamen zurückgreifen. Zu den Nachteilen dieses Ansatzes gehörten:

  • Verlassen Sie sich auf das Wissen des Testentwicklers, um den richtigen Dienstnamen festzulegen.
  • Standardmäßig auf das Testen einer einzelnen Dienstinstanz beschränkt.
  • Manuelle Pflege von Dienstnamen (d. h. da Namen fest codiert sind, müssen sie manuell aktualisiert werden, wenn sich der Dienstname ändert.

In Android 9 können Entwickler automatisch den Dienstnamen für eine bestimmte HAL-Instanz basierend auf dem zu testenden Gerät abrufen. Zu den Vorteilen dieses Ansatzes gehört die Unterstützung beim Testen:

  • HAL-Erweiterungen des Anbieters . Wenn ein Anbieter beispielsweise über eine Implementierung von camera.provider HAL verfügt, die auf Anbietergeräten mit einem benutzerdefinierten Dienstnamen ausgeführt wird, kann VTS die Anbieterinstanz identifizieren und den Test dafür ausführen.
  • Mehrere HAL-Instanzen . Wenn die graphics.composer HAL beispielsweise über zwei Instanzen verfügt (eine mit dem Dienstnamen „default“ und eine mit dem Dienstnamen „vr“), kann VTS beide Instanzen identifizieren und den Test für jede von ihnen ausführen.
  • Multi-HAL-Tests . Wird beim Testen mehrerer HALs mit mehreren Instanzen verwendet. Wenn Sie beispielsweise den VTS-Test ausführen, der überprüft, wie die Keymaster- und Gatekeeper-HAL zusammenarbeiten, kann VTS alle Kombinationen von Dienstinstanzen für diese HALs testen.

Zielseitige Tests

Um die Erkennung von Dienstnamen für zielseitige Tests zu ermöglichen, enthält Android 9 eine anpassbare Testumgebung ( VtsHalHidlTargetTestEnvBase ), die Schnittstellen bereitstellt für:

  • Registrieren Sie Targeting-HAL(s) im Test.
  • Listen Sie alle registrierten HAL(s) auf.
  • Rufen Sie Dienstnamen für registrierte HALs ab, die vom VTS-Framework bereitgestellt werden.

Darüber hinaus bietet das VTS-Framework Laufzeitunterstützung für:

  • Vorverarbeitung der Testbinärdatei, um alle registrierten Test-HAL(s) zu erhalten.
  • Identifizieren aller laufenden Dienstinstanzen und Abrufen des Dienstnamens für jede Instanz (abgerufen basierend auf vendor/manifest.xml ).
  • Berechnung aller Instanzkombinationen (zur Unterstützung mehrerer HAL-Tests).
  • Generieren eines neuen Tests für jede Dienstinstanz (Kombination).

Beispiel:

Runtime support for target-side testing

Abbildung 1. VTS-Framework-Laufzeitunterstützung für zielseitige Tests

Richten Sie zielseitige Tests mit Erkennung des Dienstnamens ein

So richten Sie Ihre Testumgebung für zielseitige Dienstnamenerkennungstests ein:

  1. Definieren Sie eine testEnvironment basierend auf VtsHalHidlTargetTestEnvBase und registrieren Sie Test-HALs:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Verwenden Sie getServiceName() , das von der Testumgebung bereitgestellt wird, um den Dienstnamen
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
    zu übergeben
  3. Registrieren Sie die Testumgebung in main() und 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();
    }

Weitere Beispiele finden Sie unter VtsHalCameraProviderV2_4TargetTest.cpp .

Hostseitige VTS-Tests

Hostseitige VTS-Tests führen Testskripte auf der Hostseite anstelle von Testbinärdateien auf dem Zielgerät aus. Um die Erkennung von Dienstnamen für diese Tests zu ermöglichen, können Sie hostseitige Vorlagen verwenden, um dasselbe Testskript mehrmals mit unterschiedlichen Parametern auszuführen (ähnlich dem parametrisierten gtest-Test).

Runtime support for host-side testing

Abbildung 2. VTS-Framework-Laufzeitunterstützung für hostseitige Tests
  • Das Hal- Testskript gibt die Ziel-HAL-Dienste im Test an.
  • Der hal_hidl_host_test (Unterklasse von param_test ) übernimmt die registrierten Test-HALs aus dem Testskript, identifiziert den/die entsprechenden Dienstnamen für den Test-HAL und generiert dann Dienstnamenkombinationen (für Multi-HAL-Tests) als Testparameter. Es stellt außerdem eine Methode getHalServiceName() bereit, die den entsprechenden Dienstnamen entsprechend dem an den aktuellen Testfall übergebenen Parameter zurückgibt.
  • Die param_test- Vorlage unterstützt die Logik zum Akzeptieren einer Liste von Parametern und zum Ausführen aller angegebenen Testfälle für jeden Parameter. Dh für jeden Testfall werden N neue parametrisierte Testfälle (N = Größe der Parameter) mit jeweils einem bestimmten Parameter generiert.

Richten Sie hostseitige Tests mit Berücksichtigung des Dienstnamens ein

So richten Sie Ihre Testumgebung für hostseitige Dienstnamenerkennungstests ein:

  1. Geben Sie den Ziel-HAL-Dienst im Testskript an:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
    
  2. Rufen Sie getHalServiceName() auf und übergeben Sie den Namen an 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))
    

Weitere Beispiele finden Sie unter VtsHalMediaOmxStoreV1_0HostTest.py .

Registrieren Sie Test-HALs

In früheren Android-Versionen identifizierte VTS den Test-HAL mithilfe der in AndroidTest.xml konfigurierten Option <precondition-lshal> . Dieser Ansatz war schwierig beizubehalten (da er darauf angewiesen war, dass die Entwickler den Test richtig konfigurierten und die Konfiguration entsprechend aktualisierten) und ungenau (da er nur die Paket- und Versionsinformationen und nicht die Schnittstelleninformationen enthielt).

In Android 9 identifiziert VTS den Test-HAL mithilfe der Dienstnamenerkennung. Die registrierten Test-HALs sind auch nützlich für:

  • Vorbedingungsprüfungen . Bevor ein HAL-Test ausgeführt wird, kann VTS bestätigen, dass das Test-HAL auf dem Zielgerät verfügbar ist, und die Tests überspringen, wenn dies nicht der Fall ist (siehe VTS-Testbarkeitsprüfung ).
  • Abdeckungsmessung . VTS unterstützt die Messung der prozessübergreifenden Codeabdeckung durch das Wissen über die Test-HAL-Dienste, die es messen möchte (z. B. um die Abdeckung für den Hal-Dienstprozess zu löschen).