1 use super::*;
2 use tracing_subscriber::{
3     filter::{filter_fn, Targets},
4     prelude::*,
5 };
6 
7 #[test]
8 #[cfg_attr(not(feature = "tracing-log"), ignore)]
log_events()9 fn log_events() {
10     // Reproduces https://github.com/tokio-rs/tracing/issues/1563
11     mod inner {
12         pub(super) const MODULE_PATH: &str = module_path!();
13 
14         #[tracing::instrument]
15         pub(super) fn logs() {
16             log::debug!("inner");
17         }
18     }
19 
20     let filter = Targets::new()
21         .with_default(LevelFilter::DEBUG)
22         .with_target(inner::MODULE_PATH, LevelFilter::WARN);
23 
24     let layer =
25         tracing_subscriber::layer::Identity::new().with_filter(filter_fn(move |_meta| true));
26 
27     let _guard = tracing_subscriber::registry()
28         .with(filter)
29         .with(layer)
30         .set_default();
31 
32     inner::logs();
33 }
34 
35 #[test]
inner_layer_short_circuits()36 fn inner_layer_short_circuits() {
37     // This test ensures that when a global filter short-circuits `Interest`
38     // evaluation, we aren't left with a "dirty" per-layer filter state.
39 
40     let (layer, handle) = layer::mock()
41         .event(event::msg("hello world"))
42         .done()
43         .run_with_handle();
44 
45     let filter = Targets::new().with_target("magic_target", LevelFilter::DEBUG);
46 
47     let _guard = tracing_subscriber::registry()
48         // Note: we don't just use a `LevelFilter` for the global filter here,
49         // because it will just return a max level filter, and the chain of
50         // `register_callsite` calls that would trigger the bug never happens...
51         .with(filter::filter_fn(|meta| meta.level() <= &Level::INFO))
52         .with(layer.with_filter(filter))
53         .set_default();
54 
55     tracing::debug!("skip me please!");
56     tracing::info!(target: "magic_target", "hello world");
57 
58     handle.assert_finished();
59 }
60