mithril_common/test/logging/
mod.rs

1//! Logging utilities for tests
2//!
3mod memory_logger;
4
5pub use memory_logger::*;
6
7/// Creates a test-specific `TestLogger` struct that can creates preconfigured logger instances.
8///
9/// This macro avoids direct `slog_async` and `slog_term` dependencies in library crates
10/// by letting dependents add them as `dev-dependencies` only.
11///
12/// ## Methods
13///
14/// - `TestLogger::stdout()` - Logger that outputs to stdout.
15/// - `TestLogger::memory()` - Logger that stores messages in memory for inspection.
16///   Returns `(Logger, MemoryDrainForTestInspector)` tuple
17///
18/// Requires: `slog`, `slog_async`, `slog_term`
19#[macro_export]
20macro_rules! define_test_logger {
21    () => {
22        #[cfg(test)]
23        pub(crate) struct TestLogger;
24
25        #[cfg(test)]
26        mod test_logger_impl {
27            use std::io;
28            use std::sync::Arc;
29
30            use slog::{Drain, Logger};
31            use slog_async::Async;
32            use slog_term::{CompactFormat, PlainDecorator};
33
34            use $crate::test::logging::{MemoryDrainForTest, MemoryDrainForTestInspector};
35
36            impl super::TestLogger {
37                fn from_writer<W: io::Write + Send + 'static>(writer: W) -> Logger {
38                    let decorator = PlainDecorator::new(writer);
39                    let drain = CompactFormat::new(decorator).build().fuse();
40                    let drain = Async::new(drain).build().fuse();
41                    Logger::root(Arc::new(drain), slog::o!())
42                }
43
44                pub(crate) fn stdout() -> Logger {
45                    Self::from_writer(slog_term::TestStdoutWriter)
46                }
47
48                pub(crate) fn memory() -> (Logger, MemoryDrainForTestInspector) {
49                    let (drain, inspector) = MemoryDrainForTest::new();
50                    (Logger::root(drain.fuse(), slog::o!()), inspector)
51                }
52            }
53        }
54    };
55}
56pub use define_test_logger;