Skip to content

Commit

Permalink
[rust] Support different output types (logger, json, shell) in Seleni…
Browse files Browse the repository at this point in the history
…um 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
  • Loading branch information
bonigarcia authored Jan 19, 2023
1 parent 15bc527 commit 4a2c863
Show file tree
Hide file tree
Showing 11 changed files with 430 additions and 119 deletions.
28 changes: 21 additions & 7 deletions rust/src/chrome.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ use crate::config::ARCH::ARM64;
use crate::config::OS::{LINUX, MACOS, WINDOWS};
use crate::downloads::read_content_from_link;
use crate::files::{compose_driver_path_in_cache, BrowserPath};
use crate::logger::Logger;
use crate::metadata::{
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
};
Expand All @@ -44,6 +45,7 @@ pub struct ChromeManager {
pub driver_name: &'static str,
pub config: ManagerConfig,
pub http_client: Client,
pub log: Logger,
}

impl ChromeManager {
Expand All @@ -53,6 +55,7 @@ impl ChromeManager {
driver_name: DRIVER_NAME,
config: ManagerConfig::default(),
http_client: create_default_http_client(),
log: Logger::default(),
})
}
}
Expand Down Expand Up @@ -150,15 +153,15 @@ impl SeleniumManager for ChromeManager {

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

match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
{
Some(driver_version) => {
log::trace!(
self.log.trace(format!(
"Driver TTL is valid. Getting {} version from metadata",
&self.driver_name
);
));
Ok(driver_version)
}
_ => {
Expand All @@ -173,22 +176,25 @@ impl SeleniumManager for ChromeManager {
if !browser_version.is_empty() && browser_version_int <= 0 {
break;
}
log::debug!("Reading {} version from {}", &self.driver_name, driver_url);
self.log.debug(format!(
"Reading {} version from {}",
&self.driver_name, driver_url
));
let content = read_content_from_link(self.get_http_client(), driver_url);
match content {
Ok(version) => {
driver_version = version;
break;
}
_ => {
log::warn!(
self.log.warn(format!(
"Error getting version of {} {}. Retrying with {} {} (attempt {}/{})",
&self.driver_name,
browser_version_int,
&self.driver_name,
browser_version_int - 1,
i + 1, FALLBACK_RETRIES
);
));
browser_version_int -= 1;
}
}
Expand All @@ -199,7 +205,7 @@ impl SeleniumManager for ChromeManager {
self.driver_name,
&driver_version,
));
write_metadata(&metadata);
write_metadata(&metadata, self.get_logger());
}
Ok(driver_version)
}
Expand Down Expand Up @@ -262,4 +268,12 @@ impl SeleniumManager for ChromeManager {
fn set_config(&mut self, config: ManagerConfig) {
self.config = config;
}

fn get_logger(&self) -> &Logger {
&self.log
}

fn set_logger(&mut self, log: Logger) {
self.log = log;
}
}
13 changes: 9 additions & 4 deletions rust/src/downloads.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,20 @@ use std::io::Cursor;
use tempfile::{Builder, TempDir};

use crate::files::parse_version;
use crate::Logger;

#[tokio::main]
pub async fn download_driver_to_tmp_folder(
http_client: &Client,
url: String,
log: &Logger,
) -> Result<(TempDir, String), Box<dyn Error>> {
let tmp_dir = Builder::new().prefix("selenium-manager").tempdir()?;
log::trace!(
log.trace(format!(
"Downloading {} to temporal folder {:?}",
url,
tmp_dir.path()
);
));

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

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

log::trace!("Temporal folder for driver package: {}", target_path);
log.trace(format!(
"Temporal folder for driver package: {}",
target_path
));
File::create(target_name)?
};
let mut content = Cursor::new(response.bytes().await?);
Expand Down
29 changes: 21 additions & 8 deletions rust/src/edge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ use crate::metadata::{
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
};
use crate::{
create_default_http_client, SeleniumManager, BETA, DASH_DASH_VERSION, DEV, ENV_LOCALAPPDATA,
ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, REG_QUERY, STABLE, WMIC_COMMAND,
WMIC_COMMAND_ENV,
create_default_http_client, Logger, SeleniumManager, BETA, DASH_DASH_VERSION, DEV,
ENV_LOCALAPPDATA, ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, REG_QUERY, STABLE,
WMIC_COMMAND, WMIC_COMMAND_ENV,
};

const BROWSER_NAME: &str = "edge";
Expand All @@ -45,6 +45,7 @@ pub struct EdgeManager {
pub driver_name: &'static str,
pub config: ManagerConfig,
pub http_client: Client,
pub log: Logger,
}

impl EdgeManager {
Expand All @@ -54,6 +55,7 @@ impl EdgeManager {
driver_name: DRIVER_NAME,
config: ManagerConfig::default(),
http_client: create_default_http_client(),
log: Logger::default(),
})
}
}
Expand Down Expand Up @@ -151,15 +153,15 @@ impl SeleniumManager for EdgeManager {

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

match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
{
Some(driver_version) => {
log::trace!(
self.log.trace(format!(
"Driver TTL is valid. Getting {} version from metadata",
&self.driver_name
);
));
Ok(driver_version)
}
_ => {
Expand All @@ -174,7 +176,10 @@ impl SeleniumManager for EdgeManager {
self.get_os().to_uppercase()
)
};
log::debug!("Reading {} version from {}", &self.driver_name, driver_url);
self.log.debug(format!(
"Reading {} version from {}",
&self.driver_name, driver_url
));
let driver_version = read_content_from_link(self.get_http_client(), driver_url)?;

if !browser_version.is_empty() {
Expand All @@ -183,7 +188,7 @@ impl SeleniumManager for EdgeManager {
self.driver_name,
&driver_version,
));
write_metadata(&metadata);
write_metadata(&metadata, self.get_logger());
}

Ok(driver_version)
Expand Down Expand Up @@ -249,4 +254,12 @@ impl SeleniumManager for EdgeManager {
fn set_config(&mut self, config: ManagerConfig) {
self.config = config;
}

fn get_logger(&self) -> &Logger {
&self.log
}

fn set_logger(&mut self, log: Logger) {
self.log = log;
}
}
27 changes: 16 additions & 11 deletions rust/src/files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use tar::Archive;
use zip::ZipArchive;

use crate::config::OS::WINDOWS;
use crate::Logger;

const CACHE_FOLDER: &str = ".cache/selenium";
const ZIP: &str = "zip";
Expand Down Expand Up @@ -57,20 +58,24 @@ pub fn create_path_if_not_exists(path: &Path) {
}
}

