Тестирование HAL с учетом названия сервиса

В Android 9 добавлена поддержка получения названия сервиса для определенного экземпляра HAL на основе устройства, на котором выполняются тесты Vendor Test Suite (VTS). Выполнение тестов VTS HAL с учетом имени сервиса позволяет разработчикам автоматизировать тестирование расширений поставщика, нескольких HAL и нескольких экземпляров HAL при выполнении тестов VTS на целевой и хост-стороне.

О названиях услуг

Каждый запущенный сервис HAL регистрируется с определенным названием.

В предыдущих версиях Android разработчики, выполняющие тесты HAL VTS, должны были задать правильное имя сервиса для тестового клиента в getService() или оставить имя пустым и вернуться к имени сервиса по умолчанию. Недостатки этого подхода:

  • Разработчик теста должен знать правильное название сервиса.
  • По умолчанию тестирование выполняется только для одного экземпляра сервиса.
  • Названия сервисов нужно обновлять вручную, поскольку они заданы в коде.

В Android 9 разработчики могут автоматически получать название сервиса для определенного экземпляра HAL на основе тестируемого устройства. Преимущества этого подхода:

  • Расширения HAL от поставщика. Например, если у поставщика есть реализация HAL camera.provider, которая работает на устройствах поставщика с настраиваемым названием сервиса, VTS может определить экземпляр поставщика и запустить тест для него.
  • Несколько экземпляров HAL. Например, если у HAL graphics.composer есть два экземпляра (один с названием сервиса default, а другой – vr), VTS может идентифицировать оба экземпляра и выполнить тестирование для каждого из них.
  • Тестирование нескольких уровней абстракции оборудования. Используется при тестировании нескольких HAL с несколькими экземплярами. Например, при запуске теста VTS, который проверяет, как HAL KeyMint (ранее Keymaster) и Gatekeeper работают вместе, 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).