use {
super::super::*,
std::{
error::Error,
sync::atomic::{AtomicUsize, Ordering},
},
};
#[test]
fn test_nop_logger() {
let logger = NopLogger;
assert!(!logger.enabled(Level::Error));
assert!(!logger.enabled(Level::Warn));
assert!(!logger.enabled(Level::Info));
assert!(!logger.enabled(Level::Debug));
assert!(!logger.enabled(Level::Trace));
let record = Record::builder(Level::Info).message("test").build();
logger.log(&record);
logger.flush();
}
#[test]
fn test_set_logger_error_display() {
let err = SetLoggerError;
assert_eq!(format!("{err}"), "logger already set");
}
#[test]
fn test_logger_fallback() {
let l = logger();
l.flush();
}
#[test]
fn test_custom_logger_trait() {
struct CountingLogger {
count: AtomicUsize,
}
impl Logger for CountingLogger {
fn log(&self, _record: &Record) {
self.count.fetch_add(1, Ordering::Relaxed);
}
fn flush(&self) {}
fn enabled(&self, level: Level) -> bool {
level <= Level::Info
}
}
let logger = CountingLogger {
count: AtomicUsize::new(0),
};
assert!(logger.enabled(Level::Error));
assert!(logger.enabled(Level::Warn));
assert!(logger.enabled(Level::Info));
assert!(!logger.enabled(Level::Debug));
assert!(!logger.enabled(Level::Trace));
logger.flush();
let record = Record::builder(Level::Info).message("test").build();
logger.log(&record);
assert_eq!(logger.count.load(Ordering::Relaxed), 1);
}
#[test]
fn test_logger_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<NopLogger>();
}
#[test]
fn test_logger_trait_object() {
let logger: &dyn Logger = &NopLogger;
assert!(!logger.enabled(Level::Error));
let record = Record::builder(Level::Error).message("test").build();
logger.log(&record);
logger.flush();
}
#[test]
fn test_log_internal() {
__log(
Level::Info,
"test::module",
"test_file.rs",
42,
format_args!("hello {}", "world"),
);
}
#[test]
fn test_flush() {
flush();
}
#[test]
fn test_set_logger_error_is_error() {
let err = SetLoggerError;
let _: &dyn std::error::Error = &err;
assert!(err.source().is_none());
}