Skip to content

Commit 4a2c863

Browse files
authored
[rust] Support different output types (logger, json, shell) in Selenium Manager (#11365) (#11531)
* [rust] Support different output types (logger, json, shell) in Selenium Manager (#11365) * [rust] Honor --debug and --trace flags for JSON output * [rust] Include result code and message in the JSON output * [rust] Include assertion to check if driver exists in output test * [rust] Include assertion for result code from JSON in test * [rust] Remove trailing newline from shell and json output * [rust] Use crate name env instead of hardcoding that name
1 parent 15bc527 commit 4a2c863

File tree

11 files changed

+430
-119
lines changed

11 files changed

+430
-119
lines changed

rust/src/chrome.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use crate::config::ARCH::ARM64;
2525
use crate::config::OS::{LINUX, MACOS, WINDOWS};
2626
use crate::downloads::read_content_from_link;
2727
use crate::files::{compose_driver_path_in_cache, BrowserPath};
28+
use crate::logger::Logger;
2829
use crate::metadata::{
2930
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
3031
};
@@ -44,6 +45,7 @@ pub struct ChromeManager {
4445
pub driver_name: &'static str,
4546
pub config: ManagerConfig,
4647
pub http_client: Client,
48+
pub log: Logger,
4749
}
4850

4951
impl ChromeManager {
@@ -53,6 +55,7 @@ impl ChromeManager {
5355
driver_name: DRIVER_NAME,
5456
config: ManagerConfig::default(),
5557
http_client: create_default_http_client(),
58+
log: Logger::default(),
5659
})
5760
}
5861
}
@@ -150,15 +153,15 @@ impl SeleniumManager for ChromeManager {
150153

151154
fn request_driver_version(&self) -> Result<String, Box<dyn Error>> {
152155
let browser_version = self.get_browser_version();
153-
let mut metadata = get_metadata();
156+
let mut metadata = get_metadata(self.get_logger());
154157

155158
match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
156159
{
157160
Some(driver_version) => {
158-
log::trace!(
161+
self.log.trace(format!(
159162
"Driver TTL is valid. Getting {} version from metadata",
160163
&self.driver_name
161-
);
164+
));
162165
Ok(driver_version)
163166
}
164167
_ => {
@@ -173,22 +176,25 @@ impl SeleniumManager for ChromeManager {
173176
if !browser_version.is_empty() && browser_version_int <= 0 {
174177
break;
175178
}
176-
log::debug!("Reading {} version from {}", &self.driver_name, driver_url);
179+
self.log.debug(format!(
180+
"Reading {} version from {}",
181+
&self.driver_name, driver_url
182+
));
177183
let content = read_content_from_link(self.get_http_client(), driver_url);
178184
match content {
179185
Ok(version) => {
180186
driver_version = version;
181187
break;
182188
}
183189
_ => {
184-
log::warn!(
190+
self.log.warn(format!(
185191
"Error getting version of {} {}. Retrying with {} {} (attempt {}/{})",
186192
&self.driver_name,
187193
browser_version_int,
188194
&self.driver_name,
189195
browser_version_int - 1,
190196
i + 1, FALLBACK_RETRIES
191-
);
197+
));
192198
browser_version_int -= 1;
193199
}
194200
}
@@ -199,7 +205,7 @@ impl SeleniumManager for ChromeManager {
199205
self.driver_name,
200206
&driver_version,
201207
));
202-
write_metadata(&metadata);
208+
write_metadata(&metadata, self.get_logger());
203209
}
204210
Ok(driver_version)
205211
}
@@ -262,4 +268,12 @@ impl SeleniumManager for ChromeManager {
262268
fn set_config(&mut self, config: ManagerConfig) {
263269
self.config = config;
264270
}
271+
272+
fn get_logger(&self) -> &Logger {
273+
&self.log
274+
}
275+
276+
fn set_logger(&mut self, log: Logger) {
277+
self.log = log;
278+
}
265279
}

rust/src/downloads.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,20 @@ use std::io::Cursor;
2424
use tempfile::{Builder, TempDir};
2525

2626
use crate::files::parse_version;
27+
use crate::Logger;
2728

2829
#[tokio::main]
2930
pub async fn download_driver_to_tmp_folder(
3031
http_client: &Client,
3132
url: String,
33+
log: &Logger,
3234
) -> Result<(TempDir, String), Box<dyn Error>> {
3335
let tmp_dir = Builder::new().prefix("selenium-manager").tempdir()?;
34-
log::trace!(
36+
log.trace(format!(
3537
"Downloading {} to temporal folder {:?}",
3638
url,
3739
tmp_dir.path()
38-
);
40+
));
3941

4042
let response = http_client.get(url).send().await?;
4143
let target_path;
@@ -47,11 +49,14 @@ pub async fn download_driver_to_tmp_folder(
4749
.and_then(|name| if name.is_empty() { None } else { Some(name) })
4850
.unwrap_or("tmp.bin");
4951

50-
log::trace!("File to be downloaded: {}", target_name);
52+
log.trace(format!("File to be downloaded: {}", target_name));
5153
let target_name = tmp_dir.path().join(target_name);
5254
target_path = String::from(target_name.to_str().unwrap());
5355

54-
log::trace!("Temporal folder for driver package: {}", target_path);
56+
log.trace(format!(
57+
"Temporal folder for driver package: {}",
58+
target_path
59+
));
5560
File::create(target_name)?
5661
};
5762
let mut content = Cursor::new(response.bytes().await?);

rust/src/edge.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ use crate::metadata::{
2929
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
3030
};
3131
use crate::{
32-
create_default_http_client, SeleniumManager, BETA, DASH_DASH_VERSION, DEV, ENV_LOCALAPPDATA,
33-
ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, REG_QUERY, STABLE, WMIC_COMMAND,
34-
WMIC_COMMAND_ENV,
32+
create_default_http_client, Logger, SeleniumManager, BETA, DASH_DASH_VERSION, DEV,
33+
ENV_LOCALAPPDATA, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, REG_QUERY, STABLE,
34+
WMIC_COMMAND, WMIC_COMMAND_ENV,
3535
};
3636

3737
const BROWSER_NAME: &str = "edge";
@@ -45,6 +45,7 @@ pub struct EdgeManager {
4545
pub driver_name: &'static str,
4646
pub config: ManagerConfig,
4747
pub http_client: Client,
48+
pub log: Logger,
4849
}
4950

5051
impl EdgeManager {
@@ -54,6 +55,7 @@ impl EdgeManager {
5455
driver_name: DRIVER_NAME,
5556
config: ManagerConfig::default(),
5657
http_client: create_default_http_client(),
58+
log: Logger::default(),
5759
})
5860
}
5961
}
@@ -151,15 +153,15 @@ impl SeleniumManager for EdgeManager {
151153

152154
fn request_driver_version(&self) -> Result<String, Box<dyn Error>> {
153155
let browser_version = self.get_browser_version();
154-
let mut metadata = get_metadata();
156+
let mut metadata = get_metadata(self.get_logger());
155157

156158
match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
157159
{
158160
Some(driver_version) => {
159-
log::trace!(
161+
self.log.trace(format!(
160162
"Driver TTL is valid. Getting {} version from metadata",
161163
&self.driver_name
162-
);
164+
));
163165
Ok(driver_version)
164166
}
165167
_ => {
@@ -174,7 +176,10 @@ impl SeleniumManager for EdgeManager {
174176
self.get_os().to_uppercase()
175177
)
176178
};
177-
log::debug!("Reading {} version from {}", &self.driver_name, driver_url);
179+
self.log.debug(format!(
180+
"Reading {} version from {}",
181+
&self.driver_name, driver_url
182+
));
178183
let driver_version = read_content_from_link(self.get_http_client(), driver_url)?;
179184

180185
if !browser_version.is_empty() {
@@ -183,7 +188,7 @@ impl SeleniumManager for EdgeManager {
183188
self.driver_name,
184189
&driver_version,
185190
));
186-
write_metadata(&metadata);
191+
write_metadata(&metadata, self.get_logger());
187192
}
188193

189194
Ok(driver_version)
@@ -249,4 +254,12 @@ impl SeleniumManager for EdgeManager {
249254
fn set_config(&mut self, config: ManagerConfig) {
250255
self.config = config;
251256
}
257+
258+
fn get_logger(&self) -> &Logger {
259+
&self.log
260+
}
261+
262+
fn set_logger(&mut self, log: Logger) {
263+
self.log = log;
264+
}
252265
}

rust/src/files.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use tar::Archive;
3030
use zip::ZipArchive;
3131

3232
use crate::config::OS::WINDOWS;
33+
use crate::Logger;
3334

3435
const CACHE_FOLDER: &str = ".cache/selenium";
3536
const ZIP: &str = "zip";
@@ -57,20 +58,24 @@ pub fn create_path_if_not_exists(path: &Path) {
5758
}
5859
}
5960

60-
pub fn uncompress(compressed_file: &String, target: PathBuf) -> Result<(), Box<dyn Error>> {
61+
pub fn uncompress(
62+
compressed_file: &String,
63+
target: PathBuf,
64+
log: &Logger,
65+
) -> Result<(), Box<dyn Error>> {
6166
let file = File::open(compressed_file)?;
6267
let kind = infer::get_from_path(compressed_file)?
6368
.ok_or(format!("Format for file {:?} cannot be inferred", file))?;
6469
let extension = kind.extension();
65-
log::trace!(
70+
log.trace(format!(
6671
"The detected extension of the compressed file is {}",
6772
extension
68-
);
73+
));
6974

7075
if extension.eq_ignore_ascii_case(ZIP) {
71-
unzip(file, target)?
76+
unzip(file, target, log)?
7277
} else if extension.eq_ignore_ascii_case(GZ) {
73-
untargz(file, target)?
78+
untargz(file, target, log)?
7479
} else if extension.eq_ignore_ascii_case(XML) {
7580
return Err("Wrong browser/driver version".into());
7681
} else {
@@ -83,8 +88,8 @@ pub fn uncompress(compressed_file: &String, target: PathBuf) -> Result<(), Box<d
8388
Ok(())
8489
}
8590

86-
pub fn untargz(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
87-
log::trace!("Untargz file to {}", target.display());
91+
pub fn untargz(file: File, target: PathBuf, log: &Logger) -> Result<(), Box<dyn Error>> {
92+
log.trace(format!("Untargz file to {}", target.display()));
8893
let tar = GzDecoder::new(&file);
8994
let mut archive = Archive::new(tar);
9095
let parent_path = target
@@ -96,8 +101,8 @@ pub fn untargz(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
96101
Ok(())
97102
}
98103

99-
pub fn unzip(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
100-
log::trace!("Unzipping file to {}", target.display());
104+
pub fn unzip(file: File, target: PathBuf, log: &Logger) -> Result<(), Box<dyn Error>> {
105+
log.trace(format!("Unzipping file to {}", target.display()));
101106
let mut archive = ZipArchive::new(file)?;
102107

103108
for i in 0..archive.len() {
@@ -107,11 +112,11 @@ pub fn unzip(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
107112
}
108113
let target_file_name = target.file_name().unwrap().to_str().unwrap();
109114
if target_file_name.eq_ignore_ascii_case(file.name()) {
110-
log::debug!(
115+
log.debug(format!(
111116
"File extracted to {} ({} bytes)",
112117
target.display(),
113118
file.size()
114-
);
119+
));
115120
if let Some(p) = target.parent() {
116121
create_path_if_not_exists(p);
117122
}

rust/src/firefox.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ use crate::metadata::{
2929
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
3030
};
3131
use crate::{
32-
create_default_http_client, SeleniumManager, BETA, DASH_VERSION, DEV, ENV_PROGRAM_FILES,
33-
ENV_PROGRAM_FILES_X86, NIGHTLY, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
32+
create_default_http_client, Logger, SeleniumManager, BETA, DASH_VERSION, DEV,
33+
ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
3434
};
3535

3636
const BROWSER_NAME: &str = "firefox";
@@ -43,6 +43,7 @@ pub struct FirefoxManager {
4343
pub driver_name: &'static str,
4444
pub config: ManagerConfig,
4545
pub http_client: Client,
46+
pub log: Logger,
4647
}
4748

4849
impl FirefoxManager {
@@ -52,6 +53,7 @@ impl FirefoxManager {
5253
driver_name: DRIVER_NAME,
5354
config: ManagerConfig::default(),
5455
http_client: create_default_http_client(),
56+
log: Logger::default(),
5557
})
5658
}
5759
}
@@ -141,15 +143,15 @@ impl SeleniumManager for FirefoxManager {
141143

142144
fn request_driver_version(&self) -> Result<String, Box<dyn Error>> {
143145
let browser_version = self.get_browser_version();
144-
let mut metadata = get_metadata();
146+
let mut metadata = get_metadata(self.get_logger());
145147

146148
match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
147149
{
148150
Some(driver_version) => {
149-
log::trace!(
151+
self.log.trace(format!(
150152
"Driver TTL is valid. Getting {} version from metadata",
151153
&self.driver_name
152-
);
154+
));
153155
Ok(driver_version)
154156
}
155157
_ => {
@@ -162,7 +164,7 @@ impl SeleniumManager for FirefoxManager {
162164
self.driver_name,
163165
&driver_version,
164166
));
165-
write_metadata(&metadata);
167+
write_metadata(&metadata, self.get_logger());
166168
}
167169

168170
Ok(driver_version)
@@ -248,6 +250,14 @@ impl SeleniumManager for FirefoxManager {
248250
fn set_config(&mut self, config: ManagerConfig) {
249251
self.config = config;
250252
}
253+
254+
fn get_logger(&self) -> &Logger {
255+
&self.log
256+
}
257+
258+
fn set_logger(&mut self, log: Logger) {
259+
self.log = log;
260+
}
251261
}
252262

253263
#[cfg(test)]

0 commit comments

Comments
 (0)