サービス名認識型 HAL テスト

Android 9 には、ベンダー テストスイート(VTS)テストが実行されているデバイスに基づいて、HAL インスタンスのサービス名を取得する機能があります。サービス名を認識する VTS HAL テストを実行すると、ベンダー拡張、複数の HAL、複数の HAL インスタンスのテストを、ターゲット側とホスト側の両方の VTS テスト実行で自動化できます。

サービス名について

実行中の HAL サービスの各インスタンスは、サービス名を付けて登録されます。

以前のバージョンの Android では、VTS HAL テストを実行する際に、getService() でテスト クライアントの正しいサービス名を設定するか、名前を空にしてデフォルトのサービス名のままにする必要がありました。この方法には以下の欠点があります。

  • 正しいサービス名の設定がテスト デベロッパーの知識に依存する。
  • デフォルトで、1 つのサービス インスタンスのテストに限定される。
  • サービス名を手動でメンテナンスする必要がある(名前はハードコードされるため、サービス名の変更時に手動で更新する必要がある)。

Android 9 では、テスト対象デバイスに基づいて、HAL インスタンスのサービス名を自動的に取得できます。 この方法のメリットは、以下のテストに対応している点です。

  • ベンダーの HAL 拡張。たとえば、ベンダーがベンダー デバイス上でサービス名をカスタマイズして動作する camera.provider HAL を実装している場合に、VTS でベンダー インスタンスを識別し、それに対してテストを実行できます。
  • 複数の HAL インスタンス。たとえば、graphics.composer HAL に 2 つのインスタンス(1 つはサービス名「default」、もう 1 つはサービス名「vr」)がある場合、両方のインスタンスを識別し、各インスタンスに対してテストを実行できます。
  • 複数 HAL のテスト。複数 HAL を複数インスタンスでテストする場合に使用します。たとえば、keymaster HAL と 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 test スクリプトで、テスト対象とする 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 は、次の場合にも役立ちます。

  • 前提条件のチェック。VTS は、HAL テストを実行する前に、対象デバイスでテスト HAL が使用可能かを確認し、使用可能でない場合にテストをスキップできます(VTS でのテスト可否のチェックをご覧ください)。
  • カバレッジの測定。VTS は、測定するテスト HAL サービスに関する知識によるプロセス横断コード カバレッジ測定をサポートしています(HAL サービス プロセスのカバレッジをフラッシュするため)。