يؤدي توصيل جهاز جديد إلى بدء سلسلة من الأحداث غير المتزامنة التي لا تبدو واضحة ولكن من المهم فهمها.
الأجهزة المتصلة فعليًا
تستخدم Tradefed مكتبة ddmlib (مكتبة Java adb) لتوفير التفاعل الأساسي مع adb والأجهزة. ويشمل هذا الحل واجهة
IDeviceChangeListener
التي تسمح بتلقّي أحداث الجهاز الجديدة، مثل:
deviceConnected: عندما يرىadbجهازًا جديدًاdeviceDisconnected: عندما لا يعود الجهاز يرسل تقارير إلىadbdeviceChanged: عندما تحدث حالة رئيسية للجهاز (مثل الجهاز غير متصل أو الجهاز متصل)
تكفي هذه الأحداث على مستوى adb لتحديد ما إذا كان الجهاز متصلاً أو متصلاً بالإنترنت أو غير متصل. ولكن بالنسبة إلى مفعِّل الاختبار، نحتاج إلى حالة أقوى من ذلك لضمان أنّ الجهاز جاهز فعلاً لبدء إجراء الاختبارات، ويجب ألا يتأثر بتقلبات الحالة المحتمَلة التي قد تحدث عند توصيل جهاز متصل جديد.
في ما يلي تسلسل الأحداث في Tradefed:
- يتم التعرّف على الجهاز على أنّه
deviceConnectedويصبح بإمكانه تلقّي الأحداث العادية منadb يتم إنشاء حدث داخلي في Tradefed سيؤدي إلى:
- التحقّق مما إذا كان الجهاز معروفًا من قبل، إذ تحتفظ Tradefed بمرجع داخلي لبعض الأجهزة (خاصةً الجهاز الذي تم تخصيصه حاليًا والذي يتم إجراء الاختبارات عليه) لتجنُّب فقدان Tradefed إمكانية تتبُّعها بشكل عشوائي
- التحقّق مما إذا كان الجهاز
ONLINEأوOFFLINE
إذا كان الجهاز:
OFFLINE: سيتم تبديل الجهاز إلى حالةCONNECTED_OFFLINEفي Tradefed، ما لا يسمح للجهاز بإجراء الاختبارات بعد. إذا أصبح الجهاز متصلاً بالإنترنت لاحقًا، سيخضع لدورةONLINE. إذا تلقّينا حدثdeviceDisconnect، ستتم إزالة الجهاز ببساطة من القائمة.ONLINE(كما يظهر في adb): سيتم وضع الجهاز في الحالةCONNECTED_ONLINEوسيتم التحقّق من مدى توفّره لتخصيص الاختبار:checking_availability.
إذا نجح التحقّق من
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 الأساسي حتى يمكن إجراء الاختبار على المرجع المناسب. يتم ذلك بسلاسة في كل مرة يتم فيها فصل الجهاز أو إعادة توصيله (أثناء إعادة التشغيل مثلاً).