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

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

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

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

  1. הגרסה המדויקת של ליבת Linux שנעשה בה שימוש במכשיר היא בדרך כלל ספציפית למכשיר, וקשה לדעת אם ליבה מסוימת פועלת בצורה תקינה בלי להריץ את הבדיקות.
  2. העברה קדימה (forward-porting) והעברה אחורה (back-porting) של תיקוני ליבה לגרסאות ליבה שונות או לעצי מכשירים שונים עשויות לגרום לבעיות קלות שאי אפשר לזהות בלי להריץ את הבדיקות.
  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.

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

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

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