總覽
驗證工具系統會傳送 FIDL 指令來控制「puppet」程式,並叫用程式庫功能修改「驗證工具」進行評估的某些狀態。如要進一步瞭解檢查驗證工具,請參閱 README。
Puppet 包含以下部分:
- 提供 FIDL 通訊協定。
- 解壓縮通訊協定並發出程式庫呼叫。
- 建立包含 Puppet 和 驗證工具計畫的整合測試。
本文件重點說明位於 //src/diagnostics/validator/inspect/lib/rust/src/main.rs 的檢查驗證工具 Rust Puppet。
FIDL 設計
檢查 Puppet 的 FIDL 通訊協定是在 //src/diagnostics/validator/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
(檢查程式庫的進入點物件)、nodes
的雜湊對應,以及 properties
的雜湊對應。它會實作一個函式 act()
,其中包含巨大的 match
陳述式 (其他語言的「switch」或「case」),以叫用程式庫實作的每個動作。針對程式庫不支援的動作,小狗可以回報 Unimplemented
。
驗證工具叫用每個動作後,就會測試程式庫在 VMO 上的作用。程式庫應處理動作的效果,以便驗證工具看到這些動作的效果。
nodes
和 properties
的雜湊對應儲存值,會由檢查程式庫傳回。由於 Rust 是一種 RAII 語言,會在參考記憶體遺失時自動清理,若無法儲存節點或屬性,可能會導致該節點或屬性立即遭到刪除。此外,儲存屬性可讓您更新其值,以回應 FIDL 指令。
測試與建構系統
驗證工具和 Puppet 組合應進行密封整合測試。
依附元件和名稱
Validator 的 BUILD.gn 檔案定義了 validator_bin
目標,該目標由 Rust puppet 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
將 inspect_validator_test_rust
放在 group("tests")
的 deps
中 BUILD.gn 即可輕鬆將 inspect_validator/lib/rust:tests
加入 src/diagnostics/BUILD.gn 的 group("tests")
中。deps
建構系統會擷取這項資訊,並導致檢查驗證工具 Rust Puppet 測試在 CQ 和 CI 中執行。
Meta .cml 檔案
//src/diagnostics/validator/inspect/meta 包含下列 CML 檔案:
-
讓 Puppet 二進位檔執行、使用記錄器和檢查,並提供 Verify 通訊協定。
-
use: protocol:
會指定驗證工具需要執行的服務。fuchsia.diagnostics.ArchiveAccessor
可讀取布偶已發布的檢查資料。diagnostics.validate.InspectPuppet
可控制木偶。
children: name: "puppet"
會將木偶放到元件階層中。children: url: "#meta/puppet.cm"
可讓系統找到並載入木偶。- 需要
offer: protocol: "fuchsia.logger.LogSink"
才能顯示布偶的記錄。 - 為各個小狗提供驗證工具的必要結構化設定。
-
定義執行「檢查驗證工具」測試管理工具所需的功能,這是驗證工具及元件的父項。
這些資料分割會由 Puppet 和驗證者的 CML 檔案在每個 puppet 目錄中使用,或由測試管理員使用。目前有 4 隻木偶:
驗證工具控制器的 CML 是以 fuchsia_unittest_package()
(適用於 Rust 或 C++) 或 fuchsia_unittest_component()
(適用於 Go) 的 manifest
金鑰來表示。