ב-Android 9 יש תמיכה בקבלת שם השירות של מכונה נתונה של HAL על סמך המכשיר שבו פועלות בדיקות Vendor Test Suite (VTS). הפעלת בדיקות HAL של VTS שמזהות את שם השירות מאפשרת למפתחים לבצע אוטומציה של בדיקות של תוספים של ספקים, של כמה HAL ושל כמה מכונות HAL גם בצד היעד וגם בצד המארח של בדיקות VTS.
מידע על שמות שירותים
כל מופע של שירות HAL שפועל רושם את עצמו בשם של שירות.
בגרסאות קודמות של Android, מפתחים שהפעילו בדיקות HAL של VTS נדרשו להגדיר את שם השירות הנכון ללקוח הבדיקה ב-getService()
, או להשאיר את השם ריק ולעבור לשם ברירת המחדל של השירות. החסרונות של הגישה הזו כוללים:
- להסתמך על הידע של מפתח הבדיקות כדי להגדיר את שם השירות הנכון.
- כברירת מחדל, מוגבל לבדיקה במכונה אחת של שירות.
- תחזוקה ידנית של שמות השירותים (כלומר מאחר שהשמות מופיעים בתוך הקוד, צריך לעדכן אותם ידנית אם השם של השירות משתנה.
ב-Android 9, המפתחים יכולים לקבל באופן אוטומטי את שם השירות של מכונה נתונה של HAL על סמך המכשיר שנמצא בבדיקה. היתרונות של הגישה הזו כוללים תמיכה בבדיקות של:
- תוספי HAL של ספקים. לדוגמה, כשלספק יש 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.
בנוסף, ה-framework של VTS מספקת תמיכה בסביבת זמן ריצה עבור:
- עיבוד מקדים של קובץ ה-binary של הבדיקה כדי לקבל את כל ה-HAL של הבדיקה שרשומים.
- זיהוי של כל מכונות השירות שפועלות והשגת שם השירות של כל מכונה (מאוחזרת על סמך
vendor/manifest.xml
). - חישוב כל השילובים של מכונות (לתמיכה בבדיקת HAL מרובים).
- יצירת בדיקה חדשה לכל מכונה של השירות (שילוב).
דוגמה:
הגדרה של בדיקות בצד היעד עם מוּדעוּת לשם שירות
כדי להגדיר את סביבת הבדיקה לבדיקה מבוססת-שם-שירות בצד היעד:
- מגדירים
testEnvironment
על סמךVtsHalHidlTargetTestEnvBase
ומרשמים HALs לבדיקה:#include <VtsHalHidlTargetTestEnvBase.h> class testEnvironment : public::testing::VtsHalHidlTargetTestEnvBase { virtual void registerTestServices() override { registerTestService<IFoo>(); } };
- משתמשים ב-
getServiceName()
שסופק על ידי סביבת הבדיקה כדי להעביר את שם השירות:::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default")); // "default" is the default service name you want to use.
- רושמים את סביבת הבדיקה ב-
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).
- הסקריפט hal test מציין את שירותי ה-HAL לטירגוט בבדיקה.
- הפונקציה
hal_hidl_host_test
(סיווג משנה שלparam_test
) מקבלת את ממשקי ה-HAL לבדיקה שרשומים בסקריפט הבדיקה, מזהה את שמות השירותים התואמים לממשק ה-HAL לבדיקה, ואז יוצרת שילובים של שמות שירותים (לבדיקה של כמה ממשקי HAL) כפרמטרים של בדיקה. בנוסף, הוא מספק את השיטהgetHalServiceName()
שמחזירה את שם השירות התואם בהתאם לפרמטר שהוענק למקרה הבדיקה הנוכחי. - התבנית param_test תומכת בלוגיקה שמאפשרת לקבל רשימה של פרמטרים ולהריץ את כל תרחישי הבדיקה שצוינו לכל פרמטר. כלומר, לכל תרחיש בדיקה נוצרים N תרחישי בדיקה חדשים עם פרמטרים (N = מספר הפרמטרים), כל אחד עם פרמטר נתון.
הגדרה של בדיקות בצד המארח עם מוּדעוּת לשם שירות
כדי להגדיר את סביבת הבדיקה לבדיקה מבוססת-שם-שירות בצד המארח:
- יש לציין את שירות היעד HAL בסקריפט הבדיקה:
TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
- קוראים ל-
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).