概览
验证器系统会发送 FIDL 命令来控制“傀儡”程序,该程序会调用库功能来修改验证器随后评估的某些状态。如需详细了解 Inspect 验证器,请参阅 README。
傀儡包含以下部分:
- 提供 FIDL 协议。
- 解压缩协议并进行库调用。
- 构建包含傀儡和验证器程序的集成测试。
本文档重点介绍位于 //src/diagnostics/validator/inspect/lib/rust/src/main.rs 的 Inspect 验证器 Rust 傀儡。
FIDL 设计
Inspect 傀儡的 FIDL 协议在 //src/diagnostics/validator/inspect/fidl/inspect_puppet.fidl 中定义。 FIDL 协议与 Inspect 库 API 中的函数紧密对应,该 API 定义了要应用于任何 Inspect API 实现的操作。FIDL API 的编写与 Rust API 相对应。
(注意:Inspect API 可以与 Rust API 不同;此类 API 可能需要修改傀儡代码架构。)
提供 FIDL
main() 函数执行样板代码,以通过 run_driver_service() 提供单个 FIDL 客户端,该函数会从 FIDL
流接收 Initialize 或 Act 事件。Act 事件由 Actor 对象
维护控制 Inspect 库所需的状态。
Actor 和 Inspect 库
Actor 包含 Inspector(Inspect 库的入口点对象)、nodes 的哈希映射和 properties
的哈希映射。它实现了一个函数 act(),其中包含一个巨大的 match 语句(在其他语言中为“switch”或“case”),用于调用库实现的每个操作。
对于库不支持的操作,傀儡可以报告
Unimplemented。
验证器调用每个操作后,它将测试库对 VMO 的影响。库应处理操作效果的传播,以便验证器可以看到这些效果。
nodes 和 properties 的哈希映射存储由 Inspect 库返回的值。由于 Rust 是一种 RAII
语言,当内存引用丢失时会自动清理,因此如果未能存储节点或属性,会导致立即删除该节点或属性。此外,存储属性还允许响应 FIDL 命令来更新其值。
测试和构建系统
验证器和傀儡的组合应进行密封集成测试。
依赖项和名称
验证器的 BUILD.gn 文件
定义了一个 validator_bin 目标,
Rust 傀儡的 BUILD.gn 文件
将其用作名为 inspect_validator_test_rust 的 test_package() 的依赖项,
该依赖项是执行 Rust 傀儡的测试。
Rust 傀儡本身就是
一个组件。
该构建规则会生成 inspect_validator_rust_puppet,该规则包含在
fuchsia_unittest_package() 的二进制文件中。
验证器的 Build.gn 文件
中的 validator_bin 目标包含在
fuchsia_unittest_package() 的 deps 中。
CQ/CI
将其
BUILD.gn
中的 inspect_validator_test_rust 放入 group("tests") 的 deps 中,可以轻松地将 inspect_validator/lib/rust:tests 放入 src/diagnostics/BUILD.gn 的
group("tests") 的 deps 中。构建系统会选择此项,并导致在 CQ 和 CI 中运行 Inspect 验证器 Rust
傀儡测试。
元 .cml 文件
//src/diagnostics/validator/inspect/meta 中包含以下 CML 文件:
-
允许傀儡二进制文件运行、使用记录器和 Inspect,并提供验证协议。
-
use: protocol:指定验证器运行所需的服务。fuchsia.diagnostics.ArchiveAccessor允许验证器读取傀儡发布的 Inspect 数据。diagnostics.validate.InspectPuppet允许验证器控制傀儡。
children: name: "puppet"将傀儡放置在组件层次结构中。children: url: "#meta/puppet.cm"允许查找和加载傀儡。- 需要
offer: protocol: "fuchsia.logger.LogSink"才能显示傀儡的日志。 - 为每个傀儡的验证器提供必要的结构化配置。
-
定义运行 Inspect 验证器测试管理器(验证器和组件的父级)所需的功能。
这些分片由每个傀儡目录中傀儡和验证器的 CML 文件使用,或由测试管理器使用。目前有 2 个傀儡:
验证器控制器的 CML 在 fuchsia_unittest_package()(对于 Rust 或 C++)或
fuchsia_unittest_component()(对于 Go)的 manifest 键中引用。