การทดสอบ HAL ที่รับรู้ชื่อบริการ

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 หลายรายการ)
  • การสร้างการทดสอบใหม่สำหรับอินสแตนซ์บริการแต่ละรายการ (ชุดค่าผสม)

ตัวอย่าง

การรองรับรันไทม์สําหรับการทดสอบฝั่งเป้าหมาย

รูปที่ 1 การรองรับรันไทม์ของเฟรมเวิร์ก VTS สําหรับการทดสอบฝั่งเป้าหมาย

ตั้งค่าการทดสอบฝั่งเป้าหมายที่รับรู้ชื่อบริการ

วิธีตั้งค่าสภาพแวดล้อมการทดสอบสําหรับการทดสอบที่ทราบชื่อบริการฝั่งเป้าหมาย

  1. กำหนด testEnvironment โดยอิงตาม VtsHalHidlTargetTestEnvBase และลงทะเบียน HAL ทดสอบ
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. ใช้ getServiceName() ที่สภาพแวดล้อมการทดสอบระบุเพื่อส่งชื่อบริการ
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. ลงทะเบียนสภาพแวดล้อมการทดสอบใน 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)

การรองรับรันไทม์สําหรับการทดสอบฝั่งโฮสต์

รูปที่ 2 การรองรับรันไทม์ของเฟรมเวิร์ก VTS สําหรับการทดสอบฝั่งโฮสต์
  • สคริปต์ hal test จะระบุบริการ HAL ที่กำหนดเป้าหมายในการทดสอบ
  • hal_hidl_host_test (คลาสย่อยของ param_test) จะนํา HAL ทดสอบที่ลงทะเบียนจากสคริปต์ทดสอบ ระบุชื่อบริการที่เกี่ยวข้องสําหรับ HAL ทดสอบ จากนั้นสร้างชุดค่าผสมชื่อบริการ (สําหรับการทดสอบ HAL หลายรายการ) เป็นพารามิเตอร์การทดสอบ รวมถึงมีเมธอด getHalServiceName() ซึ่งจะแสดงผลชื่อบริการที่เกี่ยวข้องตามพารามิเตอร์ที่ส่งไปยังเคสทดสอบปัจจุบัน
  • เทมเพลต param_test รองรับตรรกะในการยอมรับรายการพารามิเตอร์และเรียกใช้เทสเคสทั้งหมดที่ระบุกับพารามิเตอร์แต่ละรายการ กล่าวคือ สําหรับแต่ละชุดทดสอบ ระบบจะสร้างชุดทดสอบที่มีพารามิเตอร์ใหม่ N ชุด (N = ขนาดของพารามิเตอร์) โดยแต่ละชุดจะมีพารามิเตอร์ที่ระบุ

ตั้งค่าการทดสอบฝั่งโฮสต์ที่รับรู้ชื่อบริการ

วิธีตั้งค่าสภาพแวดล้อมการทดสอบสําหรับการทดสอบที่ทราบชื่อบริการฝั่งโฮสต์

  1. ระบุบริการ HAL เป้าหมายในสคริปต์ทดสอบดังนี้
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. โทรหา 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)