use std::cell::RefCell;
thread_local! {
pub static CAPTURED_LOGS: RefCell<Vec<(log::Level, String)>> = const { RefCell::new(Vec::new()) };
}
pub struct TestLogger;
impl log::Log for TestLogger {
fn enabled(&self, _: &log::Metadata) -> bool {
true
}
fn log(&self, record: &log::Record) {
CAPTURED_LOGS.with(|logs| {
logs.borrow_mut()
.push((record.level(), format!("{}", record.args())));
});
}
fn flush(&self) {}
}
pub static TEST_LOGGER: TestLogger = TestLogger;
pub fn init_test_logger() {
let _ = log::set_logger(&TEST_LOGGER);
log::set_max_level(log::LevelFilter::Trace);
}
pub fn take_logs() -> Vec<(log::Level, String)> {
CAPTURED_LOGS.with(|logs| std::mem::take(&mut *logs.borrow_mut()))
}
#[cfg(test)]
mod tests {
use log::Log as _;
use super::*;
#[test]
fn test_logger_enabled_returns_true_for_any_metadata() {
let meta = log::Metadata::builder()
.level(log::Level::Info)
.target("test")
.build();
assert!(TestLogger.enabled(&meta));
}
}