测试与验收

执行入口

从主仓根目录执行;临时文件放在项目输出目录:

mkdir -p out/tmp
TMPDIR="$PWD/out/tmp" make test
TMPDIR="$PWD/out/tmp" make test-long
TMPDIR="$PWD/out/tmp" make test-legacy
TMPDIR="$PWD/out/tmp" make test-smoke

test 为宿主/构建契约,test-long 包括长流程与恢复,test-legacy 显式运行 非生产 OS 测试,test-smoke 顺序检查三类介质的 BIOS/UEFI 启动。 test-build 包含 Pages 文档回归,宿主需要 Sphinx;普通内核和用户态编译不因此依赖它。 按风险选择定向检查;通过已有失败之前的步骤不能称为全套通过。

APK 归属测试和组件 Kconfig 维护脚本支持 Python 3.10+;3.10 另需 TOML 解析包 tomli``(Debian/Ubuntu 的 ``python3-tomli),3.11+ 使用标准库 tomllib。APK 夹具在测试子进程中固定 umask 022,避免继承宿主 私有权限掩码后与预期文件模式冲突。 宿主文件写入失败测试使用子进程的文件大小限制,验证短写后报错、原文件 保留与临时文件清理;不依赖 root 是否能绕过目录权限。

make test-audio 仍需要真实 ALSA 和 OPL3 构建依赖; tools/test_audio_userland.py 的日志写入 out/audio-hda/qa/logs/。 音频产品检查需要已有内核包、rootfs 和 SDK,缺少产物必须报错。

仓库边界

ReliefOS 持有应用、运行库、SDK、APK、安装器、镜像与完整系统 QEMU/VMware 集成测试。内核实现、驱动、文件系统、调度、内存和 Linux UAPI 的测试及原生 系统调用探针由 ReliefNT 仓库持有,入口见其 Documentation/process/testing.rst。混合套件按实现归属拆开,主仓不保留 内核夹具副本或旧脚本转发文件。

tests/build/test-test-ownership.sh 构建契约检查测试源码归属,包括 Shell 测试 直接引用内核私有源码和头文件的情况。旧内核桌面实现与可执行文件 GID 服务权限的 残留检查由 ReliefNT 的 service_roles 套件持有;主仓的 tests/build/test-x11-only.sh 只检查本仓的应用、运行库与产品配置。 主仓保留方便调用的 test-vdso、test-smp-time、test-page-cache-growth、 test-user-return、test-syscall-io、test-kernel-host 与 test-kernel-ownership Make 目标,它们委托内核自己的 Make 入口, 不在父仓复制内核测试清单。test-legacy 同样先委托内核定向回归组, 再运行主仓 Unix IPC 与用户态 syscall 头检查。

来宾启动、SDK 编译和应用互操作仍由本仓编排;需要原生 ABI 探针时,直接消费 kernel/reliefnt/tools/tests/ 内的源文件;公开 UAPI 的消费和完整系统的 构建集成检查仍属于主仓。

运行证据

QEMU 测试使用私有磁盘,保留源镜像与注入载荷摘要、完整串口、返回码、 截图和独立读回。界面出现不等于交互成功;编译成功不等于镜像含有新文件。 Installer 还须覆盖安装后的无 ISO 启动;VT、权限、错误路径分别检查。 QEMU 的 VMware 显卡型号不能替代 VMware 真实运行证明。 现有失败见 支持范围与已知限制;不重生成 golden 掩盖差异。

Xorg 渲染回归

tools/tests/xorg_render_runtime_probe.c 是在隔离 X server 上运行的维护 探针,不安装到产品镜像。它使用 POSIX C 和 Xlib。可在具备 C 编译器、X11 开发头及库的 ReliefOS 来宾内编译并运行:

cc -std=c11 -O2 -Wall -Wextra -Werror xorg_render_runtime_probe.c \
    -lX11 -o xorg-render-probe
DISPLAY=:0 ./xorg-render-probe --wait-wm
DISPLAY=:0 ./xorg-render-probe --repeat 3
DISPLAY=:0 ./xorg-render-probe --offscreen --repeat 25

--wait 只验证可连接 X server;--wait-wm 等待窗口管理器发布 _NET_SUPPORTING_WM_CHECK 并检查目标窗口回指自身,拒绝失效属性;两者都 不能替代绘制测试。普通模式检查同步 矩形绘制、批量绘制、重叠滚动、窗口移动和 Pixmap 创建/复制/销毁;关键 阶段以 XGetImage 验证像素。X 错误、错误像素和分配失败均使探针失败。 独立 heartbeat 进程每两秒输出时间,供外部超时监视器检查系统是否仍响应。

探针的窗口使用 override_redirect,窗口移动不等于验证 IceWM 鼠标拖动。 普通模式要求窗口无遮挡;XGetImage 不保证返回被遮挡且无 backing store 的 窗口区域内容,见 Xlib 图像读回约定。 与其他桌面应用并发时,使用 --offscreen 在独占 Pixmap 上 绘制和校验,并复制首尾画面到窗口,避免把遮挡/Expose 当作绘制错误。 同步绘制包含 X11 往返开销;批量绘制包含末尾读回,不能将它们解释为纯 GPU 吞吐量。计时只用于诊断,返回零也不表示达到了某个性能门槛。

比较性能时使用相同探针、桌面配置、分辨率、vCPU 和内存,等待 IceWM 就绪后重复采样,顺序运行各台 VM。软件对照使用 modesetting 的 AccelMethod none,加速对照使用 AccelMethod glamor;从 Xorg 日志 分别确认 glamor disabled 和 glamor X acceleration enabled on SVGA3D, 并记录 VMware host renderer。记录内核和探针摘要、完整串口、返回码与每轮 耗时;不能把启动期间加载字体/库的耗时直接当作稳定渲染性能。

全量 syscall-trace 会向串口输出大量日志,显著扰动测试,应仅用于定性 定位;其结果不能进入性能对照。超时、探针失败、Xorg 退出和 Kernel Panic 要分别记录。稳定性测试应另行叠加桌面应用、CPU/内存压力与重复启动, 并保留 panic 的 Reason、RIP 和调用栈;短时无崩溃不构成永久稳定性保证。