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()))
}