use crate::backpressure::_reset_backpressure_for_tests;
use crate::cardinality::clear_cardinality_limits;
use crate::classification::clear_classification_rules;
use crate::consent::reset_consent_for_tests;
use crate::context::{reset_context_for_tests, reset_trace_context_for_tests};
use crate::health::_reset_health_for_tests;
use crate::metrics::reset_metrics_for_tests;
use crate::otel::_reset_otel_for_tests;
use crate::pii::{replace_pii_rules, reset_secret_patterns_for_tests};
use crate::receipts::reset_receipts_for_tests;
use crate::resilience::_reset_resilience_for_tests;
use crate::sampling::_reset_sampling_for_tests;
use crate::schema::_reset_schema_for_tests;
use crate::setup::shutdown_telemetry;
use crate::slo::reset_slo_for_tests;
use crate::tracer::set_trace_context;
use std::sync::{Mutex, MutexGuard, OnceLock};
pub use crate::config::probe::{config_defaults_probe, ProbedConfigEntry};
static TEST_STATE_LOCK: OnceLock<Mutex<()>> = OnceLock::new();
#[cfg_attr(test, mutants::skip)] fn default_test_state_lock_mutex() -> Mutex<()> {
Mutex::new(())
}
fn test_state_lock() -> &'static Mutex<()> {
TEST_STATE_LOCK.get_or_init(default_test_state_lock_mutex)
}
pub fn acquire_test_state_lock() -> MutexGuard<'static, ()> {
test_state_lock().lock().unwrap_or_else(|e| e.into_inner())
}
pub fn reset_telemetry_state() {
let _ = shutdown_telemetry(None);
_reset_otel_for_tests();
#[cfg(feature = "otel")]
crate::otel::_reset_abandoned_workers_for_tests();
_reset_health_for_tests();
_reset_backpressure_for_tests();
_reset_sampling_for_tests();
_reset_resilience_for_tests();
reset_metrics_for_tests();
reset_receipts_for_tests();
reset_consent_for_tests();
reset_slo_for_tests();
clear_cardinality_limits();
clear_classification_rules();
replace_pii_rules(Vec::new());
reset_secret_patterns_for_tests();
_reset_schema_for_tests();
reset_context_for_tests();
}
pub fn reset_trace_context() {
reset_trace_context_for_tests();
drop(set_trace_context(None, None));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn testing_test_acquire_lock_recovers_after_poison() {
let handle = std::thread::spawn(|| {
let _guard = test_state_lock()
.lock()
.expect("test state lock should acquire before poison");
panic!("poison test state lock");
});
assert!(handle.join().is_err(), "worker must panic to poison lock");
let _guard = acquire_test_state_lock();
}
}