From 90b2bdb9b11bdeb51e56a4edc7787b753a2b084b Mon Sep 17 00:00:00 2001 From: Reactor Scram Date: Fri, 23 Feb 2024 10:14:20 -0600 Subject: [PATCH] test(windows): make sure files are written to the right paths during smoke tests (#3727) I will need to set up the same paths for Linux, (#3734) and I want an automated test to make sure everything gets into the right directories. --------- Signed-off-by: Reactor Scram --- rust/gui-client/src-tauri/src/client.rs | 5 +++++ rust/gui-client/src-tauri/src/client/gui.rs | 3 +++ .../src-tauri/src/client/settings.rs | 20 +++++++++---------- .../src-tauri/src/client/wintun_install.rs | 2 ++ scripts/tests/smoke-test-gui-windows.sh | 15 ++++++++++++++ 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/rust/gui-client/src-tauri/src/client.rs b/rust/gui-client/src-tauri/src/client.rs index 459029bd9..a0b49e29c 100644 --- a/rust/gui-client/src-tauri/src/client.rs +++ b/rust/gui-client/src-tauri/src/client.rs @@ -97,6 +97,11 @@ pub(crate) fn run() -> Result<()> { Ok(()) } Some(Cmd::SmokeTest) => { + // Check for elevation. This also ensures wintun.dll is installed. + if !elevation::check()? { + anyhow::bail!("`smoke-test` must be run with elevated permissions"); + } + let result = gui::run(&cli); if let Err(error) = &result { // In smoke-test mode, don't show the dialog, since it might be running diff --git a/rust/gui-client/src-tauri/src/client/gui.rs b/rust/gui-client/src-tauri/src/client/gui.rs index 41d46ef10..7236f514b 100644 --- a/rust/gui-client/src-tauri/src/client/gui.rs +++ b/rust/gui-client/src-tauri/src/client/gui.rs @@ -297,6 +297,9 @@ async fn smoke_test(ctlr_tx: CtlrTx) -> Result<()> { tracing::info!("Will quit on purpose in {delay} seconds as part of the smoke test."); let quit_time = tokio::time::Instant::now() + Duration::from_secs(delay); + // Write the settings so we can check the path for those + settings::apply_advanced_settings_inner(&settings::AdvancedSettings::default()).await?; + // Test log exporting let path = connlib_shared::windows::app_local_data_dir() .context("`app_local_data_dir` failed")? diff --git a/rust/gui-client/src-tauri/src/client/settings.rs b/rust/gui-client/src-tauri/src/client/settings.rs index 8384e819e..be1341010 100644 --- a/rust/gui-client/src-tauri/src/client/settings.rs +++ b/rust/gui-client/src-tauri/src/client/settings.rs @@ -54,7 +54,10 @@ pub(crate) async fn apply_advanced_settings( managed: tauri::State<'_, Managed>, settings: AdvancedSettings, ) -> Result<(), String> { - apply_advanced_settings_inner(managed.inner(), &settings) + if managed.inner().inject_faults { + tokio::time::sleep(Duration::from_secs(2)).await; + } + apply_advanced_settings_inner(&settings) .await .map_err(|e| e.to_string()) } @@ -64,8 +67,10 @@ pub(crate) async fn reset_advanced_settings( managed: tauri::State<'_, Managed>, ) -> Result { let settings = AdvancedSettings::default(); - - apply_advanced_settings_inner(managed.inner(), &settings) + if managed.inner().inject_faults { + tokio::time::sleep(Duration::from_secs(2)).await; + } + apply_advanced_settings_inner(&settings) .await .map_err(|e| e.to_string())?; @@ -87,17 +92,10 @@ pub(crate) async fn get_advanced_settings( Ok(rx.await.unwrap()) } -pub(crate) async fn apply_advanced_settings_inner( - managed: &Managed, - settings: &AdvancedSettings, -) -> Result<()> { +pub(crate) async fn apply_advanced_settings_inner(settings: &AdvancedSettings) -> Result<()> { let DirAndPath { dir, path } = advanced_settings_path()?; tokio::fs::create_dir_all(&dir).await?; tokio::fs::write(path, serde_json::to_string(&settings)?).await?; - - if managed.inject_faults { - tokio::time::sleep(Duration::from_secs(2)).await; - } Ok(()) } diff --git a/rust/gui-client/src-tauri/src/client/wintun_install.rs b/rust/gui-client/src-tauri/src/client/wintun_install.rs index 38b44a0b8..f1eb283ec 100644 --- a/rust/gui-client/src-tauri/src/client/wintun_install.rs +++ b/rust/gui-client/src-tauri/src/client/wintun_install.rs @@ -42,6 +42,8 @@ pub(crate) fn ensure_dll() -> Result { // The DLL path should always have a parent let dir = path.parent().ok_or(Error::DllPathInvalid)?; std::fs::create_dir_all(dir).map_err(|_| Error::CreateDirAll)?; + + // TODO: This log never shows up because `tracing` isn't started when we install wintun.dll tracing::info!(?path, "wintun.dll path"); // This hash check is not meant to protect against attacks. It only lets us skip redundant disk writes, and it updates the DLL if needed. diff --git a/scripts/tests/smoke-test-gui-windows.sh b/scripts/tests/smoke-test-gui-windows.sh index b2466621c..4a6cdb944 100755 --- a/scripts/tests/smoke-test-gui-windows.sh +++ b/scripts/tests/smoke-test-gui-windows.sh @@ -7,9 +7,24 @@ BUNDLE_ID="dev.firezone.client" DUMP_PATH="$LOCALAPPDATA/$BUNDLE_ID/data/logs/last_crash.dmp" PACKAGE=firezone-gui-client +if [[ -z "$ProgramData" ]]; then + echo "The env var \$ProgramData should be set to \`C:\ProgramData\` or similar" + exit 1 +fi + +# Make sure the files we want to check don't exist on the system yet +stat "$LOCALAPPDATA/$BUNDLE_ID" && exit 1 +stat "$ProgramData/$BUNDLE_ID" && exit 1 + # Run the smoke test normally cargo run -p "$PACKAGE" -- smoke-test +# Make sure the files were written in the right paths +stat "$LOCALAPPDATA/$BUNDLE_ID/config/advanced_settings.json" +stat "$LOCALAPPDATA/$BUNDLE_ID/data/logs/"connlib*log +stat "$LOCALAPPDATA/$BUNDLE_ID/data/wintun.dll" +stat "$ProgramData/$BUNDLE_ID/config/device_id.json" + # Delete the crash file if present rm -f "$DUMP_PATH"