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

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

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

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

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

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

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

Тесты используют User-Mode 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 main, поскольку они являются наиболее актуальными; в некоторых случаях функции ядра, необходимые для правильной работы в данном выпуске 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 .

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

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

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