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