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