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

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

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

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

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

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

ใช้การทดสอบ

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

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

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

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