provide_telemetry/
testing.rs1use crate::backpressure::_reset_backpressure_for_tests;
7use crate::cardinality::clear_cardinality_limits;
8#[cfg(feature = "governance")]
9use crate::classification::clear_classification_rules;
10#[cfg(feature = "governance")]
11use crate::consent::reset_consent_for_tests;
12use crate::context::{reset_context_for_tests, reset_trace_context_for_tests};
13use crate::health::_reset_health_for_tests;
14use crate::metrics::reset_metrics_for_tests;
15use crate::otel::_reset_otel_for_tests;
16use crate::pii::{replace_pii_rules, reset_secret_patterns_for_tests};
17#[cfg(feature = "governance")]
18use crate::receipts::reset_receipts_for_tests;
19use crate::resilience::_reset_resilience_for_tests;
20use crate::sampling::_reset_sampling_for_tests;
21use crate::schema::_reset_schema_for_tests;
22use crate::setup::shutdown_telemetry;
23use crate::slo::reset_slo_for_tests;
24use crate::tracer::set_trace_context;
25use std::sync::{Mutex, MutexGuard, OnceLock};
26
27static TEST_STATE_LOCK: OnceLock<Mutex<()>> = OnceLock::new();
28
29#[cfg_attr(test, mutants::skip)] fn default_test_state_lock_mutex() -> Mutex<()> {
31 Mutex::new(())
32}
33
34fn test_state_lock() -> &'static Mutex<()> {
35 TEST_STATE_LOCK.get_or_init(default_test_state_lock_mutex)
36}
37
38pub fn acquire_test_state_lock() -> MutexGuard<'static, ()> {
40 test_state_lock().lock().unwrap_or_else(|e| e.into_inner())
41}
42
43pub fn reset_telemetry_state() {
45 let _ = shutdown_telemetry();
46 _reset_otel_for_tests();
47 _reset_health_for_tests();
48 _reset_backpressure_for_tests();
49 _reset_sampling_for_tests();
50 _reset_resilience_for_tests();
51 reset_metrics_for_tests();
52 #[cfg(feature = "governance")]
53 reset_receipts_for_tests();
54 #[cfg(feature = "governance")]
55 reset_consent_for_tests();
56 reset_slo_for_tests();
57 clear_cardinality_limits();
58 #[cfg(feature = "governance")]
59 clear_classification_rules();
60 replace_pii_rules(Vec::new());
61 reset_secret_patterns_for_tests();
62 _reset_schema_for_tests();
63 reset_context_for_tests();
64}
65
66pub fn reset_trace_context() {
68 reset_trace_context_for_tests();
69 drop(set_trace_context(None, None));
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[test]
77 fn testing_test_acquire_lock_recovers_after_poison() {
78 let handle = std::thread::spawn(|| {
79 let _guard = test_state_lock()
80 .lock()
81 .expect("test state lock should acquire before poison");
82 panic!("poison test state lock");
83 });
84 assert!(handle.join().is_err(), "worker must panic to poison lock");
85
86 let _guard = acquire_test_state_lock();
87 }
88}