Skip to content

Commit d7b0b09

Browse files
authored
[rust] Fix local architecture discovery in Selenium Manager (SeleniumHQ#11611)
* [rust] Fix local architecture discovery in Selenium Manager * [rust] Enhance uname execution to detect ARM architectures
1 parent 201f528 commit d7b0b09

File tree

3 files changed

+40
-17
lines changed

3 files changed

+40
-17
lines changed

rust/src/config.rs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@
1616
// under the License.
1717

1818
use crate::config::OS::{LINUX, MACOS, WINDOWS};
19-
use crate::REQUEST_TIMEOUT_SEC;
2019
use crate::TTL_BROWSERS_SEC;
2120
use crate::TTL_DRIVERS_SEC;
2221

23-
use std::env::consts::{ARCH, OS};
22+
use crate::{
23+
format_one_arg, run_shell_command, ENV_PROCESSOR_ARCHITECTURE, REQUEST_TIMEOUT_SEC,
24+
UNAME_COMMAND,
25+
};
26+
use std::env;
27+
use std::env::consts::{OS};
28+
29+
pub const ARM64_ARCH: &str = "arm64";
2430

2531
pub struct ManagerConfig {
2632
pub browser_version: String,
@@ -36,11 +42,27 @@ pub struct ManagerConfig {
3642

3743
impl ManagerConfig {
3844
pub fn default() -> ManagerConfig {
45+
let self_os = OS;
46+
let self_arch = if WINDOWS.is(self_os) {
47+
env::var(ENV_PROCESSOR_ARCHITECTURE).unwrap_or_default()
48+
} else {
49+
let uname_a = format_one_arg(UNAME_COMMAND, "a");
50+
if run_shell_command(self_os, uname_a)
51+
.unwrap_or_default()
52+
.to_ascii_lowercase()
53+
.contains(ARM64_ARCH)
54+
{
55+
ARM64_ARCH.to_string()
56+
} else {
57+
let uname_m = format_one_arg(UNAME_COMMAND, "m");
58+
run_shell_command(self_os, uname_m).unwrap_or_default()
59+
}
60+
};
3961
ManagerConfig {
4062
browser_version: "".to_string(),
4163
driver_version: "".to_string(),
42-
os: OS.to_string(),
43-
arch: ARCH.to_string(),
64+
os: self_os.to_string(),
65+
arch: self_arch,
4466
browser_path: "".to_string(),
4567
proxy: "".to_string(),
4668
timeout: REQUEST_TIMEOUT_SEC,
@@ -107,15 +129,16 @@ pub enum ARCH {
107129
}
108130

109131
impl ARCH {
110-
pub fn to_str(&self) -> &str {
132+
pub fn to_str_vector(&self) -> Vec<&str> {
111133
match self {
112-
ARCH::X32 => "x86",
113-
ARCH::X64 => "x86_64",
114-
ARCH::ARM64 => "aarch64",
134+
ARCH::X32 => vec!["x86", "i386"],
135+
ARCH::X64 => vec!["x86_64", "x64", "i686", "amd64", "ia64"],
136+
ARCH::ARM64 => vec![ARM64_ARCH, "aarch64", "arm"],
115137
}
116138
}
117139

118140
pub fn is(&self, arch: &str) -> bool {
119-
self.to_str().eq_ignore_ascii_case(arch)
141+
self.to_str_vector()
142+
.contains(&arch.to_ascii_lowercase().as_str())
120143
}
121144
}

rust/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,13 @@ pub const DASH_DASH_VERSION: &str = "{} --version";
6969
pub const ENV_PROGRAM_FILES: &str = "PROGRAMFILES";
7070
pub const ENV_PROGRAM_FILES_X86: &str = "PROGRAMFILES(X86)";
7171
pub const ENV_LOCALAPPDATA: &str = "LOCALAPPDATA";
72+
pub const ENV_PROCESSOR_ARCHITECTURE: &str = "PROCESSOR_ARCHITECTURE";
7273
pub const FALLBACK_RETRIES: u32 = 5;
7374
pub const WHERE_COMMAND: &str = "where {}";
7475
pub const WHICH_COMMAND: &str = "which {}";
7576
pub const TTL_BROWSERS_SEC: u64 = 0;
7677
pub const TTL_DRIVERS_SEC: u64 = 86400;
78+
pub const UNAME_COMMAND: &str = "uname -{}";
7779

7880
pub trait SeleniumManager {
7981
// ----------------------------------------------------------
@@ -171,13 +173,11 @@ pub trait SeleniumManager {
171173
break;
172174
}
173175
if !self.is_safari() {
174-
metadata
175-
.browsers
176-
.push(create_browser_metadata(
177-
browser_name,
178-
&browser_version,
179-
browser_ttl,
180-
));
176+
metadata.browsers.push(create_browser_metadata(
177+
browser_name,
178+
&browser_version,
179+
browser_ttl,
180+
));
181181
write_metadata(&metadata, self.get_logger());
182182
}
183183
if !browser_version.is_empty() {

rust/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ use exitcode::{DATAERR, UNAVAILABLE};
2525

2626
use selenium_manager::logger::Logger;
2727
use selenium_manager::REQUEST_TIMEOUT_SEC;
28-
use selenium_manager::TTL_DRIVERS_SEC;
2928
use selenium_manager::TTL_BROWSERS_SEC;
29+
use selenium_manager::TTL_DRIVERS_SEC;
3030
use selenium_manager::{
3131
clear_cache, get_manager_by_browser, get_manager_by_driver, SeleniumManager,
3232
};

0 commit comments

Comments
 (0)