服務名稱感知 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 測試多個 HAL 時使用 舉例來說,當您執行 VTS 測試 讓 Keymaster 和總機 HAL 相輔相成,VTS 可以測試所有組合 針對這些 HAL 服務執行個體

目標端測試

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

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

此外,VTS 架構也提供以下項目的執行階段支援:

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

範例如下:

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

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

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

圖 2. 主機端適用的 VTS 架構執行階段支援 測試
,瞭解如何調查及移除這項存取權。
  • hal test 指令碼會指定指定目標 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 使用 已在以下位置設定 <precondition-lshal> 個選項: AndroidTest.xml。這個方式難以維護 (因為 仰賴開發人員正確設定測試,並更新 由於其中只包含 套件 而非介面資訊)。

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

  • 先決條件檢查。執行 HAL 測試之前 確認目標裝置有提供測試 HAL,並略過測試 如果不知道的話 (請參閱 VTS 可測試性檢查)。
  • 涵蓋率評估。VTS 支援跨程序程式碼 覆蓋範圍評估,藉此取得所需的測試 HAL 服務相關知識 來進行評估 (亦即清除暫代服務流程的涵蓋範圍)。