ב-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. משמש לבדיקה של מספר HALs עם מספר מכונות. לדוגמה, כשמריצים בדיקת VTS שמאמתת איך ה-HAL של מנהל המפתח ושומר הסף פועלים ביחד, VTS יכול לבדוק את כל השילובים של מכונות השירות האלה עבור ה-HAL הזה.
בדיקות בצד היעד
כדי לאפשר זיהוי של שם השירות לצורך בדיקה בצד היעד, Android 9 כולל סביבה של בדיקה שניתן להתאים אישית (VtsHalHidlTargetTestEnvBase
) שמספקת ממשקים ל:
- רושמים את ה-HAL לטירגוט בבדיקה.
- רשימה של כל תהליכי HAL הרשומים.
- קבלת שמות השירותים עבור HAL(s) רשומים שסופקו על ידי VTS framework.
בנוסף, מסגרת VTS מספקת תמיכה בסביבת זמן ריצה בנושאים הבאים:
- עיבוד מקדים של הקובץ הבינארי לבדיקה כדי לקבל את כל רכיבי 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).