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 upstream relativamente recentemente ou 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 fazer os testes?

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

  1. A versão exata do kernel do Linux usada em um dispositivo geralmente é específica do dispositivo e é difícil saber se algum kernel funcionará corretamente sem executar os testes.
  2. O encaminhamento e a retroportação dos patches do kernel para diferentes versões do kernel ou diferentes árvores de dispositivos podem apresentar 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 erros 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 o User-Mode Linux para inicializar o kernel como um processo em uma máquina host Linux. Consulte Estabelecendo um ambiente de compilação para obter as 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 do sistema de arquivos do host. Os testes são escritos em Python 2.xe usam interfaces TAP para exercitar o comportamento do kernel e a API de 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 compilam 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, é suficiente garantir que o código específico do hardware esteja por trás de 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 essa opção de configuração, coloque o código específico do hardware dentro dos blocos #ifndef CONFIG_UML .

Em geral, corrigir isso deve ser 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 alteração.

Executando os testes

Os testes estão em kernel/tests/net/test . Recomenda-se que os testes sejam executados a partir do mestre AOSP, pois 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 total de teste na versão em questão. Para obter informações sobre como executar os testes, consulte o arquivo README de teste de rede do kernel . Basicamente, do topo da sua árvore do kernel, execute:

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

Passando nos testes

Os arquivos de origem do Python de teste de rede do kernel contêm comentários que especificam as confirmações do kernel que são conhecidas por serem necessárias para passar nos testes. Os testes devem passar nas árvores comuns do kernel - 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 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, faça upload de uma alteração para corrigir o problema, se:

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