mirror of
https://github.com/sigp/lighthouse.git
synced 2026-06-29 10:54:24 +00:00
Add test_logger as feature to logging (#2586)
## Issue Addressed Fix #2585 ## Proposed Changes Provide a canonical version of test_logger that can be used throughout lighthouse. ## Additional Info This allows tests to conditionally emit logging data by adding test_logger as the default logger. And then when executing `cargo test --features logging/test_logger` log output will be visible: wink@3900x:~/lighthouse/common/logging/tests/test-feature-test_logger (Add-test_logger-as-feature-to-logging) $ cargo test --features logging/test_logger Finished test [unoptimized + debuginfo] target(s) in 0.02s Running unittests (target/debug/deps/test_logger-e20115db6a5e3714) running 1 test Sep 10 12:53:45.212 INFO hi, module: test_logger:8 test tests::test_fn_with_logging ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests test-logger running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Or, in normal scenarios where logging isn't needed, executing `cargo test` the log output will not be visible: wink@3900x:~/lighthouse/common/logging/tests/test-feature-test_logger (Add-test_logger-as-feature-to-logging) $ cargo test Finished test [unoptimized + debuginfo] target(s) in 0.02s Running unittests (target/debug/deps/test_logger-02e02f8d41e8cf8a) running 1 test test tests::test_fn_with_logging ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests test-logger running 0 tests test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
This commit is contained in:
@@ -4,8 +4,12 @@ version = "0.2.0"
|
||||
authors = ["blacktemplar <blacktemplar@a1.net>"]
|
||||
edition = "2018"
|
||||
|
||||
[features]
|
||||
test_logger = [] # Print log output to stderr when running tests instead of dropping it
|
||||
|
||||
[dependencies]
|
||||
slog = "2.5.2"
|
||||
slog-term = "2.6.0"
|
||||
lighthouse_metrics = { path = "../lighthouse_metrics" }
|
||||
lazy_static = "1.4.0"
|
||||
sloggers = "2.0.2"
|
||||
|
||||
@@ -4,6 +4,7 @@ extern crate lazy_static;
|
||||
use lighthouse_metrics::{
|
||||
inc_counter, try_create_int_counter, IntCounter, Result as MetricsResult,
|
||||
};
|
||||
use slog::Logger;
|
||||
use slog_term::Decorator;
|
||||
use std::io::{Result, Write};
|
||||
|
||||
@@ -157,3 +158,26 @@ impl<'a> slog_term::RecordDecorator for AlignedRecordDecorator<'a> {
|
||||
self.wrapped.start_separator()
|
||||
}
|
||||
}
|
||||
|
||||
/// Return a logger suitable for test usage.
|
||||
///
|
||||
/// By default no logs will be printed, but they can be enabled via
|
||||
/// the `test_logger` feature. This feature can be enabled for any
|
||||
/// dependent crate by passing `--features logging/test_logger`, e.g.
|
||||
/// ```bash
|
||||
/// cargo test -p beacon_chain --features logging/test_logger
|
||||
/// ```
|
||||
pub fn test_logger() -> Logger {
|
||||
use sloggers::Build;
|
||||
|
||||
if cfg!(feature = "test_logger") {
|
||||
sloggers::terminal::TerminalLoggerBuilder::new()
|
||||
.level(sloggers::types::Severity::Debug)
|
||||
.build()
|
||||
.expect("Should build test_logger")
|
||||
} else {
|
||||
sloggers::null::NullLoggerBuilder
|
||||
.build()
|
||||
.expect("Should build null_logger")
|
||||
}
|
||||
}
|
||||
|
||||
53
common/logging/tests/test.rs
Normal file
53
common/logging/tests/test.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
use std::env;
|
||||
use std::process::Command;
|
||||
use std::process::Output;
|
||||
|
||||
fn run_cmd(cmd_line: &str) -> Result<Output, std::io::Error> {
|
||||
let output;
|
||||
if cfg!(target_os = "windows") {
|
||||
output = Command::new(r#"cmd"#).args(["/C", cmd_line]).output();
|
||||
} else {
|
||||
output = Command::new(r#"sh"#).args(["-c", cmd_line]).output();
|
||||
}
|
||||
output
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_test_logger_with_feature_test_logger() {
|
||||
let cur_dir = env::current_dir().unwrap();
|
||||
let test_dir = cur_dir
|
||||
.join("..")
|
||||
.join("..")
|
||||
.join("testing")
|
||||
.join("test-test_logger");
|
||||
let cmd_line = format!(
|
||||
"cd {} && cargo test --features logging/test_logger",
|
||||
test_dir.to_str().unwrap()
|
||||
);
|
||||
|
||||
let output = run_cmd(&cmd_line);
|
||||
|
||||
// Assert output data DOES contain "INFO hi, "
|
||||
let data = String::from_utf8(output.unwrap().stderr).unwrap();
|
||||
println!("data={}", data);
|
||||
assert!(data.contains("INFO hi, "));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_test_logger_no_features() {
|
||||
// Test without features
|
||||
let cur_dir = env::current_dir().unwrap();
|
||||
let test_dir = cur_dir
|
||||
.join("..")
|
||||
.join("..")
|
||||
.join("testing")
|
||||
.join("test-test_logger");
|
||||
let cmd_line = format!("cd {} && cargo test", test_dir.to_str().unwrap());
|
||||
|
||||
let output = run_cmd(&cmd_line);
|
||||
|
||||
// Assert output data DOES contain "INFO hi, "
|
||||
let data = String::from_utf8(output.unwrap().stderr).unwrap();
|
||||
println!("data={}", data);
|
||||
assert!(!data.contains("INFO hi, "));
|
||||
}
|
||||
Reference in New Issue
Block a user