การทดสอบ 1 หน่วยของเครือข่ายเคอร์เนล

ตั้งแต่ Android 5.0 การทำงานที่เหมาะสมของสแต็กเครือข่าย Android ในเคอร์เนล Linux ต้องใช้คอมมิตจำนวนหนึ่งที่ส่งไปยังต้นทางเมื่อไม่นานมานี้ หรือยังไม่ได้ส่งไปยังต้นทาง การยืนยันฟังก์ชันการทำงานของเคอร์เนลที่จำเป็นหรือติดตามคอมมิตที่ขาดหายไปด้วยตนเองไม่ใช่เรื่องง่าย ทีม Android จึงแชร์การทดสอบที่ใช้เพื่อให้แน่ใจว่าเคอร์เนลทำงานตามที่คาดไว้

เหตุผลที่ควรทำการทดสอบ

การทดสอบเหล่านี้มีขึ้นด้วยเหตุผลหลักๆ 3 ประการ ดังนี้

  1. โดยปกติแล้วเวอร์ชันที่แน่นอนของเคอร์เนล Linux ที่ใช้ในอุปกรณ์จะ ขึ้นอยู่กับอุปกรณ์นั้นๆ และยากที่จะทราบว่าเคอร์เนล ทำงานได้อย่างถูกต้องหรือไม่โดยไม่ได้ทำการทดสอบ
  2. การส่งต่อและ ส่งกลับแพตช์เคอร์เนลไปยังเคอร์เนลเวอร์ชันต่างๆ หรือ Device Tree ที่แตกต่างกันอาจทำให้เกิดปัญหาเล็กๆ น้อยๆ ที่มองไม่เห็นหากไม่ได้ ทำการทดสอบ
  3. ฟีเจอร์เครือข่ายใหม่อาจต้องใช้ฟังก์ชันการทำงานของเคอร์เนลใหม่หรือการแก้ไขข้อบกพร่องของเคอร์เนล

หากการทดสอบไม่ผ่าน สแต็กเครือข่ายของอุปกรณ์ จะทำงานไม่ถูกต้อง ซึ่งทำให้เกิดข้อบกพร่องในการเชื่อมต่อที่ผู้ใช้มองเห็น (เช่น การหลุดออกจาก เครือข่าย Wi-Fi) อุปกรณ์น่าจะไม่ผ่านการทดสอบชุดเครื่องมือทดสอบความเข้ากันได้ของ Android (CTS) ด้วย

ใช้การทดสอบ

การทดสอบใช้ User-Mode Linux เพื่อบูต เคอร์เนลเป็นกระบวนการในเครื่องโฮสต์ Linux ดูส่วน การสร้างสภาพแวดล้อมการบิลด์สำหรับ เวอร์ชันระบบปฏิบัติการที่เหมาะสม เฟรมเวิร์กการทดสอบหน่วย จะบูตเคอร์เนลด้วยอิมเมจดิสก์ที่เหมาะสมและเรียกใช้การทดสอบจาก ระบบไฟล์ของโฮสต์ การทดสอบเขียนด้วย Python และใช้อินเทอร์เฟซ TAP เพื่อ ทดสอบลักษณะการทำงานของเคอร์เนลและ Socket API

คอมไพล์เคอร์เนลสำหรับ ARCH=um

หากต้องการเรียกใช้การทดสอบ เคอร์เนลต้องคอมไพล์สำหรับ ARCH=um SUBARCH=x86_64 นี่คือสถาปัตยกรรมที่รองรับทั้งต้นทางและในโครงสร้างเคอร์เนล 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

การคอมมิตเอกสารและการเพิ่มการทดสอบ

รายงานปัญหาตามที่อธิบายไว้ข้างต้น และหากเป็นไปได้ ให้อัปโหลดการเปลี่ยนแปลงเพื่อแก้ไขปัญหา ในกรณีต่อไปนี้

  • การทดสอบไม่ผ่านในทรีเคอร์เนลทั่วไป
  • คุณ พบคอมมิตที่จำเป็นซึ่งไม่ได้กล่าวถึงในความคิดเห็นของแหล่งที่มา
  • การทำให้การทดสอบผ่านในเคอร์เนลต้นทางต้องมีการเปลี่ยนแปลงที่สำคัญ
  • คุณเชื่อว่าการทดสอบนั้นเจาะจงมากเกินไป หรือการทดสอบล้มเหลวในเคอร์เนลในอนาคต
  • คุณต้องการเพิ่มการทดสอบหรือเพิ่มความครอบคลุมในการทดสอบที่มีอยู่