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

Начиная с 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 .

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

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

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