Kiểm thử HAL (Lớp trừu tượng phần cứng) nhận biết tên dịch vụ

Android 9 hỗ trợ việc lấy tên dịch vụ của một thực thể HAL nhất định dựa trên thiết bị đang chạy các bài kiểm thử Bộ kiểm thử của nhà cung cấp (VTS). Việc chạy các chương trình kiểm thử HAL VTS nhận biết tên dịch vụ cho phép nhà phát triển tự động kiểm thử các tiện ích của nhà cung cấp, nhiều HAL và nhiều phiên bản HAL trên cả các lần chạy kiểm thử VTS phía máy chủ và phía mục tiêu.

Giới thiệu về tên dịch vụ

Mỗi thực thể của dịch vụ HAL đang chạy sẽ tự đăng ký bằng một tên dịch vụ.

Trong các phiên bản Android trước, các nhà phát triển chạy kiểm thử HAL VTS phải đặt tên dịch vụ chính xác cho ứng dụng kiểm thử trong getService() hoặc để trống tên và quay lại tên dịch vụ mặc định. Phương pháp này có một số nhược điểm như sau:

  • Dựa vào kiến thức của nhà phát triển kiểm thử để đặt tên dịch vụ chính xác.
  • Theo mặc định, chỉ được kiểm thử trên một phiên bản dịch vụ.
  • Bảo trì tên dịch vụ theo cách thủ công (tức là vì tên được mã hoá cứng, nên tên phải được cập nhật theo cách thủ công nếu tên dịch vụ thay đổi).

Trong Android 9, nhà phát triển có thể tự động lấy tên dịch vụ cho một thực thể HAL cụ thể dựa trên thiết bị đang được kiểm thử. Ưu điểm của phương pháp này là hỗ trợ cho việc kiểm thử:

  • Tiện ích HAL của nhà cung cấp. Ví dụ: khi một nhà cung cấp triển khai camera.provider HAL chạy trên các thiết bị của nhà cung cấp có tên dịch vụ tuỳ chỉnh, VTS có thể xác định thực thể của nhà cung cấp và chạy kiểm thử dựa trên thực thể đó.
  • Nhiều thực thể HAL. Ví dụ: khi HAL graphics.composer có hai thực thể (một thực thể có tên dịch vụ là "mặc định" và một có tên dịch vụ là "VR"), VTS có thể xác định cả hai thực thể và chạy kiểm thử trên từng thực thể.
  • Thử nghiệm nhiều HAL. Được dùng khi kiểm thử nhiều HAL với nhiều thực thể. Ví dụ: khi chạy kiểm thử VTS để xác minh cách hoạt động của keymaster và HAL gatekeeper với nhau, VTS có thể kiểm thử tất cả các tổ hợp thực thể dịch vụ cho các HAL đó.

Kiểm thử phía đích

Để giúp nhận biết tên dịch vụ trong quá trình kiểm thử phía đích, Android 9 cung cấp một môi trường kiểm thử có thể tuỳ chỉnh (VtsHalHidlTargetTestEnvBase) cung cấp các giao diện để:

  • Đăng ký (các) HAL (Lớp trừu tượng phần cứng) nhắm mục tiêu trong kiểm thử.
  • Liệt kê tất cả(các) HAL đã đăng ký.
  • Lấy(các) tên dịch vụ cho(các) HAL đã đăng ký do khung VTS cung cấp.

Ngoài ra, khung VTS còn hỗ trợ thời gian chạy cho:

  • Xử lý trước tệp nhị phân kiểm thử để lấy tất cả(các) HAL kiểm thử đã đăng ký.
  • Xác định tất cả các thực thể dịch vụ đang chạy và lấy tên dịch vụ cho từng thực thể (truy xuất dựa trên vendor/manifest.xml).
  • Tính toán tất cả các tổ hợp thực thể (để hỗ trợ nhiều hoạt động kiểm thử HAL).
  • Tạo một kiểm thử mới cho mỗi thực thể dịch vụ (kết hợp).

Ví dụ:

Hỗ trợ thời gian chạy cho hoạt động kiểm thử phía mục tiêu

Hình 1. Hỗ trợ thời gian chạy khung VTS để kiểm thử phía mục tiêu

Thiết lập kiểm thử phía đích có khả năng nhận biết tên dịch vụ

