Android 9 unterstützt das Abrufen des Dienstnamens einer bestimmten HAL-Instanz basierend auf dem Gerät, auf dem VTS-Tests (Vendor Test Suite) ausgeführt werden. Durch das Ausführen von VTS-HAL-Tests, die den Dienstnamen kennen, können Entwickler das Testen von Anbietererweiterungen, mehreren HALs und mehreren HAL-Instanzen sowohl bei zielseitigen als auch bei hostseitigen VTS-Testläufen automatisieren.
Dienstnamen
Jede Instanz des laufenden HAL-Dienstes registriert sich mit einem Dienstnamen.
In früheren Versionen von Android mussten Entwickler, die VTS-HAL-Tests ausführen, den richtigen Dienstnamen für den Testclient in getService()
festlegen oder den Namen leer lassen und auf den Standarddienstnamen zurückgreifen. Nachteile dieses Ansatzes:
- Der Testentwickler muss den richtigen Dienstnamen kennen.
- Standardmäßig auf Tests für eine einzelne Dienstinstanz beschränkt.
- Manuelle Wartung 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 den Dienstnamen für eine bestimmte HAL-Instanz automatisch auf Grundlage des zu testenden Geräts abrufen. Dieser Ansatz bietet unter anderem folgende Vorteile:
- Vendor-HAL-Erweiterungen: Wenn ein Anbieter beispielsweise eine Implementierung von camera.provider HAL hat, die auf Anbietergeräten mit einem benutzerdefinierten Dienstnamen ausgeführt wird, kann VTS die Anbieterinstanz identifizieren und den Test darauf ausführen.
- Mehrere HAL-Instanzen: Wenn das
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 von ihnen ausführen. - Multi-HAL-Tests: Wird verwendet, wenn mehrere HALs mit mehreren Instanzen getestet werden. Wenn beispielsweise der VTS-Test ausgeführt wird, der überprüft, wie die KeyMint- (früher Keymaster-) und Gatekeeper-HALs zusammenarbeiten, kann VTS alle Kombinationen von Dienstinstanzen für diese HALs testen.
Tests auf Zielseite
Um die Berücksichtigung von Dienstnamen für Tests auf der Zielseite zu aktivieren, enthält Android 9 eine anpassbare Testumgebung (VtsHalHidlTargetTestEnvBase
), die Schnittstellen für Folgendes bietet:
- Registrieren Sie die HALs, die im Test verwendet werden sollen.
- Alle registrierten HALs auflisten
- Rufen Sie den oder die Dienstnamen für registrierte HALs ab, die vom VTS-Framework bereitgestellt werden.
Außerdem bietet das VTS-Framework Laufzeitunterstützung für:
- Vorverarbeitung des Test-Binärprogramms, um alle registrierten Test-HALs abzurufen.
- Alle ausgeführten Serviceinstanzen identifizieren und den Dienstnamen für jede Instanz abrufen (basierend auf
vendor/manifest.xml
). - Berechnung aller Instanzkombinationen (zur Unterstützung von HAL-Tests).
- Für jede Dienstinstanz (Kombination) wird ein neuer Test generiert.
Beispiel:
Dienstnamenspezifische Tests auf der Zielseite einrichten
So richten Sie Ihre Testumgebung für zielseitige Tests mit Dienstnamen ein:
- Definieren Sie ein
testEnvironment
basierend aufVtsHalHidlTargetTestEnvBase
und registrieren Sie Test-HALs:#include <VtsHalHidlTargetTestEnvBase.h> class testEnvironment : public::testing::VtsHalHidlTargetTestEnvBase { virtual void registerTestServices() override { registerTestService<IFoo>(); } };
- 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.
- Registrieren Sie die Testumgebung in
main()
undinitTest
: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-Hostseitentests
Bei VTS-Host-seitigen Tests werden Testskripts auf dem Host anstelle von Test-Binärdateien auf dem Zielgerät ausgeführt. Damit der Dienstname für diese Tests berücksichtigt wird, können Sie Host-seitige Vorlagen verwenden, um dasselbe Testskript mehrmals mit verschiedenen Parametern auszuführen (ähnlich wie beim parametrisierten gtest).
- Im hal test-Skript werden die HAL-Dienste angegeben, die im Test verwendet werden.
- Die
hal_hidl_host_test
-Klasse (Unterklasse vonparam_test
) übernimmt die registrierten Test-HALs aus dem Testskript, ermittelt die entsprechenden Dienstnamen für die Test-HAL und generiert dann Dienstnamenkombinationen (für Multi-HAL-Tests) als Testparameter. Außerdem wird eine MethodegetHalServiceName()
bereitgestellt, die den entsprechenden Dienstnamen entsprechend dem an den aktuellen Testlauf übergebenen Parameter zurückgibt. - Die Vorlage param_test unterstützt die Logik, eine Liste von Parametern zu akzeptieren und alle angegebenen Testläufe für jeden Parameter auszuführen. Das bedeutet, dass für jeden Testlauf N neue parametrisierte Testläufe generiert werden (N = Anzahl der Parameter), jeweils mit einem bestimmten Parameter.
Hostseitige Tests mit Dienstnamen einrichten
So richten Sie Ihre Testumgebung für hostseitige Tests mit Dienstnamen ein:
- Geben Sie den Ziel-HAL-Dienst im Testskript an:
TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
- 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 hat VTS die zu testende HAL anhand der Option <precondition-lshal>
identifiziert, die in AndroidTest.xml
konfiguriert ist. Dieser Ansatz war schwer 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 Schnittstelleninformationen enthielt.
In Android 9 identifiziert VTS die Test-HAL anhand des Dienstnamens. Die registrierten Test-HALs sind auch für Folgendes nützlich:
- Vorbedingungen: Bevor ein HAL-Test ausgeführt wird, kann VTS prüfen, ob das zu testende HAL auf dem Zielgerät verfügbar ist. Wenn nicht, werden die Tests übersprungen (siehe VTS-Testbarkeitsprüfung).
- Analyse der Reichweite: VTS unterstützt die prozessübergreifende Code-Coverage-Messung über die Kenntnis der zu messenden HAL-Dienste (d.h. zum Leeren der Coverage für den HAL-Dienstprozess).