ชื่อบริการทราบการทดสอบ HAL

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

ตัวอย่าง:

Runtime support for target-side testing

รูปที่ 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)

Runtime support for host-side testing

รูปที่ 2 การสนับสนุนรันไทม์กรอบงาน VTS สำหรับการทดสอบฝั่งโฮสต์
  • สคริปต์ ทดสอบ Hal ระบุบริการ 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)