QEMU检查器

大多数内核代码通过QEMU进行测试。我们引入QEMU检查器以协助测试内核。

QEMU检查器必须提供一个QEMU运行脚本和一个包含检查指令的输入文件。QEMU检查器运行该脚本并捕获其输出行。如果输出行匹配检查指令中指定的条件或正则表达式,检查器将采取相应操作。指令应写在输入文件的头部。

指令动作
// 检查-失败: <regex>记录此行并在退出时报告。
// 检查-成功: <regex>记录此行并在退出时报告。
// 断言失败:<regex>退出 runner 并报告失败。
// 断言-成功: <regex>退出 runner 并报告成功。
// 新建行超时: <数字>检查器读取下一行时超时。如果发生超时,报告失败。
// 总超时: <数字>本次运行的总超时时间。

例子

假设我们有一个用于测试的内核镜像,名为blueos_foo_test。首先我们需要为它生成一个qemu运行脚本。

gen_qemu_runner("runner_for_blueos_foo_test") {
  img = ":blueos_foo_test"
  qemu = "$qemu_exe"
  board = "$board"
}

然后,我们为上述runner制作一个checker。

run_qemu_checker("check_blueos_foo_test") {
  img = ":blueos_foo_test"
  runner = ":runner_for_blueos_foo_test"
  checker = "//kernel/kernel/tests/integration_test.rs"
}

必须指出,上述两个目标必须放在同一个 BUILD.gn 中。检查指令应放在 integration_test.rs 的头部。

// NEWLINE-TIMEOUT: 15  
// ASSERT-SUCC: Kernel test end.
// ASSERT-FAIL: Backtrace in Panic.*

在CI中集成检查

CI runner 仅运行两个顶层目标,defaultcheck_all。要在 CI 期间运行检查,你必须将你的检查器目标放入顶层 BUILD.gncheck_all 组的 deps 里。

group("check_all") {
  deps = [ ":check_kernel" ]
}