1 use super::*;
2 use tracing_mock::{expect, layer::MockLayer};
3
4 #[test]
basic_trees()5 fn basic_trees() {
6 let (with_target, with_target_handle) = layer::named("info_with_target")
7 .event(
8 expect::event()
9 .at_level(Level::INFO)
10 .with_target("my_target"),
11 )
12 .only()
13 .run_with_handle();
14
15 let (info, info_handle) = layer::named("info")
16 .event(
17 expect::event()
18 .at_level(Level::INFO)
19 .with_target(module_path!()),
20 )
21 .event(
22 expect::event()
23 .at_level(Level::INFO)
24 .with_target("my_target"),
25 )
26 .only()
27 .run_with_handle();
28
29 let (all, all_handle) = layer::named("all")
30 .event(
31 expect::event()
32 .at_level(Level::INFO)
33 .with_target(module_path!()),
34 )
35 .event(expect::event().at_level(Level::TRACE))
36 .event(
37 expect::event()
38 .at_level(Level::INFO)
39 .with_target("my_target"),
40 )
41 .event(
42 expect::event()
43 .at_level(Level::TRACE)
44 .with_target("my_target"),
45 )
46 .only()
47 .run_with_handle();
48
49 let info_tree = info
50 .and_then(
51 with_target.with_filter(filter::filter_fn(|meta| dbg!(meta.target()) == "my_target")),
52 )
53 .with_filter(LevelFilter::INFO);
54
55 let subscriber = tracing_subscriber::registry().with(info_tree).with(all);
56 let _guard = dbg!(subscriber).set_default();
57
58 tracing::info!("hello world");
59 tracing::trace!("hello trace");
60 tracing::info!(target: "my_target", "hi to my target");
61 tracing::trace!(target: "my_target", "hi to my target at trace");
62
63 all_handle.assert_finished();
64 info_handle.assert_finished();
65 with_target_handle.assert_finished();
66 }
67
68 #[test]
filter_span_scopes()69 fn filter_span_scopes() {
70 fn target_layer(target: &'static str) -> (MockLayer, subscriber::MockHandle) {
71 layer::named(format!("target_{}", target))
72 .enter(expect::span().with_target(target).at_level(Level::INFO))
73 .event(
74 expect::event()
75 .with_fields(expect::msg("hello world"))
76 .in_scope(vec![expect::span()
77 .with_target(target)
78 .at_level(Level::INFO)]),
79 )
80 .exit(expect::span().with_target(target).at_level(Level::INFO))
81 .only()
82 .run_with_handle()
83 }
84
85 let (a_layer, a_handle) = target_layer("a");
86 let (b_layer, b_handle) = target_layer("b");
87 let (info_layer, info_handle) = layer::named("info")
88 .enter(expect::span().with_target("b").at_level(Level::INFO))
89 .enter(expect::span().with_target("a").at_level(Level::INFO))
90 .event(
91 expect::event()
92 .with_fields(expect::msg("hello world"))
93 .in_scope(vec![
94 expect::span().with_target("a").at_level(Level::INFO),
95 expect::span().with_target("b").at_level(Level::INFO),
96 ]),
97 )
98 .exit(expect::span().with_target("a").at_level(Level::INFO))
99 .exit(expect::span().with_target("b").at_level(Level::INFO))
100 .only()
101 .run_with_handle();
102
103 let full_scope = vec![
104 expect::span().with_target("b").at_level(Level::TRACE),
105 expect::span().with_target("a").at_level(Level::INFO),
106 expect::span().with_target("b").at_level(Level::INFO),
107 expect::span().with_target("a").at_level(Level::TRACE),
108 ];
109 let (all_layer, all_handle) = layer::named("all")
110 .enter(expect::span().with_target("a").at_level(Level::TRACE))
111 .enter(expect::span().with_target("b").at_level(Level::INFO))
112 .enter(expect::span().with_target("a").at_level(Level::INFO))
113 .enter(expect::span().with_target("b").at_level(Level::TRACE))
114 .event(
115 expect::event()
116 .with_fields(expect::msg("hello world"))
117 .in_scope(full_scope.clone()),
118 )
119 .event(
120 expect::event()
121 .with_fields(expect::msg("hello to my target"))
122 .with_target("a")
123 .in_scope(full_scope.clone()),
124 )
125 .event(
126 expect::event()
127 .with_fields(expect::msg("hello to my target"))
128 .with_target("b")
129 .in_scope(full_scope),
130 )
131 .exit(expect::span().with_target("b").at_level(Level::TRACE))
132 .exit(expect::span().with_target("a").at_level(Level::INFO))
133 .exit(expect::span().with_target("b").at_level(Level::INFO))
134 .exit(expect::span().with_target("a").at_level(Level::TRACE))
135 .only()
136 .run_with_handle();
137
138 let a_layer = a_layer.with_filter(filter::filter_fn(|meta| {
139 let target = meta.target();
140 target == "a" || target == module_path!()
141 }));
142
143 let b_layer = b_layer.with_filter(filter::filter_fn(|meta| {
144 let target = meta.target();
145 target == "b" || target == module_path!()
146 }));
147
148 let info_tree = info_layer
149 .and_then(a_layer)
150 .and_then(b_layer)
151 .with_filter(LevelFilter::INFO);
152
153 let subscriber = tracing_subscriber::registry()
154 .with(info_tree)
155 .with(all_layer);
156 let _guard = dbg!(subscriber).set_default();
157
158 {
159 let _a1 = tracing::trace_span!(target: "a", "a/trace").entered();
160 let _b1 = tracing::info_span!(target: "b", "b/info").entered();
161 let _a2 = tracing::info_span!(target: "a", "a/info").entered();
162 let _b2 = tracing::trace_span!(target: "b", "b/trace").entered();
163 tracing::info!("hello world");
164 tracing::debug!(target: "a", "hello to my target");
165 tracing::debug!(target: "b", "hello to my target");
166 }
167
168 all_handle.assert_finished();
169 info_handle.assert_finished();
170 a_handle.assert_finished();
171 b_handle.assert_finished();
172 }
173