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é transférés en amont relativement récemment ou qui ne l'ont pas encore été. Il n'est pas facile de vérifier manuellement la fonctionnalité du noyau requise ni de suivre les commits manquants. L'équipe Android partage donc les tests qu'elle utilise pour s'assurer que le noyau se comporte comme prévu.

Pourquoi exécuter les tests ?

Ces tests existent pour trois raisons principales :

  1. La version exacte du noyau Linux utilisée sur un appareil est généralement spécifique à l'appareil. Il est difficile de savoir si un noyau fonctionne correctement sans exécuter les tests.
  2. Le portage en avant et en arrière des correctifs du noyau vers différentes versions du noyau ou différents arbres d'appareils peut introduire des problèmes subtils qu'il est impossible de détecter sans exécuter les tests.
  3. De nouvelles fonctionnalités réseau peuvent nécessiter de nouvelles fonctionnalités du noyau ou des corrections de bugs du noyau.

Si les tests ne sont pas concluants, la pile réseau de l'appareil se comporte de manière incorrecte, ce qui entraîne des bugs de connectivité visibles par l'utilisateur (par exemple, la déconnexion des réseaux Wi-Fi). Il est également probable que l'appareil échoue aux tests de la suite de tests de compatibilité (CTS) Android.

Utiliser les tests

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

Compiler le noyau pour ARCH=um

Pour que les tests s'exécutent, le noyau doit être compilé pour ARCH=um SUBARCH=x86_64. Il s'agit d'une architecture compatible en amont et dans les arbres de noyau Android courants (tels que android-4.4). Toutefois, il arrive que les noyaux d'appareils ne se compilent pas dans ce mode, car les arbres d'appareils contiennent du code spécifique à l'appareil 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. Il s'agit généralement d'un #ifdef sur une option de configuration qui contrôle la fonctionnalité spécifique pertinente pour le code. S'il n'existe pas d'option de configuration de ce type, placez le code spécifique au matériel dans des blocs #ifndef CONFIG_UML.

En général, la correction de ce problème devrait incomber au fournisseur de l'arborescence du noyau (tel que le fournisseur du chipset ou du SoC). Nous collaborons avec les OEM et les fournisseurs pour nous assurer que les noyaux actuels et futurs se compilent pour ARCH=um SUBARCH=x86_64 sans nécessiter de modifications.

Exécuter les tests

Les tests se trouvent sous kernel/tests/net/test. Il est recommandé d'exécuter les tests à partir de la branche principale d'AOSP, car ils sont les plus à jour. Dans certains cas, les fonctionnalités du noyau nécessaires au bon fonctionnement d'une version d'Android donnée ne sont pas encore entièrement couvertes par les tests de cette version. Pour savoir comment exécuter les tests, consultez le fichier README du test réseau du noyau. En gros, exécutez la commande suivante à partir du haut de votre arborescence du noyau :

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 commits du noyau connus pour être nécessaires à la réussite des tests. Les tests doivent réussir dans les arbres de noyau communs (toutes les branches de noyau communes android-4.4 et supérieures) dans le projet kernel/common dans AOSP. Par conséquent, pour réussir les tests sur un noyau, il suffit de fusionner en continu à partir de la branche de noyau commun correspondante.

Contributions

Signaler des problèmes

Signalez tout problème lié aux tests réseau du noyau dans l'outil de suivi des problèmes Android avec le libellé Component-Networking.

Documenter les commits et ajouter des tests

Signalez les problèmes comme décrit ci-dessus et, si possible, importez une modification pour les résoudre, si :

  • Les tests ne sont pas réussis sur les arbres du noyau commun
  • Vous trouvez un commit nécessaire qui n'est pas mentionné dans les commentaires sources.
  • Pour que les tests réussissent sur les noyaux en amont, des modifications majeures sont nécessaires.
  • Vous pensez que les tests sont trop spécifiés ou qu'ils échoueront sur les futurs noyaux.
  • Vous souhaitez ajouter des tests ou étendre la couverture des tests existants.