Тестирование 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 имеет два экземпляра (один с именем службы «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).