Détection d'appareils dans Tradefed

La connexion d'un nouvel appareil déclenche une série d'événements asynchrones qui ne sont pas évidents, mais qu'il est important de comprendre.

Connecté physiquement

Tradefed utilise la bibliothèque ddmlib (une bibliothèque Java adb) pour fournir l'interaction de base avec adb et les appareils. Une partie de cette solution est l'interface IDeviceChangeListener qui permet de recevoir de nouveaux événements d'appareil, tels que :

  • deviceConnected : lorsqu'un nouvel appareil est détecté par adb
  • deviceDisconnected : lorsqu'un appareil ne transmet plus de données à adb
  • deviceChanged : lorsqu'un état majeur de l'appareil se produit (par exemple, l'appareil est hors connexion ou en ligne)

Ces événements sont suffisants au niveau adb pour déterminer si un appareil est connecté, en ligne ou hors connexion. Toutefois, pour le harnais de test, nous avons besoin d'un état plus fort pour nous assurer qu'un appareil est réellement prêt à exécuter des tests. Il ne doit pas être affecté par une éventuelle instabilité de l'état qui peut survenir avec un appareil nouvellement connecté.

Voici la séquence d'événements dans Tradefed :

  1. L'appareil est reconnu comme deviceConnected et ouvert aux événements réguliers à partir du adb.
  2. Un événement Tradefed interne est créé pour :

    • Vérifiez si l'appareil est déjà connu. Tradefed conserve une référence interne à certains appareils (en particulier ceux actuellement attribués et exécutant des tests) pour éviter que TF ne les perde de vue de manière aléatoire.
    • Vérifiez si l'appareil est ONLINE ou OFFLINE.
  3. Si l'appareil est :

    • OFFLINE : l'appareil passera à l'état Tradefed CONNECTED_OFFLINE, qui ne lui permet pas encore d'exécuter des tests. Si l'appareil est de nouveau en ligne ultérieurement, il passera par le cycle ONLINE. Si nous recevons un événement deviceDisconnect, l'appareil sera simplement supprimé de la liste.

    • ONLINE (tel qu'indiqué par adb) : l'appareil sera mis dans l'état CONNECTED_ONLINE et sa disponibilité sera vérifiée pour l'attribution des tests : checking_availability.

  4. Si la vérification availability réussit, l'appareil est marqué comme disponible pour l'attribution de tests et peut exécuter des tests. Si ce n'est pas le cas, l'appareil sera marqué comme unavailable pour l'allocation et ne pourra recevoir aucun test.

Tous ces états sont reflétés dans la console Tradefed lors de la liste des appareils via : tf> list devices

Il est important de noter que lorsque l'appareil est actuellement attribué à un test, la plupart des éléments ci-dessus ne se produiront pas et Tradefed déterminera l'état de l'appareil en interne. Il est donc possible qu'un appareil disparaisse de adb devices tout en étant toujours listé par Tradefed. Cela peut se produire, par exemple, lorsqu'un test redémarre l'appareil.

Appareil virtuel connecté avec adb connect

Lorsqu'un appareil virtuel à distance est créé, Tradefed s'y connecte à l'aide de adb connect. L'appareil devrait alors s'afficher dans adb devices sous la forme <some ip>:<port number> et suivre la même séquence que les appareils connectés physiquement.

Suivi de l'appareil lorsqu'un événement deviceConnected se produit

Lorsque deviceConnected se produit, ddmlib crée une référence IDevice pour suivre le nouvel appareil connecté.

Tradefed utilise cette référence et l'encapsule dans sa propre implémentation de l'interface d'appareil ITestDevice pour fournir un service plus avancé. Toutefois, l'IDevice sous-jacent est toujours celui provenant de ddmlib.

Cela signifie que si un nouvel appareil est connecté, un nouvel ITestDevice est créé et associé à l'IDevice. Lorsque cela se produit lors d'une invocation et que l'ITestDevice est utilisé, l'IDevice sous-jacent est toujours remplacé afin que les tests puissent se poursuivre sur la bonne référence. Cette opération est effectuée de manière transparente chaque fois qu'un appareil est déconnecté/reconnecté (par exemple, lors d'un redémarrage).