رصد الأجهزة في Tradefed

يؤدي توصيل جهاز جديد إلى بدء سلسلة من الأحداث غير المتزامنة التي لا تبدو واضحة ولكن من المهم فهمها.

الأجهزة المتصلة فعليًا

تستخدم Tradefed مكتبة ddmlib (مكتبة Java adb) لتوفير التفاعل الأساسي مع adb والأجهزة. ويشمل هذا الحل واجهة IDeviceChangeListener التي تسمح بتلقّي أحداث الجهاز الجديدة، مثل:

  • deviceConnected: عندما يرى adb جهازًا جديدًا
  • deviceDisconnected: عندما لا يعود الجهاز يرسل تقارير إلى adb
  • deviceChanged: عندما تحدث حالة رئيسية للجهاز (مثل الجهاز غير متصل أو الجهاز متصل)

تكفي هذه الأحداث على مستوى adb لتحديد ما إذا كان الجهاز متصلاً أو متصلاً بالإنترنت أو غير متصل. ولكن بالنسبة إلى مفعِّل الاختبار، نحتاج إلى حالة أقوى من ذلك لضمان أنّ الجهاز جاهز فعلاً لبدء إجراء الاختبارات، ويجب ألا يتأثر بتقلبات الحالة المحتمَلة التي قد تحدث عند توصيل جهاز متصل جديد.

في ما يلي تسلسل الأحداث في Tradefed:

  1. يتم التعرّف على الجهاز على أنّه deviceConnected ويصبح بإمكانه تلقّي الأحداث العادية من adb
  2. يتم إنشاء حدث داخلي في Tradefed سيؤدي إلى:

    • التحقّق مما إذا كان الجهاز معروفًا من قبل، إذ تحتفظ Tradefed بمرجع داخلي لبعض الأجهزة (خاصةً الجهاز الذي تم تخصيصه حاليًا والذي يتم إجراء الاختبارات عليه) لتجنُّب فقدان Tradefed إمكانية تتبُّعها بشكل عشوائي
    • التحقّق مما إذا كان الجهاز ONLINE أو OFFLINE
  3. إذا كان الجهاز:

    • OFFLINE: سيتم تبديل الجهاز إلى حالة CONNECTED_OFFLINE في Tradefed، ما لا يسمح للجهاز بإجراء الاختبارات بعد. إذا أصبح الجهاز متصلاً بالإنترنت لاحقًا، سيخضع لدورة ONLINE. إذا تلقّينا حدث deviceDisconnect، ستتم إزالة الجهاز ببساطة من القائمة.

    • ONLINE (كما يظهر في adb): سيتم وضع الجهاز في الحالة CONNECTED_ONLINE وسيتم التحقّق من مدى توفّره لتخصيص الاختبار: checking_availability.

  4. إذا نجح التحقّق من availability، سيتم وضع علامة على الجهاز بأنّه متاح لتخصيص الاختبار، وسيتمكّن من إجراء الاختبارات. إذا لم ينجح التحقّق، سيتم وضع علامة على الجهاز بأنّه unavailable للتخصيص ولا يمكنه تلقّي أي اختبارات.

تظهر كل هذه الحالات في وحدة تحكّم Tradefed عند إدراج الـ أجهزة من خلال الأمر: tf> list devices

من المهم ملاحظة أنّه عندما يتم تخصيص الجهاز حاليًا لإجراء اختبار، لن تحدث معظم الحالات المذكورة أعلاه وستحدّد Tradefed حالة الجهاز داخليًا. لذلك، من الممكن أن يختفي جهاز من adb devices بينما لا يزال مدرَجًا في Tradefed. يمكن أن يحدث ذلك عندما يعيد أحد الاختبارات تشغيل الجهاز مثلاً.

الجهاز الافتراضي المتصل باستخدام adb connect

عند إنشاء جهاز افتراضي عن بُعد، تتصل به Tradefed باستخدام adb connect. سيؤدي ذلك عادةً إلى ظهور الجهاز في adb devices على النحو التالي: <some ip>:<port number> وسيتبع التسلسل نفسه للأجهزة المتصلة فعليًا.

تتبُّع الجهاز عند وقوع حدث deviceConnected

عند وقوع حدث deviceConnected، تنشئ ddmlib مرجعًا جديدًا IDevice لتتبُّع الجهاز المتصل حديثًا.

تستخدم Tradefed هذا المرجع وتغلفه في تنفيذها الخاص لواجهة الجهاز interface ITestDevice لتوفير خدمة أكثر تقدّمًا. ولكن IDevice الأساسي هو دائمًا الجهاز الذي يأتي من ddmlib.

هذا يعني أنّه إذا تم توصيل جهاز جديد، يتم إنشاء ITestDevice جديد وربطه بـ IDevice. عند حدوث ذلك أثناء عملية استدعاء واستخدام ITestDevice، لا يزال يتم استبدال IDevice الأساسي حتى يمكن إجراء الاختبار على المرجع المناسب. يتم ذلك بسلاسة في كل مرة يتم فيها فصل الجهاز أو إعادة توصيله (أثناء إعادة التشغيل مثلاً).