Android 9 มีการรองรับการรับชื่อบริการของอินสแตนซ์ HAL ที่กำหนดโดยอิงตามอุปกรณ์ที่การทดสอบ Vendor Test Suite (VTS) กำลังทำงานอยู่ การรันการทดสอบ VTS HAL ที่ทราบชื่อบริการช่วยให้นักพัฒนาสามารถทำการทดสอบส่วนขยายของผู้จำหน่าย, HAL หลายรายการ และอินสแตนซ์ HAL หลายรายการได้โดยอัตโนมัติบนการรันการทดสอบ VTS ทั้งฝั่งเป้าหมายและฝั่งโฮสต์
เกี่ยวกับชื่อบริการ
แต่ละอินสแตนซ์ของบริการ HAL ที่ทำงานอยู่จะลงทะเบียนตัวเองด้วยชื่อบริการ
ใน Android เวอร์ชันก่อนหน้า นักพัฒนาที่ใช้การทดสอบ VTS HAL จำเป็นต้องตั้งชื่อบริการที่ถูกต้องสำหรับไคลเอ็นต์การทดสอบใน getService()
หรือปล่อยให้ชื่อว่างไว้และเลือกใช้ชื่อบริการเริ่มต้น ข้อเสียของวิธีนี้ ได้แก่ :
- อาศัยความรู้ของผู้พัฒนาการทดสอบในการตั้งชื่อบริการที่ถูกต้อง
- จำกัดให้ทดสอบกับอินสแตนซ์บริการเดียวตามค่าเริ่มต้น
- การบำรุงรักษาชื่อบริการด้วยตนเอง (เช่น เนื่องจากชื่อเป็นแบบฮาร์ดโค้ด จึงต้องอัปเดตด้วยตนเองหากชื่อบริการมีการเปลี่ยนแปลง
ใน Android 9 นักพัฒนาสามารถรับชื่อบริการสำหรับอินสแตนซ์ HAL ที่ระบุโดยอัตโนมัติตามอุปกรณ์ที่อยู่ระหว่างการทดสอบ ข้อดีของแนวทางนี้รวมถึงการสนับสนุนการทดสอบ:
- ส่วนขยาย HAL ของผู้ขาย ตัวอย่างเช่น เมื่อผู้จำหน่ายมีการใช้งาน camera.provider HAL ที่ทำงานบนอุปกรณ์ของผู้จำหน่ายด้วยชื่อบริการที่กำหนดเอง VTS จะสามารถระบุอินสแตนซ์ของผู้จำหน่ายและทำการทดสอบกับอินสแตนซ์นั้นได้
- อินสแตนซ์ HAL หลายรายการ ตัวอย่างเช่น เมื่อ
graphics.composer
HAL มีสองอินสแตนซ์ (หนึ่งอินสแตนซ์มีชื่อบริการ "default" และอีกอินสแตนซ์หนึ่งมีชื่อบริการ "vr") VTS จะสามารถระบุทั้งสองอินสแตนซ์และทำการทดสอบกับแต่ละอินสแตนซ์ได้ - การทดสอบหลาย HAL ใช้เมื่อทดสอบ HAL หลายรายการด้วยหลายอินสแตนซ์ ตัวอย่างเช่น เมื่อรันการทดสอบ VTS ที่ตรวจสอบว่า HAL ของคีย์มาสเตอร์และผู้รักษาประตูทำงานร่วมกันอย่างไร VTS จะสามารถทดสอบการรวมอินสแตนซ์บริการทั้งหมดสำหรับ HAL เหล่านั้นได้
การทดสอบด้านเป้าหมาย
เพื่อเปิดใช้งานการรับรู้ชื่อบริการสำหรับการทดสอบฝั่งเป้าหมาย Android 9 มีสภาพแวดล้อมการทดสอบที่ปรับแต่งได้ ( VtsHalHidlTargetTestEnvBase
) ที่ให้อินเทอร์เฟซสำหรับ:
- ลงทะเบียนการกำหนดเป้าหมาย HAL ในการทดสอบ
- แสดงรายการ HAL ที่ลงทะเบียนทั้งหมด
- รับชื่อบริการสำหรับ HAL ที่ลงทะเบียนซึ่งจัดทำโดยกรอบงาน VTS
นอกจากนี้ กรอบงาน 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)