Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Pruebas unitarias de redes de kernel

Desde Android 5.0, el funcionamiento adecuado de la pila de redes de Android en los kernels de Linux requiere una serie de confirmaciones que se transmitieron recientemente 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 usa para garantizar que el kernel se comporte como se esperaba.

¿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 conversió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 una nueva funcionalidad del kernel o correcciones de errores del kernel.

Si las pruebas no pasan, la pila de red del dispositivo se comportará incorrectamente, 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 del Conjunto de pruebas de compatibilidad de Android (CTS).

Usando las pruebas

Las pruebas utilizan Linux en modo de 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 adecuadas del sistema operativo. El marco de prueba unitario 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 2.xy utilizan interfaces TAP para ejercitar el comportamiento del kernel y la API de socket.

Compilando el kernel para ARCH = um

Para que las pruebas se ejecuten, el kernel debe compilarse 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 controla la función 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 chipset o del 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 requerir 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 README de prueba de red del kernel . Básicamente, desde la parte superior de su árbol del kernel, ejecute:

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 comunes del kernel (todas las ramas comunes del kernel android-4.4 y superior) en el kernel/common proyecto kernel/common en AOSP. Por lo tanto, pasar las pruebas en un kernel es simplemente una cuestión de fusionar continuamente desde la rama común del kernel correspondiente.

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 los árboles de kernel comunes
  • Encuentra un compromiso necesario que no se menciona en los comentarios de la fuente,
  • Hacer que las pruebas pasen a los kernels 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.