ffx
主要專為開發人員設計,因此會檢查目前的環境
設定並在背景啟動 Daemon 以協調通訊
與 Fuchsia 裝置搭配使用。因此更難以編寫會使用
ffx
,因為必須隔離設定和 Daemon,以免出現
不同測試間的差異或乾擾全球環境造成的干擾
為修正這個問題,ffx
可在獨立環境中執行,以在
整合測試
手動隔離設定
為了達到這種隔離效果,ffx
支援使用隔離目錄。這項功能
指定要執行 ffx
的新獨立環境 (包括使用者層級)
此外還會從 0 自動調整資源配置
您完全不必調整資源調度設定ascendd
通訊端是連線至 ffx
Daemon 的連線
建立了這個目錄
所有使用隔離功能的 ffx
叫用都必須在 ffx
指令列中,透過
--isolate-dir
選項。您也可以透過設定 __FFX_ISOLATE_DIR__
來指定這項設定。
環境變數
以下虛擬殼層指令碼會詳細資料設定步驟和指令,
確保 ffx
是密封的:
# Write all configuration and state to the isolate directory, using mktemp or
# something similar.
export FFX_ISOLATE_DIR = ...
# Disable analytics:
ffx config set ffx.analytics.disabled true
# Don't discover devices via mDNS:
ffx config set discovery.mdns.enabled false
# Don't discover fastboot devices connected via USB:
ffx config set fastboot.usb.disabled true
# Require manual process management for the daemon:
ffx config set daemon.autostart false
# If needed, start daemon:
# ffx outputs log files under $FUCHSIA_TEST_OUTDIR/ffx_logs by default.
LOG_DIR = "$FUCHSIA_TEST_OUTDIR/ffx_logs"
# Redirect stdout and stderr to the log file
ffx daemon start > "$LOG_DIR/ffx.daemon.log" 2> "$LOG_DIR/ffx.daemon.log" &
# If interacting with a device:
ffx config target.default "$FUCHSIA_DEVICE_ADDR"
ffx target add "$FUCHSIA_DEVICE_ADDR"
測試完成後,測試作者需要清理隔離目錄。刪除中
關閉 Daemon。ffx daemon stop
是建議選項,但並非必要。殺手
我們不建議使用 Daemon 程序,因為可能會在記錄檔中留下資訊。
樹狀結構內 Rust 隔離程式庫
在 Fuchsia 原始碼樹狀結構中,使用 Rust 程式設計語言的開發人員應使用
測試 //src/developer/ffx/lib/isolate
,以呈現與互動
與隔離目錄互動
隔離程式庫會自動遵循上述的手動設定指南,並清除 放置時仍能隔離目錄
初始化測試的全域結構定義
為避免在主機環境中初始化全域結構定義,測試需要建立 用於初始化全域資料的測試環境。當 Pod 使用容器時 傳回的值,因此必須在測試生命週期內。
let test_env = ffx_config::test_init().await?;
建立隔離機制
視環境而定,建立新區隔的方法有兩種
執行 ffx 作業針對在樹狀結構內測試和
依賴建構輸出目錄結構,請使用 Isolate::new_in_test()
。
如果是 ffx 子工具或以 SDK 為基礎的測試,請使用
Isolate::new_in_sdk()
。
如果測試與外部佈建裝置互動,
您也應傳入 SSH 私密金鑰。如果測試會初始化
系統會視需要產生安全殼層金鑰
金鑰的儲存位置路徑
隔離目錄時,系統會清理隔離目錄 因此在整個測試中必須持續運作
範例 Isolate::new_in_test()
let test_case_name = "my test";
let ssh_path = std::env::var("FUCHSIA_SSH_KEY").unwrap().into();
let test_env = ffx_config::test_init().await
.expect("Setting up test environment");
// This takes advantage of knowing that Rust tests are down one level from the
// build output root directory.
let build_root =
std::env::current_exe().unwrap().canonicalize().unwrap().parent().unwrap().to_owned();
let isolate = ffx_isolate::Isolate::new_in_test(test_case_name,
build_root,
ssh_path,
&test_env.context).await
.expect("create isolate");
Isolate::new_in_sdk() 範例
let test_case_name = "my test";
let ssh_path = std::env::var("FUCHSIA_SSH_KEY").unwrap().into();
let test_env = ffx_config::test_init().await
.expect("Setting up test environment");
let isolate = ffx_isolate::Isolate::new_with_sdk(test_case_name, ssh_path, &test_env.context)
.await
.expect("create isolate");
啟動 ffx Daemon
ffx
Daemon 必須透過 Isolate::start_daemon()
方法手動啟動。非
所有指令都需要用到 Daemon,而一些指令 (例如 ffx config set
) 可能需要
在啟動 Daemon 之前執行
let _ = isolate.start_daemon().await?;
注意:直接執行 ffx daemon start
並不會啟動可正常運作的 Daemon。
執行 ffx 指令
如要在隔離環境執行指令,系統會使用 Isolate::ffx()
方法。
此包裝函式會將正確的選項新增至 ffx 指令列中,以便使用隔離目錄。
let output = isolate.ffx(&["target", "list"]).await?;
隔離內部的設定
請使用 ffx config
設定隔離中 ffx
的值和預設值
指令列:
let args = ["config", "set", "ssh.pub", &path_to_ssh_authorized_keys.to_string_lossy()];
let output = isolate.ffx(&args).await?;
記錄檔
使用隔離時,系統會在建立隔離時設定 ffx
的記錄檔路徑。
常見做法是透過測試架構設定環境變數
__FUCHSIA_TEST_OUTDIR__
用於需要以測試輸出內容形式存取的檔案。
如果已設定記錄目錄,則會在 __FUCHSIA_TEST_OUTDIR__
的子目錄中建立。
使用 log_dir()
存取記錄目錄的路徑。
let log_dir = isolate.log_dir();
預設目標
某些測試架構可能會分配裝置來執行測試。隔離會讀取
__FUCHSIA_DEVICE_ADDR__
環境變數,並將其設為
此外還會從 0 自動調整資源配置
您完全不必調整資源調度設定
Analytics 設定
隔離後,系統會透過設定停用分析資料收集功能。