Cách thiết lập môi trường kiểm thử để kiểm thử nhận biết tên dịch vụ phía mục tiêu:

  1. Xác định testEnvironment dựa trên VtsHalHidlTargetTestEnvBase và đăng ký HAL kiểm thử:
    #include <VtsHalHidlTargetTestEnvBase.h>
    class testEnvironment  : public::testing::VtsHalHidlTargetTestEnvBase {
          virtual void registerTestServices() override {
        registerTestService<IFoo>();
          }
    };
  2. Sử dụng getServiceName() do môi trường kiểm thử cung cấp để truyền tên dịch vụ:
    ::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default"));
    // "default" is the default service name you want to use.
  3. Đăng ký môi trường thử nghiệm trong 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();
    }

Để xem thêm ví dụ, hãy tham khảo VtsHalCameraProviderV2_4TargetTest.cpp.

Kiểm thử phía máy chủ VTS

Các kiểm thử phía máy chủ lưu trữ VTS chạy tập lệnh kiểm thử ở phía máy chủ lưu trữ thay vì các tệp nhị phân kiểm thử trên thiết bị mục tiêu. Để bật tính năng nhận biết tên dịch vụ cho các kiểm thử này, bạn có thể sử dụng các mẫu phía máy chủ lưu trữ để chạy cùng một tập lệnh kiểm thử nhiều lần dựa trên nhiều tham số (tương tự như kiểm thử có tham số gtest).

Hỗ trợ thời gian chạy cho hoạt động kiểm thử phía máy chủ

Hình 2. Hỗ trợ thời gian chạy khung VTS để kiểm thử phía máy chủ
  • Tập lệnh kiểm thử hal chỉ định (các) dịch vụ HAL (Lớp trừu tượng phần cứng) nhắm mục tiêu trong quy trình kiểm thử.
  • hal_hidl_host_test (lớp con của param_test) lấy (các) HAL (các) lớp kiểm thử đã đăng ký từ tập lệnh kiểm thử, xác định (các) tên dịch vụ tương ứng cho HAL (Lớp con) kiểm thử, sau đó tạo các tổ hợp tên dịch vụ (để kiểm thử nhiều HAL) làm tham số kiểm thử. Tệp này cũng cung cấp một phương thức getHalServiceName() trả về tên dịch vụ tương ứng theo tham số được truyền đến trường hợp kiểm thử hiện tại.
  • Mẫu param_test hỗ trợ logic để chấp nhận danh sách tham số và chạy tất cả các trường hợp kiểm thử đã cho theo từng tham số. Tức là, đối với mỗi trường hợp kiểm thử, công cụ này sẽ tạo ra N trường hợp kiểm thử có tham số mới (N = kích thước của các tham số), mỗi trường hợp có một tham số nhất định.

Thiết lập các kiểm thử phía máy chủ nhận biết tên dịch vụ

Cách thiết lập môi trường kiểm thử để kiểm thử khả năng nhận biết tên dịch vụ phía máy chủ:

  1. Chỉ định dịch vụ HAL mục tiêu trong tập lệnh kiểm thử:
    TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
  2. Gọi getHalServiceName() và truyền tên vào 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))

Để biết thêm ví dụ, hãy tham khảo VtsHalMediaOmxStoreV1_0HostTest.py.

Đăng ký HAL kiểm thử

Trong các phiên bản Android trước, VTS đã xác định HAL kiểm thử bằng tuỳ chọn <precondition-lshal> được định cấu hình trong AndroidTest.xml. Phương pháp này khó duy trì (vì dựa vào nhà phát triển để định cấu hình kiểm thử đúng cách và cập nhật cấu hình cho phù hợp) và không chính xác (vì chỉ chứa gói và thông tin phiên bản chứ không phải thông tin giao diện).

Trong Android 9, VTS xác định HAL kiểm thử bằng cách sử dụng tính năng nhận biết tên dịch vụ. Các HAL kiểm thử đã đăng ký cũng hữu ích cho:

  • Kiểm tra điều kiện tiên quyết. Trước khi chạy kiểm thử HAL, VTS có thể xác nhận rằng HAL kiểm thử có trên thiết bị mục tiêu và bỏ qua các kiểm thử nếu không có (tham khảo quy trình kiểm tra khả năng kiểm thử của VTS).
  • Đo lường phạm vi áp dụng. VTS hỗ trợ đo lường mức độ sử dụng mã trên nhiều quy trình thông qua kiến thức về các dịch vụ HAL kiểm thử mà nó muốn đo lường (tức là để làm mới mức độ sử dụng cho quy trình dịch vụ HAL).