Skip to content

Commit b89fb5e

Browse files
authored
[rust] Allow to change default folder for Selenium Manager cache (#11688) (#12514)
* [rust] Allow to change default folder for Selenium Manager cache (#11688) * [rust] Enhance assertion in cache test * [rust] Avoid unwrap when creating cache path
1 parent efefbc9 commit b89fb5e

File tree

15 files changed

+235
-98
lines changed

15 files changed

+235
-98
lines changed

rust/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ Options:
4747
Driver TTL (time-to-live) [default: 3600]
4848
--browser-ttl <BROWSER_TTL>
4949
Browser TTL (time-to-live) [default: 3600]
50+
--cache-path <CACHE_PATH>
51+
Local folder used to store downloaded assets (drivers and browsers), local metadata, and configuration file [default: ~/.cache/selenium]
5052
--clear-cache
5153
Clear cache folder (~/.cache/selenium)
5254
--clear-metadata

rust/src/chrome.rs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@ use std::path::PathBuf;
2626
use crate::config::ARCH::{ARM64, X32};
2727
use crate::config::OS::{LINUX, MACOS, WINDOWS};
2828
use crate::downloads::{parse_json_from_url, read_version_from_link};
29-
use crate::files::{
30-
compose_driver_path_in_cache, get_cache_folder, path_buf_to_string, BrowserPath,
31-
};
29+
use crate::files::{compose_driver_path_in_cache, path_buf_to_string, BrowserPath};
3230
use crate::logger::Logger;
3331
use crate::metadata::{
3432
create_driver_metadata, get_driver_version_from_metadata, get_metadata, write_metadata,
@@ -314,19 +312,20 @@ impl ChromeManager {
314312
}
315313
}
316314

317-
fn get_browser_path_in_cache(&self) -> PathBuf {
318-
get_cache_folder()
315+
fn get_browser_path_in_cache(&self) -> Result<PathBuf, Box<dyn Error>> {
316+
Ok(self
317+
.get_cache_path()?
319318
.join(self.get_browser_name())
320319
.join(self.get_platform_label())
321-
.join(self.get_browser_version())
320+
.join(self.get_browser_version()))
322321
}
323322

324-
fn get_browser_binary_path_in_cache(&self) -> PathBuf {
325-
let browser_in_cache = self.get_browser_path_in_cache();
323+
fn get_browser_binary_path_in_cache(&self) -> Result<PathBuf, Box<dyn Error>> {
324+
let browser_in_cache = self.get_browser_path_in_cache()?;
326325
if MACOS.is(self.get_os()) {
327-
browser_in_cache.join(CFT_MACOS_APP_NAME)
326+
Ok(browser_in_cache.join(CFT_MACOS_APP_NAME))
328327
} else {
329-
browser_in_cache.join(self.get_browser_name_with_extension())
328+
Ok(browser_in_cache.join(self.get_browser_name_with_extension()))
330329
}
331330
}
332331
}
@@ -402,7 +401,7 @@ impl SeleniumManager for ChromeManager {
402401
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
403402
let major_browser_version_binding = self.get_major_browser_version();
404403
let major_browser_version = major_browser_version_binding.as_str();
405-
let mut metadata = get_metadata(self.get_logger());
404+
let mut metadata = get_metadata(self.get_logger(), self.get_cache_path()?);
406405

407406
match get_driver_version_from_metadata(
408407
&metadata.drivers,
@@ -447,7 +446,7 @@ impl SeleniumManager for ChromeManager {
447446
&driver_version,
448447
driver_ttl,
449448
));
450-
write_metadata(&metadata, self.get_logger());
449+
write_metadata(&metadata, self.get_logger(), self.get_cache_path()?);
451450
}
452451
Ok(driver_version)
453452
}
@@ -458,7 +457,7 @@ impl SeleniumManager for ChromeManager {
458457
let browser_name = self.browser_name;
459458
let browser_version;
460459
let major_browser_version = self.get_major_browser_version();
461-
let mut metadata = get_metadata(self.get_logger());
460+
let mut metadata = get_metadata(self.get_logger(), self.get_cache_path()?);
462461

463462
// First, browser version is checked in the local metadata
464463
match get_browser_version_from_metadata(
@@ -486,7 +485,7 @@ impl SeleniumManager for ChromeManager {
486485
&browser_version,
487486
browser_ttl,
488487
));
489-
write_metadata(&metadata, self.get_logger());
488+
write_metadata(&metadata, self.get_logger(), self.get_cache_path()?);
490489
}
491490
}
492491
}
@@ -536,11 +535,17 @@ impl SeleniumManager for ChromeManager {
536535
))
537536
}
538537

