diff --git a/rust/src/lib.rs b/rust/src/lib.rs index a9a83ac99d543..d48e6ff7a428a 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -514,6 +514,7 @@ pub trait SeleniumManager { } if !download_browser && !self.is_electron() { let major_browser_version = self.get_major_browser_version(); + let original_browser_path = self.get_browser_path().to_string(); match self.discover_browser_version()? { Some(discovered_version) => { if !self.is_safari() { @@ -526,6 +527,16 @@ pub trait SeleniumManager { if self.is_browser_version_specific() && !self.get_browser_version().eq(&discovered_version) { + if !original_browser_path.is_empty() { + return Err(anyhow!(format!( + "The browser at {} has version {} but {} {} was requested; \ + remove --browser-path to allow a browser download", + original_browser_path, + discovered_version, + self.get_browser_name(), + self.get_browser_version(), + ))); + } download_browser = true; } else { let discovered_major_browser_version = self diff --git a/rust/tests/browser_tests.rs b/rust/tests/browser_tests.rs index a0913e092c661..2162d4a865f2c 100644 --- a/rust/tests/browser_tests.rs +++ b/rust/tests/browser_tests.rs @@ -20,6 +20,8 @@ use crate::common::{assert_output, get_selenium_manager, get_stdout}; use exitcode::DATAERR; use rstest::rstest; use std::env::consts::OS; +#[cfg(unix)] +use std::os::unix::fs::PermissionsExt; use std::path::Path; mod common; @@ -160,3 +162,44 @@ fn invalid_browser_path_test() { .code(DATAERR) .failure(); } + +#[cfg(unix)] +fn create_fake_browser(version: &str) -> std::path::PathBuf { + let tmp = std::env::temp_dir().join(format!("fake-chrome-{}", version.replace('.', "-"))); + let script = format!("#!/bin/sh\necho 'Google Chrome {}'\n", version); + std::fs::write(&tmp, script).expect("Unable to write fake browser script"); + std::fs::set_permissions(&tmp, std::fs::Permissions::from_mode(0o755)) + .expect("Unable to set executable bit"); + tmp +} + +#[test] +#[cfg(unix)] +fn browser_path_version_mismatch_test() { + let fake_browser = create_fake_browser("131.0.6778.264"); + let mut cmd = get_selenium_manager(); + let stdout = cmd + .args([ + "--browser", + "chrome", + "--browser-path", + fake_browser.to_str().unwrap(), + "--browser-version", + "999.0.0.0", + "--debug", + ]) + .assert() + .get_output() + .stdout + .clone(); + let stdout_str = std::str::from_utf8(&stdout).unwrap(); + // The mismatch is always reported, either as ERROR (no cached driver) or WARN (fallback used) + assert!( + stdout_str.contains("131.0.6778.264"), + "Should mention detected version" + ); + assert!( + stdout_str.contains("999.0.0.0"), + "Should mention requested version" + ); +}