La conexión de un nuevo dispositivo desencadena una serie de eventos asincrónicos que no son obvios pero que vale la pena entender.
Conectado físicamente
Tradefed utiliza la biblioteca ddmlib
(una biblioteca adb
de Java) para proporcionar la interacción básica con adb
y dispositivos. Parte de esta solución es la interfaz IDeviceChangeListener que permite la recepción de eventos de nuevos dispositivos, tales como:
-
deviceConnected
: cuandoadb
ve un nuevo dispositivo -
deviceDisconnected
: cuando un dispositivo ya no informa aadb
-
deviceChanged
: cuando se produce 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 o no, 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 ejecutar pruebas; no debería verse afectado por la descamación del estado potencial que puede venir con un dispositivo recién conectado.
Esta es la secuencia de eventos en Tradefed:
- El dispositivo se reconoce como dispositivo
deviceConnected
y abierto a eventos regulares deadb
Se crea un evento interno de Tradefed que:
- Compruebe si el dispositivo ya se conoce; Tradefed mantiene una referencia interna a algunos dispositivos (especialmente el que está actualmente asignado y está ejecutando pruebas) para evitar que TF los pierda de vista al azar.
- Compruebe si el dispositivo está
ONLINE
oOFFLINE
.
Si el dispositivo es:
SIN
OFFLINE
: el dispositivo se cambiará al estado TradefedCONNECTED_OFFLINE
, lo que no permite que el dispositivo ejecute pruebas todavía. 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 pondrá en el estadoCONNECTED_ONLINE
LÍNEA y se verificará su disponibilidad para la asignación de prueba:checking_availability
.
Si la verificación de
availability
es exitosa, el dispositivo se marcará como disponible para la asignación de prueba; será capaz de ejecutar pruebas. De lo contrario, el dispositivo se marcará comounavailable
para la asignación y no podrá recibir ninguna prueba.
Todos estos estados se reflejan en la consola de Tradefed al listar 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 Tradefed aún lo incluye. Eso puede suceder cuando una prueba está reiniciando el dispositivo, por ejemplo.
Dispositivo virtual conectado a través de "adb connect"
Cuando se crea un dispositivo virtual remoto, Tradefed se conecta a él mediante 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 IDevice de referencia para rastrear el dispositivo recién conectado.
Tradefed usa esa referencia y la envuelve 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 está utilizando ITestDevice, el IDevice subyacente aún se reemplaza para que las pruebas puedan continuar con la referencia adecuada. Esto se hace sin inconvenientes cada vez que se desconecta o se vuelve a conectar un dispositivo (por ejemplo, durante un reinicio).