服務名稱感知 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 和多個執行個體。舉例來說,當您執行 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() 並傳遞名稱,啟動暫停動作:
    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 服務程序的涵蓋率),支援跨程序程式碼涵蓋率評估。