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 のテストをサポートするため)。
- サービス インスタンス(組み合わせ)ごとに新しいテストを生成する。
例:
ターゲット側のサービス名認識型テストのセットアップ
以下のようにして、ターゲット側のサービス名認識型テストのテスト環境をセットアップします。
VtsHalHidlTargetTestEnvBase
をベースにしてtestEnvironment
を定義し、テスト HAL を登録します。#include <VtsHalHidlTargetTestEnvBase.h> class testEnvironment : public::testing::VtsHalHidlTargetTestEnvBase { virtual void registerTestServices() override { registerTestService<IFoo>(); } };
- テスト環境から提供されている
getServiceName()
を使用して、サービス名を渡します。::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default")); // "default" is the default service name you want to use.
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 パラメータ化テストと同様)。
- hal test スクリプトで、テスト対象とする HAL サービスが指定されます。
hal_hidl_host_test
(param_test
のサブクラス)は、登録済みのテスト HAL をテスト スクリプトから受け取り、テスト HAL の対応するサービス名を特定してから、テスト パラメータとしてサービス名の組み合わせを(複数 HAL のテスト用に)生成します。また、現在のテストケースに渡されたパラメータに従って対応するサービス名を返すメソッドgetHalServiceName()
を提供します。- param_test テンプレートは、パラメータのリストを受け取って、各パラメータに対してすべてのテストケースを実行するロジックをサポートしています。つまり、各テストケースに対して、各パラメータでパラメータ化されたテストケースを N 個生成します(N はパラメータの個数)。
ホスト側のサービス名認識型テストのセットアップ
次のようにして、ホスト側のサービス名認識型テスト用にテスト環境をセットアップします。
- 次のようにして、テスト スクリプトで対象の HAL サービスを指定します。
TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
- 次のように、
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 サービス プロセスのカバレッジをフラッシュするため)。