oopsie_core/
test_utils.rs1#[cfg(feature = "tracing")]
11use tracing_subscriber::prelude::*;
12
13#[doc(hidden)]
14pub mod __private {
15 pub use konst;
16 pub use target_triple::TARGET;
17}
18
19pub const CHANNEL: &str = if cfg!(feature = "unstable-error-generic-member-access") {
25 "unstable"
26} else {
27 "stable"
28};
29
30#[cfg(feature = "unstable-error-generic-member-access")]
31const _: () = assert!(matches!(CHANNEL.as_bytes(), b"unstable"));
32
33#[macro_export]
36macro_rules! snap_name {
37 ($name:literal) => {{
38 $crate::test_utils::__private::konst::string::str_join!(
39 "_",
40 &[
41 $name,
42 $crate::test_utils::CHANNEL,
43 $crate::test_utils::__private::TARGET
44 ]
45 )
46 }};
47}
48
49#[cfg(feature = "tracing")]
52#[must_use]
53pub fn init_test_subscriber() -> tracing::subscriber::DefaultGuard {
54 #[cfg(feature = "serde")]
55 let error_layer = crate::tracing::json_error_layer();
56 #[cfg(not(feature = "serde"))]
57 let error_layer = tracing_error::ErrorLayer::default();
58 let subscriber = tracing_subscriber::registry().with(error_layer);
59 tracing::subscriber::set_default(subscriber)
60}
61
62#[cfg(feature = "tracing")]
67#[must_use]
68pub fn init_test_subscriber_without_error_layer() -> tracing::subscriber::DefaultGuard {
69 tracing::subscriber::set_default(tracing_subscriber::registry())
70}
71
72pub fn force_backtrace() {
75 crate::set_rust_backtrace_override(crate::RustBacktrace::Enabled);
76}
77
78pub mod settings {
82 use std::{
83 env,
84 path::{Path, PathBuf},
85 process::Command,
86 sync::LazyLock,
87 };
88
89 #[must_use]
92 pub fn backtrace() -> insta::Settings {
93 static RUSTC_SYSROOT: LazyLock<String> = LazyLock::new(|| {
94 String::from_utf8(
95 Command::new("rustc")
96 .arg("--print")
97 .arg("sysroot")
98 .output()
99 .expect("failed to run rustc")
100 .stdout,
101 )
102 .expect("invalid UTF-8 in rustc sysroot")
103 .trim()
104 .to_owned()
105 });
106
107 static WORKSPACE_ROOT: LazyLock<String> = LazyLock::new(|| {
108 Path::new(env!("CARGO_MANIFEST_DIR"))
109 .parent()
110 .unwrap()
111 .parent()
112 .unwrap()
113 .to_string_lossy()
114 .into_owned()
115 });
116
117 static CARGO_HOME: LazyLock<String> = LazyLock::new(|| {
118 env::var("CARGO_HOME")
119 .map_or_else(
120 |_| {
121 PathBuf::from(env::var("HOME").expect("HOME environment variable not set"))
122 .join(".cargo")
123 },
124 PathBuf::from,
125 )
126 .to_string_lossy()
127 .into_owned()
128 });
129
130 let mut settings = insta::Settings::clone_current();
131 settings.add_filter(r"\[[0-9a-f]{7,16}\]", "[[HASH]]");
132 settings.add_filter(r"::h[0-9a-f]{7,16}\b", "::h[HASH]");
133 settings.add_filter(r"\/[a-f0-9]+\/", "/[HASH]/");
134 settings.add_filter(r"rs:\d+(:\d+)?", "rs:[LOC]");
135 settings.add_filter(&WORKSPACE_ROOT, "[WORKSPACE]");
136 settings.add_filter(&RUSTC_SYSROOT, "[SYS_ROOT]");
137 settings.add_filter(&CARGO_HOME, "[CARGO_HOME]/");
138 settings.add_filter(
141 r"\[SYS_ROOT\]/lib/rustlib/src/rust/library/",
142 "[STDLIB]/library/",
143 );
144 settings.add_filter(r"/rustc/\[HASH\]/library/", "[STDLIB]/library/");
145 settings.add_filter(r#""line":\s*\d+"#, r#""line": 42"#);
147 settings.add_filter(r#""column":\s*\d+"#, r#""column": 69"#);
148 settings.add_filter(r"__pthread\w*", "[OS_TAIL]");
152 settings
153 }
154}
155
156#[macro_export]
159macro_rules! redact {
160 ($name:ident, $bl:block) => {
161 $crate::test_utils::settings::$name().bind(|| $bl)
162 };
163}