概览
验证器系统会发送 FIDL 命令来控制“puppet”程序,该程序会调用库功能来修改验证器随后评估的某些状态。如需详细了解检查验证工具,请参阅自述文件。
Puppet 包含以下部分:
- 提供 FIDL 协议。
- 解压缩协议并进行库调用。
- 构建包含 Puppet 和验证器程序的集成测试。
本文档重点介绍了位于 //src/diagnostics/Verifier/inspect/lib/rust/src/main.rs 的 Inspect Validator Rust Puppet。
FIDL 设计
用于检查 Puppet 的 FIDL 协议在 //src/diagnostics/Verifier/inspect/fidl/inspect_puppet.fidl 中定义。FIDL 协议与 Inspect Library API 中的函数密切相关,后者定义了要应用于任何 Inspect API 实现的操作。FIDL API 编写为与 Rust API 相对应。
(注意:检查 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”),以调用该库实现的每个操作。Puppet 可以针对库不支持的操作报告 Unimplemented
。
验证工具调用每个操作后,将测试库对 VMO 的影响。该库应负责传播操作的效果,以便验证器能够看到这些操作。
nodes
和 properties
的哈希映射会存储 Inspect 库返回的值。由于 Rust 是一种 RAII 语言,会在对内存的引用丢失时自动进行清理,因此未存储节点或属性会导致该节点或属性立即被删除。此外,存储属性还允许更新其值以响应 FIDL 命令。
测试和构建系统
验证器和 Puppet 的组合应进行封闭的集成测试。
依赖项和名称
验证器的 BUILD.gn 文件定义了一个 validator_bin
目标,Rust 木偶的 BUILD.gn 文件将其用作名为 inspect_validator_test_rust
的 test_package()
(用于执行 Rust 木偶的测试)的依赖项。
Rust puppet 本身是一个组件。
该构建规则会生成 inspect_validator_rust_puppet
,它包含在 fuchsia_unittest_package()
的二进制文件中。
验证工具的 Build.gn 文件中的 validator_bin
目标包含在 fuchsia_unittest_package()
的 deps
中。
CQ/CI
通过将 inspect_validator_test_rust
放在其 BUILD.gn 的 group("tests")
的 deps
中,您可以轻松地将 inspect_validator/lib/rust:tests
添加到 src/diagnostics/BUILD.gn 的 group("tests")
的 deps
中。构建系统将会获取此标识符,并使 Inspect Validator Rust Puppet 测试在 CQ 和 CI 中运行。
.cml Meta 文件
//src/diagnostics/Verifier/inspect/meta 中包含以下 CML 文件:
-
让 puppet 二进制文件运行,使用 logger 和 Inspect,然后提供 Verified 协议。
-
use: protocol:
指定验证工具需要运行的服务。fuchsia.diagnostics.ArchiveAccessor
允许读取 puppet 已发布的 Inspect 数据。diagnostics.validate.InspectPuppet
允许其控制木偶。
children: name: "puppet"
会将木偶置于组件层次结构中。children: url: "#meta/puppet.cm"
允许找到并加载木偶。- 若要显示 puppet 的日志,则需要
offer: protocol: "fuchsia.logger.LogSink"
。 - 为每个 Puppet 的验证程序提供必要的结构化配置。
-
定义运行 Inspect Validator 测试管理器所需的功能,该管理器是验证程序和组件的父级。
这些分片由每个 puppet 目录中的 puppet 和验证器的 CML 文件使用,或供测试管理器使用。目前有 4 种木偶:
验证器控制器的 CML 在 fuchsia_unittest_package()
(对于 Rust 或 C++)或 fuchsia_unittest_component()
(对于 Go)的 manifest
键中引用。