服務名稱感知 HAL 測試

Android 9 支持根據運行供應商測試套件 (VTS) 測試的設備獲取給定 HAL 實例的服務名稱。運行支持服務名稱的 VTS HAL 測試使開發人員能夠在目標端和主機端 VTS 測試運行中自動測試供應商擴展、多個 HAL 和多個 HAL 實例。

關於服務名稱

正在運行的 HAL 服務的每個實例都使用服務名稱註冊自己。

在舊版Android設備,開發運行在測試客戶端設置正確的服務名稱VTS HAL測試所需getService()或保留名稱空回退到默認服務名稱。這種方法的缺點包括:

  • 依賴測試開發人員的知識來設置正確的服務名稱。
  • 默認情況下僅限於針對單個服務實例進行測試。
  • 手動維護服務名稱(即因為名稱是硬編碼的,如果服務名稱更改,則必須手動更新它們。

在 Android 9 中,開發人員可以根據被測設備自動獲取給定 HAL 實例的服務名稱。這種方法的優點包括支持測試:

  • 供應商HAL擴展。例如,當供應商實現了在供應商設備上運行的具有自定義服務名稱的 camera.provider HAL 時,VTS 可以識別供應商實例並對其運行測試。
  • 多HAL實例。例如,當graphics.composer HAL有兩個實例(一個服務名稱“默認”和一個具有服務名稱“VR”),VTS能識別這兩種情況下,並運行對他們每個人的考驗。
  • 多HAL測試。在使用多個實例測試多個 HAL 時使用 例如,在運行 VTS 測試以驗證密鑰管理器和網守 HAL 如何協同工作時,VTS 可以測試這些 HAL 的所有服務實例組合。

目標端測試

要啟用目標側檢測服務名稱意識,機器人9包括一個可定制的測試環境( VtsHalHidlTargetTestEnvBase ),它提供接口:

  • 在測試中註冊目標 HAL。
  • 列出所有已註冊的 HAL。
  • 獲取 VTS 框架提供的已註冊 HAL 的服務名稱。

此外,VTS 框架提供運行時支持:

  • 預處理測試二進製文件以獲取所有已註冊的測試 HAL。
  • 確定所有正在運行的服務實例,每個實例獲取服務名(根據獲取的vendor/manifest.xml )。
  • 計算所有實例組合(以支持多個 HAL 測試)。
  • 為每個服務實例(組合)生成一個新的測試。

例子:

Runtime support for target-side testing

為目標側的測試圖1。VTS框架運行時支持

設置服務名稱感知目標端測試

為目標端服務名稱感知測試設置測試環境:

  1. 定義testEnvironment基於VtsHalHidlTargetTestEnvBase和註冊檢驗的HAL:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. 使用getServiceName()由測試環境提供通過服務名稱:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. 註冊在測試環境中main()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();
    }

對於另外的實例,請參見VtsHalCameraProviderV2_4TargetTest.cpp

VTS 主機端測試

VTS 主機端測試在主機端運行測試腳本,而不是在目標設備上運行測試二進製文件。要為這些測試啟用服務名稱感知,您可以使用主機端模板針對不同參數多次運行相同的測試腳本(類似於 gtest 參數化測試)。

Runtime support for host-side testing

對於主機側的測試圖2的VTS框架運行時支持
  • HAL測試腳本指定目標HAL服務(收費)測試。
  • 所述hal_hidl_host_test (子類param_test )開出註冊從測試腳本的測試HAL(S),標識對應的服務名(多個)用於測試HAL,然後生成服務名稱的組合(用於多HAL測試)作為測試參數。它還提供了一個方法getHalServiceName()根據傳遞給當前測試情況下,參數,其返回相應的服務名。
  • param_test模板支持邏輯接受的參數列表,並運行所有針對每一個參數指定的測試用例。即對於每個測試用例,它生成 N 個新的參數化測試用例(N = 參數大小),每個測試用例都有一個給定的參數。

設置服務名稱感知主機端測試

要為主機端服務名稱感知測試設置測試環境:

  1. 指定測試腳本的目標HAL服務:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
    
  2. 呼叫getHalServiceName()並通過名稱來初始化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))
    

對於另外的實例,請參見VtsHalMediaOmxStoreV1_0HostTest.py

註冊測試 HAL

Android中的先前版本中,VTS識別的測試HAL使用<precondition-lshal>在配置選項AndroidTest.xml 。這種方法難以維護(因為它依賴於開發人員正確配置測試並相應地更新配置)和不准確(因為它只包含包和版本信息,而不包含接口信息)。

在 Android 9 中,VTS 使用服務名稱感知識別測試 HAL。註冊的測試 HAL 也可用於:

  • 前提條件檢查。運行HAL測試之前,VTS可以確認檢測HAL可在目標設備上跳過測試,如果它不是(指VTS可測性檢查)。
  • 覆蓋測試。 VTS 通過它想要測量的測試 HAL 服務的知識來支持跨進程代碼覆蓋率測量(即刷新 hal 服務進程的覆蓋率)。