זיהוי מכשירים ב-Tradefed

חיבור של מכשיר חדש מפעיל סדרה של אירועים אסינכרונים שלא ברורים לכולם, אבל כדאי להבין אותם.

חיבור פיזי

‏Tradefed משתמש בספרייה ddmlib (ספריית adb של Java) כדי לספק את האינטראקציה הבסיסית עם adb ועם מכשירים. חלק מהפתרון הוא ממשק IDeviceChangeListener שמאפשר לקבל אירועים חדשים של המכשיר, כמו:

  • deviceConnected: כשמכשיר חדש נראה על ידי adb
  • deviceDisconnected: כשמכשיר לא מדווח יותר ל-adb
  • deviceChanged: כשמתרחש שינוי במצב המכשיר (למשל, המכשיר אופליין או המכשיר אונליין)

האירועים האלה מספיקים ברמה adb כדי לקבוע אם מכשיר מחובר, אונליין או אופליין. אבל לצורך ערכת הבדיקה, אנחנו צריכים מצב חזק יותר כדי לוודא שהמכשיר מוכן באמת להתחיל להריץ בדיקות. המצב לא אמור להיות מושפע מתנודות פוטנציאליות במצב שיכולות להתרחש במכשיר שמחובר לאחרונה.

זהו רצף האירועים ב-Tradefed:

  1. המכשיר מזוהה בתור deviceConnected ופתוח לאירועים רגילים מ-adb
  2. נוצר אירוע פנימי ב-Tradefed ש:

    • בודקים אם המכשיר כבר ידוע. ב-Tradefed יש הפניה פנימית למכשירים מסוימים (במיוחד למכשיר שהוקצה כרגע שבו פועלים הבדיקות) כדי למנוע מ-TF לאבד את המעקב אחריהם באופן אקראי.
    • בודקים אם המכשיר הוא 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 משתמש בהפניה הזו ומעביר אותה להטמעה משלו של ממשק המכשיר ITestDevice כדי לספק שירות מתקדם יותר. אבל מכשיר ה-IDevice הבסיסי הוא תמיד זה שמגיע מ-ddmlib.

כלומר, אם מחובר מכשיר חדש, נוצר אובייקט ITestDevice חדש שמשויך לאובייקט IDevice. אם זה קורה במהלך קריאה והמכשיר הוא ITestDevice, עדיין מתבצע החלפה של IDevice הבסיסי כדי שהבדיקה תמשיך בהפניה המתאימה. הפעולה הזו מתבצעת בצורה חלקה בכל פעם שמנתקים או מחברים מחדש מכשיר (לדוגמה, במהלך הפעלה מחדש).