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é intégré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 kernel requise ni de suivre les commits manquants. L'équipe Android partage donc les tests qu'elle utilise pour s'assurer que le kernel 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é sur un appareil est généralement spécifique à l'appareil, et il est difficile de savoir si un noyau fonctionne correctement sans exécuter les tests.
  2. Le portage avant et arrière des correctifs du kernel vers différentes versions du kernel ou différents arbres d'appareils peut entraîner des problèmes subtils qui peuvent être impossibles à détecter sans exécuter les tests.
  3. Les nouvelles fonctionnalités de mise en réseau peuvent nécessiter de nouvelles fonctionnalités de noyau ou des corrections de bugs de noyau.

Si les tests échouent, la pile réseau de l'appareil ne se comporte pas correctement, ce qui entraîne des bugs de connectivité visibles par l'utilisateur (par exemple, la perte de connexion aux réseaux Wi-Fi). L'appareil échouera probablement également aux tests de la suite de tests de compatibilité Android (CTS).

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. Consultez la section Établir un environnement de compilation pour connaître les versions de système d'exploitation appropriées. Le framework de test unitaire 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 tester le comportement du kernel 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 à la fois en amont et dans les arborescences de kernel Android courantes (telles que android-4.4). Toutefois, il arrive que les noyaux de l'appareil ne soient pas compilés dans ce mode, car les arborescences de l'appareil contiennent du code spécifique à l'appareil ou au matériel dans des fichiers courants (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. Si aucune option de configuration de ce type n'existe, placez le code spécifique au matériel dans des blocs #ifndef CONFIG_UML.

En général, la correction de ce problème relève de la responsabilité du fournisseur de l'arborescence du noyau (tel que le chipset ou le fournisseur de 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 dans kernel/tests/net/test. Il est recommandé d'exécuter les tests à partir du principal 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. Pour savoir comment exécuter les tests, consultez le fichier README des tests réseau du kernel. En gros, depuis le sommet de l'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 des tests réseau du kernel contiennent des commentaires qui spécifient les commits du kernel qui sont connus pour être nécessaires pour réussir les tests. Les tests doivent réussir dans les arbres de kernel courants (toutes les branches de kernel courantes android-4.4 et versions ultérieures) dans le projet kernel/common dans AOSP. Par conséquent, réussir les tests sur un noyau ne consiste qu'à effectuer des fusions continues à partir de la branche de noyau commune correspondante.

Contributions

Signaler des problèmes

Signalez tout problème lié aux tests réseau du kernel 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 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.
  • Pour que les tests soient acceptés sur les noyaux en amont, des modifications majeures sont nécessaires.
  • Vous pensez que les tests sont trop spécifiés ou qu'ils échouent sur les futurs noyaux.
  • Vous souhaitez ajouter des tests ou une couverture plus étendue aux tests existants.