use std::cell::Cell;
use kvlog::collector::{set_uninitialized_log_policy, UninitializedLogPolicy};
use kvlog::EnvGuard;
static ENABLED: EnvGuard = EnvGuard::new("KVLOG_TEST_MACRO_ENABLED");
static DISABLED: EnvGuard = EnvGuard::new("KVLOG_TEST_MACRO_DISABLED");
struct CountingGuard<'a> {
calls: &'a Cell<usize>,
}
impl CountingGuard<'_> {
fn is_enabled(&self) -> bool {
self.calls.set(self.calls.get() + 1);
true
}
}
fn record_count() -> usize {
let logger = kvlog::global_logger();
kvlog::encoding::decode(logger.encoder.bytes())
.map(Result::unwrap)
.count()
}
#[test]
fn guarded_logging_skips_disabled_bodies_and_supports_all_levels() {
set_uninitialized_log_policy(UninitializedLogPolicy::Buffer {
max_bytes: usize::MAX,
});
kvlog::global_logger().encoder.clear();
ENABLED.set(true);
DISABLED.set(false);
let fields_evaluated = Cell::new(0);
kvlog::info!(DISABLED; "disabled", value = {
fields_evaluated.set(fields_evaluated.get() + 1);
1u8
});
assert_eq!(fields_evaluated.get(), 0);
assert_eq!(record_count(), 0);
kvlog::info!(ENABLED; "info", value = {
fields_evaluated.set(fields_evaluated.get() + 1);
1u8
});
kvlog::warn!(ENABLED; "warn", value = {
fields_evaluated.set(fields_evaluated.get() + 1);
2u8
});
kvlog::error!(ENABLED; "error", value = {
fields_evaluated.set(fields_evaluated.get() + 1);
3u8
});
kvlog::debug!(ENABLED; "debug", value = {
fields_evaluated.set(fields_evaluated.get() + 1);
4u8
});
let condition_calls = Cell::new(0);
let counting_guard = CountingGuard {
calls: &condition_calls,
};
kvlog::info!(&counting_guard; "expression guard");
assert_eq!(condition_calls.get(), 1);
if cfg!(feature = "debug") {
assert_eq!(fields_evaluated.get(), 4);
assert_eq!(record_count(), 5);
} else {
assert_eq!(fields_evaluated.get(), 3);
assert_eq!(record_count(), 4);
}
}