539-
fn get_driver_path_in_cache(&self) -> PathBuf {
538+
fn get_driver_path_in_cache(&self) -> Result<PathBuf, Box<dyn Error>> {
540539
let driver_version = self.get_driver_version();
541540
let os = self.get_os();
542541
let arch_folder = self.get_platform_label();
543-
compose_driver_path_in_cache(self.driver_name, os, arch_folder, driver_version)
542+
Ok(compose_driver_path_in_cache(
543+
self.get_cache_path()?,
544+
self.driver_name,
545+
os,
546+
arch_folder,
547+
driver_version,
548+
))
544549
}
545550

546551
fn get_config(&self) -> &ManagerConfig {
@@ -566,7 +571,7 @@ impl SeleniumManager for ChromeManager {
566571
fn download_browser(&mut self) -> Result<Option<PathBuf>, Box<dyn Error>> {
567572
let browser_version;
568573
let browser_name = self.browser_name;
569-
let mut metadata = get_metadata(self.get_logger());
574+
let mut metadata = get_metadata(self.get_logger(), self.get_cache_path()?);
570575
let major_browser_version = self.get_major_browser_version();
571576
let major_browser_version_int = major_browser_version.parse::<i32>().unwrap_or_default();
572577

@@ -618,7 +623,7 @@ impl SeleniumManager for ChromeManager {
618623
&browser_version,
619624
browser_ttl,
620625
));
621-
write_metadata(&metadata, self.get_logger());
626+
write_metadata(&metadata, self.get_logger(), self.get_cache_path()?);
622627
}
623628
}
624629
}
@@ -628,7 +633,7 @@ impl SeleniumManager for ChromeManager {
628633
));
629634

