Testes de unidade de rede do kernel

Desde o Android 5.0, a operação adequada da pilha de rede do Android em kernels Linux requer uma série de commits que foram upstreamados há relativamente pouco tempo ou que ainda não foram upstream. Não é fácil verificar manualmente a funcionalidade necessária do kernel ou rastrear os commits ausentes, então a equipe do Android está compartilhando os testes que usa para garantir que o kernel se comporte conforme o esperado.

Por que executar os testes?

Esses testes existem por três razões principais:

  1. A versão exata do kernel Linux usada em um dispositivo normalmente é específica do dispositivo e é difícil saber se algum kernel funcionará corretamente sem executar os testes.
  2. A portabilidade direta e reversa dos patches do kernel para diferentes versões do kernel ou árvores de dispositivos diferentes pode introduzir problemas sutis que podem ser impossíveis de detectar sem executar os testes.
  3. Novos recursos de rede podem exigir novas funcionalidades do kernel ou correções de bugs do kernel.

Se os testes não passarem, a pilha de rede do dispositivo se comportará incorretamente, causando bugs de conectividade visíveis ao usuário (como queda de redes Wi-Fi). O dispositivo provavelmente também falhará nos testes do Android Compatibility Test Suite (CTS).

Usando os testes

Os testes usam User-Mode Linux para inicializar o kernel como um processo em uma máquina host Linux. Consulte Estabelecendo um ambiente de compilação para versões adequadas do sistema operacional. A estrutura de teste de unidade inicializa o kernel com uma imagem de disco apropriada e executa os testes a partir do sistema de arquivos host. Os testes são escritos em Python e usam interfaces TAP para exercitar o comportamento do kernel e a API do soquete.

Compilando o kernel para ARCH=um

Para que os testes sejam executados, o kernel deve compilar para ARCH=um SUBARCH=x86_64 . Esta é uma arquitetura suportada tanto no upstream quanto nas árvores comuns do kernel do Android (como android-4.4 ). Mas às vezes os kernels de dispositivos não são compilados neste modo porque as árvores de dispositivos contêm código específico do dispositivo ou específico do hardware em arquivos comuns (por exemplo sys/exit.c ).

Em muitos casos, é suficiente garantir que o código específico do hardware esteja protegido por um #ifdef . Normalmente, deve ser um #ifdef em uma opção de configuração que controla o recurso específico relevante para o código. Se não houver tal opção de configuração, coloque o código específico do hardware dentro dos blocos #ifndef CONFIG_UML .

Em geral, consertar isso deve ser responsabilidade do fornecedor da árvore do kernel (como o chipset ou fornecedor do SoC). Estamos trabalhando com OEMs e fornecedores para garantir que os kernels atuais e futuros serão compilados para ARCH=um SUBARCH=x86_64 sem exigir quaisquer alterações.

Executando os testes

Os testes estão em kernel/tests/net/test . Recomenda-se que os testes sejam executados a partir do AOSP principal por serem os mais atualizados; em alguns casos, os recursos do kernel necessários para a operação adequada em uma determinada versão do Android ainda não têm cobertura completa de testes nessa versão. Para obter informações sobre como executar os testes, consulte o arquivo README do teste de rede do kernel . Basicamente, do topo da árvore do kernel, execute:

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

Passando nos testes

Os arquivos de origem Python do teste de rede do kernel contêm comentários que especificam confirmações do kernel que são reconhecidamente necessárias para passar nos testes. Os testes devem passar nas árvores de kernel comuns - todas as ramificações comuns do kernel android-4.4 e superior - no projeto kernel/common no AOSP. Portanto, passar nos testes em um kernel é simplesmente uma questão de mesclar continuamente a partir da ramificação comum do kernel correspondente.

Contribuindo

Relatando problemas

Relate quaisquer problemas com os testes de rede do kernel no rastreador de problemas do Android com o rótulo Component-Networking .

Documentando commits e adicionando testes

Relate os problemas conforme descrito acima e, se possível, carregue uma alteração para corrigir o problema, se:

  • Os testes não passam nas árvores de kernel comuns
  • Você encontra um commit necessário que não é mencionado nos comentários de origem,
  • Fazer com que os testes sejam aprovados nos kernels upstream requer grandes mudanças
  • Você acredita que os testes estão superespecificados ou o teste falha em kernels futuros
  • Você gostaria de adicionar mais testes ou mais cobertura aos testes existentes.