اسم الخدمة يعرف اختبار HAL

يتضمن Android 9 دعمًا للحصول على اسم الخدمة لمثيل HAL معين استنادًا إلى الجهاز الذي يتم تشغيل اختبارات Vendor Test Suite (VTS) عليه. يؤدي تشغيل اختبارات VTS HAL التي تدرك اسم الخدمة إلى تمكين المطورين من أتمتة اختبار امتدادات البائعين، وخطوط HAL المتعددة، ومثيلات HAL المتعددة في عمليات تشغيل اختبار VTS على كل من الهدف والمضيف.

حول أسماء الخدمة

يقوم كل مثيل لخدمة HAL قيد التشغيل بتسجيل نفسه باسم خدمة.

في الإصدارات السابقة من Android، كان مطلوبًا من المطورين الذين يقومون بإجراء اختبارات VTS HAL تعيين اسم الخدمة الصحيح لعميل الاختبار في getService() أو ترك الاسم فارغًا والرجوع إلى اسم الخدمة الافتراضي. ومن عيوب هذا النهج ما يلي:

  • الاعتماد على معرفة مطور الاختبار لتعيين اسم الخدمة الصحيح.
  • يقتصر على الاختبار مقابل مثيل خدمة واحد بشكل افتراضي.
  • الصيانة اليدوية لأسماء الخدمات (أي لأن الأسماء مرمزة بشكل ثابت، يجب تحديثها يدويًا إذا تغير اسم الخدمة.

في Android 9، يمكن للمطورين الحصول تلقائيًا على اسم الخدمة لمثيل HAL معين بناءً على الجهاز قيد الاختبار. تشمل مزايا هذا النهج دعم الاختبار:

  • ملحقات HAL للمورد . على سبيل المثال، عندما يكون لدى البائع تطبيق Camera.provider HAL الذي يتم تشغيله على أجهزة المورد مع اسم خدمة مخصص، يمكن لـ VTS تحديد مثيل البائع وإجراء الاختبار عليه.
  • مثيلات HAL متعددة . على سبيل المثال، عندما يكون لدى graphics.composer HAL مثيلين (أحدهما باسم الخدمة "افتراضي" والآخر باسم الخدمة "vr")، يمكن لـ VTS التعرف على كلا المثيلين وإجراء الاختبار مقابل كل منهما.
  • اختبار HAL المتعدد . يُستخدم عند اختبار طبقات HAL متعددة مع مثيلات متعددة على سبيل المثال، عند تشغيل اختبار VTS الذي يتحقق من كيفية عمل طبقة HAL الرئيسية وحارس البوابة معًا، يمكن لـ VTS اختبار جميع مجموعات مثيلات الخدمة لـ HALs.

اختبارات الجانب المستهدف

لتمكين التعرف على اسم الخدمة للاختبار على الجانب المستهدف، يتضمن Android 9 بيئة اختبار قابلة للتخصيص ( VtsHalHidlTargetTestEnvBase ) التي توفر واجهات لـ:

  • سجل استهداف HAL(s) في الاختبار.
  • قم بإدراج كافة HAL(s) المسجلة.
  • احصل على اسم (أسماء) الخدمة لـ HAL (s) المسجلة التي يوفرها إطار عمل VTS.

بالإضافة إلى ذلك، يوفر إطار عمل VTS دعمًا في وقت التشغيل لما يلي:

  • المعالجة المسبقة للاختبار الثنائي للحصول على جميع اختبارات HAL (الاختبارات المسجلة) المسجلة.
  • تحديد كافة مثيلات الخدمة قيد التشغيل والحصول على اسم الخدمة لكل مثيل (يتم استرجاعه بناءً على vendor/manifest.xml ).
  • حساب جميع مجموعات المثيلات (لدعم اختبارات HAL المتعددة).
  • إنشاء اختبار جديد لكل مثيل خدمة (مجموعة).

مثال:

Runtime support for target-side testing

الشكل 1. دعم وقت تشغيل إطار عمل VTS للاختبار على الجانب المستهدف

قم بإعداد اختبارات الجانب المستهدف المدركة لاسم الخدمة

لإعداد بيئة الاختبار الخاصة بك لاختبار معرفة اسم الخدمة من جانب الهدف:

  1. تحديد testEnvironment استنادًا إلى VtsHalHidlTargetTestEnvBase وتسجيل شرائح HALs للاختبار:
    #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).

Runtime support for host-side testing

الشكل 2. دعم وقت تشغيل إطار عمل VTS للاختبار من جانب المضيف
  • يحدد البرنامج النصي لاختبار hal خدمة (خدمات) 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 .

تسجيل اختبار HALs

في الإصدارات السابقة من Android، حدد VTS اختبار HAL باستخدام الخيار <precondition-lshal> الذي تم تكوينه في AndroidTest.xml . كان من الصعب الحفاظ على هذا النهج (لأنه اعتمد على المطورين لتكوين الاختبار بشكل صحيح وتحديث التكوين وفقًا لذلك) وكان غير دقيق (لأنه يحتوي فقط على معلومات الحزمة والإصدار وليس معلومات الواجهة).

في Android 9، يحدد VTS اختبار HAL باستخدام التعرف على اسم الخدمة. تعد اختبارات HALs المسجلة مفيدة أيضًا لما يلي:

  • فحوصات الشروط المسبقة . قبل إجراء اختبار HAL، يمكن لـ VTS التأكد من توفر اختبار HAL على الجهاز المستهدف وتخطي الاختبارات إذا لم يكن كذلك (راجع فحص قابلية اختبار VTS ).
  • قياس التغطية . يدعم VTS قياس تغطية التعليمات البرمجية عبر العمليات من خلال المعرفة حول خدمات اختبار HAL التي يريد قياسها (أي مسح التغطية لعملية خدمة hal).