Pruebas unitarias de red del kernel

Desde Android 5.0, el funcionamiento adecuado de la pila de red de Android en los kernels de Linux requiere una serie de confirmaciones que se realizaron hace relativamente poco tiempo o que aún no se han realizado. No es fácil verificar manualmente la funcionalidad requerida del kernel o rastrear las confirmaciones que faltan, por lo que el equipo de Android comparte las pruebas que utiliza para garantizar que el kernel se comporte como se espera.

¿Por qué ejecutar las pruebas?

Estas pruebas existen por tres razones principales:

  1. La versión exacta del kernel de Linux que se usa en un dispositivo suele ser específica del dispositivo y es difícil saber si algún kernel funcionará correctamente sin ejecutar las pruebas.
  2. La migración directa y posterior de los parches del kernel a diferentes versiones del kernel o diferentes árboles de dispositivos puede presentar problemas sutiles que pueden ser imposibles de detectar sin ejecutar las pruebas.
  3. Las nuevas funciones de red pueden requerir una nueva funcionalidad del kernel o correcciones de errores del kernel.

Si las pruebas no pasan, la pila de red del dispositivo se comportará de manera incorrecta, lo que provocará errores de conectividad visibles para el usuario (como la caída de las redes Wi-Fi). Es probable que el dispositivo también falle las pruebas de Android Compatibility Test Suite (CTS).

usando las pruebas

Las pruebas usan User-Mode Linux para iniciar el kernel como un proceso en una máquina host Linux. Consulte Establecimiento de un entorno de compilación para conocer las versiones adecuadas del sistema operativo. El marco de pruebas unitarias inicia el kernel con una imagen de disco adecuada y ejecuta las pruebas desde el sistema de archivos del host. Las pruebas están escritas en Python 2.x y usan interfaces TAP para ejercitar el comportamiento del kernel y la API de socket.

Compilando el kernel para ARCH=um

Para que se ejecuten las pruebas, el kernel debe compilar para ARCH=um SUBARCH=x86_64 . Esta es una arquitectura compatible tanto en sentido ascendente como en los árboles del kernel de Android comunes (como android-4.4 ). Pero a veces, los núcleos de dispositivos no se compilan en este modo porque los árboles de dispositivos contienen código específico del dispositivo o del hardware en archivos comunes (por ejemplo sys/exit.c ).

En muchos casos, es suficiente asegurarse de que el código específico del hardware esté detrás de un #ifdef . Por lo general, debería ser un #ifdef en una opción de configuración que controla la característica específica relevante para el código. Si no existe tal opción de configuración, coloque el código específico del hardware dentro de los bloques #ifndef CONFIG_UML .

En general, arreglar esto debería ser responsabilidad del proveedor del árbol del kernel (como el proveedor del conjunto de chips o SoC). Estamos trabajando con fabricantes de equipos originales y proveedores para garantizar que los núcleos actuales y futuros se compilen para ARCH=um SUBARCH=x86_64 sin necesidad de realizar ningún cambio.

Ejecutando las pruebas

Las pruebas están en kernel/tests/net/test . Se recomienda que las pruebas se ejecuten desde el maestro AOSP porque son las más actualizadas; en algunos casos, las funciones del kernel que son necesarias para el funcionamiento adecuado en una versión determinada de Android aún no tienen una cobertura de prueba completa en la versión dada. Para obtener información sobre cómo ejecutar las pruebas, consulte el archivo LÉAME de la prueba de red del núcleo . Básicamente, desde la parte superior de su árbol de kernel, ejecute:

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

pasando las pruebas

Los archivos de origen Python de la prueba de red del kernel contienen comentarios que especifican las confirmaciones del kernel que se sabe que son necesarias para pasar las pruebas. Las pruebas deben pasar en los árboles de kernel comunes (todas las ramas de kernel comunes android-4.4 y superiores) en el proyecto kernel/common en AOSP. Por lo tanto, pasar las pruebas en un kernel es simplemente una cuestión de fusionarse continuamente desde la rama del kernel común correspondiente.

contribuyendo

Informes de problemas

Informe cualquier problema con las pruebas de red del kernel en el rastreador de problemas de Android con la etiqueta Red de componentes .

Documentación de confirmaciones y adición de pruebas

Informe los problemas como se describe anteriormente y, si es posible, cargue un cambio para solucionar el problema, si:

  • Las pruebas no pasan los árboles del núcleo común
  • Encuentra un compromiso necesario que no se menciona en los comentarios de origen,
  • Lograr que las pruebas pasen a los kernels ascendentes requiere cambios importantes
  • Cree que las pruebas están sobreespecificadas o que la prueba falla en kernels futuros
  • Le gustaría agregar más pruebas o más cobertura a las pruebas existentes.