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<>);