Detección de dispositivos en Tradefed

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: Cuando adb detecta un dispositivo nuevo
  • deviceDisconnected: Cuando un dispositivo ya no envía informes a adb
  • deviceChanged: Cuando se produce un estado importante del dispositivo (por ejemplo, dispositivo sin conexión o dispositivo con conexión)

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 debería verse afectado por la posible inestabilidad del estado que puede surgir con un dispositivo recién conectado.

Esta es la secuencia de eventos en Tradefed:

  1. El dispositivo se reconoce como deviceConnected y está abierto a eventos regulares de adb.
  2. 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 está asignado y ejecutando pruebas) para evitar que TF los pierda de vista de forma aleatoria.
    • Verifica si el dispositivo es ONLINE o OFFLINE.
  3. Si el dispositivo es:

    • OFFLINE: El dispositivo cambiará al estado CONNECTED_OFFLINE de Tradefed, que aún no permite que el dispositivo ejecute pruebas. Si el dispositivo se conecta más tarde, pasará por el ciclo de ONLINE. Si recibimos un evento deviceDisconnect, el dispositivo simplemente se quitará de la lista.

    • ONLINE (según lo ve adb): El dispositivo se colocará en el estado CONNECTED_ONLINE y se verificará su disponibilidad para la asignación de pruebas: checking_availability.

  4. 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á como unavailable para 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, la mayoría de los casos anteriores no ocurrirán y Tradefed determinará el estado del dispositivo de forma interna. Por lo tanto, es posible que un dispositivo desaparezca de adb devices y que Tradefed lo siga mostrando. Esto 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 hará que el dispositivo se muestre en adb devices como <some ip>:<port number> y seguirá la misma secuencia que los dispositivos conectados físicamente.

Seguimiento del dispositivo cuando ocurre un evento deviceConnected

Cuando ocurre deviceConnected, ddmlib crea una nueva referencia IDevice para hacer un seguimiento del dispositivo recién conectado.

Tradefed usa esa referencia y la incluye 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 asocia con el IDevice. Cuando esto sucede durante una invocación y se usa el ITestDevice, el IDevice subyacente se reemplaza de todos modos para que las pruebas puedan continuar en la referencia adecuada. Esto se hace sin problemas cada vez que se desconecta o vuelve a conectar un dispositivo (por ejemplo, durante un reinicio).