Détection d'appareils dans Tradefed

Une nouvelle connexion d'appareil déclenche une série d'événements asynchrones qui ne sont pas évidents, mais qui méritent d'être compris.

Connecté physiquement

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

  • 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, appareil hors connexion ou appareil en ligne)

Ces événements suffisent au niveau adb pour déterminer si un appareil est connecté, en ligne ou hors connexion. Toutefois, pour le banc d'essai, nous avons besoin d'un état plus fort que celui-ci pour nous assurer qu'un appareil est vraiment prêt à commencer à exécuter des tests. Il ne doit pas être affecté par l'instabilité potentielle de l'état qui peut accompagner un appareil nouvellement connecté.

Voici la séquence des événements dans Tradefed:

  1. L'appareil est reconnu comme deviceConnected et ouvert aux événements standards de adb
  2. Un événement Tradefed interne est créé, qui:

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

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

    • ONLINE (comme vu par adb): l'appareil est mis en état CONNECTED_ONLINE et sa disponibilité est vérifiée pour l'allocation de test: checking_availability.

  4. Si la vérification availability réussit, l'appareil est marqué comme disponible pour l'allocation de tests. Il peut alors exécuter des tests. Dans le cas contraire, 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

Notez que lorsque l'appareil est actuellement alloué à un test, la plupart des éléments ci-dessus ne se produisent pas et Tradefed détermine l'état de l'appareil en interne. Il est donc possible qu'un appareil disparaisse de adb devices tout en restant listé par Tradefed. Cela peut se produire lorsqu'un test redémarre l'appareil, par exemple.

Appareil virtuel connecté à adb Connect

Lorsqu'un appareil virtuel distant est créé, Tradefed s'y connecte à l'aide de adb connect. Cela déclenche généralement l'affichage de l'appareil dans adb devices en tant que <some ip>:<port number> et suit la même séquence que les appareils connectés physiquement.

Suivi des appareils lorsqu'un événement deviceConnected se produit

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

Tradefed utilise cette référence et l'encapsule dans sa propre implémentation de l'interface de l'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 avec la référence appropriée. 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).