Uma nova conexão de dispositivo aciona uma série de eventos assíncronos que não são óbvios, mas que valem a pena serem entendidos.
Conectado fisicamente
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, tais como:
-
deviceConnected
: Quando um novo dispositivo é visto peloadb
-
deviceDisconnected
: Quando um dispositivo não está mais reportando aoadb
-
deviceChanged
: Quando ocorre um estado principal do dispositivo (como dispositivo offline ou dispositivo online)
Esses eventos são suficientes no nível adb
para decidir se um dispositivo está conectado, online ou offline. Mas para o equipamento de teste, precisamos de um estado mais forte do que isso para garantir que um dispositivo esteja realmente pronto para começar a executar testes; ele não deve ser afetado por possíveis falhas de estado que podem vir 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 Tradefed interno que irá:
- Verifique se o dispositivo já é conhecido; Tradefed mantém referência interna a alguns dispositivos (especialmente o atual alocado e executando 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
, que ainda não permite que o dispositivo execute testes. Se o dispositivo estiver online mais tarde, ele passará pelo cicloONLINE
. Se recebermos um eventodeviceDisconnect
, o dispositivo será simplesmente removido da lista.ONLINE
(como 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 de
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 do Tradefed ao listar os dispositivos via: tf> list devices
É importante observar que, quando o dispositivo estiver 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 está sendo listado pelo Tradefed. Isso pode acontecer quando um teste está reiniciando o dispositivo, por exemplo.
Dispositivo virtual conectado via "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.
A Tradefed usa essa referência e a envolve em sua própria implementação da interface de dispositivo ITestDevice para fornecer um serviço mais avançado. Mas o IDevice subjacente é sempre aquele vindo 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 chamada e o ITestDevice está sendo usado, o IDevice subjacente ainda é substituído para que o teste possa prosseguir na referência apropriada. Isso é feito perfeitamente cada vez que um dispositivo é desconectado/reconectado (por exemplo, durante uma reinicialização).