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 peloadb
-
deviceDisconnected
: quando um dispositivo não está mais reportando aoadb
-
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:
- O dispositivo é reconhecido como
deviceConnected
e aberto a eventos regulares doadb
É 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
ouOFFLINE
.
Se o dispositivo for:
OFFLINE
: o dispositivo será alterado para o estado TradefedCONNECTED_OFFLINE
, o que ainda não permite que o dispositivo execute testes. Se o dispositivo estiver online posteriormente, ele passará pelo cicloONLINE
. Se recebermos um eventodeviceDisconnect
, o dispositivo será simplesmente removido da lista.ONLINE
(conforme visto pelo adb): O dispositivo será colocado no estadoCONNECTED_ONLINE
e terá sua disponibilidade verificada para alocação de teste:checking_availability
.
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 comounavailable
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).