use log::Level;
use log::LevelFilter;
use log::Log;
use log::Metadata;
use log::Record;
use std::sync::Mutex;
use std::sync::Once;
pub struct CapturedLog {
#[cfg(feature = "warning-messages")]
pub body: String,
pub level: Level,
}
static LOG_RECORDS: Mutex<Vec<CapturedLog>> = Mutex::new(Vec::new());
struct TestingLogger {}
impl Log for TestingLogger {
#[allow(unused_variables)]
fn enabled(&self, metadata: &Metadata) -> bool {
true }
fn log(&self, record: &Record) {
let mut records = LOG_RECORDS.lock().unwrap();
let captured_record = CapturedLog {
#[cfg(feature = "warning-messages")]
body: format!("{}", record.args()),
level: record.level(),
};
records.push(captured_record);
}
fn flush(&self) {}
}
static FIRST_TEST: Once = Once::new();
static TEST_LOGGER: TestingLogger = TestingLogger {};
pub fn setup() {
FIRST_TEST.call_once(|| {
log::set_logger(&TEST_LOGGER).unwrap();
});
log::set_max_level(LevelFilter::Trace);
let mut records = LOG_RECORDS.lock().unwrap();
records.truncate(0);
}
pub fn validate<F>(asserter: F)
where
F: Fn(&Vec<CapturedLog>),
{
let mut records = LOG_RECORDS.lock().unwrap();
asserter(&records);
records.truncate(0);
}