ffx
是專為開發人員設計,因此會檢查目前環境的設定,並在背景啟動 Daemon,協調與 Fuchsia 裝置的通訊。這會讓編寫使用 ffx
的自動化測試變得更加複雜,因為必須隔離設定和 Daemon,以避免測試之間的副作用或乾擾全域環境。
如要解決這個問題,ffx
可在獨立環境中執行,以便在整合測試中使用。
手動隔離設定
為此,ffx
支援使用隔離目錄。這項功能會指定 ffx
執行的新獨立環境,包括使用者層級設定。這個目錄中也會建立 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
來建立隔離目錄,並與隔離目錄互動。
隔離程式庫會自動遵循上述手動設定指南,並在推送時清除隔離目錄。
初始化測試的全域結構定義
為了避免從主機環境初始化全域結構定義,測試需要建立測試環境來初始化全域資料。傳回值時會清除環境,因此環境必須在測試的整個生命週期內。
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
值和預設值是透過 ffx config
指令列進行設定:
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__
環境變數,並將其設為設定中的預設目標。
Analytics (分析) 設定
隔離功能會透過設定停用數據分析資料收集功能。