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
62pub fn force_backtrace() {
65 crate::set_rust_backtrace_override(crate::RustBacktrace::Enabled);
66}
67
68pub mod settings {
72 use std::{
73 env,
74 path::{Path, PathBuf},
75 process::Command,
76 sync::LazyLock,
77 };
78
79 #[must_use]
82 pub fn backtrace() -> insta::Settings {
83 static RUSTC_SYSROOT: LazyLock<String> = LazyLock::new(|| {
84 String::from_utf8(
85 Command::new("rustc")
86 .arg("--print")
87 .arg("sysroot")
88 .output()
89 .expect("failed to run rustc")
90 .stdout,
91 )
92 .expect("invalid UTF-8 in rustc sysroot")
93 .trim()
94 .to_owned()
95 });
96
97 static WORKSPACE_ROOT: LazyLock<String> = LazyLock::new(|| {
98 Path::new(env!("CARGO_MANIFEST_DIR"))
99 .parent()
100 .unwrap()
101 .parent()
102 .unwrap()
103 .to_string_lossy()
104 .into_owned()
105 });
106
107 static CARGO_HOME: LazyLock<String> = LazyLock::new(|| {
108 env::var("CARGO_HOME")
109 .map_or_else(
110 |_| {
111 PathBuf::from(env::var("HOME").expect("HOME environment variable not set"))
112 .join(".cargo")
113 },
114 PathBuf::from,
115 )
116 .to_string_lossy()
117 .into_owned()
118 });
119
120 let mut settings = insta::Settings::clone_current();
121 settings.add_filter(r"\[[0-9a-f]{7,16}\]", "[[HASH]]");
122 settings.add_filter(r"::h[0-9a-f]{7,16}\b", "::h[HASH]");
123 settings.add_filter(r"\/[a-f0-9]+\/", "/[HASH]/");
124 settings.add_filter(r"rs:\d+(:\d+)?", "rs:[LOC]");
125 settings.add_filter(&WORKSPACE_ROOT, "[WORKSPACE]");
126 settings.add_filter(&RUSTC_SYSROOT, "[SYS_ROOT]");
127 settings.add_filter(&CARGO_HOME, "[CARGO_HOME]/");
128 settings.add_filter(
131 r"\[SYS_ROOT\]/lib/rustlib/src/rust/library/",
132 "[STDLIB]/library/",
133 );
134 settings.add_filter(r"/rustc/\[HASH\]/library/", "[STDLIB]/library/");
135 settings.add_filter(r#""line":\s*\d+"#, r#""line": 42"#);
137 settings.add_filter(r#""column":\s*\d+"#, r#""column": 69"#);
138 settings.add_filter(r"__pthread\w*", "[OS_TAIL]");
142 settings
143 }
144}
145
146#[macro_export]
149macro_rules! redact {
150 ($name:ident, $bl:block) => {
151 $crate::test_utils::settings::$name().bind(|| $bl)
152 };
153}