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