Tests unitaires de mise en réseau du noyau

Depuis Android 5.0, le bon fonctionnement de la pile réseau Android sur les noyaux Linux nécessite un certain nombre de commits qui ont été effectués relativement récemment ou qui ne l'ont pas encore été. Il n'est pas facile de vérifier manuellement les fonctionnalités requises du noyau ou de suivre les validations manquantes, c'est pourquoi l'équipe Android partage les tests qu'elle utilise pour garantir que le noyau se comporte comme prévu.

Pourquoi faire les tests ?

Ces tests existent pour trois raisons principales :

  1. La version exacte du noyau Linux utilisée sur un périphérique est généralement spécifique à l'appareil, et il est difficile de savoir si un noyau fonctionnera correctement sans exécuter les tests.
  2. Le portage avant et arrière des correctifs du noyau vers différentes versions du noyau ou différentes arborescences de périphériques peut introduire des problèmes subtils qui peuvent être impossibles à détecter sans exécuter les tests.
  3. Les nouvelles fonctionnalités réseau peuvent nécessiter de nouvelles fonctionnalités du noyau ou des corrections de bogues du noyau.

Si les tests échouent, la pile réseau de l'appareil se comportera de manière incorrecte, provoquant des bugs de connectivité visibles par l'utilisateur (tels que la coupure des réseaux Wi-Fi). L’appareil échouera probablement également aux tests CTS (Android Compatibility Test Suite).

Utiliser les tests

Les tests utilisent Linux en mode utilisateur pour démarrer le noyau en tant que processus sur une machine hôte Linux. Voir Établir un environnement de construction pour connaître les versions de système d'exploitation appropriées. Le framework de tests unitaires démarre le noyau avec une image disque appropriée et exécute les tests à partir du système de fichiers hôte. Les tests sont écrits en Python et utilisent les interfaces TAP pour exercer le comportement du noyau et l'API socket.

Compilation du noyau pour ARCH=um

Pour que les tests s'exécutent, le noyau doit compiler pour ARCH=um SUBARCH=x86_64 . Il s'agit d'une architecture prise en charge à la fois en amont et dans les arborescences courantes du noyau Android (telles que android-4.4 ). Mais parfois, les noyaux de périphériques ne compilent pas dans ce mode car les arborescences de périphériques contiennent du code spécifique au périphérique ou au matériel dans des fichiers communs (par exemple sys/exit.c ).

Dans de nombreux cas, il suffit de s'assurer que le code spécifique au matériel se trouve derrière un #ifdef . En règle générale, il doit s'agir d'un #ifdef sur une option de configuration qui contrôle la fonctionnalité spécifique pertinente pour le code. S'il n'existe pas une telle option de configuration, placez le code spécifique au matériel dans les blocs #ifndef CONFIG_UML .

En général, la résolution de ce problème devrait relever de la responsabilité du fournisseur de l'arborescence du noyau (tel que le fournisseur du chipset ou du SoC). Nous travaillons avec les OEM et les fournisseurs pour garantir que les noyaux actuels et futurs seront compilés pour ARCH=um SUBARCH=x86_64 sans nécessiter aucune modification.

Exécuter les tests

Les tests se trouvent dans kernel/tests/net/test . Il est recommandé d' exécuter les tests à partir de l'AOSP principal car ils sont les plus à jour ; dans certains cas, les fonctionnalités du noyau nécessaires au bon fonctionnement dans une version Android donnée ne bénéficient pas encore d'une couverture de test complète dans la version donnée. Pour plus d'informations sur la façon d'exécuter les tests, consultez le fichier README du test réseau du noyau . En gros, depuis le haut de votre arborescence du noyau, exécutez :

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

Réussir les tests

Les fichiers sources Python du test réseau du noyau contiennent des commentaires qui spécifient les validations du noyau connues pour être nécessaires pour réussir les tests. Les tests doivent réussir dans les arborescences communes du noyau - toutes les branches communes du noyau android-4.4 et supérieur - dans le projet kernel/common dans AOSP. Par conséquent, réussir les tests sur un noyau consiste simplement à fusionner continuellement à partir de la branche commune du noyau correspondante.

Contribuant

Problèmes de signalement

Veuillez signaler tout problème lié aux tests réseau du noyau dans le suivi des problèmes Android avec l'étiquette Component-Networking .

Documenter les commits et ajouter des tests

Veuillez signaler les problèmes comme décrit ci-dessus et, si possible, télécharger une modification pour résoudre le problème, si :

  • Les tests ne passent pas sur les arbres de noyau communs
  • Vous trouvez un commit nécessaire qui n'est pas mentionné dans les commentaires de la source,
  • Faire réussir les tests sur les noyaux en amont nécessite des changements majeurs
  • Vous pensez que les tests sont surspécifiés ou que les tests échouent sur les futurs noyaux
  • Vous souhaitez ajouter plus de tests ou plus de couverture aux tests existants.