Pruebas unitarias de red del kernel

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

¿Por qué realizar las pruebas?

Estas pruebas existen por tres razones principales:

  1. La versión exacta del kernel de Linux utilizada 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 hacia adelante y hacia atrás de los parches del kernel a diferentes versiones del kernel o diferentes árboles de dispositivos puede introducir problemas sutiles que pueden ser imposibles de detectar sin ejecutar las pruebas.
  3. Las nuevas funciones de red pueden requerir nuevas funciones del kernel o correcciones de errores del kernel.

Si las pruebas no pasan, la pila de red del dispositivo se comportará incorrectamente, provocando errores de conectividad visibles para el usuario (como caídas de las redes Wi-Fi). Es probable que el dispositivo también falle las pruebas del conjunto de pruebas de compatibilidad de Android (CTS).

Usando las pruebas

Las pruebas utilizan Linux en modo usuario 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 de sistema operativo adecuadas. El marco de prueba unitaria arranca 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 y utilizan interfaces TAP para ejercitar el comportamiento del kernel y la API del 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 comunes del kernel de Android (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 . Normalmente, debería ser un #ifdef en una opción de configuración que controle 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, solucionar este problema debería ser responsabilidad del proveedor del árbol del kernel (como el proveedor del chipset o del SoC). Estamos trabajando con fabricantes de equipos originales y proveedores para garantizar que los kernels actuales y futuros se compilen para ARCH=um SUBARCH=x86_64 sin requerir ningún cambio.

ejecutando las pruebas

Las pruebas están en kernel/tests/net/test . Se recomienda ejecutar las pruebas desde AOSP principal 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 esa versión. Para obtener información sobre cómo ejecutar las pruebas, consulte el archivo README de prueba de red del kernel . Básicamente, desde la parte superior del árbol del kernel, ejecuta:

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

Pasando las pruebas

Los archivos fuente de Python de 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 del kernel comunes (todas las ramas del 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 común correspondiente del kernel.

Contribuyendo

Informar problemas

Informe cualquier problema con las pruebas de red del kernel en el rastreador de problemas de Android con la etiqueta Component-Networking .

Documentar confirmaciones y agregar pruebas.

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

  • Las pruebas no pasan en los árboles de kernel comunes.
  • Encuentra una confirmación necesaria que no se menciona en los comentarios de la fuente,
  • Lograr que las pruebas pasen en los núcleos ascendentes requiere cambios importantes
  • Cree que las pruebas están sobreespecificadas o que la prueba falla en núcleos futuros.
  • Le gustaría agregar más pruebas o más cobertura a las pruebas existentes.