חיבור של מכשיר חדש מפעיל סדרה של אירועים אסינכרוניים שלא ברורים מאליהם, אבל כדאי להבין אותם.
מחובר פיזית
Tradefed משתמש בספריית ddmlib
(ספריית Java adb
) כדי לספק את האינטראקציה הבסיסית עם adb
ומכשירים. חלק מהפתרון הזה הוא ממשק IDeviceChangeListener שמאפשר קבלת אירועים חדשים של מכשירים, כמו:
deviceConnected
: כשמכשיר חדש מזוהה על ידיadb
deviceDisconnected
: כשמכשיר מפסיק לשלוח דיווחים אלadb
-
deviceChanged
: כשמתרחש מצב מכשיר משמעותי (כמו מכשיר אופליין או מכשיר אונליין)
האירועים האלה מספיקים ברמה של adb
כדי להחליט אם מכשיר מחובר, אונליין או אופליין. אבל כדי להריץ את חבילת הבדיקה, אנחנו צריכים מצב חזק יותר כדי לוודא שהמכשיר באמת מוכן להתחיל להריץ בדיקות. המצב לא צריך להיות מושפע מחוסר יציבות פוטנציאלי במצב, שיכול להתרחש במכשיר שמחובר לאחרונה.
זהו רצף האירועים ב-Tradefed:
- המכשיר מזוהה כ-
deviceConnected
ופתוח לאירועים רגילים מ-adb
נוצר אירוע פנימי של Tradefed שיבצע את הפעולות הבאות:
- בודקים אם המכשיר כבר מוכר. מערכת Tradefed שומרת הפניה פנימית למכשירים מסוימים (במיוחד למכשיר שהוקצה כרגע ומריץ בדיקות) כדי למנוע מצב שבו המערכת מאבדת את המעקב אחריהם באופן אקראי.
- בודקים אם המכשיר הוא
ONLINE
אוOFFLINE
.
אם המכשיר הוא:
OFFLINE
: המכשיר יעבור למצב TradefedCONNECTED_OFFLINE
, שעדיין לא מאפשר להריץ בדיקות במכשיר. אם המכשיר יהיה אונליין בהמשך, הוא יעבור את מחזור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 משתמש בהפניה הזו ועוטף אותה בהטמעה משלו של ממשק המכשיר ITestDevice כדי לספק שירות מתקדם יותר. אבל מזהה ה-iDevice הבסיסי הוא תמיד זה שמגיע מ-ddmlib
.
כלומר, אם מתחבר מכשיר חדש, נוצר ITestDevice חדש שמשויך ל-IDevice. אם זה קורה במהלך הפעלה ונעשה שימוש ב-ITestDevice, עדיין מתבצעת החלפה של ה-IDevice הבסיסי כדי שהבדיקה תוכל להתבצע בהפניה המתאימה. הפעולה הזו מתבצעת בצורה חלקה בכל פעם שמנתקים מכשיר או מחברים אותו מחדש (לדוגמה, במהלך הפעלה מחדש).