]>
Commit | Line | Data |
---|---|---|
ff7c6d11 XL |
1 | #[macro_use] |
2 | extern crate log; | |
476ff2be SL |
3 | |
4 | use std::sync::{Arc, Mutex}; | |
ff7c6d11 | 5 | use log::{Level, LevelFilter, Log, Record, Metadata}; |
476ff2be | 6 | |
ff7c6d11 XL |
7 | #[cfg(feature = "std")] |
8 | use log::set_boxed_logger; | |
9 | ||
10 | #[cfg(not(feature = "std"))] | |
11 | fn set_boxed_logger(logger: Box<Log>) -> Result<(), log::SetLoggerError> { | |
12 | log::set_logger(unsafe { &*Box::into_raw(logger) }) | |
476ff2be SL |
13 | } |
14 | ||
15 | struct State { | |
ff7c6d11 | 16 | last_log: Mutex<Option<Level>>, |
476ff2be SL |
17 | } |
18 | ||
19 | struct Logger(Arc<State>); | |
20 | ||
21 | impl Log for Logger { | |
ff7c6d11 | 22 | fn enabled(&self, _: &Metadata) -> bool { |
476ff2be SL |
23 | true |
24 | } | |
25 | ||
ff7c6d11 | 26 | fn log(&self, record: &Record) { |
476ff2be SL |
27 | *self.0.last_log.lock().unwrap() = Some(record.level()); |
28 | } | |
ff7c6d11 | 29 | fn flush(&self) {} |
476ff2be SL |
30 | } |
31 | ||
32 | fn main() { | |
ff7c6d11 XL |
33 | let me = Arc::new(State { last_log: Mutex::new(None) }); |
34 | let a = me.clone(); | |
35 | set_boxed_logger(Box::new(Logger(me))).unwrap(); | |
476ff2be | 36 | |
ff7c6d11 XL |
37 | test(&a, LevelFilter::Off); |
38 | test(&a, LevelFilter::Error); | |
39 | test(&a, LevelFilter::Warn); | |
40 | test(&a, LevelFilter::Info); | |
41 | test(&a, LevelFilter::Debug); | |
42 | test(&a, LevelFilter::Trace); | |
476ff2be SL |
43 | } |
44 | ||
ff7c6d11 XL |
45 | fn test(a: &State, filter: LevelFilter) { |
46 | log::set_max_level(filter); | |
476ff2be | 47 | error!(""); |
ff7c6d11 | 48 | last(&a, t(Level::Error, filter)); |
476ff2be | 49 | warn!(""); |
ff7c6d11 | 50 | last(&a, t(Level::Warn, filter)); |
476ff2be | 51 | info!(""); |
ff7c6d11 | 52 | last(&a, t(Level::Info, filter)); |
476ff2be | 53 | debug!(""); |
ff7c6d11 | 54 | last(&a, t(Level::Debug, filter)); |
476ff2be | 55 | trace!(""); |
ff7c6d11 | 56 | last(&a, t(Level::Trace, filter)); |
476ff2be | 57 | |
ff7c6d11 XL |
58 | fn t(lvl: Level, filter: LevelFilter) -> Option<Level> { |
59 | if lvl <= filter { Some(lvl) } else { None } | |
476ff2be SL |
60 | } |
61 | } | |
62 | ||
ff7c6d11 XL |
63 | fn last(state: &State, expected: Option<Level>) { |
64 | let lvl = state.last_log.lock().unwrap().take(); | |
65 | assert_eq!(lvl, expected); | |
476ff2be | 66 | } |