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