В 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).
- Создание нового теста для каждого экземпляра (комбинации) сервиса.
Пример:
Как настроить тесты на стороне целевого сервера с учетом названия сервиса
Чтобы настроить тестовую среду для тестирования с учетом названия сервиса на стороне целевого сервиса:
- Определите
testEnvironmentна основеVtsHalHidlTargetTestEnvBaseи зарегистрируйте тестовые HAL:#include <VtsHalHidlTargetTestEnvBase.h> class testEnvironment : public::testing::VtsHalHidlTargetTestEnvBase { virtual void registerTestServices() override { registerTestService<IFoo>(); } };
- Используйте
getServiceName(), предоставленный тестовой средой, чтобы передать название сервиса:::testing::VtsHalHidlTargetTestBase::getService<IFoo>(testEnv->getServiceName<IFoo>("default")); // "default" is the default service name you want to use.
- Зарегистрируйте тестовую среду в
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).
- В скрипте hal test указываются сервисы HAL, на которые настраивается таргетинг в тесте.
- Класс
hal_hidl_host_test(подклассparam_test) берет зарегистрированные HAL для тестирования из тестового скрипта, определяет соответствующие названия сервисов для HAL для тестирования, а затем генерирует комбинации названий сервисов (для тестирования нескольких HAL) в качестве параметров тестирования. Также в нем есть методgetHalServiceName(), который возвращает название сервиса в соответствии с параметром, переданным в текущий тестовый случай. - Шаблон param_test поддерживает логику, позволяющую принять список параметров и запустить все заданные тестовые сценарии для каждого параметра. То есть для каждого тестового случая он создает N новых параметризованных тестовых случаев (N = размер параметров), каждый с заданным параметром.
Как настроить тесты на стороне хоста с учетом названия сервиса
Чтобы настроить тестовую среду для тестирования на стороне хоста с учетом имени сервиса:
- Укажите целевой сервис HAL в тестовом скрипте:
TEST_HAL_SERVICES = { "android.hardware.foo@1.0::IFoo" }
- Позвонить
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).