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
O Tradefed usa a biblioteca ddmlib
(uma biblioteca Java adb
) para fornecer a interação básica com adb
e dispositivos. Parte dessa solução é a
interface IDeviceChangeListener
que permite o recebimento de novos eventos de dispositivo, como:
deviceConnected
: quando um novo dispositivo é detectado poradb
deviceDisconnected
: quando um dispositivo não envia mais relatórios para oadb
deviceChanged
: quando ocorre um estado importante do dispositivo, como ficar off-line ou 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 ambiente de teste, precisamos de um estado mais forte do que esse para garantir que um dispositivo esteja realmente pronto para começar a executar testes. Ele não pode ser afetado por uma possível instabilidade de estado que pode surgir com um dispositivo recém-conectado.
Esta é a sequência de eventos no Tradefed:
- O dispositivo é reconhecido como
deviceConnected
e está aberto a eventos regulares deadb
Um evento interno do Tradefed é criado para:
- Verifique se o dispositivo já é conhecido. O Tradefed mantém uma referência interna a alguns dispositivos (principalmente o que está alocado e executando testes) para evitar que o TF perca o controle deles aleatoriamente.
- Verifique se o dispositivo é
ONLINE
ouOFFLINE
.
Se o dispositivo for:
OFFLINE
: o dispositivo será alternado para o estadoCONNECTED_OFFLINE
do Tradefed, que ainda não permite a execução de testes. Se o dispositivo ficar on-line depois, ele vai passar pelo ciclo deONLINE
. Se um eventodeviceDisconnect
for recebido, o dispositivo será removido da lista.ONLINE
(como visto pelo adb): o dispositivo será colocado no estadoCONNECTED_ONLINE
e terá a 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 e poderá executar testes. Caso contrário, o dispositivo será marcado comounavailable
para alocação e não poderá receber testes.
Todos esses estados são refletidos no console do Tradefed ao listar os dispositivos usando: 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. Por isso, é possível que um dispositivo desapareça do adb devices
, mas ainda seja listado pelo Tradefed. Isso pode acontecer quando um teste está reiniciando 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 faz com que o dispositivo apareça em adb devices
como
<some ip>:<port number>
e siga a mesma sequência dos dispositivos conectados
fisicamente.
Rastreamento de dispositivos quando um evento deviceConnected ocorre
Quando deviceConnected
ocorre, ddmlib
cria uma nova referência IDevice 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 oferecer 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 de maneira integrada sempre que um dispositivo é desconectado/reconectado (por exemplo, durante uma reinicialização).