Detecção de dispositivos no Tradefed

Uma nova conexão de dispositivo aciona uma série de eventos assíncronos que não são óbvios, mas vale a pena entender.

Conectado fisicamente

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

  • deviceConnected: quando um novo dispositivo for visto por adb
  • deviceDisconnected: quando um dispositivo não está mais informando para adb
  • deviceChanged: quando ocorre um estado importante do dispositivo (como dispositivo off-line ou dispositivo on-line)

Esses eventos são suficientes no nível adb para decidir se um dispositivo está conectado, on-line ou off-line. No entanto, para o harness de teste, precisamos de um estado mais forte do que esse para garantir que um dispositivo esteja realmente pronto para iniciar a execução de testes. Ele não pode ser afetado por possíveis instabilidades de estado que podem vir com um dispositivo recém conectado.

Esta é a sequência de eventos no Tradefed:

  1. O dispositivo é reconhecido como deviceConnected e aberto para eventos regulares de adb
  2. Um evento interno do Tradefed é criado para:

    • Verifique se o dispositivo já é conhecido. O Tradefed mantém uma referência interna para alguns dispositivos (principalmente o alocado e em execução atualmente) para evitar que o TF perca o controle deles aleatoriamente.
    • Verifique se o dispositivo é ONLINE ou OFFLINE.
  3. Se o dispositivo for:

    • OFFLINE: o dispositivo será alternado para o estado CONNECTED_OFFLINE Tradefed, que ainda não permite que o dispositivo execute testes. Se o dispositivo estiver on-line mais tarde, ele vai passar pelo ciclo ONLINE. Se recebermos um evento deviceDisconnect, o dispositivo será removido da lista.

    • ONLINE (como visto pelo adb): o dispositivo será colocado no estado CONNECTED_ONLINE e a disponibilidade dele será verificada para alocação de teste: checking_availability.

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

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

É importante observar que, quando o dispositivo está alocado para um teste, a maioria das ações acima não ocorre e o Tradefed determina o estado do dispositivo internamente. Portanto, é possível que um dispositivo desapareça de adb devices enquanto ainda está listado pelo 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 aciona o dispositivo que aparece em adb devices como <some ip>:<port number> e segue a mesma sequência dos dispositivos conectados fisicamente.

Rastreamento do dispositivo quando ocorre um evento deviceConnected

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

O Tradefed usa essa referência e a envolve na própria implementação da interface do dispositivo ITestDevice para fornecer um serviço mais avançado. Mas o IDevice subjacente é sempre o 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 sem problemas toda vez que um dispositivo é desconectado/reconectado (por exemplo, durante uma reinicialização).