Uma nova conexão de dispositivo aciona uma série de eventos assíncronos que ainda não são óbvios, mas que 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 peloadbdeviceDisconnected: quando um dispositivo não está mais se comunicando com oadbdeviceChanged: quando ocorre um estado principal do dispositivo (como 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 arcabouço de testes, 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 deve ser afetado por uma possível instabilidade de estado que pode ocorrer com um dispositivo conectado recentemente.
Esta é a sequência de eventos no Tradefed:
- O dispositivo é reconhecido como
deviceConnectede aberto a eventos regulares doadb Um evento interno do Tradefed é criado para:
- Verificar se o dispositivo já é conhecido. O Tradefed mantém uma referência interna a alguns dispositivos (especialmente o que está alocado e executando testes) para evitar que o TF perca o controle deles aleatoriamente.
- Verificar se o dispositivo está
ONLINEouOFFLINE.
Se o dispositivo estiver:
OFFLINE: o dispositivo será alternado para o estadoCONNECTED_OFFLINEdo Tradefed, que ainda não permite que ele execute testes. Se o dispositivo ficar on-line mais tarde, ele vai passar pelo cicloONLINE. Se recebermos um eventodeviceDisconnect, o dispositivo será removido da lista.ONLINE(conforme visto pelo adb): o dispositivo será colocado no estadoCONNECTED_ONLINEe terá a disponibilidade verificada para alocação de testes:checking_availability.
Se a verificação de
availabilityfor 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 comounavailablepara 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. Portanto, é possível que um dispositivo desapareça de adb devices enquanto ainda está listado pelo Tradefed. Isso pode acontecer quando um teste está reinicializando 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 a exibição do dispositivo em adb devices como
<some ip>:<port number> e segue a mesma sequência dos dispositivos conectados fisicamente.
Rastreamento de dispositivos quando ocorre um evento deviceConnected
Quando deviceConnected ocorre, ddmlib cria uma nova referência IDevice para rastrear o dispositivo conectado recentemente.
O Tradefed usa essa referência e a envolve na própria implementação da interface de dispositivo
interface
ITestDevice
para fornecer um serviço mais avançado. No entanto, 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).