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

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

ทำไมต้องทำการทดสอบ?

การทดสอบเหล่านี้เกิดขึ้นจากสาเหตุหลักสามประการ:

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

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

การใช้การทดสอบ

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

การจัดทำเอกสารการกระทำและเพิ่มการทดสอบ

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

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