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

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

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

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

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