GTest עם פרמטרים לבדיקת HAL

לממשק HAL יכולות להיות כמה הטמעות. כדי לבדוק כל מופע של הטמעת HAL, הדרך הרגילה היא לכתוב GTest עם פרמטרים של ערכים.

הגדרה בסיסית של בדיקה

מחלקת GTest חייבת לרשת את מחלקת הבסיס testing::TestWithParam, שהפרמטר שלה הוא שם כל מכונה. בשיטה SetUp אפשר ליצור מופע של השירות על סמך שם המופע, כפי שמתואר בקטע הקוד הבא.

// The main test class for the USB hidl HAL
class UsbHidlTest : public testing::TestWithParam<std::string> {

 virtual void SetUp() override {
   usb = IUsb::getService(GetParam());
   ASSERT_NE(usb, nullptr);
...
 }

בכל שיטת בדיקה, משתמשים במאקרו TEST_P כפי שמתואר בדוגמה הבאה:

TEST_P(UsbHidlTest, setCallback) {
...
}

יוצרים מופע של הסוויטה באמצעות המאקרו INSTANTIATE_TEST_SUITE_P, כמו בדוגמה הבאה:

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

הארגומנטים הם:

  1. InstantiationName, שיכול להיות כל דבר שמתאים לבדיקה. PerInstance הוא שם נפוץ.

  2. שם הכיתה של הבדיקה.

  3. אוסף של שמות של מופעים, שאפשר לאחזר מהשיטה המובנית, למשל getAllHalInstanceNames.

  4. השיטה להדפסת שם שיטת הבדיקה. PrintInstanceNameToString הוא שם מובנה שאפשר להשתמש בו כדי ליצור שם בדיקה על סמך שם המכונה ושם שיטת הבדיקה.

בדיקה עם כמה מקורות קלט

ב-GTest יש תמיכה בקבוצות של ערכים (tuples) לבדיקות עם פרמטרים של ערכים. כשבדיקת HAL דורשת בדיקה עם מספר מקורות קלט (לדוגמה, בדיקה עם מספר ממשקים), אפשר לכתוב בדיקת GTest עם tuple בתור פרמטר הבדיקה. הקוד המלא מופיע ב-VtsHalGraphicsMapperV2_1TargetTest.

בהשוואה ל-GTest עם פרמטר בדיקה יחיד, בבדיקה הזו צריך להשתמש בפרמטר הבדיקה tuple, כפי שמוצג בדוגמה הבאה:

class GraphicsMapperHidlTest
   : public ::testing::TestWithParam<std::tuple<std::string, std::string>> {
 protected:
   void SetUp() override {
       ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>(std::get<0>(GetParam()),
                                                                    std::get<1>(GetParam())));

}

אם נדרשים פרמטרים מורכבים יותר, מומלץ להשתמש במבנה ובפונקציות ToString בהתאמה אישית של GTest.

כדי ליצור מופע של חבילת הבדיקות, משתמשים גם במאקרו INSTANTIATE\_TEST\_CASE\_P, עם שני הבדלים:

  • הארגומנט השלישי הוא אוסף של צמדי מחרוזות (לעומת אוסף של מחרוזות במקרה הבסיסי).
  • השיטה ליצירת קובץ היעד של שם הבדיקה צריכה לתמוך ב-tuple. אפשר להשתמש בשיטה המובנית PrintInstanceTupleNameToString, שיכולה לטפל בקבוצות של מחרוזות, כפי שמוצג בדוגמה הבאה:
INSTANTIATE_TEST_CASE_P(
       PerInstance, GraphicsMapperHidlTest,
       testing::Combine(
               testing::ValuesIn(
                       android::hardware::getAllHalInstanceNames(IAllocator::descriptor)),
           testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMapper::descriptor))),
       android::hardware::PrintInstanceTupleNameToString<>);