服務名稱感知 HAL 測試

Android 9 支援取得服務 特定 HAL 執行個體名稱 (根據廠商測試套件所使用的裝置) (VTS) 測試正在執行。執行具服務名稱感知的 VTS HAL 測試 可讓開發人員自動測試廠商擴充功能、多個 HAL,以及 在目標和主機端 VTS 測試上執行多個 HAL 執行個體。

關於服務名稱

執行中的 HAL 服務每個執行個體都會使用服務名稱註冊自身。

在先前的 Android 版本中,執行 VTS HAL 測試的開發人員 需要為測試用戶端設定正確的服務名稱 請設為 getService() 或將名稱留空,改回預設值 服務名稱。這種做法的缺點包括:

  • 仰賴測試開發人員的知識來設定正確的服務 名稱。
  • 預設只能測試單一服務執行個體。
  • 手動維護服務名稱 (例如名稱以硬式編碼的方式寫入, 如果服務名稱有所變更,就必須手動更新。

在 Android 9 中,開發人員可以自動取得 根據測試中的裝置判斷特定 HAL 執行個體的服務名稱。 這種做法的好處包括支援測試:

  • 供應商 HAL 擴充功能。舉例來說 實作 camera.provider HAL 在供應商裝置上使用的 自訂服務名稱,VTS 可以識別供應商執行個體並執行測試 互相對抗
  • 多個 HAL 例項。舉例來說,假設 graphics.composer HAL 有兩個執行個體 (一個具有服務名稱) 「預設」且服務名稱為「vr」的 VTS 可識別執行個體 然後分別對它們執行測試
  • 多 HAL 測試。用於測試多個 HAL 和多個執行個體。舉例來說,當您執行 VTS 測試,驗證 Keymaster 和 Gatekeeper HAL 如何搭配運作時,VTS 可以測試這些 HAL 的所有服務例項組合。

目標端測試

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

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

此外,VTS 架構還提供下列執行階段支援:

  • 預先處理測試二進位檔,以取得所有已註冊的測試 HAL。
  • 找出所有執行中的服務執行個體,並取得每個執行個體的服務名稱 (根據 vendor/manifest.xml 擷取)。
  • 計算所有執行個體組合 (支援多個 HAL) 測試)。
  • 為每個服務執行個體產生新測試 (組合)。

範例如下:

目標端測試的執行階段支援

圖 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 參數化測試)。

主機端測試的執行階段支援

圖 2. 主機端測試的 VTS 架構執行階段支援功能
  • hal 測試指令碼會指定測試中的 HAL 服務。
  • hal_hidl_host_test (param_test 的子類別) 取得已註冊的測試 HAL 測試指令碼,識別測試 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 會使用 AndroidTest.xml 中設定的 <precondition-lshal> 選項來識別測試 HAL。這種做法難以維護 (因為它需要開發人員正確設定測試,並據此更新設定),而且不準確 (因為它只包含套件和版本資訊,而非介面資訊)。

在 Android 9 中,VTS 會使用 服務名稱感知功能。註冊的測試 HAL 也適用於以下情況:

  • 先決條件檢查。在執行 HAL 測試前,VTS 可以確認測試 HAL 是否可在目標裝置上使用,如果無法使用,則略過測試 (請參閱 VTS 可測試性檢查)。
  • 涵蓋率評估。VTS 支援跨程序程式碼 覆蓋範圍評估,藉此取得所需的測試 HAL 服務相關知識 來進行評估 (亦即清除暫代服務流程的涵蓋範圍)。