Detecção de dispositivos no Tradefed

Uma nova conexão de dispositivo desencadeia uma série de eventos assíncronos que não são óbvios, mas que merecem ser compreendidos.

Fisicamente conectado

Tradefed usa a biblioteca ddmlib (uma biblioteca Java adb ) para fornecer a interação básica com adb e dispositivos. Parte desta solução é a interface IDeviceChangeListener que permite a recepção de novos eventos do dispositivo, como:

  • deviceConnected : quando um novo dispositivo é visto pelo adb
  • deviceDisconnected : quando um dispositivo não está mais reportando ao adb
  • deviceChanged : quando ocorre um estado importante do dispositivo (como dispositivo offline ou dispositivo online)

Esses eventos são suficientes no nível adb para decidir se um dispositivo está conectado ou não, online ou offline. Mas para o equipamento de teste, precisamos de um estado mais forte do que este para garantir que um dispositivo esteja realmente pronto para iniciar a execução de testes; ele não deve ser afetado por possíveis instabilidades de estado que podem ocorrer com um dispositivo recém-conectado.

Esta é a sequência de eventos no Tradefed:

  1. O dispositivo é reconhecido como deviceConnected e aberto a eventos regulares do adb
  2. É criado um evento interno do Tradefed que irá:

    • Verifique se o dispositivo já é conhecido; Tradefed mantém referência interna para alguns dispositivos (especialmente aquele atualmente alocado e em execução de testes) para evitar que o TF os perca aleatoriamente.
    • Verifique se o dispositivo está ONLINE ou OFFLINE .
  3. Se o dispositivo for:

    • OFFLINE : o dispositivo será alterado para o estado Tradefed CONNECTED_OFFLINE , o que ainda não permite que o dispositivo execute testes. Se o dispositivo estiver online posteriormente, ele passará pelo ciclo ONLINE . Se recebermos um evento deviceDisconnect , o dispositivo será simplesmente removido da lista.

    • ONLINE (conforme visto pelo adb): O dispositivo será colocado no estado CONNECTED_ONLINE e terá sua disponibilidade verificada para alocação de teste: checking_availability .

  4. Se a verificação availability for bem-sucedida, o dispositivo será marcado como disponível para alocação de teste; ele será capaz de executar testes. Caso contrário, o dispositivo será marcado como unavailable para alocação e não poderá receber nenhum teste.

Todos esses estados são refletidos no console Tradefed ao listar os dispositivos via: tf> list devices

É importante observar que quando o dispositivo estiver atualmente alocado para um teste, a maioria dos itens acima não ocorrerá e o Tradefed determinará o estado do dispositivo internamente. Portanto, é possível que um dispositivo desapareça dos adb devices enquanto ainda estiver listado no Tradefed. Isso pode acontecer quando um teste reinicia o dispositivo, por exemplo.

Dispositivo virtual conectado com adb connect

Quando um dispositivo virtual remoto é criado, o Tradefed se conecta a ele usando adb connect . Isso geralmente acionará o dispositivo exibido em adb devices como <some ip>:<port number> e seguirá a mesma sequência dos dispositivos conectados fisicamente.

Rastreamento de dispositivo quando ocorre um evento deviceConnected

Quando ocorre deviceConnected , ddmlib cria um novo IDevice de referência para rastrear o dispositivo recém-conectado.

Tradefed usa essa referência e a envolve em sua própria implementação da interface do dispositivo ITestDevice para fornecer um serviço mais avançado. Mas o IDevice subjacente é sempre aquele que vem de ddmlib .

Isso significa que se um novo dispositivo for conectado, um novo ITestDevice será criado e associado ao IDevice. Quando isso acontece durante uma invocação e o ITestDevice está sendo usado, o IDevice subjacente ainda é substituído para que o teste possa prosseguir na referência adequada. Isso é feito perfeitamente sempre que um dispositivo é desconectado/reconectado (por exemplo, durante uma reinicialização).