آزمایش «لایه انتزاع سخت‌افزار» با آگاهی از نام سرویس

‫Android 9 از دریافت نام سرویس نمونه HAL معین براساس دستگاهی که در آن «مجموعه آزمون فروشنده» (VTS) اجرا می‌شود پشتیبانی می‌کند. اجرای آزمایش‌های VTS HAL که از نام سرویس آگاه هستند به توسعه‌دهندگان امکان می‌دهد آزمایش افزونه‌های فروشنده، چندین HAL، و چندین نمونه HAL را در اجرای آزمایش VTS سمت میزبان و سمت هدف به‌طور خودکار انجام دهند.

درباره نام سرویس‌ها

هر نمونه از سرویس درحال اجرای HAL خود را با نام سرویس ثبت می‌کند.

در نسخه‌های قبلی Android، توسعه‌دهندگانی که آزمایش‌های VTS HAL را اجرا می‌کردند ملزم بودند نام سرویس صحیح را برای کارخواه آزمایش در getService() تنظیم کنند یا نام را خالی بگذارند و به نام سرویس پیش‌فرض برگردند. معایب این رویکرد عبارت‌اند از:

  • اتکا به دانش توسعه‌دهنده آزمایش برای تنظیم نام سرویس صحیح.
  • به‌طور پیش‌فرض به آزمایش دربرابر یک نمونه سرویس محدود است.
  • نگهداری دستی نام‌های سرویس (یعنی چون نام‌ها کدنویسی شده‌اند، اگر نام سرویس تغییر کند، باید به‌صورت دستی به‌روزرسانی شوند.

در Android 9، توسعه‌دهندگان می‌توانند به‌طور خودکار نام سرویس را برای یک نمونه HAL مشخص براساس دستگاه تحت آزمایش دریافت کنند. مزایای این رویکرد شامل پشتیبانی از آزمایش است:

  • افزونه‌های لایه انتزاع سخت‌افزار فروشنده. برای مثال، وقتی فروشنده‌ای پیاده‌سازی HAL‏ camera.provider را دارد که در دستگاه‌های فروشنده با نام سرویس سفارشی اجرا می‌شود، VTS می‌تواند نمونه فروشنده را شناسایی کند و آزمایش را در آن اجرا کند.
  • چند نمونه HAL. برای مثال، وقتی graphics.composer HAL دو نمونه دارد (یکی با نام سرویس «پیش‌فرض» و دیگری با نام سرویس «vr»)، VTS می‌تواند هر دو نمونه را شناسایی کند و آزمایش را برای هریک از آن‌ها اجرا کند.
  • آزمایش چندگانه HAL. هنگام آزمایش چندین HAL با چندین نمونه استفاده می‌شود. برای مثال، هنگام اجرای آزمایش VTS که نحوه عملکرد KeyMint (قبلاً Keymaster) و Gatekeeper HAL را باهم تأیید می‌کند، VTS می‌تواند تمام ترکیب‌های نمونه‌های سرویس را برای آن HALها آزمایش کند.

آزمایش‌های طرف هدف

برای فعال کردن آگاهی از نام سرویس برای آزمایش سمت هدف، Android 9 شامل محیط آزمایشی سفارشی‌سازی‌پذیر (VtsHalHidlTargetTestEnvBase) است که رابط‌هایی برای موارد زیر ارائه می‌دهد:

  • «لایه انتزاع سخت‌افزار»(های) هدف‌گیری را در آزمایش ثبت کنید.
  • همه HAL(های) ثبت‌شده را فهرست کنید.
  • نام(های) سرویس را برای HAL(های) ثبت‌شده ارائه‌شده توسط چارچوب VTS دریافت کنید.

علاوه‌براین، چارچوب VTS پشتیبانی زمان اجرا را برای موارد زیر فراهم می‌کند:

  • پیش‌پردازش باینری آزمایش برای دریافت همه HAL(های) آزمایش ثبت‌شده.
  • درحال شناسایی همه نمونه‌های سرویس درحال اجرا و دریافت نام سرویس برای هر نمونه (براساس vendor/manifest.xml بازیابی شد).
  • درحال محاسبه همه ترکیب‌های نمونه (برای پشتیبانی از آزمایش چندگانه HAL).
  • درحال تولید آزمایشی جدید برای هر نمونه سرویس (ترکیب).

مثال:

پشتیبانی زمان اجرا برای آزمایش طرف هدف

شکل ۱. پشتیبانی زمان اجرای چارچوب 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).

پشتیبانی زمان اجرا برای آزمایش سمت میزبان

شکل ۲. پشتیبانی زمان اجرای چارچوب 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 مراجعه کنید.

ثبت لایه‌های انتزاع سخت‌افزار آزمایشی

در نسخه‌های قبلی Android،‏ VTS بااستفاده از گزینه <precondition-lshal> که در AndroidTest.xml پیکربندی شده است،‏ HAL آزمایش را شناسایی می‌کرد. حفظ این رویکرد دشوار بود (زیرا به توسعه‌دهندگان متکی بود تا آزمایش را به‌درستی پیکربندی کنند و پیکربندی را متناسب با آن به‌روز کنند) و نادرست بود (زیرا فقط حاوی اطلاعات بسته و نسخه بود و اطلاعات رابط را نداشت).

در Android 9،‏ VTS بااستفاده از آگاهی از نام سرویس، HAL آزمایشی را شناسایی می‌کند. «لایه انتزاع سخت‌افزار» (HAL) آزمایش ثبت‌شده برای موارد زیر نیز مفید است:

  • بررسی‌های پیش‌شرط. قبل‌از اجرای آزمایش HAL،‏ VTS می‌تواند تأیید کند که HAL آزمایشی در دستگاه هدف دردسترس است و اگر دردسترس نباشد، آزمایش‌ها را رد کند (به بررسی آزمون‌پذیری VTS مراجعه کنید).
  • اندازه‌گیری پوشش. ‫VTS ازطریق اطلاعات مربوط به سرویس‌های HAL آزمایشی که می‌خواهد اندازه‌گیری کند (یعنی پاک کردن پوشش برای فرایند سرویس hal)، از اندازه‌گیری پوشش کد بین فرایندی پشتیبانی می‌کند.