Una nueva conexión de dispositivo activa una serie de eventos asíncronos que 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
: Cuandoadb
vea un dispositivo nuevo.deviceDisconnected
: Cuando un dispositivo ya no le informa aadb
.deviceChanged
: Cuando ocurre un estado principal del dispositivo (por ejemplo, si el dispositivo está sin conexión o está 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 agente de prueba, necesitamos un estado más seguro que este para asegurarnos de que un dispositivo esté realmente listo para comenzar a ejecutar pruebas. No debería verse afectado por la posible inestabilidad de estado que puede surgir con un dispositivo recientemente conectado.
Esta es la secuencia de eventos en Tradefed:
- El dispositivo se reconoce como
deviceConnected
y está abierto a eventos normales deadb
. Se crea un evento interno de Tradefed que hará lo siguiente:
- Verifica si el dispositivo ya se conoce. Tradefed mantiene una referencia interna a algunos dispositivos (en especial, el que se asignó y ejecuta pruebas actualmente) para evitar que TF pierda la pista de ellos de forma aleatoria.
- Verifica si el dispositivo es
ONLINE
oOFFLINE
.
Si el dispositivo es:
OFFLINE
: El dispositivo cambiará al estadoCONNECTED_OFFLINE
de Tradefed, que aún no le permite ejecutar pruebas. Si el dispositivo está en línea más adelante, pasará por el ciclo deONLINE
. Si recibimos un eventodeviceDisconnect
, el dispositivo simplemente se quitará de la lista.ONLINE
(como lo ve adb): El dispositivo se pondrá en el estadoCONNECTED_ONLINE
y se verificará su disponibilidad para la asignación de pruebas:checking_availability
.
Si la verificación de
availability
se 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á comounavailable
para la asignación y no podrá recibir pruebas.
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 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 siga mostrando en la lista. Eso 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 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 se produce un evento deviceConnected
Cuando se produce deviceConnected
, ddmlib
crea una nueva referencia IDevice para hacer un seguimiento del dispositivo recién conectado.
Tradefed usa esa referencia y la une en su propia implementación de la interfaz del dispositivo 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 nuevo ITestDevice y se lo asocia con el IDevice. Cuando esto sucede durante una invocación y se usa el ITestDevice, se reemplaza el IDevice subyacente de todos modos para que las pruebas puedan continuar en la referencia correcta. Esto se hace sin problemas cada vez que se desconecta o vuelve a conectar un dispositivo (por ejemplo, durante un reinicio).