एचएएल इंटरफ़ेस के लिए, कई तरीके से लागू किया जा सकता है. 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);
आर्ग्युमेंट ये हैं:
InstantiationName
, जो आपके टेस्ट से मैच करने वाली कोई भी चीज़ हो सकती है.PerInstance
एक सामान्य नाम है.टेस्ट क्लास का नाम.
इंस्टेंस के नामों का कलेक्शन, जिसे पहले से मौजूद तरीके से वापस पाया जा सकता है. उदाहरण के लिए,
getAllHalInstanceNames
.टेस्ट के तरीके का नाम प्रिंट करने का तरीका.
PrintInstanceNameToString
एक ऐसा नाम है जो पहले से मौजूद होता है. इसका इस्तेमाल, इंस्टेंस के नाम और टेस्ट के तरीके के नाम के आधार पर, टेस्ट का नाम कंपाइल करने के लिए किया जा सकता है.
एक से ज़्यादा इनपुट के साथ टेस्ट करना
GTest, वैल्यू-पैरामीटर वाले टेस्ट के लिए ट्यूपल के साथ काम करता है. जब किसी HAL टेस्ट के लिए कई इनपुट (उदाहरण के लिए, कई इंटरफ़ेस वाला टेस्ट) की ज़रूरत होती है, तो टेस्ट पैरामीटर के तौर पर tuple
के साथ GTest लिखा जा सकता है. पूरा कोड 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<>);