Skip to content

Commit c8d121e

Browse files
authored
[rust] Capture Rust backtrace in case of error (displayed at DEBUG level) (#12852)
* [rust] Use anyhow crate to display backtrace in case of error * [rust] Include --backtrace argument to enable backtrace capture * [rust] Use --backtrace argument in test * [rust] Enable using RUST_BACKTRACE to capture backtrace as well * [rust] Remove --backtrace (display backtrace when error is available at DEBUG level) * [rust] Include debug info in release artifact and enable backtrace by default * Revert "[rust] Include debug info in release artifact and enable backtrace by default" This reverts commit aa57f2a. * [rust] Remove backtrace for warning message * [rust] Remove --backtrace from test * [rust] Fix problems after rebasing * [rust] Update bazel lock file * [rust] Remove old download browser function in edge module
1 parent bceee4e commit c8d121e

20 files changed

+375
-324
lines changed

rust/Cargo.Bazel.lock

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"checksum": "7bb62c0cb24820374fb08c7eb1d2c1661ceb1a296f8cf2cad91579a7d2687eaf",
2+
"checksum": "d9d5f22625fe3080b3eef8acfa5d55ae7929945c9570e4d592189d3b69f4149f",
33
"crates": {
44
"addr2line 0.19.0": {
55
"name": "addr2line",
@@ -478,6 +478,71 @@
478478
},
479479
"license": "MIT OR Apache-2.0"
480480
},
481+
"anyhow 1.0.75": {
482+
"name": "anyhow",
483+
"version": "1.0.75",
484+
"repository": {
485+
"Http": {
486+
"url": "https://crates.io/api/v1/crates/anyhow/1.0.75/download",
487+
"sha256": "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
488+
}
489+
},
490+
"targets": [
491+
{
492+
"Library": {
493+
"crate_name": "anyhow",
494+
"crate_root": "src/lib.rs",
495+
"srcs": [
496+
"**/*.rs"
497+
]
498+
}
499+
},
500+
{
501+
"BuildScript": {
502+
"crate_name": "build_script_build",
503+
"crate_root": "build.rs",
504+
"srcs": [
505+
"**/*.rs"
506+
]
507+
}
508+
}
509+
],
510+
"library_target_name": "anyhow",
511+
"common_attrs": {
512+
"compile_data_glob": [
513+
"**"
514+
],
515+
"crate_features": {
516+
"common": [
517+
"backtrace",
518+
"default",
519+
"std"
520+
],
521+
"selects": {}
522+
},
523+
"deps": {
524+
"common": [
525+
{
526+
"id": "anyhow 1.0.75",
527+
"target": "build_script_build"
528+
},
529+
{
530+
"id": "backtrace 0.3.67",
531+
"target": "backtrace"
532+
}
533+
],
534+
"selects": {}
535+
},
536+
"edition": "2018",
537+
"version": "1.0.75"
538+
},
539+
"build_script_attrs": {
540+
"data_glob": [
541+
"**"
542+
]
543+
},
544+
"license": "MIT OR Apache-2.0"
545+
},
481546
"ar 0.9.0": {
482547
"name": "ar",
483548
"version": "0.9.0",
@@ -672,6 +737,13 @@
672737
"compile_data_glob": [
673738
"**"
674739
],
740+
"crate_features": {
741+
"common": [
742+
"default",
743+
"std"
744+
],
745+
"selects": {}
746+
},
675747
"deps": {
676748
"common": [
677749
{
@@ -3860,6 +3932,13 @@
38603932
"compile_data_glob": [
38613933
"**"
38623934
],
3935+
"crate_features": {
3936+
"common": [
3937+
"read",
3938+
"read-core"
3939+
],
3940+
"selects": {}
3941+
},
38633942
"edition": "2018",
38643943
"version": "0.27.3"
38653944
},
@@ -5965,6 +6044,18 @@
59656044
"compile_data_glob": [
59666045
"**"
59676046
],
6047+
"crate_features": {
6048+
"common": [
6049+
"archive",
6050+
"coff",
6051+
"elf",
6052+
"macho",
6053+
"pe",
6054+
"read_core",
6055+
"unaligned"
6056+
],
6057+
"selects": {}
6058+
},
59686059
"deps": {
59696060
"common": [
59706061
{
@@ -8003,6 +8094,10 @@
80038094
],
80048095
"deps": {
80058096
"common": [
8097+
{
8098+
"id": "anyhow 1.0.75",
8099+
"target": "anyhow"
8100+
},
80068101
{
80078102
"id": "bzip2 0.4.4",
80088103
"target": "bzip2"

rust/Cargo.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ bzip2 = "0.4.4"
3333
sevenz-rust = "0.5.2"
3434
walkdir = "2.4.0"
3535
debpkg = "0.6.0"
36+
anyhow = { version = "1.0.75", features = ["backtrace"] }
3637

3738
[dev-dependencies]
3839
assert_cmd = "2.0.12"

rust/src/chrome.rs

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ use crate::config::ManagerConfig;
1919
use reqwest::Client;
2020
use serde::{Deserialize, Serialize};
2121
use std::collections::HashMap;
22-
use std::error::Error;
22+
23+
use anyhow::anyhow;
24+
use anyhow::Error;
2325
use std::option::Option;
2426
use std::path::PathBuf;
2527

@@ -60,7 +62,7 @@ pub struct ChromeManager {
6062
}
6163

6264
impl ChromeManager {
63-
pub fn new() -> Result<Box<Self>, Box<dyn Error>> {
65+
pub fn new() -> Result<Box<Self>, Error> {
6466
let browser_name = CHROME_NAME;
6567
let driver_name = CHROMEDRIVER_NAME;
6668
let config = ManagerConfig::default(browser_name, driver_name);
@@ -94,18 +96,15 @@ impl ChromeManager {
9496
format!("{}{}", CFT_URL, endpoint)
9597
}
9698

97-
fn request_driver_version_from_latest(
98-
&self,
99-
driver_url: String,
100-
) -> Result<String, Box<dyn Error>> {
99+
fn request_driver_version_from_latest(&self, driver_url: String) -> Result<String, Error> {
101100
self.log.debug(format!(
102101
"Reading {} version from {}",
103102
&self.driver_name, driver_url
104103
));
105104
read_version_from_link(self.get_http_client(), driver_url, self.get_logger())
106105
}
107106

108-
fn request_versions_from_online<T>(&self, driver_url: String) -> Result<T, Box<dyn Error>>
107+
fn request_versions_from_online<T>(&self, driver_url: String) -> Result<T, Error>
109108
where
110109
T: Serialize + for<'a> Deserialize<'a>,
111110
{
@@ -114,7 +113,7 @@ impl ChromeManager {
114113
parse_json_from_url::<T>(self.get_http_client(), driver_url)
115114
}
116115

117-
fn request_latest_driver_version_from_online(&mut self) -> Result<String, Box<dyn Error>> {
116+
fn request_latest_driver_version_from_online(&mut self) -> Result<String, Error> {
118117
let driver_name = self.driver_name;
119118
self.get_logger().trace(format!(
120119
"Using Chrome for Testing (CfT) endpoints to find out latest stable {} version",
@@ -150,7 +149,7 @@ impl ChromeManager {
150149
Ok(stable_channel.version)
151150
}
152151

153-
fn request_good_driver_version_from_online(&mut self) -> Result<String, Box<dyn Error>> {
152+
fn request_good_driver_version_from_online(&mut self) -> Result<String, Error> {
154153
let browser_or_driver_version = if self.get_driver_version().is_empty() {
155154
self.get_browser_version()
156155
} else {
@@ -170,13 +169,12 @@ impl ChromeManager {
170169
.filter(|r| r.version.starts_with(version_for_filtering.as_str()))
171170
.collect();
172171
if filtered_versions.is_empty() {
173-
return Err(format_three_args(
172+
return Err(anyhow!(format_three_args(
174173
UNAVAILABLE_DOWNLOAD_WITH_MIN_VERSION_ERR_MSG,
175174
self.get_driver_name(),
176175
&version_for_filtering,
177176
&MIN_CHROMEDRIVER_VERSION_CFT.to_string(),
178-
)
179-
.into());
177+
)));
180178
}
181179

182180
let driver_version = filtered_versions.last().unwrap();
@@ -255,7 +253,7 @@ impl SeleniumManager for ChromeManager {
255253
])
256254
}
257255

258-
fn discover_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
256+
fn discover_browser_version(&mut self) -> Result<Option<String>, Error> {
259257
self.general_discover_browser_version(
260258
r#"HKCU\Software\Google\Chrome\BLBeacon"#,
261259
REG_VERSION_ARG,
@@ -267,7 +265,7 @@ impl SeleniumManager for ChromeManager {
267265
self.driver_name
268266
}
269267

270-
fn request_driver_version(&mut self) -> Result<String, Box<dyn Error>> {
268+
fn request_driver_version(&mut self) -> Result<String, Error> {
271269
let major_browser_version_binding = self.get_major_browser_version();
272270
let major_browser_version = major_browser_version_binding.as_str();
273271
let cache_path = self.get_cache_path()?;
@@ -327,11 +325,11 @@ impl SeleniumManager for ChromeManager {
327325
}
328326
}
329327

330-
fn request_browser_version(&mut self) -> Result<Option<String>, Box<dyn Error>> {
328+
fn request_browser_version(&mut self) -> Result<Option<String>, Error> {
331329
self.general_request_browser_version(self.browser_name)
332330
}
333331

334-
fn get_driver_url(&mut self) -> Result<String, Box<dyn Error>> {
332+
fn get_driver_url(&mut self) -> Result<String, Error> {
335333
let major_driver_version = self
336334
.get_major_driver_version()
337335
.parse::<i32>()
@@ -373,7 +371,7 @@ impl SeleniumManager for ChromeManager {
373371
))
374372
}
375373

376-
fn get_driver_path_in_cache(&self) -> Result<PathBuf, Box<dyn Error>> {
374+
fn get_driver_path_in_cache(&self) -> Result<PathBuf, Error> {
377375
Ok(compose_driver_path_in_cache(
378376
self.get_cache_path()?.unwrap_or_default(),
379377
self.driver_name,
@@ -426,7 +424,7 @@ impl SeleniumManager for ChromeManager {
426424
fn request_latest_browser_version_from_online(
427425
&mut self,
428426
_browser_version: &str,
429-
) -> Result<String, Box<dyn Error>> {
427+
) -> Result<String, Error> {
430428
let browser_name = self.browser_name;
431429
self.get_logger().trace(format!(
432430
"Using Chrome for Testing (CfT) endpoints to find out latest stable {} version",
@@ -457,7 +455,7 @@ impl SeleniumManager for ChromeManager {
457455
fn request_fixed_browser_version_from_online(
458456
&mut self,
459457
_browser_version: &str,
460-
) -> Result<String, Box<dyn Error>> {
458+
) -> Result<String, Error> {
461459
let browser_name = self.browser_name;
462460
let mut browser_version = self.get_browser_version().to_string();
463461
let major_browser_version = self.get_major_browser_version();
@@ -497,13 +495,12 @@ impl SeleniumManager for ChromeManager {
497495
.filter(|r| r.version.starts_with(major_browser_version.as_str()))
498496
.collect();
499497
if filtered_versions.is_empty() {
500-
return Err(format_three_args(
498+
return Err(anyhow!(format_three_args(
501499
UNAVAILABLE_DOWNLOAD_WITH_MIN_VERSION_ERR_MSG,
502500
browser_name,
503501
&major_browser_version,
504502
&MIN_CHROME_VERSION_CFT.to_string(),
505-
)
506-
.into());
503+
)));
507504
}
508505
let last_browser = filtered_versions.last().unwrap();
509506
let platform_url: Vec<&PlatformUrl> = last_browser
@@ -518,14 +515,11 @@ impl SeleniumManager for ChromeManager {
518515
}
519516
}
520517

521-
fn get_min_browser_version_for_download(&self) -> Result<i32, Box<dyn Error>> {
518+
fn get_min_browser_version_for_download(&self) -> Result<i32, Error> {
522519
Ok(MIN_CHROME_VERSION_CFT)
523520
}
524521

525-
fn get_browser_binary_path(
526-
&mut self,
527-
_browser_version: &str,
528-
) -> Result<PathBuf, Box<dyn Error>> {
522+
fn get_browser_binary_path(&mut self, _browser_version: &str) -> Result<PathBuf, Error> {
529523
let browser_in_cache = self.get_browser_path_in_cache()?;
530524
if MACOS.is(self.get_os()) {
531525
Ok(browser_in_cache.join(CFT_MACOS_APP_NAME))
@@ -534,10 +528,7 @@ impl SeleniumManager for ChromeManager {
534528
}
535529
}
536530

537-
fn get_browser_url_for_download(
538-
&mut self,
539-
browser_version: &str,
540-
) -> Result<String, Box<dyn Error>> {
531+
fn get_browser_url_for_download(&mut self, browser_version: &str) -> Result<String, Error> {
541532
if let Some(browser_url) = self.browser_url.clone() {
542533
Ok(browser_url)
543534
} else {
@@ -553,7 +544,7 @@ impl SeleniumManager for ChromeManager {
553544
fn get_browser_label_for_download(
554545
&self,
555546
_browser_version: &str,
556-
) -> Result<Option<&str>, Box<dyn Error>> {
547+
) -> Result<Option<&str>, Error> {
557548
Ok(None)
558549
}
559550
}

rust/src/config.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ use crate::{ARCH_AMD64, ARCH_ARM64, ARCH_X86, TTL_SEC, WMIC_COMMAND_OS};
2525
use std::cell::RefCell;
2626
use std::env;
2727
use std::env::consts::OS;
28-
use std::error::Error;
28+
29+
use anyhow::anyhow;
30+
use anyhow::Error;
2931
use std::fs::read_to_string;
3032
use std::path::Path;
3133
use toml::Table;
@@ -129,15 +131,15 @@ impl OS {
129131
}
130132
}
131133

132-
pub fn str_to_os(os: &str) -> Result<OS, Box<dyn Error>> {
134+
pub fn str_to_os(os: &str) -> Result<OS, Error> {
133135
if WINDOWS.is(os) {
134136
Ok(WINDOWS)
135137
} else if MACOS.is(os) {
136138
Ok(MACOS)
137139
} else if LINUX.is(os) {
138140
Ok(LINUX)
139141
} else {
140-
Err(format!("Invalid operating system: {os}").into())
142+
Err(anyhow!(format!("Invalid operating system: {os}")))
141143
}
142144
}
143145

@@ -232,7 +234,7 @@ fn get_env_name(suffix: &str) -> String {
232234
concat(ENV_PREFIX, suffix_uppercase.as_str())
233235
}
234236

235-
fn get_config() -> Result<Table, Box<dyn Error>> {
237+
fn get_config() -> Result<Table, Error> {
236238
let cache_path = read_cache_path();
237239
let config_path = Path::new(&cache_path).to_path_buf().join(CONFIG_FILE);
238240
Ok(read_to_string(config_path)?.parse()?)

0 commit comments

Comments
 (0)