Android 9 כולל תמיכה בהשגת שם השירות של מופע HAL נתון על סמך המכשיר שבו מופעלות בדיקות Vendor Test Suite (VTS). הפעלת בדיקות VTS HAL שמודעות לשם השירות מאפשרת למפתחים לבצע אוטומציה של בדיקות הרחבות של ספקים, של כמה HAL ושל כמה מופעים של HAL בהרצות בדיקות VTS בצד היעד ובצד המארח.
מידע על שמות שירותים
כל מופע של שירות HAL שפועל נרשם עם שם שירות.
בגרסאות קודמות של Android, מפתחים שהריצו בדיקות VTS HAL נדרשו להגדיר את שם השירות הנכון עבור לקוח הבדיקה ב-getService() או להשאיר את השם ריק ולחזור לשם השירות שמוגדר כברירת מחדל. החסרונות של הגישה הזו כוללים:
- הסתמכות על הידע של מפתח הבדיקה כדי להגדיר את שם השירות הנכון.
- כברירת מחדל, אפשר לבצע בדיקות רק מול מופע שירות יחיד.
- תחזוקה ידנית של שמות שירותים (כלומר, מכיוון שהשמות מוצפנים, צריך לעדכן אותם ידנית אם שם השירות משתנה).
ב-Android 9, מפתחים יכולים לקבל באופן אוטומטי את שם השירות של מופע HAL נתון על סמך המכשיר שנבדק. היתרונות של הגישה הזו כוללים תמיכה בבדיקות:
- Vendor HAL extensions. לדוגמה, אם לספק יש הטמעה של camera.provider HAL שפועלת במכשירי הספק עם שם שירות מותאם אישית, VTS יכול לזהות את מופע הספק ולהריץ את הבדיקה מולו.
- Multiple HAL instances (מספר מופעים של HAL). לדוגמה, אם ל-HAL
graphics.composerיש שני מופעים (אחד עם שם השירות default ואחד עם שם השירות vr), VTS יכול לזהות את שני המופעים ולהריץ את הבדיקה על כל אחד מהם. - בדיקות של Multi-HAL. האפשרות הזו שימושית כשבודקים כמה HAL עם כמה מופעים. לדוגמה, כשמריצים את בדיקת VTS שמאמתת את אופן הפעולה של KeyMint (לשעבר Keymaster) ו-Gatekeeper HAL ביחד, VTS יכול לבדוק את כל השילובים של מופעי שירות עבור HAL האלה.
בדיקות בצד היעד
כדי להפעיל את ההגדרה 'שם השירות' לבדיקות בצד היעד, Android 9 כולל סביבת בדיקה שניתנת להתאמה אישית (VtsHalHidlTargetTestEnvBase) שמספקת ממשקי API ל:
- רושמים את ה-HAL(ים) לטירגוט בבדיקה.
- מציינים את כל שכבות ה-HAL הרשומות.
- קבלת שמות של שירותים עבור HAL רשומים שסופקו על ידי מסגרת VTS.
בנוסף, ה-framework של VTS מספק תמיכה בזמן ריצה עבור:
- ביצוע עיבוד מקדים לקובץ הבינארי של הבדיקה כדי לקבל את כל ה-HAL של הבדיקה הרשומים.
- זיהוי כל המופעים של השירות שפועלים וקבלת שם השירות של כל מופע (מאוחזר על סמך
vendor/manifest.xml). - חישוב כל השילובים של המופעים (כדי לתמוך בבדיקות מרובות של HAL).
- יצירת בדיקה חדשה לכל מופע שירות (שילוב).
דוגמה:
הגדרה של בדיקות בצד היעד שמודעות לשם השירות
כדי להגדיר את סביבת הבדיקה לבדיקה עם מודעות לשם השירות בצד היעד:
- מגדירים
testEnvironmentעל סמךVtsHalHidlTargetTestEnvBaseורושמים בדיקות HAL:#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 מציין את שירותי ה-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).