Rilevamento dei dispositivi in Tradefed

La connessione di un nuovo dispositivo attiva una serie di eventi asincroni non evidenti, 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: quando un nuovo dispositivo viene rilevato da adb
  • deviceDisconnected: quando un dispositivo non genera più report per adb
  • 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 framework di test, abbiamo bisogno di uno 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 di eventi in TradeFed:

  1. Il dispositivo è riconosciuto come deviceConnected ed è aperto agli eventi regolari da adb
  2. Viene creato un evento Tradefed interno che:

    • Controlla se il dispositivo è già noto. Tradefed conserva un riferimento interno per alcuni dispositivi (in particolare quelli attualmente allocati e in esecuzione dei test) per evitare che TF li perda di vista in modo casuale.
    • Controlla se il dispositivo è ONLINE o OFFLINE.
  3. Se il dispositivo è:

    • OFFLINE: sul dispositivo verrà attivato lo stato CONNECTED_OFFLINE Tradefed, che non consente ancora di eseguire test. Se il dispositivo è online in un secondo momento, verrà eseguito il ciclo ONLINE. Se riceviamo un evento deviceDisconnect, il dispositivo verrà semplicemente rimosso dall'elenco.

    • ONLINE (come visto da adb): il dispositivo verrà impostato sullo stato CONNECTED_ONLINE e la sua disponibilità verrà verificata per l'allocazione del test: checking_availability.

  4. Se il controllo availability va a buon fine, il dispositivo verrà contrassegnato come disponibile per l'allocazione dei test e potrà eseguire i test. In caso contrario, il dispositivo verrà contrassegnato come unavailable 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. Pertanto, è possibile che un dispositivo scompaia da adb devices, pur rimanendo elencato da Tradefed. Ciò può accadere, ad esempio, quando un test riavvia il dispositivo.

Dispositivo virtuale connesso con adb connect

Quando viene creato un dispositivo virtuale remoto, Tradefed si connette utilizzando adb connect. In genere, questo attiverà il dispositivo visualizzato in adb devices come <some ip>:<port number> e seguirà 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 questo riferimento e lo inserisce 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).