Una nuova connessione di un dispositivo attiva una serie di eventi asincroni che non sono ovvi, ma che vale la pena comprendere.
Connesso fisicamente
Tradefed utilizza la libreria ddmlib
(una libreria adb
Java) per fornire l'interazione di base con adb
e i dispositivi. Parte di questa soluzione è l'interfaccia IDeviceChangeListener che consente la ricezione di nuovi eventi del dispositivo, ad esempio:
deviceConnected
: quandoadb
rileva un nuovo dispositivodeviceDisconnected
: quando un dispositivo non genera più report peradb
deviceChanged
: quando si verifica uno stato importante del dispositivo (ad esempio dispositivo offline o dispositivo online)
Questi eventi sono sufficienti a livello di adb
per decidere se un dispositivo è collegato, online o offline. Tuttavia, per il test harness, abbiamo bisogno di un stato più stringente per assicurarci che un dispositivo sia davvero pronto per iniziare a eseguire i test. Non deve essere interessato da potenziali incoerenze dello stato che possono verificarsi con un dispositivo appena collegato.
Questa è la sequenza degli eventi in Tradefed:
- Il dispositivo è riconosciuto come
deviceConnected
ed è aperto agli eventi regolari daadb
Viene creato un evento Tradefed interno che:
- Controlla se il dispositivo è già noto: Tradefed conserva un riferimento interno ad alcuni dispositivi (soprattutto a quello attualmente allocato ed in esecuzione) per evitare che TF perda di vista i dispositivi in modo casuale.
- Controlla se il dispositivo è
ONLINE
oOFFLINE
.
Se il dispositivo è:
OFFLINE
: il dispositivo passerà allo statoCONNECTED_OFFLINE
Tradefed, che non consente ancora di eseguire test. Se il dispositivo è online in un secondo momento, verrà eseguito il cicloONLINE
. Se riceviamo un eventodeviceDisconnect
, il dispositivo verrà semplicemente rimosso dall'elenco.ONLINE
(come visto da adb): il dispositivo verrà impostato sullo statoCONNECTED_ONLINE
e la sua disponibilità verrà verificata per l'allocazione del test:checking_availability
.
Se il controllo
availability
ha esito positivo, il dispositivo verrà contrassegnato come disponibile per l'allocazione dei test e potrà eseguire test. In caso contrario, il dispositivo verrà contrassegnato comeunavailable
per l'allocazione e non potrà ricevere alcun test.
Tutti questi stati vengono riportati nella console TradeFed quando vengono elencati i dispositivi tramite: tf> list devices
È importante notare che, quando il dispositivo è attualmente allocato per un test, gran parte di quanto sopra non si verificherà e Tradefed determinerà lo stato del dispositivo internamente. Di conseguenza, è possibile che un dispositivo scomparisca da adb devices
mentre
è ancora elencato da Tradefed. Questo può accadere, ad esempio, quando un test
è il riavvio del dispositivo.
Dispositivo virtuale connesso con adb connect
Quando viene creato un dispositivo virtuale remoto, Tradefed si connette utilizzando adb
connect
. In genere, questa operazione attiva la visualizzazione del dispositivo in adb devices
come
<some ip>:<port number>
e segue la stessa sequenza dei dispositivi
collegati fisicamente.
Monitoraggio del dispositivo quando si verifica un evento deviceConnected
Quando si verifica deviceConnected
, ddmlib
crea un nuovo riferimento
IDevice
per monitorare il dispositivo appena connesso.
Tradefed utilizza tale riferimento e lo include nella propria implementazione dell'interfaccia del dispositivo ITestDevice per fornire un servizio più avanzato. Tuttavia, l'IDevice sottostante è sempre quello proveniente da ddmlib
.
Ciò significa che se viene collegato un nuovo dispositivo, viene creato un nuovo ITestDevice e associato a IDevice. Quando ciò si verifica durante un'invocazione e viene utilizzato ITestDevice, l'IDevice sottostante viene comunque sostituito in modo che i test possano procedere con il riferimento corretto. Questa operazione viene eseguita senza problemi ogni volta che un dispositivo viene disconnesso/ricollegato (ad esempio durante un riavvio).