starryos-test
路径:
test-suit/starryos类型:二进制 crate 分层:测试层 / StarryOS 系统回归入口 版本:0.3.0-preview.3文档依据:Cargo.toml、src/main.rs、src/init.sh、xtask/src/starry/{mod.rs,run.rs,config.rs,build.rs}、os/StarryOS/kernel/src/entry.rs
starryos-test 是 StarryOS 的专用测试入口包。它的运行时代码当前几乎与 starryos 相同,同样会构造 /bin/sh -c init.sh 并调用 starry_kernel::entry::init();但它在构建和运行流程中的“包身份”完全不同,因为 cargo starry test qemu 默认选择的就是它。
因此,starryos-test 不是另一套内核实现,而是“被测试系统的入口包”。它把 StarryOS 的真实启动主线放进了专门的自动化回归通道里。
架构设计
设计定位
这个包的职责可以概括为三点:
- 作为
cargo starry test qemu的默认目标包。 - 复用与
starryos基本一致的启动路径,确保测试跑在真实系统 bring-up 之上。 - 让 xtask 能为测试场景注入专门的成功/失败判据和目标产物目录。
从 CI 和本地测试视角看,它就是 StarryOS 的“系统测试镜像入口”。
1.2 为什么必须单独做成一个包
真实差异不在 src/main.rs,而在 xtask 的选择逻辑:
xtask/src/starry/build.rs把测试包名固定为STARRY_TEST_PACKAGE = "starryos-test"。scripts/axbuild/src/starry/mod.rs::Starry::test_qemu()会构造测试请求并强制package = "starryos-test"。xtask/src/starry/run.rs在包名等于starryos-test时使用RunScope::PackageRoot。xtask/src/starry/config.rs通过cargo build -p starryos-test --target ... --features qemu解析测试产物目录和rootfs-<arch>.img位置。
也就是说,测试入口之所以独立,不是为了换一套运行时代码,而是为了换一条受控的测试构建/运行通道。
1.3 当前运行时代码主线
src/main.rs 与 os/StarryOS/starryos/src/main.rs 当前几乎一致:
这里还有一个容易忽略但很关键的细节:
- package 名是
starryos-test。 [[bin]]名依旧是starryos。
这意味着测试运行的仍然是“StarryOS 这份系统镜像”,只是由另一个包名进入测试流水线。
1.4 当前测试判据
xtask/src/starry/run.rs 为该包默认注入:
success_regex = ["starry:~#"]fail_regex = ["(?i)\\bpanic(?:ked)?\\b"]
再结合 src/init.sh 当前内容与 starryos 相同,可以看出现在这条测试主线的实际意义是:
- 让系统完整启动。
- 跑完默认初始化脚本。
- 成功进入 shell 提示符。
- 只要出现 panic 关键字就判失败。
也就是说,当前它更偏“系统 smoke/regression 入口”,而不是“脚本化功能测试总控程序”。
1.5 与 starryos 的边界
starryos-test 和 starryos 当前共享同一内核入口、同一默认 init 脚本逻辑,但边界仍然很明确:
starryos:默认人工运行入口,带本地.axconfig.toml/.qemu.toml。starryos-test:默认自动化回归入口,依赖 xtask 注入 run scope、rootfs 准备和 QEMU 正则判据。
test-suit/starryos 目录当前没有自己的 .axconfig.toml 或 .qemu.toml,这也进一步说明它的测试配置主要来自 xtask,而不是包内静态 dotfile。
核心功能
功能概览
- 作为
cargo starry test qemu的目标包。 - 复用真实的 StarryOS 启动主 线进行系统级回归。
- 为 xtask 提供稳定的包标识和产物根目录。
- 通过 success/fail regex 把 QEMU 输出转成可自动判定的测试结果。
2.2 关键入口
src/main.rs:把init.sh组装成命令行并调用starry_kernel::entry::init()。src/init.sh:定义测试入口当前会执行的用户态初始化脚本。scripts/axbuild/src/starry/mod.rs::Starry::test_qemu():把这个包接入统一测试入口。xtask/src/starry/run.rs::run_with_qemu_regex():注入正则并以PackageRoot范围运行。xtask/src/starry/config.rs:解析该包的 target 产物目录并准备 rootfs。
2.3 关键使用示例
最常用的使用方式不是直接 cargo run,而是通过统一测试命令:
cargo starry test qemu --target riscv64
如果需要单独调试这个包,也可以显式运行:
cargo xtask starry run --arch riscv64 --package starryos-test
依赖关系
直接依赖
ax-feat:提供底层平台、驱动和运行时装配。starry-kernel:真正执行系统 bring-up。ax-plat-riscv64-visionfive2:在vf2feature 下可选引入。
3.2 关键外部驱动者
tg-xtask:不是 Cargo 依赖,但是真正让这个包进入测试流水线的上层驱动者。
开发指南
4.1 常用运行方式
cargo starry test qemu --target riscv64
需要单包调试时再退回:
cargo xtask starry run --arch riscv64 --package starryos-test
4.2 修改这个包时最应注意什么
- 如果你改了
src/init.sh的输出或 shell 提示符,要同步检查xtask/src/starry/run.rs中的 success regex。 - 如果你改了启动主线但并非测试专属差异,通常也应该同步考虑
starryos。 - 如果你想增加测试专属行为,优先放在这个包里,而不是污染默认人工运行入口。
4.3 常见开发误区
- 不要把它当成另一套内核;它复用的还是
starry-kernel。 - 不要以为它当前已经有独立的脚本化测试程序;目前主要判据仍是“能否进入 shell 提示符”。
- 不要忘记 package 名和 bin 名不同:xtask 认的是 package
starryos-test,运行出来的二进制仍叫starryos。
测试
测试覆盖
这个 crate 自己就是系统测试入口,因此它的价值主要来自端到端运行:
- QEMU 能否成功启动镜像。
- rootfs 是否正确准备并挂载。
- 内核能否 bring-up 到用户态 shell。
- 输出中是否出现 panic。
5.2 建议重点验证的场景
cargo starry test qemu是否仍能稳定进入成功正则。- rootfs 产物目录解析是否仍正确。
qemu/smp/vf2组合下是否仍能完成 bring-up。- 若引入测试专属初始化脚本,是否与普通
starryos入口形成清晰边界。
5.3 覆盖率要求
- 这里的覆盖率应按“场景覆盖”理解,而不是 host 侧代码覆盖率。
- 至少应覆盖正常启动、panic 失败、rootfs 准备和目标架构切换几类核心路径。
跨项目定位
ArceOS
ArceOS 本体不直接依赖 starryos-test。这是 StarryOS 在根工作区中单独建立的系统测试入口包。
StarryOS
这是 StarryOS 的自动化回归入口。仓库里执行 cargo starry test qemu 时,真正被构建和运行的是它,而不是普通的 starryos 包。
Axvisor
当前仓库中 Axvisor 不直接依赖 starryos-test。两者没有代码级直接关系。