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

מאז Android 5.0, כדי שמערך הרשת של Android יפעל בצורה תקינה בליבות של Linux, נדרשות כמה פעולות commit שבוצעו לאחרונה או שעדיין לא בוצעו. קשה לאמת באופן ידני את הפונקציונליות הנדרשת של ליבת המערכת או לעקוב אחרי הקומיטים החסרים, ולכן צוות 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.

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

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

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