Detección de dispositivos en Tradefed

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 : cuando adb ve un nuevo dispositivo
  • deviceDisconnected : cuando un dispositivo ya no informa a adb
  • 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:

  1. El dispositivo se reconoce como dispositivo deviceConnected y abierto a eventos regulares de adb
  2. 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 o OFFLINE .
  3. Si el dispositivo es:

    • SIN OFFLINE : el dispositivo se cambiará al estado Tradefed CONNECTED_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 ciclo ONLINE . Si recibimos un evento deviceDisconnect , el dispositivo simplemente se eliminará de la lista.

    • ONLINE (como lo ve adb): el dispositivo se pondrá en el estado CONNECTED_ONLINE LÍNEA y se verificará su disponibilidad para la asignación de prueba: checking_availability .

  4. 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á como unavailable 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).