12d8ae3abSopenharmony_ci#[macro_use]
22d8ae3abSopenharmony_ciextern crate log;
32d8ae3abSopenharmony_ci
42d8ae3abSopenharmony_ciuse std::sync::{Arc, Mutex};
52d8ae3abSopenharmony_ciuse log::{Level, LevelFilter, Log, Record, Metadata};
62d8ae3abSopenharmony_ci
72d8ae3abSopenharmony_ci#[cfg(feature = "std")]
82d8ae3abSopenharmony_ciuse log::set_boxed_logger;
92d8ae3abSopenharmony_ci#[cfg(not(feature = "std"))]
102d8ae3abSopenharmony_cifn set_boxed_logger(logger: Box<Log>) -> Result<(), log::SetLoggerError> {
112d8ae3abSopenharmony_ci    log::set_logger(Box::leak(logger))
122d8ae3abSopenharmony_ci}
132d8ae3abSopenharmony_ci
142d8ae3abSopenharmony_cistruct State {
152d8ae3abSopenharmony_ci    last_log: Mutex<Option<Level>>,
162d8ae3abSopenharmony_ci}
172d8ae3abSopenharmony_ci
182d8ae3abSopenharmony_cistruct Logger(Arc<State>);
192d8ae3abSopenharmony_ci
202d8ae3abSopenharmony_ciimpl Log for Logger {
212d8ae3abSopenharmony_ci    fn enabled(&self, _: &Metadata) -> bool {
222d8ae3abSopenharmony_ci        true
232d8ae3abSopenharmony_ci    }
242d8ae3abSopenharmony_ci
252d8ae3abSopenharmony_ci    fn log(&self, record: &Record) {
262d8ae3abSopenharmony_ci        *self.0.last_log.lock().unwrap() = Some(record.level());
272d8ae3abSopenharmony_ci    }
282d8ae3abSopenharmony_ci
292d8ae3abSopenharmony_ci    fn flush(&self) {}
302d8ae3abSopenharmony_ci}
312d8ae3abSopenharmony_ci
322d8ae3abSopenharmony_cifn main() {
332d8ae3abSopenharmony_ci    let me = Arc::new(State { last_log: Mutex::new(None) });
342d8ae3abSopenharmony_ci    let a = me.clone();
352d8ae3abSopenharmony_ci    set_boxed_logger(Box::new(Logger(me))).unwrap();
362d8ae3abSopenharmony_ci
372d8ae3abSopenharmony_ci    test(&a, LevelFilter::Off);
382d8ae3abSopenharmony_ci    test(&a, LevelFilter::Error);
392d8ae3abSopenharmony_ci    test(&a, LevelFilter::Warn);
402d8ae3abSopenharmony_ci    test(&a, LevelFilter::Info);
412d8ae3abSopenharmony_ci    test(&a, LevelFilter::Debug);
422d8ae3abSopenharmony_ci    test(&a, LevelFilter::Trace);
432d8ae3abSopenharmony_ci}
442d8ae3abSopenharmony_ci
452d8ae3abSopenharmony_cifn test(a: &State, filter: LevelFilter) {
462d8ae3abSopenharmony_ci    log::set_max_level(filter);
472d8ae3abSopenharmony_ci    error!("");
482d8ae3abSopenharmony_ci    last(&a, t(Level::Error, filter));
492d8ae3abSopenharmony_ci    warn!("");
502d8ae3abSopenharmony_ci    last(&a, t(Level::Warn, filter));
512d8ae3abSopenharmony_ci    info!("");
522d8ae3abSopenharmony_ci    last(&a, t(Level::Info, filter));
532d8ae3abSopenharmony_ci
542d8ae3abSopenharmony_ci    debug!("");
552d8ae3abSopenharmony_ci    if cfg!(debug_assertions) {
562d8ae3abSopenharmony_ci        last(&a, t(Level::Debug, filter));
572d8ae3abSopenharmony_ci    } else {
582d8ae3abSopenharmony_ci        last(&a, None);
592d8ae3abSopenharmony_ci    }
602d8ae3abSopenharmony_ci
612d8ae3abSopenharmony_ci    trace!("");
622d8ae3abSopenharmony_ci    last(&a, None);
632d8ae3abSopenharmony_ci
642d8ae3abSopenharmony_ci    fn t(lvl: Level, filter: LevelFilter) -> Option<Level> {
652d8ae3abSopenharmony_ci        if lvl <= filter {Some(lvl)} else {None}
662d8ae3abSopenharmony_ci    }
672d8ae3abSopenharmony_ci}
682d8ae3abSopenharmony_ci
692d8ae3abSopenharmony_cifn last(state: &State, expected: Option<Level>) {
702d8ae3abSopenharmony_ci    let mut lvl = state.last_log.lock().unwrap();
712d8ae3abSopenharmony_ci    assert_eq!(*lvl, expected);
722d8ae3abSopenharmony_ci    *lvl = None;
732d8ae3abSopenharmony_ci}
74