總覽
驗證器系統會傳送 FIDL 指令來控制「傀儡」程式,該程式會叫用程式庫功能來修改驗證器隨後評估的某些狀態。如要進一步瞭解 Inspect Validator,請參閱 README。
Puppet 包含以下部分:
- 提供 FIDL 通訊協定。
- 解壓縮通訊協定並發出程式庫呼叫。
- 建構包含 Puppet 和驗證器程式的整合測試。
本文主要介紹位於 //src/diagnostics/validator/inspect/lib/rust/src/main.rs 的 Inspect 驗證工具 Rust Puppet。
FIDL 設計
Inspect Puppet 的 FIDL 通訊協定定義於 //src/diagnostics/validator/inspect/fidl/inspect_puppet.fidl。 FIDL 通訊協定與 Inspect 程式庫 API 中的函式密切相關,後者定義了要套用至任何 Inspect API 實作項目的動作。FIDL API 的編寫方式與 Rust API 對應。
(注意:檢查 API 可以與 Rust API 不同,這類 API 可能需要修改 Puppet 程式碼架構)。
提供 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 的雜湊圖會儲存 Inspect 程式庫傳回的值。Rust 是一種 RAII 語言,會在記憶體參照遺失時自動清理,因此如果無法儲存節點或屬性,就會立即刪除該節點或屬性。此外,儲存屬性後,您就能根據 FIDL 指令更新屬性值。
測試和建構系統
驗證工具和 Puppet 組合應能進行封閉式整合測試。
依附元件和名稱
驗證器的 BUILD.gn 檔案定義了 validator_bin 目標,Rust puppet 的 BUILD.gn 檔案會將該目標做為 test_package() (名為 inspect_validator_test_rust) 的依附元件,而該 test_package() 是用於測試 Rust puppet。
Rust Puppet 本身是元件。該建構規則會產生 inspect_validator_rust_puppet,並包含在 fuchsia_unittest_package() 的二進位檔中。
驗證工具的 Build.gn 檔案中的 validator_bin 目標包含在 fuchsia_unittest_package() 的 deps 中。
CQ/CI
在 group("tests") 的 BUILD.gn 中,將 inspect_validator_test_rust 放入 deps,即可輕鬆將 inspect_validator/lib/rust:tests 納入 src/diagnostics/BUILD.gn 的 group("tests") deps。建構系統會擷取這項資訊,並在 CQ 和 CI 中執行 Inspect 驗證器 Rust Puppet 測試。
中繼 .cml 檔案
//src/diagnostics/validator/inspect/meta 中有下列 CML 檔案:
-
允許執行 Puppet 二進位檔、使用記錄器和 Inspect,以及提供 Validate 通訊協定。
-
use: protocol:指定驗證器需要執行的服務。fuchsia.diagnostics.ArchiveAccessor讓它讀取傀儡發布的檢查資料。diagnostics.validate.InspectPuppet則可控制木偶。
children: name: "puppet"會將人偶放在元件階層中。children: url: "#meta/puppet.cm"可讓系統找到並載入傀儡。- 才能查看傀儡的記錄。
offer: protocol: "fuchsia.logger.LogSink" - 為每個傀儡提供驗證器所需的結構化設定。
-
定義執行 Inspect Validator 測試管理工具所需的功能,該工具是驗證工具和元件的父項。
這些分片會由每個傀儡目錄中的傀儡和驗證器 CML 檔案使用,或是由測試管理員使用。目前有 2 個木偶:
驗證器控制器的 CML 會在 fuchsia_unittest_package() (適用於 Rust 或 C++) 或 fuchsia_unittest_component() (適用於 Go) 的 manifest 鍵中參照。