Skip to content
21 changes: 21 additions & 0 deletions rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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
Expand Down Expand Up @@ -570,6 +581,16 @@ pub trait SeleniumManager {
discovered_major_browser_version,
major_browser_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(),
)));
}
Comment thread
Delta456 marked this conversation as resolved.
download_browser = true;
} else {
self.set_browser_version(discovered_version);
Expand Down
74 changes: 74 additions & 0 deletions rust/tests/browser_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -160,3 +162,75 @@ 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"
);
}

#[test]
#[cfg(unix)]
fn browser_path_major_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",
"--debug",
])
.assert()
.get_output()
.stdout
.clone();
let stdout_str = std::str::from_utf8(&stdout).unwrap();
// Major-only version mismatch must also be reported
assert!(
stdout_str.contains("131.0.6778.264"),
"Should mention detected version"
);
assert!(
stdout_str.contains("999"),
"Should mention requested version"
);
}