सेवा के नाम के बारे में जानकारी रखने वाले एचएएल की जांच

Android 9 में, Vendor Test Suite (VTS) टेस्ट चलाने वाले डिवाइस के आधार पर, किसी दिए गए एचएएल इंस्टेंस के सेवा नाम को पाने की सुविधा शामिल है. VTS HAL टेस्ट चलाने से, डेवलपर को वेंडर एक्सटेंशन, कई एचएएल, और टारगेट और होस्ट-साइड VTS टेस्ट रन, दोनों पर कई एचएएल इंस्टेंस की टेस्टिंग को अपने-आप होने के लिए सेट करने की सुविधा मिलती है.

सेवा के नामों के बारे में जानकारी

चालू HAL सेवा का हर इंस्टेंस, सेवा के नाम के साथ खुद को रजिस्टर करता है.

Android के पिछले वर्शन में, VTS HAL टेस्ट चलाने वाले डेवलपर को टेस्ट क्लाइंट के लिए सही सेवा का नाम सेट करना होता था. इसके लिए, उन्हें getService() में सेवा का नाम सेट करना होता था. इसके अलावा, वे नाम को खाली छोड़कर डिफ़ॉल्ट सेवा के नाम पर वापस आ सकते थे. इस तरीके से ये समस्याएं हो सकती हैं:

  • सही सेवा का नाम सेट करने के लिए, टेस्ट डेवलपर के ज्ञान पर भरोसा करना.
  • डिफ़ॉल्ट रूप से, इसे किसी एक सेवा इंस्टेंस के ख़िलाफ़ टेस्ट करने के लिए इस्तेमाल किया जा सकता है.
  • सेवा के नामों को मैन्युअल तरीके से बनाए रखना.इसका मतलब है कि नामों को हार्ड-कोड किया गया है. इसलिए, अगर सेवा का नाम बदलता है, तो उन्हें मैन्युअल तरीके से अपडेट करना होगा.

Android 9 में, डेवलपर को टेस्ट किए जा रहे डिवाइस के आधार पर, किसी दिए गए एचएएल इंस्टेंस के लिए सेवा का नाम अपने-आप मिल सकता है. इस तरीके के फ़ायदों में, जांच की सुविधा शामिल है:

  • Vendor HAL extensions. उदाहरण के लिए, जब किसी वेंडर के पास camera.provider HAL का ऐसा वर्शन होता है जो वेंडर के डिवाइसों पर चलता है और जिसका सेवा नाम कस्टम होता है, तो VTS, वेंडर इंस्टेंस की पहचान कर सकता है और उस पर टेस्ट चला सकता है.
  • एक से ज़्यादा HAL इंस्टेंस. उदाहरण के लिए, जब graphics.composer HAL के दो इंस्टेंस होते हैं (एक का सेवा नाम "default" और दूसरे का सेवा नाम "vr"), तो VTS दोनों इंस्टेंस की पहचान कर सकता है और उन सभी के ख़िलाफ़ टेस्ट चला सकता है.
  • मल्टी-एचएएल टेस्टिंग. इस कुकी का इस्तेमाल, कई HAL के साथ कई इंस्टेंस की जांच करते समय किया जाता है. उदाहरण के लिए, जब VTS टेस्ट चलाया जाता है, तो यह पुष्टि करता है कि KeyMint (पहले Keymaster) और Gatekeeper HAL एक साथ कैसे काम करते हैं. VTS, उन HAL के लिए सेवा इंस्टेंस के सभी कॉम्बिनेशन की जांच कर सकता है.

टारगेट-साइड टेस्ट

टारगेट-साइड टेस्टिंग के लिए, सेवा के नाम की जानकारी देने वाली सुविधा चालू करने के लिए, Android 9 में पसंद के मुताबिक बनाया जा सकने वाला टेस्ट एनवायरमेंट (VtsHalHidlTargetTestEnvBase) शामिल है. यह एनवायरमेंट, इन कामों के लिए इंटरफ़ेस उपलब्ध कराता है:

  • टेस्ट में, एचएएल को टारगेट करने के लिए रजिस्टर करें.
  • रजिस्टर किए गए सभी एचएएल की सूची बनाएं.
  • वीटीएस फ़्रेमवर्क की ओर से उपलब्ध कराए गए, रजिस्टर किए गए एचएएल के लिए सेवा का नाम पाएं.