pub fn uncompress(compressed_file: &String, target: PathBuf) -> Result<(), Box<dyn Error>> {
pub fn uncompress(
compressed_file: &String,
target: PathBuf,
log: &Logger,
) -> Result<(), Box<dyn Error>> {
let file = File::open(compressed_file)?;
let kind = infer::get_from_path(compressed_file)?
.ok_or(format!("Format for file {:?} cannot be inferred", file))?;
let extension = kind.extension();
log::trace!(
log.trace(format!(
"The detected extension of the compressed file is {}",
extension
);
));

if extension.eq_ignore_ascii_case(ZIP) {
unzip(file, target)?
unzip(file, target, log)?
} else if extension.eq_ignore_ascii_case(GZ) {
untargz(file, target)?
untargz(file, target, log)?
} else if extension.eq_ignore_ascii_case(XML) {
return Err("Wrong browser/driver version".into());
} else {
Expand All @@ -83,8 +88,8 @@ pub fn uncompress(compressed_file: &String, target: PathBuf) -> Result<(), Box<d
Ok(())
}

pub fn untargz(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
log::trace!("Untargz file to {}", target.display());
pub fn untargz(file: File, target: PathBuf, log: &Logger) -> Result<(), Box<dyn Error>> {
log.trace(format!("Untargz file to {}", target.display()));
let tar = GzDecoder::new(&file);
let mut archive = Archive::new(tar);
let parent_path = target
Expand All @@ -96,8 +101,8 @@ pub fn untargz(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
Ok(())
}

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

for i in 0..archive.len() {
Expand All @@ -107,11 +112,11 @@ pub fn unzip(file: File, target: PathBuf) -> Result<(), Box<dyn Error>> {
}
let target_file_name = target.file_name().unwrap().to_str().unwrap();
if target_file_name.eq_ignore_ascii_case(file.name()) {
log::debug!(
log.debug(format!(
"File extracted to {} ({} bytes)",
target.display(),
file.size()
);
));
if let Some(p) = target.parent() {
create_path_if_not_exists(p);
}
Expand Down
22 changes: 16 additions & 6 deletions rust/src/firefox.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ use crate::metadata::{
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
};
use crate::{
create_default_http_client, SeleniumManager, BETA, DASH_VERSION, DEV, ENV_PROGRAM_FILES,
ENV_PROGRAM_FILES_X86, NIGHTLY, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
create_default_http_client, Logger, SeleniumManager, BETA, DASH_VERSION, DEV,
ENV_PROGRAM_FILES, ENV_PROGRAM_FILES_X86, NIGHTLY, STABLE, WMIC_COMMAND, WMIC_COMMAND_ENV,
};

const BROWSER_NAME: &str = "firefox";
Expand All @@ -43,6 +43,7 @@ pub struct FirefoxManager {
pub driver_name: &'static str,
pub config: ManagerConfig,
pub http_client: Client,
pub log: Logger,
}

impl FirefoxManager {
Expand All @@ -52,6 +53,7 @@ impl FirefoxManager {
driver_name: DRIVER_NAME,
config: ManagerConfig::default(),
http_client: create_default_http_client(),
log: Logger::default(),
})
}
}
Expand Down Expand Up @@ -141,15 +143,15 @@ impl SeleniumManager for FirefoxManager {

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

match get_driver_version_from_metadata(&metadata.drivers, self.driver_name, browser_version)
{
Some(driver_version) => {
log::trace!(
self.log.trace(format!(
"Driver TTL is valid. Getting {} version from metadata",
&self.driver_name
);
));
Ok(driver_version)
}
_ => {
Expand All @@ -162,7 +164,7 @@ impl SeleniumManager for FirefoxManager {
self.driver_name,
&driver_version,
));
write_metadata(&metadata);
write_metadata(&metadata, self.get_logger());
}

Ok(driver_version)
Expand Down Expand Up @@ -248,6 +250,14 @@ impl SeleniumManager for FirefoxManager {
fn set_config(&mut self, config: ManagerConfig) {
self.config = config;
}

fn get_logger(&self) -> &Logger {
&self.log
}

fn set_logger(&mut self, log: Logger) {
self.log = log;
}
}

#[cfg(test)]
Expand Down
Loading

0 comments on commit 4a2c863

Please sign in to comment.