בדיקת HAL עם מוּדעוּת לשם השירות

ב-Android 9 יש תמיכה בקבלת שם השירות של מכונה נתונה של HAL על סמך המכשיר שבו פועלות בדיקות של Vendor Test Suite‏ (VTS). הפעלת בדיקות HAL של VTS שמזהות את שם השירות מאפשרת למפתחים לבצע אוטומציה של בדיקות של תוספים של ספקים, של כמה HAL ושל כמה מכונות HAL גם בצד היעד וגם בצד המארח של בדיקות VTS.

מידע על שמות שירותים

כל מכונה של שירות HAL שפועלה מתעדכנת עם שם שירות.

בגרסאות קודמות של Android, מפתחים שהפעילו בדיקות HAL של VTS נדרשו להגדיר את שם השירות הנכון ללקוח הבדיקה ב-getService() או להשאיר את השם ריק ולעבור לשם ברירת המחדל של השירות. החסרונות של הגישה הזו כוללים:

  • להסתמך על הידע של מפתח הבדיקות כדי להגדיר את שם השירות הנכון.
  • כברירת מחדל, הבדיקה מוגבלת למכונה אחת של השירות.
  • תחזוקה ידנית של שמות השירותים (כלומר, מאחר שהשמות מוטמעים בקוד, צריך לעדכן אותם באופן ידני אם שם השירות משתנה.

ב-Android 9, מפתחים יכולים לקבל באופן אוטומטי את שם השירות של מכונה נתונה של HAL על סמך המכשיר שנמצא בבדיקה. היתרונות של הגישה הזו כוללים תמיכה בבדיקות של:

  • תוספים של HAL של ספקים. לדוגמה, אם למכשיר של ספק יש הטמעה של camera.provider HAL שפועלת במכשירי הספק עם שם שירות מותאם אישית, VTS יכול לזהות את המכונה של הספק ולהריץ את הבדיקה נגדה.
  • מכונות HAL מרובות. לדוגמה, כשיש ל-HAL של graphics.composer שתי מכונות (אחת עם שם השירות default והשנייה עם שם השירות vr), VTS יכול לזהות את שתי המכונות ולהריץ את הבדיקה בכל אחת מהן.
  • בדיקות בכמה ממשקי HAL. משמש לבדיקת כמה ממשקי HAL עם כמה מכונות. לדוגמה, כשמריצים את בדיקת VTS שמאמתת את האופן שבו HAL של Keymaster ו-HAL של Gatekeeper פועלים יחד, VTS יכול לבדוק את כל השילובים של מכונות השירות של ממשקי ה-HAL האלה.

בדיקות בצד היעד

כדי לאפשר זיהוי של שם השירות לצורך בדיקה בצד היעד, Android 9 כולל סביבה של בדיקה שניתן להתאים אישית (VtsHalHidlTargetTestEnvBase) שמספקת ממשקים ל:

  • רושמים את ה-HAL לטירגוט בבדיקה.
  • הצגת רשימה של כל ה-HAL הרשומים.
  • אחזור שמות שירותים של HAL רשומים שסופקו על ידי מסגרת VTS.

בנוסף, מסגרת VTS מספקת תמיכה בסביבת זמן ריצה בנושאים הבאים:

  • עיבוד מקדים של קובץ ה-binary של הבדיקה כדי לקבל את כל ה-HAL של הבדיקה שרשומים.
  • זיהוי כל המכונות של השירות שפועלות ואיתור שם השירות לכל מכונה (האחזור מתבצע על סמך vendor/manifest.xml).
  • חישוב כל השילובים של המכונות (כדי לתמוך במספר בדיקות HAL).
  • יצירת בדיקה חדשה לכל מכונה של השירות (שילוב).

דוגמה:

תמיכה בסביבת זמן ריצה לבדיקות בצד היעד

איור 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).

תמיכה בסביבת זמן הריצה לבדיקה בצד המארח

איור 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 זיהה את HAL לבדיקה באמצעות האפשרות <precondition-lshal> שהוגדרה ב-AndroidTest.xml. הגישה הזו הייתה קשה לתחזוקה (כי היא הסתמכה על המפתחים כדי להגדיר את הבדיקה בצורה נכונה ולעדכן את ההגדרה בהתאם) ולא מדויקת (כי היא הכילה רק את פרטי החבילה והגרסה ולא את פרטי הממשק).

ב-Android 9, ‏VTS מזהה את HAL לבדיקה באמצעות זיהוי של שם השירות. ממשקי ה-HAL לבדיקה הרשומים שימושיים גם לדברים הבאים:

  • בדיקות של תנאים מוקדמים. לפני שמריצים בדיקת HAL, VTS יכול לוודא שה-HAL לבדיקה זמין במכשיר היעד ולדלג על הבדיקות אם הוא לא זמין (ראו בדיקת יכולת הבדיקה של VTS).
  • מדידת הכיסוי. VTS תומך במדידת הכיסוי של קוד במספר תהליכים באמצעות הידע על שירותי HAL לבדיקה שהוא רוצה למדוד (כלומר, כדי לנקות את הכיסוי של תהליך שירות HAL).