Skip to content

Commit b7bd4c0

Browse files
bonigarciadiemol
andauthored
[rust] Use "stable" label for current stable browser version (#12422)
* [rust] Use "stable" label for current stable browser version * [rust] Update lock file * [rust] Refactor common module for tests --------- Co-authored-by: Diego Molina <[email protected]>
1 parent 60a054b commit b7bd4c0

12 files changed

Lines changed: 158 additions & 35 deletions

rust/Cargo.Bazel.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"checksum": "0a20f0fe60fda64d9bb35f8a482f95239754a053b83e53e92d2a259eab911369",
2+
"checksum": "45490f1b2f9461b7a6461df267ed0788d1783a8231446ca1b047d8db3e7a9a06",
33
"crates": {
44
"addr2line 0.19.0": {
55
"name": "addr2line",

rust/src/chrome.rs

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -449,15 +449,15 @@ impl SeleniumManager for ChromeManager {
449449
let major_browser_version_int =
450450
major_browser_version.parse::<i32>().unwrap_or_default();
451451
let driver_version =
452-
if !major_browser_version.is_empty() && major_browser_version_int < 115 {
452+
if self.is_browser_version_stable() || major_browser_version.is_empty() {
453+
// For discovering the latest driver version, the CfT endpoints are also used
454+
self.request_latest_driver_version_from_cft()?
455+
} else if !major_browser_version.is_empty() && major_browser_version_int < 115 {
453456
// For old versions (chromedriver 114-), the traditional method should work:
454457
// https://chromedriver.chromium.org/downloads
455458
self.request_driver_version_from_latest(
456459
self.create_latest_release_with_version_url(),
457460
)?
458-
} else if major_browser_version.is_empty() {
459-
// For discovering the latest driver version, the CfT endpoints are also used
460-
self.request_latest_driver_version_from_cft()?
461461
} else {
462462
// As of chromedriver 115+, the metadata for version discovery are published
463463
// by the "Chrome for Testing" (CfT) JSON endpoints:
@@ -481,6 +481,10 @@ impl SeleniumManager for ChromeManager {
481481
}
482482
}
483483

484+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
485+
Ok(Some(self.request_latest_browser_version_from_cft()?))
486+
}
487+
484488
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
485489
let major_driver_version = self
486490
.get_major_driver_version()
@@ -551,15 +555,14 @@ impl SeleniumManager for ChromeManager {
551555
}
552556

553557
fn download_browser(&mut self) -> Result<Option<PathBuf>, Box<dyn Error>> {
558+
let browser_version;
554559
let browser_name = self.browser_name;
555-
let browser_version_unstable = self.is_browser_version_unstable();
556560
let mut metadata = get_metadata(self.get_logger());
557-
let mut browser_version = self.get_browser_version().to_string();
558561
let major_browser_version = self.get_major_browser_version();
559562
let major_browser_version_int = major_browser_version.parse::<i32>().unwrap_or_default();
560563

561-
if !browser_version_unstable
562-
&& !major_browser_version.is_empty()
564+
if !self.is_browser_version_unstable()
565+
&& !self.is_browser_version_stable()
563566
&& major_browser_version_int < MIN_CHROME_VERSION_CFT
564567
{
565568
return Err(format_three_args(
@@ -587,13 +590,15 @@ impl SeleniumManager for ChromeManager {
587590
}
588591
_ => {
589592
// If not in metadata, discover version using Chrome for Testing (CfT) endpoints
590-
if browser_version.is_empty() {
593+
if self.is_browser_version_stable() {
591594
browser_version = self.request_latest_browser_version_from_cft()?;
592595
} else {
593596
browser_version = self.request_fixed_browser_version_from_cft()?;
594597
}
598+
self.set_browser_version(browser_version.clone());
599+
595600
let browser_ttl = self.get_browser_ttl();
596-
if browser_ttl > 0 && !browser_version.is_empty() {
601+
if browser_ttl > 0 && !self.is_browser_version_stable() {
597602
metadata.browsers.push(create_browser_metadata(
598603
browser_name,
599604
&major_browser_version,
@@ -608,7 +613,6 @@ impl SeleniumManager for ChromeManager {
608613
"Required browser: {} {}",
609614
browser_name, browser_version
610615
));
611-
self.set_browser_version(browser_version.clone());
612616

613617
// Checking if browser version is in the cache
614618
let browser_binary_path = self.get_browser_binary_path_in_cache();
@@ -622,7 +626,7 @@ impl SeleniumManager for ChromeManager {
622626
let browser_url = if let Some(url) = self.browser_url.clone() {
623627
url
624628
} else {
625-
if browser_version.is_empty() {
629+
if self.is_browser_version_stable() {
626630
self.request_latest_browser_version_from_cft()?;
627631
} else {
628632
self.request_fixed_browser_version_from_cft()?;

rust/src/edge.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl SeleniumManager for EdgeManager {
178178
_ => {
179179
self.assert_online_or_err(OFFLINE_REQUEST_ERR_MSG)?;
180180

181-
if major_browser_version.is_empty() {
181+
if self.is_browser_version_stable() || major_browser_version.is_empty() {
182182
let latest_stable_url = format!("{}{}", DRIVER_URL, LATEST_STABLE);
183183
self.log.debug(format!(
184184
"Reading {} latest version from {}",
@@ -226,6 +226,10 @@ impl SeleniumManager for EdgeManager {
226226
}
227227
}
228228

229+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
230+
Ok(None)
231+
}
232+
229233
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
230234
let driver_version = self.get_driver_version();
231235
let os = self.get_os();

rust/src/firefox.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ impl SeleniumManager for FirefoxManager {
197197
}
198198
}
199199

200+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
201+
Ok(None)
202+
}
203+
200204
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
201205
let driver_version = self.get_driver_version();
202206
let os = self.get_os();

rust/src/grid.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ impl SeleniumManager for GridManager {
167167
}
168168
}
169169

170+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
171+
Ok(None)
172+
}
173+
170174
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
171175
if self.driver_url.is_some() {
172176
return Ok(self.driver_url.as_ref().unwrap().to_string());

rust/src/iexplorer.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ impl SeleniumManager for IExplorerManager {
167167
}
168168
}
169169

170+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
171+
Ok(None)
172+
}
173+
170174
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
171175
if self.driver_url.is_some() {
172176
return Ok(self.driver_url.as_ref().unwrap().to_string());

rust/src/lib.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ pub trait SeleniumManager {
110110

111111
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>>;
112112

113+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>>;
114+
113115
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>>;
114116

115117
fn get_driver_path_in_cache(&self) -> PathBuf;
@@ -262,7 +264,28 @@ pub trait SeleniumManager {
262264
}
263265
let discovered_major_browser_version =
264266
self.get_major_version(&version).unwrap_or_default();
265-
if !major_browser_version.is_empty()
267+
268+
if self.is_browser_version_stable() {
269+
let online_browser_version = self.request_browser_version()?;
270+
if online_browser_version.is_some() {
271+
let major_online_browser_version =
272+
self.get_major_version(&online_browser_version.unwrap())?;
273+
if major_browser_version.eq(&major_online_browser_version) {
274+
self.get_logger().debug(format!(
275+
"Online stable browser version ({}) different to specified browser version ({})",
276+
major_online_browser_version,
277+
major_browser_version,
278+
));
279+
download_browser = true;
280+
} else {
281+
self.get_logger().debug(format!(
282+
"Online stable {} version ({}) is the same as the one installed in the system",
283+
self.get_browser_name(),
284+
major_online_browser_version,
285+
));
286+
}
287+
}
288+
} else if !major_browser_version.is_empty()
266289
&& !self.is_browser_version_unstable()
267290
&& !major_browser_version.eq(&discovered_major_browser_version)
268291
{
@@ -410,6 +433,11 @@ pub trait SeleniumManager {
410433
|| browser_version.eq_ignore_ascii_case(CANARY)
411434
}
412435

436+
fn is_browser_version_stable(&self) -> bool {
437+
let browser_version = self.get_browser_version();
438+
browser_version.is_empty() || browser_version.eq_ignore_ascii_case(STABLE)
439+
}
440+
413441
fn resolve_driver(&mut self) -> Result<PathBuf, Box<dyn Error>> {
414442
let mut driver_in_path = None;
415443
let mut driver_in_path_version = None;
@@ -576,7 +604,9 @@ pub trait SeleniumManager {
576604
}
577605

578606
fn get_major_browser_version(&self) -> String {
579-
if self.is_browser_version_unstable() {
607+
if self.is_browser_version_stable() {
608+
STABLE.to_string()
609+
} else if self.is_browser_version_unstable() {
580610
self.get_browser_version().to_string()
581611
} else {
582612
self.get_major_version(self.get_browser_version())

rust/src/safari.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ impl SeleniumManager for SafariManager {
101101
Ok("(local)".to_string())
102102
}
103103

104+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
105+
Ok(None)
106+
}
107+
104108
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
105109
Err(format!("{} not available for download", self.get_driver_name()).into())
106110
}

rust/src/safaritp.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ impl SeleniumManager for SafariTPManager {
106106
Ok("(local)".to_string())
107107
}
108108

109+
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
110+
Ok(None)
111+
}
112+
109113
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
110114
Err(format!("{} not available for download", self.get_driver_name()).into())
111115
}

rust/tests/chrome_download_tests.rs

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

1818
use assert_cmd::Command;
19-
use std::path::Path;
2019

21-
use is_executable::is_executable;
20+
use crate::common::assert_driver_and_browser;
2221
use rstest::rstest;
23-
use selenium_manager::logger::JsonOutput;
24-
use std::str;
22+
23+
mod common;
2524

2625
#[test]
2726
fn chrome_latest_download_test() {
@@ -59,18 +58,3 @@ fn chrome_version_download_test(#[case] browser_version: String) {
5958

6059
assert_driver_and_browser(&mut cmd);
6160
}
62-
63-
fn assert_driver_and_browser(cmd: &mut Command) {
64-
let stdout = &cmd.unwrap().stdout;
65-
let output = str::from_utf8(stdout).unwrap();
66-
println!("{}", output);
67-
68-
let json: JsonOutput = serde_json::from_str(output).unwrap();
69-
let driver_path = Path::new(&json.result.driver_path);
70-
assert!(driver_path.exists());
71-
assert!(is_executable(driver_path));
72-
73-
let browser_path = Path::new(&json.result.browser_path);
74-
assert!(browser_path.exists());
75-
assert!(is_executable(browser_path));
76-
}

0 commit comments

Comments
 (0)