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 um número de confirmações que foram enviadas para o upstream recentemente ou ainda não foram enviadas. Não é fácil verificar manualmente a funcionalidade do kernel necessária ou acompanhar as confirmações ausentes. Por isso, a equipe do Android está compartilhando os testes que usa para garantir que o kernel se comporte conforme o 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 do dispositivo, e é difícil saber se um kernel funciona corretamente sem executar os testes.
  2. A portabilidade para frente e para trás dos patches do kernel para diferentes versões do kernel ou diferentes árvores de dispositivos 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 forem aprovados, a pilha de rede do dispositivo vai se comportar incorretamente, causando bugs de conectividade visíveis ao usuário, como a queda de redes Wi-Fi. O dispositivo provavelmente também vai falhar nos testes do Teste de compatibilidade do Android (CTS).

Usar os testes

Os testes usam o Linux em modo de usuário para inicializar o kernel como um processo em uma máquina host Linux. Consulte Como estabelecer um ambiente de criação para ver as versões adequadas do sistema operacional. O framework de teste de unidade inicializa o kernel com uma imagem de disco adequada e executa os testes no 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 com suporte upstream e nas árvores de kernel comuns do Android (como android-4.4). No entanto, às vezes, os kernels do dispositivo não são compilados nesse modo porque as árvores de dispositivo 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 por trás de um #ifdef. Normalmente, isso 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 essa opção de configuração, coloque o código específico do hardware dentro de blocos #ifndef CONFIG_UML.

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

Executar os testes

Os testes estão em kernel/tests/net/test. É recomendável que os testes sejam executados no AOSP principal 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 nesta 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

Aprovar os testes

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

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 confirmações 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 transmitidos 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 transmitidos em kernels upstream exige grandes mudanças
  • Você acredita que os testes estão muito especificados ou que falham em kernels futuros.
  • Você quer adicionar mais testes ou cobertura aos testes existentes.