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 תומך בטופלים לבדיקות עם פרמטרים של ערכים. אם בדיקת 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())));

}

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

כדי ליצור מופע של חבילת הבדיקות, משתמשים גם בפקודת המאקרו 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<>);