La conexión de un nuevo dispositivo desencadena una serie de eventos asincrónicos que no son obvios pero que vale la pena comprender.
Conectado fisicamente
Tradefed utiliza 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 nuevos eventos de dispositivos, como:
-
deviceConnected
: Cuandoadb
ve un nuevo dispositivo -
deviceDisconnected
: cuando un dispositivo ya no informa aadb
-
deviceChanged
: cuando ocurre un estado importante del dispositivo (como dispositivo fuera de línea o dispositivo en línea)
Estos eventos son suficientes en el nivel adb
para decidir si un dispositivo está conectado, en línea o fuera de línea. Pero para el arnés de prueba, necesitamos un estado más fuerte que este para garantizar que un dispositivo esté realmente listo para comenzar a realizar pruebas; no debería verse afectado por la posible debilidad del estado que puede surgir con un dispositivo recién conectado.
Esta es la secuencia de eventos en Tradefed:
- El dispositivo se reconoce como
deviceConnected
y abierto a eventos regulares desdeadb
Se crea un evento interno de Tradefed que:
- Compruebe si el dispositivo ya es conocido; Tradefed mantiene referencias internas a algunos dispositivos (especialmente el que actualmente está asignado y ejecuta pruebas) para evitar que TF los pierda de vista aleatoriamente.
- Compruebe si el dispositivo está
ONLINE
oOFFLINE
.
Si el dispositivo es:
OFFLINE
: el dispositivo cambiará al estado TradefedCONNECTED_OFFLINE
, lo que aún no permite que el dispositivo ejecute pruebas. Si el dispositivo está en línea más tarde, pasará por el cicloONLINE
. Si recibimos un eventodeviceDisconnect
, el dispositivo simplemente se eliminará de la lista.ONLINE
(como lo ve adb): el dispositivo se colocará en el estadoCONNECTED_ONLINE
y se verificará su disponibilidad para la asignación de prueba:checking_availability
.
Si la verificación
availability
es exitosa, el dispositivo se marcará como disponible para la asignación de prueba; podrá ejecutar pruebas. De lo contrario, el dispositivo se marcará comounavailable
para su asignación y no podrá recibir ninguna prueba.
Todos estos estados se reflejan en la consola Tradefed al enumerar los dispositivos a través de: tf> list devices
Es importante tener en cuenta que cuando el dispositivo está actualmente asignado para una prueba, la mayor parte de lo anterior no ocurrirá y Tradefed determinará el estado del dispositivo internamente. Por lo tanto, es posible que un dispositivo desaparezca de adb devices
mientras aún aparece en la lista de Tradefed. Esto puede suceder, por ejemplo, cuando una prueba reinicia el dispositivo.
Dispositivo virtual conectado con adb connect
Cuando se crea un dispositivo virtual remoto, Tradefed se conecta a él mediante adb connect
. Esto generalmente 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 del dispositivo cuando se produce un evento de dispositivo conectado
Cuando ocurre deviceConnected
, ddmlib
crea un nuevo IDevice de referencia para rastrear el dispositivo recién conectado.
Tradefed utiliza esa referencia y la incluye en su propia implementación de la interfaz del dispositivo ITestDevice para brindar un servicio más avanzado. Pero el IDevice subyacente siempre es el que proviene de ddmlib
.
Esto significa que si se conecta un nuevo dispositivo, se crea un nuevo ITestDevice y se asocia con el IDevice. Cuando esto sucede durante una invocación y se utiliza ITestDevice, el IDevice subyacente aún se reemplaza para que las pruebas puedan continuar con la referencia adecuada. Esto se hace sin problemas cada vez que se desconecta/vuelve a conectar un dispositivo (por ejemplo, durante un reinicio).