内核网络单元测试

自 Android 5.0 以来,Linux 内核上 Android 网络堆栈的正常运行需要许多提交,这些提交相对较近才被上游接受,或者尚未被上游接受。手动验证所需的内核功能或跟踪缺失的提交并不容易,因此 Android 团队正在分享其用于确保内核按预期运行的测试。

运行测试的原因

这些测试存在三个主要原因

  1. 设备上使用的 Linux 内核的确切版本通常是设备特定的,并且在不运行测试的情况下很难知道任何内核是否正常工作。
  2. 将内核补丁向前移植和向后移植到不同的内核版本或不同的设备树可能会引入细微的问题,如果不运行测试,这些问题可能无法发现。
  3. 新的网络功能可能需要新的内核功能或内核错误修复。

如果测试未通过,则设备的网络堆栈行为不正确,从而导致用户可见的连接错误(例如掉出 Wi-Fi 网络)。设备可能也很可能无法通过 Android 兼容性测试套件 (CTS) 测试。

使用测试

这些测试使用 用户模式 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 源文件包含注释,这些注释指定了已知通过测试所需的内核提交。测试应在通用内核树中通过 - kernel/common 项目中 AOSP 中的所有通用内核分支 android-4.4 及更高版本。因此,在内核上通过测试只是不断地从相应的通用内核分支合并的问题。

贡献

报告问题

Android 问题跟踪器中报告内核网络测试的任何问题,并带有 Component-Networking 标签。

记录提交并添加测试

如上所述报告问题,如果可能,上传更改以修复问题,如果

  • 测试在通用内核树上未通过
  • 您发现源注释中未提及的必要提交,
  • 使测试在 upstream 内核上通过需要重大更改
  • 您认为测试过度指定,或者测试在未来内核上失败
  • 您想要为现有测试添加更多测试或更多覆盖率。