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

Android 9 มีการรองรับการขอรับบริการ ชื่อของอินสแตนซ์ HAL ที่ระบุตามอุปกรณ์ที่ชุดทดสอบของผู้ให้บริการ กำลังทดสอบ (VTS) เรียกใช้การทดสอบ VTS HAL ที่ตระหนักถึงชื่อบริการ ช่วยให้นักพัฒนาซอฟต์แวร์สามารถทดสอบส่วนขยายผู้ให้บริการ, HAL หลายรายการ และ อินสแตนซ์ HAL หลายรายการในการเรียกใช้การทดสอบ VTS ทั้งฝั่งเป้าหมายและฝั่งโฮสต์

เกี่ยวกับชื่อบริการ

อินสแตนซ์ของบริการ HAL ที่ใช้งานอยู่แต่ละรายการจะลงทะเบียนตัวเองโดยใช้ชื่อบริการ

ใน Android เวอร์ชันก่อนหน้า นักพัฒนาแอปที่เรียกใช้การทดสอบ VTS HAL คือ จำเป็นต่อการตั้งชื่อบริการที่ถูกต้องสำหรับไคลเอ็นต์ทดสอบใน getService() หรือเว้นชื่อให้ว่างไว้และใช้แทนค่าเริ่มต้น ชื่อบริการ ข้อเสียของวิธีการนี้ได้แก่

  • อาศัยความรู้ของนักพัฒนาแอปในการตั้งค่าบริการที่ถูกต้อง ชื่อ
  • จำกัดไว้ให้ทดสอบกับอินสแตนซ์บริการเดียวโดยค่าเริ่มต้น
  • การดูแลรักษาชื่อบริการด้วยตนเอง (เช่น เนื่องจากชื่อมีการฮาร์ดโค้ด แต่จะต้องมีการอัปเดตด้วยตนเองหากชื่อบริการมีการเปลี่ยนแปลง

ใน Android 9 นักพัฒนาซอฟต์แวร์จะได้รับ ชื่อบริการสำหรับอินสแตนซ์ HAL ที่ระบุตามอุปกรณ์ที่กำลังทดสอบ ข้อดีของวิธีนี้รวมถึงการรองรับการทดสอบ ได้แก่

  • ส่วนขยาย HAL ของผู้ให้บริการ ตัวอย่างเช่น เมื่อผู้ให้บริการมี การใช้ Camera.provider HAL ที่ทำงานบนอุปกรณ์ของผู้ให้บริการ ชื่อบริการที่กำหนดเอง VTS สามารถระบุอินสแตนซ์ของผู้ให้บริการและทำการทดสอบ แข่งกับสิ่งนั้น
  • อินสแตนซ์ HAL หลายรายการ ตัวอย่างเช่น เมื่อ HAL ของ graphics.composer มี 2 อินสแตนซ์ (รายการหนึ่งมีชื่อบริการ) "ค่าเริ่มต้น" และอีกรายการหนึ่งชื่อบริการ "vr") VTS สามารถระบุทั้งอินสแตนซ์และ ทำการทดสอบกับแต่ละรูปแบบ
  • การทดสอบหลาย HAL ใช้เมื่อทดสอบ HAL หลายรายการกับ หลายอินสแตนซ์ เช่น เมื่อเรียกใช้การทดสอบ VTS ที่ยืนยันวิธี Keymaster และ 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 การทดสอบที่ธุรกิจต้องการ เพื่อวัด (เช่น เพื่อล้างความครอบคลุมสำหรับกระบวนการให้บริการ Half)