Модульные тесты сетевых функций ядра

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

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

Мы проводим такие эксперименты по трем основным причинам:

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

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

Как использовать тесты

В тестах используется User-Mode Linux для загрузки ядра в качестве процесса на хост-компьютере Linux. Подходящие версии операционных систем перечислены в статье Establishing a Build Environment (Создание среды сборки). Платформа для модульного тестирования загружает ядро с подходящим образом диска и запускает тесты из файловой системы хоста. Тесты написаны на языке Python и используют интерфейсы TAP для проверки поведения ядра и API сокетов.

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

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

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

Как правило, за устранение этой проблемы отвечает поставщик дерева ядра (например, производитель чипсета или SoC). Мы работаем с производителями оригинального оборудования и поставщиками, чтобы обеспечить компиляцию текущих и будущих ядер для 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.

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

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

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