Testes de unidade de rede do kernel

Desde o Android 5.0, o funcionamento adequado da pilha de rede do Android em kernels do Linux exige vários commits que foram enviados relativamente há pouco tempo ou ainda não foram enviados. Não é fácil verificar manualmente a funcionalidade necessária do kernel ou rastrear os commits ausentes. Por isso, a equipe do Android está compartilhando os testes que usa para garantir que o kernel se comporte como esperado.

Motivos para executar os testes

Esses testes existem por três motivos principais:

  1. A versão exata do kernel do Linux usada em um dispositivo geralmente é específica dele, e é difícil saber se um kernel funciona corretamente sem executar os testes.
  2. O encaminhamento e o backporting dos patches do kernel para diferentes versões do kernel ou diferentes árvores de dispositivos podem introduzir problemas sutis que são 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 forem aprovados, a pilha de rede do dispositivo vai se comportar de maneira incorreta, causando bugs de conectividade visíveis ao usuário (como desconexão de redes Wi-Fi). O dispositivo provavelmente também vai falhar nos testes do Teste de compatibilidade do Android (CTS, na sigla em inglês).

Usar os testes

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

Compilar o kernel para ARCH=um

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

Em muitos casos, basta garantir que o código específico do hardware esteja atrás de um #ifdef. Normalmente, esse valor precisa 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 essa opção de configuração, coloque o código específico do hardware dentro de blocos #ifndef CONFIG_UML.

Em geral, corrigir isso é responsabilidade do provedor da árvore do kernel (como o fornecedor do chipset ou do SoC). Estamos trabalhando com OEMs e fornecedores para garantir que os kernels atuais e futuros sejam compilados para o ARCH=um SUBARCH=x86_64 sem exigir mudanças.

Executar os testes

Os testes estão em kernel/tests/net/test. Recomendamos que os testes sejam executados na principal do AOSP porque são 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 de teste completa nessa versão. Para informações sobre como executar os testes, consulte o arquivo README do teste de rede do kernel. Basicamente, na parte de cima da árvore do kernel, execute:

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

Passar nos testes

Os arquivos de origem Python de teste de rede do kernel contêm comentários que especificam commits do kernel conhecidos por serem necessários para passar nos testes. Os testes precisam ser aprovados nas árvores de kernel comuns (todos os branches de kernel comuns android-4.4 e mais recentes) no projeto kernel/common no AOSP. Portanto, passar os testes em um kernel é apenas uma questão de mesclar continuamente da ramificação correspondente do kernel comum.

Contribuições

Relatar problemas

Informe qualquer problema com os testes de rede do kernel no rastreador de problemas do Android com o rótulo Component-Networking.

Documentar commits e adicionar testes

Informe os problemas conforme descrito acima e, se possível, faça o upload de uma mudança para corrigir o problema, se:

  • Os testes não são aprovados nas árvores de kernel comuns.
  • Você encontra um commit necessário que não é mencionado nos comentários da fonte,
  • Para que os testes sejam aprovados em kernels upstream, são necessárias grandes mudanças.
  • Você acredita que os testes estão especificados demais ou que vão falhar em kernels futuros.
  • Você quer adicionar mais testes ou mais cobertura aos testes atuais.