इसके अलावा, वीटीएस फ़्रेमवर्क, रनटाइम के दौरान इन सुविधाओं के लिए सहायता देता है:

  • सभी रजिस्टर किए गए टेस्ट HAL पाने के लिए, टेस्ट बाइनरी को प्री-प्रोसेस किया जाता है.
  • चल रहे सभी सेवा इंस्टेंस की पहचान करना और हर इंस्टेंस के लिए सेवा का नाम पाना. यह नाम vendor/manifest.xml के आधार पर वापस पाया जाता है.
  • सभी इंस्टेंस के कॉम्बिनेशन का हिसाब लगाया जा रहा है, ताकि एक से ज़्यादा एचएएल की जांच की जा सके.
  • हर सेवा इंस्टेंस (कॉम्बिनेशन) के लिए, नया टेस्ट जनरेट करना.

उदाहरण:

टारगेट-साइड टेस्टिंग के लिए रनटाइम की सुविधा

पहली इमेज. टारगेट-साइड टेस्टिंग के लिए, वीटीएस फ़्रेमवर्क के रनटाइम का इस्तेमाल किया जा सकता है

सेवा के नाम के बारे में जानकारी देने वाले टारगेट-साइड टेस्ट सेट अप करना

टारगेट-साइड सेवा के नाम के बारे में जानकारी देने वाली टेस्टिंग के लिए, अपना टेस्ट एनवायरमेंट सेट अप करने के लिए:

  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 देखें.

वीटीएस होस्ट-साइड टेस्ट

वीटीएस के होस्ट-साइड टेस्ट, टारगेट डिवाइस पर टेस्ट बाइनरी के बजाय होस्ट साइड पर टेस्ट स्क्रिप्ट चलाते हैं. इन टेस्ट के लिए, सेवा के नाम की जानकारी देने की सुविधा चालू करने के लिए, होस्ट साइड टेंप्लेट का इस्तेमाल किया जा सकता है. इससे एक ही टेस्ट स्क्रिप्ट को अलग-अलग पैरामीटर के हिसाब से कई बार चलाया जा सकता है. यह 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, AndroidTest.xml में कॉन्फ़िगर किए गए <precondition-lshal> विकल्प का इस्तेमाल करके, टेस्टिंग HAL की पहचान करता था. इस तरीके को बनाए रखना मुश्किल था, क्योंकि इसमें डेवलपर पर यह ज़िम्मेदारी थी कि वे टेस्ट को सही तरीके से कॉन्फ़िगर करें और कॉन्फ़िगरेशन को उसके हिसाब से अपडेट करें. साथ ही, यह तरीका सटीक नहीं था, क्योंकि इसमें सिर्फ़ पैकेज और वर्शन की जानकारी शामिल थी, इंटरफ़ेस की जानकारी नहीं.

Android 9 में, VTS, सर्विस के नाम की जानकारी का इस्तेमाल करके, टेस्टिंग HAL की पहचान करता है. रजिस्टर्ड टेस्टिंग HAL, इन कामों के लिए भी फ़ायदेमंद होते हैं:

  • पहले से तय की गई शर्तों की जांच. HAL टेस्ट चलाने से पहले, VTS यह पुष्टि कर सकता है कि टारगेट डिवाइस पर टेस्टिंग HAL उपलब्ध है या नहीं. अगर यह उपलब्ध नहीं है, तो VTS टेस्ट को छोड़ सकता है (VTS टेस्ट किए जा सकते हैं या नहीं, इसकी जांच देखें).
  • कवरेज मेज़रमेंट. VTS, क्रॉस-प्रोसेस कोड कवरेज मेज़रमेंट की सुविधा देता है.इसके लिए, वह उन टेस्टिंग HAL सेवाओं के बारे में जानकारी का इस्तेमाल करता है जिन्हें मेज़र करना है. जैसे, hal सेवा प्रोसेस के लिए कवरेज को फ़्लश करना.