use std::io;
use std::sync::{Arc, Mutex};
use ticklog::{debug, error, info, trace, warn, FanOut, Level, LogSink, LogSinkExt};
struct CaptureSink {
levels: Arc<Mutex<Vec<Level>>>,
}
impl LogSink for CaptureSink {
fn accept(&mut self, _line: &[u8], level: Level) -> io::Result<()> {
self.levels.lock().unwrap().push(level);
Ok(())
}
}
fn capture() -> (CaptureSink, Arc<Mutex<Vec<Level>>>) {
let levels = Arc::new(Mutex::new(Vec::new()));
let sink = CaptureSink {
levels: Arc::clone(&levels),
};
(sink, levels)
}
#[test]
fn fanout_routes_each_record_by_per_sink_level() {
let (err_sink, err_levels) = capture();
let (info_sink, info_levels) = capture();
let (trace_sink, trace_levels) = capture();
let fan = FanOut::new()
.add(err_sink.with_max_level(Level::Error))
.add(info_sink.with_max_level(Level::Info))
.add(trace_sink.with_max_level(Level::Trace));
let guard = ticklog::builder()
.sink(fan)
.max_level(Level::Trace)
.build()
.expect("first build in a fresh process must succeed");
error!("e");
warn!("w");
info!("i");
debug!("d");
trace!("t");
drop(guard);
assert_eq!(*err_levels.lock().unwrap(), vec![Level::Error]);
assert_eq!(
*info_levels.lock().unwrap(),
vec![Level::Error, Level::Warn, Level::Info]
);
assert_eq!(
*trace_levels.lock().unwrap(),
vec![
Level::Error,
Level::Warn,
Level::Info,
Level::Debug,
Level::Trace
]
);
}