630635
// Checking if browser version is in the cache
631-
let browser_binary_path = self.get_browser_binary_path_in_cache();
636+
let browser_binary_path = self.get_browser_binary_path_in_cache()?;
632637
if browser_binary_path.exists() {
633638
self.get_logger().debug(format!(
634639
"{} {} already in the cache",
@@ -657,7 +662,7 @@ impl SeleniumManager for ChromeManager {
657662

658663
uncompress(
659664
&driver_zip_file,
660-
&self.get_browser_path_in_cache(),
665+
&self.get_browser_path_in_cache()?,
661666
self.get_logger(),
662667
None,
663668
)?;

rust/src/config.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,30 @@
1616
// under the License.
1717

1818
use crate::config::OS::{LINUX, MACOS, WINDOWS};
19-
use crate::files::get_cache_folder;
2019
use crate::shell::run_shell_command_by_os;
21-
use crate::{format_one_arg, Command, REQUEST_TIMEOUT_SEC, UNAME_COMMAND};
20+
use crate::{
21+
default_cache_folder, format_one_arg, path_buf_to_string, Command, REQUEST_TIMEOUT_SEC,
22+
UNAME_COMMAND,
23+
};
2224
use crate::{ARCH_AMD64, ARCH_ARM64, ARCH_X86, TTL_BROWSERS_SEC, TTL_DRIVERS_SEC, WMIC_COMMAND_OS};
25+
use std::cell::RefCell;
2326
use std::env;
2427
use std::env::consts::OS;
2528
use std::error::Error;
2629
use std::fs::read_to_string;
30+
use std::path::Path;
2731
use toml::Table;
2832

33+
thread_local!(static CACHE_PATH: RefCell<String> = RefCell::new(path_buf_to_string(default_cache_folder())));
34+
2935
pub const CONFIG_FILE: &str = "selenium-manager-config.toml";
3036
pub const ENV_PREFIX: &str = "SE_";
3137
pub const VERSION_PREFIX: &str = "-version";
3238
pub const PATH_PREFIX: &str = "-path";
39+
pub const CACHE_PATH_KEY: &str = "cache-path";
3340

3441
pub struct ManagerConfig {
42+
pub cache_path: String,
3543
pub browser_version: String,
3644
pub driver_version: String,
3745
pub browser_path: String,
@@ -47,6 +55,8 @@ pub struct ManagerConfig {
4755

4856
impl ManagerConfig {
4957
pub fn default(browser_name: &str, driver_name: &str) -> ManagerConfig {
58+
let cache_path = StringKey(vec![CACHE_PATH_KEY], &read_cache_path()).get_value();
59+
5060
let self_os = OS;
5161
let self_arch = if WINDOWS.is(self_os) {
5262
let wmic_command = Command::new_single(WMIC_COMMAND_OS.to_string());
@@ -77,12 +87,12 @@ impl ManagerConfig {
7787
let browser_path_label = concat(browser_name, PATH_PREFIX);
7888

7989
ManagerConfig {
80-
browser_version: StringKey(vec!["browser-version", browser_version_label.as_str()], "")
90+
cache_path,
91+
browser_version: StringKey(vec!["browser-version", &browser_version_label], "")
8192
.get_value(),
82-
driver_version: StringKey(vec!["driver-version", driver_version_label.as_str()], "")
83-
.get_value(),
84-
browser_path: StringKey(vec!["browser-path", browser_path_label.as_str()], "")
93+
driver_version: StringKey(vec!["driver-version", &driver_version_label], "")
8594
.get_value(),
95+
browser_path: StringKey(vec!["browser-path", &browser_path_label], "").get_value(),
8696
os: StringKey(vec!["os"], self_os).get_value(),
8797
arch: StringKey(vec!["arch"], self_arch.as_str()).get_value(),
8898
proxy: StringKey(vec!["proxy"], "").get_value(),
@@ -168,6 +178,9 @@ impl StringKey<'_> {
168178
result = env::var(get_env_name(key)).unwrap_or_default()
169179
}
170180
if !result.is_empty() {
181+
if key.eq(CACHE_PATH_KEY) {
182+
write_cache_path(result.clone());
183+
}
171184
return result;
172185
}
173186
}
@@ -215,7 +228,8 @@ fn get_env_name(suffix: &str) -> String {
215228
}
216229

217230
fn get_config() -> Result<Table, Box<dyn Error>> {
218-
let config_path = get_cache_folder().join(CONFIG_FILE);
231+
let cache_path = read_cache_path();
232+
let config_path = Path::new(&cache_path).to_path_buf().join(CONFIG_FILE);
219233
Ok(read_to_string(config_path)?.parse()?)
220234
}
221235

@@ -224,3 +238,20 @@ fn concat(prefix: &str, suffix: &str) -> String {
224238
version_label.push_str(suffix);
225239
version_label
226240
}
241+
242+
fn write_cache_path(cache_path: String) {
243+
CACHE_PATH.with(|value| {
244+
*value.borrow_mut() = cache_path;
245+
});
246+
}
247+
248+
fn read_cache_path() -> String {
249+
let mut cache_path: String = path_buf_to_string(default_cache_folder());
250+
CACHE_PATH.with(|value| {
251+
let path: String = (&*value.borrow().to_string()).into();
252+
if !path.is_empty() {
253+
cache_path = path;
254+
}
255+
});
256+
cache_path
257+
}

rust/src/edge.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ impl SeleniumManager for EdgeManager {
134134

135135
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
136136
let mut major_browser_version = self.get_major_browser_version();
137-
let mut metadata = get_metadata(self.get_logger());
137+
let mut metadata = get_metadata(self.get_logger(), self.get_cache_path()?);
138138

139139
match get_driver_version_from_metadata(
140140
&metadata.drivers,
@@ -191,7 +191,7 @@ impl SeleniumManager for EdgeManager {
191191
&driver_version,
192192
driver_ttl,
193193
));
194-
write_metadata(&metadata, self.get_logger());
194+
write_metadata(&metadata, self.get_logger(), self.get_cache_path()?);
195195
}
196196

197197
Ok(driver_version)
@@ -230,7 +230,7 @@ impl SeleniumManager for EdgeManager {
230230
))
231231
}
232232

233-
fn get_driver_path_in_cache(&self) -> PathBuf {
233+
fn get_driver_path_in_cache(&self) -> Result<PathBuf, Box<dyn Error>> {
234234
let driver_version = self.get_driver_version();
235235
let os = self.get_os();
236236
let arch = self.get_arch();
@@ -251,7 +251,13 @@ impl SeleniumManager for EdgeManager {
251251
} else {
252252
"linux64"
253253
};
254-
compose_driver_path_in_cache(self.driver_name, os, arch_folder, driver_version)
254+
Ok(compose_driver_path_in_cache(
255+
self.get_cache_path()?,
256+
self.driver_name,
257+
os,
258+
arch_folder,
259+
driver_version,
260+
))
255261
}
256262

257263
fn get_config(&self) -> &ManagerConfig {

rust/src/files.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,18 @@ impl BrowserPath {
5454
}
5555
}
5656

57-
pub fn create_parent_path_if_not_exists(path: &Path) {
57+
pub fn create_parent_path_if_not_exists(path: &Path) -> Result<(), Box<dyn Error>> {
5858
if let Some(p) = path.parent() {
59-
create_path_if_not_exists(p);
59+
create_path_if_not_exists(p)?;
6060
}
61+
Ok(())
6162
}
6263

63-
pub fn create_path_if_not_exists(path: &Path) {
64+
pub fn create_path_if_not_exists(path: &Path) -> Result<(), Box<dyn Error>> {
6465
if !path.exists() {
65-
fs::create_dir_all(path).unwrap();
66+
fs::create_dir_all(path)?;
6667
}
68+
Ok(())
6769
}
6870

6971
pub fn uncompress(
@@ -132,7 +134,7 @@ pub fn unzip(
132134
None => continue,
133135
};
134136
if single_file.is_none() {
135-
create_path_if_not_exists(target);
137+
create_path_if_not_exists(target)?;
136138
out_path = target.join(path);
137139
}
138140

@@ -148,7 +150,7 @@ pub fn unzip(
148150
out_path.display(),
149151
file.size()
150152
));
151-
create_parent_path_if_not_exists(out_path.as_path());
153+
create_parent_path_if_not_exists(out_path.as_path())?;
152154

153155
let mut outfile = File::create(&out_path)?;
154156
io::copy(&mut file, &mut outfile)?;
@@ -186,27 +188,22 @@ pub fn get_raw_file_name(file_name: &str) -> &str {
186188
raw_file_name
187189
}
188190

189-
pub fn compose_cache_folder() -> PathBuf {
191+
pub fn default_cache_folder() -> PathBuf {
190192
if let Some(base_dirs) = BaseDirs::new() {
191193
return Path::new(base_dirs.home_dir())
192194
.join(String::from(CACHE_FOLDER).replace('/', std::path::MAIN_SEPARATOR_STR));
193195
}
194196
PathBuf::new()
195197
}
196198

197-
pub fn get_cache_folder() -> PathBuf {
198-
let cache_path = compose_cache_folder();
199-
create_path_if_not_exists(&cache_path);
200-
cache_path
201-
}
202-
203199
pub fn compose_driver_path_in_cache(
200+
driver_path: PathBuf,
204201
driver_name: &str,
205202
os: &str,
206203
arch_folder: &str,
207204
driver_version: &str,
208205
) -> PathBuf {
209-
get_cache_folder()
206+
driver_path
210207
.join(driver_name)
211208
.join(arch_folder)
212209
.join(driver_version)

rust/src/firefox.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl SeleniumManager for FirefoxManager {
132132
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
133133
let major_browser_version_binding = self.get_major_browser_version();
134134
let major_browser_version = major_browser_version_binding.as_str();
135-
let mut metadata = get_metadata(self.get_logger());
135+
let mut metadata = get_metadata(self.get_logger(), self.get_cache_path()?);
136136

137137
match get_driver_version_from_metadata(
138138
&metadata.drivers,
@@ -161,7 +161,7 @@ impl SeleniumManager for FirefoxManager {
161161
&driver_version,
162162
driver_ttl,
163163
));
164-
write_metadata(&metadata, self.get_logger());
164+
write_metadata(&metadata, self.get_logger(), self.get_cache_path()?);
165165
}
166166

167167
Ok(driver_version)
@@ -211,7 +211,7 @@ impl SeleniumManager for FirefoxManager {
211211
))
212212
}
213213

214-
fn get_driver_path_in_cache(&self) -> PathBuf {
214+
fn get_driver_path_in_cache(&self) -> Result<PathBuf, Box<dyn Error>> {
215215
let driver_version = self.get_driver_version();
216216
let os = self.get_os();
217217
let arch = self.get_arch();
@@ -241,7 +241,13 @@ impl SeleniumManager for FirefoxManager {
241241
} else {
242242
"linux64"
243243
};
244-
compose_driver_path_in_cache(self.driver_name, os, arch_folder, driver_version)
244+
Ok(compose_driver_path_in_cache(
245+
self.get_cache_path()?,
246+
self.driver_name,
247+
os,
248+
arch_folder,
249+
driver_version,
250+
))
245251
}
246252

247253
fn get_config(&self) -> &ManagerConfig {

0 commit comments

Comments
 (0)