서비스 이름 인식 HAL 테스트

Android 9에는 VTS(공급업체 테스트 도구 모음) 테스트가 실행되는 기기에 따라 지정된 HAL 인스턴스의 서비스 이름을 가져올 수 있는 지원 기능이 포함되어 있습니다. 서비스 이름을 인식하는 VTS HAL 테스트를 실행하면 개발자는 타겟 측 VTS 테스트 실행과 호스트 측 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을 테스트할 때 사용됩니다. 예를 들어 keymaster와 gatekeeper HAL이 연동되는 방식을 확인하는 VTS 테스트를 실행할 경우 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_test(param_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은 다음 경우에도 유용합니다.

  • 전제 조건 확인. HAL 테스트를 실행하기 전에 VTS는 타겟 기기에서 테스트 HAL을 사용할 수 있는지 확인하고 사용할 수 없는 경우 테스트를 건너뛸 수 있습니다(VTS 테스트 가능성 확인 참조).
  • 커버리지 측정. VTS에서는 측정하려는 테스트 HAL 서비스의 정보를 통해 프로세스 간 코드 커버리지를 측정할 수 있습니다(즉, hal 서비스 프로세스의 커버리지를 빠르게 전송함).