HAL-Test mit Erkennung des Dienstnamens

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

Dienstnamen

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

In früheren Android-Versionen mussten Entwickler, die VTS HAL-Tests ausführten, in getService() den richtigen Dienstnamen für den Testclient festlegen oder den Namen leer lassen und auf den Standarddienstnamen zurücksetzen. Dieser Ansatz hat unter anderem folgende Nachteile:

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

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

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

Zielseitentests

Android 9 enthält eine anpassbare Testumgebung (VtsHalHidlTargetTestEnvBase), die Schnittstellen für folgende Aktionen bietet, um die Erkennung von Dienstnamen für zielseitige Tests zu aktivieren:

  • Registrieren Sie die Ausrichtung auf HALs im Test.
  • Listet alle registrierten HALs auf.
  • Dienstnamen für registrierte HALs abrufen, die vom VTS-Framework bereitgestellt werden.

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

  • Vorverarbeitung des Test-Binärcodes, um alle registrierten Test-HALs zu erhalten.
  • Alle laufenden Dienstinstanzen identifizieren und den Dienstnamen für jede Instanz abrufen (anhand von vendor/manifest.xml abgerufen).
  • Alle Instanzkombinationen berechnen (um mehrere HAL-Tests zu unterstützen)
  • Für jede Dienstinstanz (Kombination) wird ein neuer Test generiert.

Beispiel:

Laufzeitunterstützung für zielseitige Tests

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

Zielseitige Tests mit Dienstnamen einrichten

So richten Sie Ihre Testumgebung für standortbezogene Tests ein, die den Dienstnamen berücksichtigen:

  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() aus der Testumgebung, um den Dienstnamen zu übergeben:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  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 findest du unter VtsHalCameraProviderV2_4TargetTest.cpp.

VTS-hostseitige Tests

Bei hostseitigen VTS-Tests werden Testscripts auf der Hostseite ausgeführt, anstelle von Testbinärdateien auf dem Zielgerät. Wenn Sie die Dienstnamenerkennung für diese Tests aktivieren möchten, können Sie hostseitige Vorlagen verwenden, um dasselbe Testscript mehrmals mit verschiedenen Parametern auszuführen (ähnlich wie beim parametrisierten gtest-Test).

Laufzeitunterstützung für hostseitige Tests

Abbildung 2: VTS-Framework-Laufzeitunterstützung für hostseitige Tests
  • Das Skript hal test gibt den oder die Targeting-HAL-Dienst(e) im Test an.
  • Die hal_hidl_host_test (Unterklasse von param_test) übernimmt die registrierten Test-HALs aus dem Testscript, identifiziert die entsprechenden Dienstnamen für die Test-HAL und generiert dann Dienstnamenkombinationen (für Mehrfach-HAL-Tests) als Testparameter. Außerdem gibt es die Methode getHalServiceName(), die den entsprechenden Dienstnamen entsprechend dem Parameter zurückgibt, der an den aktuellen Testfall übergeben wurde.
  • Die Vorlage param_test unterstützt eine Logik, mit der eine Liste von Parametern akzeptiert und alle angegebenen Testfälle für jeden Parameter ausgeführt werden. Das bedeutet, dass für jeden Testfall N neue parametrisierte Testfälle generiert werden (N = Größe der Parameter), die jeweils einen bestimmten Parameter haben.

Dienstnamenserkennung auf Hostseite einrichten

So richten Sie Ihre Testumgebung für hostseitige Tests mit Dienstnamen 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.

Test-HALs registrieren

In früheren Android-Versionen identifizierte VTS die Test-HAL anhand der Option <precondition-lshal>, die in AndroidTest.xml konfiguriert wurde. Dieser Ansatz war schwierig zu pflegen, da die Entwickler den Test richtig konfigurieren und die Konfiguration entsprechend aktualisieren mussten. Außerdem war er ungenau, da er nur die Paket- und Versionsinformationen und nicht die Informationen zur Benutzeroberfläche enthielt.

In Android 9 identifiziert VTS die Test-HAL anhand des Dienstnamens. Die registrierten HALs für Tests eignen sich auch für Folgendes:

  • Vorbedingungsprüfungen. Vor dem Ausführen eines HAL-Tests kann VTS prüfen, ob die 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 prozessübergreifende Codeabdeckung anhand des Wissens über die zu messenden HAL-Testdienste (d.h., um die Abdeckung des Hal-Service-Prozesses zu spülen).