Una nueva conexión de dispositivo activa una serie de eventos asíncronos que aún no son obvios, pero que vale la pena comprender.
Conexión física
Tradefed usa la biblioteca ddmlib (una biblioteca adb de Java) para proporcionar la interacción básica con adb y los dispositivos. Parte de esta solución es la
interfaz IDeviceChangeListener
que permite la recepción de eventos de dispositivos nuevos, como los siguientes:
deviceConnected: Cuandoadbve un dispositivo nuevodeviceDisconnected: Cuando un dispositivo ya no informa aadbdeviceChanged: Cuando se produce un estado importante del dispositivo (como el dispositivo sin conexión o en línea)
Estos eventos son suficientes a nivel de adb para decidir si un dispositivo está conectado, en línea o sin conexión. Sin embargo, para el arnés de prueba, necesitamos un estado más sólido que este para garantizar que un dispositivo esté realmente listo para comenzar a ejecutar pruebas; no debe verse afectado por la posible inestabilidad del estado que puede venir con un dispositivo recién conectado.
Esta es la secuencia de eventos en Tradefed:
- El dispositivo se reconoce como
deviceConnectedy está abierto a eventos normales deadb. Se crea un evento interno de Tradefed que hará lo siguiente:
- Verificar si el dispositivo ya es conocido; Tradefed mantiene una referencia interna a algunos dispositivos (en especial, el que está asignado actualmente y ejecuta pruebas) para evitar que TF los pierda de forma aleatoria
- Verificar si el dispositivo está
ONLINEoOFFLINE
Si el dispositivo es lo siguiente:
OFFLINE: El dispositivo cambiará al estadoCONNECTED_OFFLINEde Tradefed, que aún no le permite ejecutar pruebas. Si el dispositivo está en línea más tarde, pasará por el cicloONLINE. Si recibimos un eventodeviceDisconnect, el dispositivo se quitará de la lista.ONLINE(como lo ve adb): El dispositivo se colocará en el estadoCONNECTED_ONLINEy se verificará su disponibilidad para la asignación de pruebas:checking_availability.
Si la verificación de
availabilityse realiza correctamente, el dispositivo se marcará como disponible para la asignación de pruebas y podrá ejecutar pruebas. De lo contrario, el dispositivo se marcará comounavailablepara la asignación y no podrá recibir ninguna prueba.
Todos estos estados se reflejan en la consola de Tradefed cuando se enumeran los
dispositivos a través de: tf> list devices
Es importante tener en cuenta que, cuando el dispositivo está asignado actualmente para una prueba, no ocurrirá la mayoría de lo anterior y Tradefed determinará el estado del dispositivo de forma interna. Por lo tanto, es posible que un dispositivo desaparezca de adb devices mientras Tradefed lo sigue mostrando. Eso puede suceder cuando una prueba reinicia el dispositivo, por ejemplo.
Dispositivo virtual conectado con adb connect
Cuando se crea un dispositivo virtual remoto, Tradefed se conecta a él con adb
connect. Por lo general, esto activará el dispositivo que se muestra en adb devices como
<some ip>:<port number> y seguirá la misma secuencia que los dispositivos conectados físicamente.
Seguimiento de dispositivos cuando ocurre un evento deviceConnected
Cuando ocurre deviceConnected, ddmlib crea un nuevo ID de referencia
IDevice
para hacer un seguimiento del dispositivo conectado.
Tradefed usa esa referencia y la incluye en su propia implementación de la interfaz de dispositivo
interface
ITestDevice
para proporcionar un servicio más avanzado. Sin embargo, el IDevice subyacente siempre es el que proviene de ddmlib.
Esto significa que, si se conecta un dispositivo nuevo, se crea un ITestDevice nuevo y se asocia con el IDevice. Cuando esto sucede durante una invocación y se usa el ITestDevice, el IDevice subyacente se reemplaza para que la prueba pueda continuar en la referencia adecuada. Esto se realiza sin problemas cada vez que se desconecta o se vuelve a conectar un dispositivo (por ejemplo, durante un reinicio).