Сетевые модульные тесты ядра

Начиная с Android 5.0, для корректной работы сетевого стека Android на ядрах Linux требуется ряд изменений, которые были внесены в основную ветку относительно недавно или еще не попали туда. Проверить вручную необходимую функциональность ядра или отследить отсутствующие изменения непросто, поэтому команда Android делится используемыми тестами, чтобы убедиться, что ядро ​​работает должным образом.

Причины для проведения тестов

Эти тесты существуют по трем основным причинам:

  1. Точная версия ядра Linux, используемого на устройстве, обычно зависит от конкретного устройства, и сложно определить, работает ли какое-либо ядро ​​должным образом без проведения тестов.
  2. Перенос и перенос патчей ядра на разные версии ядра или разные деревья устройств может привести к появлению скрытых проблем, которые невозможно обнаружить без проведения тестов.
  3. Для внедрения новых сетевых функций может потребоваться обновление функциональности ядра или исправление ошибок в ядре.

Если тесты не пройдут, сетевой стек устройства будет работать некорректно, вызывая видимые пользователю ошибки подключения (например, отключение от сетей Wi-Fi). Устройство, скорее всего, также не пройдет тесты Android Compatibility Test Suite (CTS).

Используйте тесты

В тестах используется пользовательский режим Linux для загрузки ядра в качестве процесса на хост-машине Linux. См. раздел «Создание среды сборки» для получения информации о подходящих версиях операционных систем. Фреймворк модульного тестирования загружает ядро ​​с соответствующим образом диска и запускает тесты из файловой системы хоста. Тесты написаны на Python и используют интерфейсы TAP для проверки поведения ядра и API сокетов.

Скомпилируйте ядро ​​для ARCH=um

Для запуска тестов ядро ​​должно быть скомпилировано для ARCH=um SUBARCH=x86_64 . Это поддерживаемая архитектура как в исходном коде, так и в стандартных репозиториях ядра Android (например, android-4.4 ). Однако иногда ядра устройств не компилируются в этом режиме, поскольку в стандартных репозиториях устройств содержится код, специфичный для устройства или оборудования, в общих файлах (например, sys/exit.c ).

Во многих случаях достаточно убедиться, что код, специфичный для оборудования, находится за директивой #ifdef . Как правило, это должна быть директива #ifdef для параметра конфигурации, управляющего конкретной функцией, относящейся к коду. Если такого параметра конфигурации нет, поместите код, специфичный для оборудования, в блоки #ifndef CONFIG_UML .

В целом, исправление этой проблемы должно быть обязанностью поставщика дерева ядра (например, производителя чипсета или SoC). Мы работаем с OEM-производителями и поставщиками, чтобы гарантировать, что текущие и будущие ядра будут компилироваться для ARCH=um SUBARCH=x86_64 без необходимости каких-либо изменений.

Запустите тесты

Тесты находятся в папке kernel/tests/net/test . Рекомендуется запускать тесты из основной директории AOSP, поскольку она содержит самые актуальные версии; в некоторых случаях функции ядра, необходимые для корректной работы в конкретной версии Android, еще не имеют полного тестового покрытия в данной версии. Информацию о том, как запустить тесты, см. в файле README для сетевых тестов ядра . В основном, из корневой директории ядра выполните:

ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh

Сдайте тесты

Исходные файлы Python для тестирования сети ядра содержат комментарии, указывающие на необходимые для прохождения тестов коммиты ядра. Тесты должны проходить в общих ветках ядра — всех общих ветках ядра android-4.4 и выше — в проекте kernel/common в AOSP. Таким образом, прохождение тестов в ядре сводится к непрерывному слиянию изменений из соответствующей общей ветки ядра.

Взносы

Сообщить о проблемах

О любых проблемах с сетевыми тестами ядра сообщайте в систему отслеживания ошибок Android с меткой Component-Networking .

Документирование коммитов и добавление тестов.

Сообщайте о проблемах, как описано выше, и, если возможно, загрузите изменения для их исправления, если:

  • Тесты не проходят на общих деревьях ядра.
  • Вы обнаруживаете необходимый коммит, который не упомянут в комментариях к исходному коду.
  • Для того чтобы тесты проходили в ядрах, принадлежащих разработчикам, требуются серьёзные изменения.
  • Вы считаете, что тесты слишком детализированы, или что тесты не будут работать в будущих версиях ядра.
  • Вы хотели бы добавить больше тестов или расширить покрытие кода к существующим тестам.