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 poradb
deviceDisconnected
: quando um dispositivo não está mais informando paraadb
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:
- O dispositivo é reconhecido como
deviceConnected
e aberto para eventos regulares deadb
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
ouOFFLINE
.
Se o dispositivo for:
OFFLINE
: o dispositivo será alternado para o estadoCONNECTED_OFFLINE
Tradefed, que ainda não permite que o dispositivo execute testes. Se o dispositivo estiver on-line mais tarde, ele vai passar pelo cicloONLINE
. Se recebermos um eventodeviceDisconnect
, o dispositivo será removido da lista.ONLINE
(como visto pelo adb): o dispositivo será colocado no estadoCONNECTED_ONLINE
e a disponibilidade dele será 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 testes 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 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).