From de5e3b243f747f6417af11b219e6cb52177707e4 Mon Sep 17 00:00:00 2001 From: Dennis Ameling Date: Sat, 12 Jul 2025 13:45:06 +0200 Subject: [PATCH 1/3] [rust] Enable tests in GitHub Actions on Linux arm64 Now that GitHub-hosted Linux arm64 runners are available, we can start using them to test the Selenium Manager code. --- .github/workflows/ci-rust.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-rust.yml b/.github/workflows/ci-rust.yml index 6b165b69cc05f..ff0dc40890ef6 100644 --- a/.github/workflows/ci-rust.yml +++ b/.github/workflows/ci-rust.yml @@ -35,6 +35,7 @@ jobs: include: - os: macos - os: ubuntu + - os: ubuntu-24.04-arm - os: windows with: name: Tests (${{ matrix.os }}) From a88d4e16594a37fd648bddd2be1550989b3f080b Mon Sep 17 00:00:00 2001 From: Dennis Ameling Date: Sat, 12 Jul 2025 15:17:16 +0200 Subject: [PATCH 2/3] [rust] Selenium Manager: Update tests to work with Linux arm64 Currently, only Firefox and Geckodriver have official support for Linux arm64. This commit ensures that the Selenium Manager test suite passes on this platform, by skipping tests on non- Firefox browsers. --- rust/src/chrome.rs | 2 ++ rust/src/edge.rs | 3 ++ rust/tests/browser_download_tests.rs | 39 +++++++++++++++----------- rust/tests/browser_tests.rs | 9 ++++++ rust/tests/cache_tests.rs | 1 + rust/tests/common.rs | 6 ++++ rust/tests/config_tests.rs | 5 ++++ rust/tests/exec_driver_tests.rs | 5 ++++ rust/tests/mirror_tests.rs | 4 +-- rust/tests/offline_tests.rs | 15 ++++++---- rust/tests/output_tests.rs | 41 +++++++++++++++++++--------- rust/tests/proxy_tests.rs | 14 +++++++--- rust/tests/stable_browser_tests.rs | 6 ++++ rust/tests/webview_tests.rs | 1 + 14 files changed, 111 insertions(+), 40 deletions(-) diff --git a/rust/src/chrome.rs b/rust/src/chrome.rs index 9467faa6d091b..1befde50d34cf 100644 --- a/rust/src/chrome.rs +++ b/rust/src/chrome.rs @@ -383,6 +383,8 @@ impl SeleniumManager for ChromeManager { } else { "mac64" } + } else if LINUX.is(os) && ARM64.is(arch) { + return Err(anyhow!("Linux arm64 is not supported yet by Google Chrome. Please try another browser.")); } else { "linux64" }; diff --git a/rust/src/edge.rs b/rust/src/edge.rs index 607c5174d696e..6d9f981cf5090 100644 --- a/rust/src/edge.rs +++ b/rust/src/edge.rs @@ -28,6 +28,7 @@ use crate::{ DASH_DASH_VERSION, DEV, ENV_PROGRAM_FILES_X86, NIGHTLY, OFFLINE_REQUEST_ERR_MSG, REG_PV_ARG, REG_VERSION_ARG, STABLE, }; +use anyhow::anyhow; use anyhow::Error; use reqwest::Client; use serde::{Deserialize, Serialize}; @@ -288,6 +289,8 @@ impl SeleniumManager for EdgeManager { } else { "mac64" } + } else if LINUX.is(os) && ARM64.is(arch) { + return Err(anyhow!("Linux arm64 is not supported yet by Google Chrome. Please try another browser.")); } else { "linux64" }; diff --git a/rust/tests/browser_download_tests.rs b/rust/tests/browser_download_tests.rs index 23214694a4218..a25dc8004a409 100644 --- a/rust/tests/browser_download_tests.rs +++ b/rust/tests/browser_download_tests.rs @@ -18,6 +18,7 @@ use crate::common::{assert_browser, assert_driver, get_selenium_manager}; use rstest::rstest; +use std::env::consts::ARCH; use std::env::consts::OS; mod common; @@ -27,23 +28,27 @@ mod common; #[case("firefox")] #[case("edge")] fn browser_latest_download_test(#[case] browser: String) { - if !browser.eq("edge") || !OS.eq("windows") { - let mut cmd = get_selenium_manager(); - cmd.args([ - "--browser", - &browser, - "--force-browser-download", - "--output", - "json", - "--debug", - ]) - .assert() - .success() - .code(0); - - assert_driver(&mut cmd); - assert_browser(&mut cmd); + if browser.eq("edge") && OS.eq("windows") { + return + } else if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") { + return } + + let mut cmd = get_selenium_manager(); + cmd.args([ + "--browser", + &browser, + "--force-browser-download", + "--output", + "json", + "--debug", + ]) + .assert() + .success() + .code(0); + + assert_driver(&mut cmd); + assert_browser(&mut cmd); } #[rstest] @@ -59,6 +64,8 @@ fn browser_latest_download_test(#[case] browser: String) { fn browser_version_download_test(#[case] browser: String, #[case] browser_version: String) { if OS.eq("windows") && browser.eq("edge") { println!("Skipping Edge download test on Windows since the installation requires admin privileges"); + } else if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") { + println!("Skipping non-Firefox download test on Linux arm64 since no other browsers are supported yet"); } else { let mut cmd = get_selenium_manager(); cmd.args([ diff --git a/rust/tests/browser_tests.rs b/rust/tests/browser_tests.rs index 13bf093a12564..c340b6ce9f833 100644 --- a/rust/tests/browser_tests.rs +++ b/rust/tests/browser_tests.rs @@ -19,6 +19,7 @@ use crate::common::{assert_output, get_selenium_manager, get_stdout}; use exitcode::DATAERR; use rstest::rstest; +use std::env::consts::ARCH; use std::env::consts::OS; use std::path::Path; @@ -40,6 +41,10 @@ fn browser_version_test( #[case] browser_version: String, #[case] driver_version: String, ) { + if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") { + return + } + let mut cmd = get_selenium_manager(); cmd.args([ "--browser", @@ -78,6 +83,10 @@ fn wrong_parameters_test( #[case] driver_version: String, #[case] error_code: i32, ) { + if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") { + return + } + let mut cmd = get_selenium_manager(); let result = cmd .args([ diff --git a/rust/tests/cache_tests.rs b/rust/tests/cache_tests.rs index 68478fb73826f..18ef1ad23aa4f 100644 --- a/rust/tests/cache_tests.rs +++ b/rust/tests/cache_tests.rs @@ -23,6 +23,7 @@ use std::path::Path; mod common; +#[cfg(not(all(target_os = "linux", target_arch = "aarch64")))] #[rstest] #[case("../tmp")] #[case("../áèîö")] diff --git a/rust/tests/common.rs b/rust/tests/common.rs index ae8c820b1d4e6..07693212370ba 100644 --- a/rust/tests/common.rs +++ b/rust/tests/common.rs @@ -23,6 +23,7 @@ use selenium_manager::logger::JsonOutput; use selenium_manager::shell; use selenium_manager::shell::run_shell_command_by_os; use std::borrow::BorrowMut; +use std::env::consts::ARCH; use std::env::consts::OS; use std::path::{Path, PathBuf}; @@ -119,3 +120,8 @@ pub fn assert_output( .contains(&error_code.to_string())); } } + +#[allow(dead_code)] +pub fn is_linux_arm64() -> bool { + OS == "linux" && ARCH == "aarch64" +} diff --git a/rust/tests/config_tests.rs b/rust/tests/config_tests.rs index df41f9c29bf01..087f412b7fa50 100644 --- a/rust/tests/config_tests.rs +++ b/rust/tests/config_tests.rs @@ -19,6 +19,8 @@ use crate::common::{assert_browser, assert_driver, get_selenium_manager, get_std use rstest::rstest; +use std::env::consts::ARCH; +use std::env::consts::OS; use std::fs::File; use std::io::{BufWriter, Write}; use tempfile::Builder; @@ -30,6 +32,9 @@ mod common; #[case("firefox")] #[case("edge")] fn config_test(#[case] browser_name: String) { + if OS.eq("linux") && ARCH.eq("aarch64") && !browser_name.eq("firefox") { + return + } let tmp_dir = Builder::new().prefix("sm-config-test").tempdir().unwrap(); let config_path = tmp_dir.path().join("se-config.toml"); let config_file = File::create(config_path.as_path()).unwrap(); diff --git a/rust/tests/exec_driver_tests.rs b/rust/tests/exec_driver_tests.rs index da6db43ecb304..137f48ad5e739 100644 --- a/rust/tests/exec_driver_tests.rs +++ b/rust/tests/exec_driver_tests.rs @@ -18,6 +18,7 @@ use crate::common::{assert_browser, assert_driver, exec_driver, get_selenium_manager}; use rstest::rstest; +use std::env::consts::ARCH; use std::env::consts::OS; mod common; @@ -28,6 +29,10 @@ mod common; #[case("firefox", "geckodriver")] #[case("iexplorer", "IEDriverServer")] fn exec_driver_test(#[case] browser_name: String, #[case] driver_name: String) { + if OS.eq("linux") && ARCH.eq("aarch64") && !browser_name.eq("firefox") { + return + } + let mut cmd = get_selenium_manager(); cmd.args(["--browser", &browser_name, "--output", "json"]) .assert() diff --git a/rust/tests/mirror_tests.rs b/rust/tests/mirror_tests.rs index 127fb37f17b86..9421544b19558 100644 --- a/rust/tests/mirror_tests.rs +++ b/rust/tests/mirror_tests.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -use crate::common::{assert_driver, get_selenium_manager}; +use crate::common::{assert_driver, is_linux_arm64, get_selenium_manager}; mod common; @@ -24,7 +24,7 @@ fn mirror_test() { let mut cmd = get_selenium_manager(); cmd.args([ "--browser", - "chrome", + if is_linux_arm64() { "firefox" } else { "chrome" }, "--driver-mirror-url", "https://registry.npmmirror.com/-/binary/chromedriver/", "--browser-version", diff --git a/rust/tests/offline_tests.rs b/rust/tests/offline_tests.rs index 2d1020a4532f3..e56ebf380600d 100644 --- a/rust/tests/offline_tests.rs +++ b/rust/tests/offline_tests.rs @@ -15,17 +15,22 @@ // specific language governing permissions and limitations // under the License. -use crate::common::{get_selenium_manager, get_stdout}; +use crate::common::{get_selenium_manager, get_stdout, is_linux_arm64}; mod common; #[test] fn offline_test() { let mut cmd = get_selenium_manager(); - cmd.args(["--debug", "--browser", "chrome", "--offline"]) - .assert() - .success() - .code(0); + cmd.args([ + "--debug", + "--browser", + if is_linux_arm64() { "firefox" } else { "chrome" }, + "--offline" + ]) + .assert() + .success() + .code(0); let stdout = get_stdout(&mut cmd); diff --git a/rust/tests/output_tests.rs b/rust/tests/output_tests.rs index 96eb7104c5d21..08ca20456f283 100644 --- a/rust/tests/output_tests.rs +++ b/rust/tests/output_tests.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -use crate::common::{get_selenium_manager, get_stderr, get_stdout}; +use crate::common::{get_selenium_manager, get_stderr, get_stdout, is_linux_arm64}; use selenium_manager::logger::{JsonOutput, MinimalJson, DRIVER_PATH}; use std::path::Path; @@ -25,10 +25,15 @@ mod common; #[test] fn json_output_test() { let mut cmd = get_selenium_manager(); - cmd.args(["--browser", "chrome", "--output", "json"]) - .assert() - .success() - .code(0); + cmd.args([ + "--browser", + if is_linux_arm64() { "firefox" } else { "chrome" }, + "--output", + "json" + ]) + .assert() + .success() + .code(0); let stdout = get_stdout(&mut cmd); @@ -45,10 +50,15 @@ fn json_output_test() { #[test] fn shell_output_test() { let mut cmd = get_selenium_manager(); - cmd.args(["--browser", "chrome", "--output", "shell"]) - .assert() - .success() - .code(0); + cmd.args([ + "--browser", + if is_linux_arm64() { "firefox" } else { "chrome" }, + "--output", + "shell" + ]) + .assert() + .success() + .code(0); let stdout = get_stdout(&mut cmd); assert!(stdout.contains(DRIVER_PATH)); @@ -57,10 +67,15 @@ fn shell_output_test() { #[test] fn mixed_output_test() { let mut cmd = get_selenium_manager(); - cmd.args(["--browser", "chrome", "--output", "mixed"]) - .assert() - .success() - .code(0); + cmd.args([ + "--browser", + if is_linux_arm64() { "firefox" } else { "chrome" }, + "--output", + "mixed" + ]) + .assert() + .success() + .code(0); let stdout = get_stdout(&mut cmd); let json: MinimalJson = serde_json::from_str(&stdout).unwrap(); diff --git a/rust/tests/proxy_tests.rs b/rust/tests/proxy_tests.rs index f66cc0a2b1037..41ce08866c642 100644 --- a/rust/tests/proxy_tests.rs +++ b/rust/tests/proxy_tests.rs @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -use crate::common::{assert_output, get_selenium_manager}; +use crate::common::{assert_output, get_selenium_manager, is_linux_arm64}; use exitcode::DATAERR; @@ -28,7 +28,7 @@ async fn wrong_proxy_test() { .args([ "--debug", "--browser", - "chrome", + if is_linux_arm64() { "firefox" } else { "chrome" }, "--proxy", "http://localhost:12345", ]) @@ -37,11 +37,17 @@ async fn wrong_proxy_test() { assert_output(&mut cmd, result, vec!["in PATH"], DATAERR); } + #[test] fn wrong_protocol_proxy_test() { let mut cmd = get_selenium_manager(); let result = cmd - .args(["--browser", "chrome", "--proxy", "wrong:://proxy"]) + .args([ + "--browser", + if is_linux_arm64() { "firefox" } else { "chrome" }, + "--proxy", + "wrong:://proxy" + ]) .assert() .try_success(); @@ -54,7 +60,7 @@ fn wrong_port_proxy_test() { let result = cmd .args([ "--browser", - "chrome", + if is_linux_arm64() { "firefox" } else { "chrome" }, "--proxy", "https:://localhost:1234567", ]) diff --git a/rust/tests/stable_browser_tests.rs b/rust/tests/stable_browser_tests.rs index c51ab8720889e..f059a7c1e2913 100644 --- a/rust/tests/stable_browser_tests.rs +++ b/rust/tests/stable_browser_tests.rs @@ -18,6 +18,8 @@ use crate::common::{assert_browser, assert_driver, get_selenium_manager}; use rstest::rstest; +use std::env::consts::ARCH; +use std::env::consts::OS; mod common; @@ -26,6 +28,10 @@ mod common; #[case("firefox")] #[case("edge")] fn stable_browser_test(#[case] browser_name: String) { + if OS.eq("linux") && ARCH.eq("aarch64") && !browser_name.eq("firefox") { + return + } + let mut cmd = get_selenium_manager(); cmd.args([ "--browser", diff --git a/rust/tests/webview_tests.rs b/rust/tests/webview_tests.rs index 1356f6973652e..7f89b7f302c41 100644 --- a/rust/tests/webview_tests.rs +++ b/rust/tests/webview_tests.rs @@ -19,6 +19,7 @@ use crate::common::{assert_driver, get_selenium_manager}; mod common; +#[cfg(not(all(target_os = "linux", target_arch = "aarch64")))] #[test] fn webview2_test() { let mut cmd = get_selenium_manager(); From 94b2d3500ec98e9fef95c977e241a8ac1e3b2e5a Mon Sep 17 00:00:00 2001 From: Dennis Ameling Date: Sat, 12 Jul 2025 15:50:33 +0200 Subject: [PATCH 3/3] Apply AI review suggestions --- rust/src/edge.rs | 2 +- rust/tests/browser_download_tests.rs | 4 ++-- rust/tests/browser_tests.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/src/edge.rs b/rust/src/edge.rs index 6d9f981cf5090..4c8bb388b4744 100644 --- a/rust/src/edge.rs +++ b/rust/src/edge.rs @@ -290,7 +290,7 @@ impl SeleniumManager for EdgeManager { "mac64" } } else if LINUX.is(os) && ARM64.is(arch) { - return Err(anyhow!("Linux arm64 is not supported yet by Google Chrome. Please try another browser.")); + return Err(anyhow!("Linux arm64 is not supported yet by Microsoft Edge. Please try another browser.")); } else { "linux64" }; diff --git a/rust/tests/browser_download_tests.rs b/rust/tests/browser_download_tests.rs index a25dc8004a409..b15bd2c14994e 100644 --- a/rust/tests/browser_download_tests.rs +++ b/rust/tests/browser_download_tests.rs @@ -29,9 +29,9 @@ mod common; #[case("edge")] fn browser_latest_download_test(#[case] browser: String) { if browser.eq("edge") && OS.eq("windows") { - return + return; } else if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") { - return + return; } let mut cmd = get_selenium_manager(); diff --git a/rust/tests/browser_tests.rs b/rust/tests/browser_tests.rs index c340b6ce9f833..0caea6843fbcc 100644 --- a/rust/tests/browser_tests.rs +++ b/rust/tests/browser_tests.rs @@ -42,7 +42,7 @@ fn browser_version_test( #[case] driver_version: String, ) { if OS.eq("linux") && ARCH.eq("aarch64") && !browser.eq("firefox") { - return + return; } let mut cmd = get_selenium_manager();