服務名稱感知 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有兩個實例(一個服務名稱為“default”,另一個服務名稱為“vr”)時,VTS可以識別這兩個實例並對每個實例執行測試。
  • 多 HAL 測試。在測試具有多個實例的多個 HAL 時使用 例如,當執行驗證 keymaster 和網守 HAL 如何協同工作的 VTS 測試時,VTS 可以測試這些 HAL 的服務實例的所有組合。

目標端測試

為了啟用目標端測試的服務名稱感知,Android 9 包含一個可自訂的測試環境 ( VtsHalHidlTargetTestEnvBase ),它提供了以下介面:

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

此外,VTS 框架還提供以下運行時支援:

  • 預處理測試二進位檔案以取得所有已註冊的測試 HAL。
  • 識別所有正在執行的服務實例並取得每個實例的服務名稱(根據vendor/manifest.xml檢索)。
  • 計算所有實例組合(以支援多個HAL測試)。
  • 為每個服務實例(組合)產生新測試。

例子:

Runtime support for target-side testing

圖 1. VTS 框架運行時對目標端測試的支持

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

若要設定測試環境以進行目標端服務名稱感知測試:

  1. 基於VtsHalHidlTargetTestEnvBase定義testEnvironment並註冊測試 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_testparam_test的子類別)從測試腳本中取得已註冊的測試 HAL,識別測試 HAL 的對應服務名稱,然後產生服務名稱組合(用於多 HAL 測試)作為測試參數。它還提供了getHalServiceName()方法,該方法根據傳遞給目前測試案例的參數傳回對應的服務名稱。
  • param_test模板支援接受參數清單並針對每個參數執行所有給定測試案例的邏輯。即,對於每個測試案例,它會產生 N 個新的參數化測試案例(N = 參數大小),每個測試案例都有給定的參數。

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

若要設定測試環境以進行主機端服務名稱感知測試:

  1. 在測試腳本中指定目標HAL服務:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
    
  2. 呼叫getHalServiceName()並將名稱傳遞給 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))
    

有關其他範例,請參閱VtsHalMediaOmxStoreV1_0HostTest.py

註冊測試 HAL

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

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

  • 前提條件檢查。在執行 HAL 測試之前,VTS 可以確認測試 HAL 在目標裝置上可用,如果不可用則跳過測試(請參閱VTS 可測試性檢查)。
  • 覆蓋率測量。 VTS 透過了解其想要測量的測試 HAL 服務的知識來支援跨進程程式碼覆蓋率測量(即刷新 hal 服務進程的覆蓋率)。