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ühren, den korrekten Dienstnamen für den Testclient in getService() festlegen oder den Namen leer lassen und auf den Standarddienstnamen zurückgreifen. Zu den Nachteilen dieses Ansatzes gehörten:

  • Der Testentwickler muss den richtigen Dienstnamen festlegen.
  • 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 von Tests:

  • HAL-Erweiterungen von Anbietern Wenn ein Anbieter beispielsweise eine Implementierung der HAL „camera.provider“ hat, die auf Geräten des Anbieters mit einem benutzerdefinierten Dienstnamen ausgeführt wird, kann VTS die Anbieterinstanz identifizieren und den Test darauf ausführen.
  • Mehrere HAL-Instanzen Wenn der HAL graphics.composer beispielsweise zwei Instanzen hat (eine mit dem Dienstnamen „default“ und eine mit dem Dienstnamen „vr“), kann VTS beide Instanzen identifizieren 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

Um die Dienstnamenerkennung für zielseitige Tests zu ermöglichen, enthält Android 9 eine anpassbare Testumgebung (VtsHalHidlTargetTestEnvBase), die Schnittstellen für Folgendes bietet:

  • 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 der Testbinärdatei, um alle registrierten Test-HAL(s) 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)
  • Neuen Test für jede Dienstinstanz (Kombination) generieren

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 den von der Testumgebung bereitgestellten getServiceName(), 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 finden Sie unter VtsHalCameraProviderV2_4TargetTest.cpp.

VTS-hostseitige Tests

Bei Host-seitigen VTS-Tests werden Testskripts auf Hostseite statt Testbinärprogrammen auf dem Zielgerät ausgeführt. Um die Erkennung von Dienstnamen für diese Tests zu aktivieren, können Sie Vorlagen auf Hostseite verwenden, um dasselbe Testskript mehrmals für verschiedene Parameter auszuführen (ähnlich dem parametrisierten gtest-Test).

Laufzeitunterstützung für hostseitige Tests

Abbildung 2 Unterstützung der VTS-Framework-Laufzeit für hostseitige Tests
  • Das Skript hal test gibt den oder die Targeting-HAL-Dienst(e) im Test an.
  • Die hal_hidl_host_test (untergeordnete Klasse von param_test) nimmt die registrierten Test-HALs aus dem Testskript, identifiziert die entsprechenden Dienstnamen für den Test-HAL und generiert dann Kombinationen aus Dienstnamen (für Multi-HAL-Tests) als Testparameter. Außerdem bietet sie die Methode getHalServiceName(), die den entsprechenden Dienstnamen gemäß dem Parameter zurückgibt, der an den aktuellen Testlauf ü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, um init hal zu starten:
    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 mithilfe der in AndroidTest.xml konfigurierten Option <precondition-lshal>. 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:

  • Voraussetzungsprüfungen: Vor dem Ausführen eines HAL-Tests kann VTS bestätigen, dass der 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 Codeabdeckungsmessung anhand der Informationen zu den zu messenden HAL-Diensten für die Tests (d.h. die Abdeckung für den HAL-Dienstprozess löschen).