בדיקות יחידה של רשתות הליבה

החל מגרסה 5.0 של Android, כדי שה-stack של הרשתות ב-Android יפעל כראוי בליבות Linux נדרשים מספר התחייבויות (commits) שהועברו ל-upstream לאחרונה יחסית, או שעדיין לא הועברו. לא קל לאמת באופן ידני את הפונקציונליות הנדרשת של הליבה או לעקוב אחרי ההצהרות החסרות, ולכן צוות Android משתף את הבדיקות שבהן הוא משתמש כדי לוודא שהליבה פועלת כמצופה.

סיבות להרצת הבדיקות

הבדיקות האלה קיימות משלושה סיבות עיקריות:

  1. בדרך כלל, הגרסה המדויקת של ליבה של Linux שמשמשת במכשיר היא ספציפית למכשיר, וקשה לדעת אם ליבה כלשהי פועלת כראוי בלי להריץ את הבדיקות.
  2. העברה קדימה והעברה לאחור של תיקוני הליבה לגרסאות ליבה שונות או לעצי מכשירים שונים עלולים לגרום לבעיות עדינות שקשה לזהות בלי להריץ את הבדיקות.
  3. תכונות רשת חדשות עשויות לדרוש פונקציונליות חדשה בליבה או תיקוני באגים בליבה.

אם הבדיקות נכשלות, משמעות הדבר היא שסטאק הרשת של המכשיר פועל בצורה שגויה, וכתוצאה מכך מתרחשים באגים בקישוריות שגלויים למשתמשים (למשל ניתוק מרשתות Wi-Fi). סביר להניח שהמכשיר ייכשל גם בבדיקות של חבילת בדיקות התאימות ל-Android‏ (CTS).

שימוש בבדיקות

בבדיקות נעשה שימוש ב-User-Mode Linux כדי להפעיל את הליבה בתור תהליך במכונה המארחת של Linux. במאמר יצירת סביבת build מפורטות גרסאות מערכת ההפעלה המתאימות. מסגרת בדיקת היחידה מפעילה את הליבה באמצעות קובץ אימג' מתאים של דיסק ומריצה את הבדיקות ממערכת הקבצים של המארח. הבדיקות נכתבות ב-Python ומשתמשות בממשקי TAP כדי לבדוק את התנהגות הליבה ואת ה-socket API.

הידור הליבה עבור ARCH=um

כדי שהבדיקות יפעלו, הליבה צריכה לעבור הידור עבור ARCH=um SUBARCH=x86_64. זוהי ארכיטקטורה נתמכת גם ב-upstream וגם בעצים הנפוצים של ליבות Android (כמו android-4.4). עם זאת, לפעמים ליבות של מכשירים לא עוברות הידור במצב הזה כי עצי המכשירים מכילים קוד ספציפי למכשיר או לחומרה בקובצי קוד נפוצים (לדוגמה sys/exit.c).

במקרים רבים, מספיק לוודא שהקוד הספציפי לחומרה נמצא מאחורי #ifdef. בדרך כלל, זה צריך להיות #ifdef באפשרות תצורה ששולטת בתכונה הספציפית הרלוונטית לקוד. אם אין אפשרות כזו, צריך להוסיף קוד ספציפי לחומרה בתוך בלוקים של #ifndef CONFIG_UML.

באופן כללי, תיקון הבעיה צריך להיות באחריות ספק עץ הליבה (כמו ספק הצ'יפסט או SoC). אנחנו עובדים עם יצרני ציוד מקורי (OEM) וספקים כדי לוודא שהליבבות הנוכחיים והעתידיים יקובצו ל-ARCH=um SUBARCH=x86_64 בלי צורך בשינויים.

הרצת הבדיקות

הבדיקות נמצאות בכתובת kernel/tests/net/test. מומלץ להריץ את הבדיקות מ-AOSP main כי הן העדכניות ביותר. במקרים מסוימים, לתכונות הליבה הנדרשות לפעולה תקינה במהדורת Android מסוימת עדיין אין כיסוי בדיקה מלא במהדורה הזו. מידע על הפעלת הבדיקות זמין בקובץ ה-README של בדיקת הרשת של הליבה. בעיקרון, בחלק העליון של עץ הליבה, מריצים את הפקודה:

ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh

עוברים את הבדיקות

קובצי המקור של בדיקת הרשת של הליבה ב-Python מכילים תגובות שמציינות את ההתחייבויות לקוד של הליבה שנדרשות כדי לעבור את הבדיקות. הבדיקות צריכות לעבור בעצי הליבה הנפוצים – כל ההסתעפויות הנפוצות של הליבה מגרסה android-4.4 ואילך – בפרויקט kernel/common ב-AOSP. לכן, כדי לעבור את הבדיקות בליבה, צריך פשוט למזג אותה באופן קבוע מההסתעפות המשותפת המתאימה של הליבה.

תרומות

דיווח על בעיות

אפשר לדווח על בעיות בבדיקות הרשת של הליבה במעקב אחר הבעיות ב-Android באמצעות התווית Component-Networking.

תיעוד של השמירות והוספת בדיקות

מדווחים על בעיות כפי שמתואר למעלה, ואם אפשר מעלים שינוי כדי לפתור את הבעיה, במקרים הבאים:

  • הבדיקות לא עוברות בעצי הליבה הנפוצים
  • מצאתם שינויים חיוניים שלא מוזכרים בתגובות למקור,
  • כדי שהבדיקות יעברו בגרסת הליבה של המקור, נדרשים שינויים משמעותיים
  • לדעתכם הבדיקות מפורטות מדי, או שהבדיקה נכשלת בליבות עתידיות
  • אתם רוצים להוסיף בדיקות או להרחיב את הכיסוי של בדיקות קיימות.