1use super::*;
2use tracing_mock::{event, expect, layer::MockLayer};
3
4#[test]
5fn filters_span_scopes() {
6 let (debug_layer, debug_handle) = layer::named("debug")
7 .enter(expect::span().at_level(Level::DEBUG))
8 .enter(expect::span().at_level(Level::INFO))
9 .enter(expect::span().at_level(Level::WARN))
10 .enter(expect::span().at_level(Level::ERROR))
11 .event(event::msg("hello world").in_scope(vec![
12 expect::span().at_level(Level::ERROR),
13 expect::span().at_level(Level::WARN),
14 expect::span().at_level(Level::INFO),
15 expect::span().at_level(Level::DEBUG),
16 ]))
17 .exit(expect::span().at_level(Level::ERROR))
18 .exit(expect::span().at_level(Level::WARN))
19 .exit(expect::span().at_level(Level::INFO))
20 .exit(expect::span().at_level(Level::DEBUG))
21 .only()
22 .run_with_handle();
23 let (info_layer, info_handle) = layer::named("info")
24 .enter(expect::span().at_level(Level::INFO))
25 .enter(expect::span().at_level(Level::WARN))
26 .enter(expect::span().at_level(Level::ERROR))
27 .event(event::msg("hello world").in_scope(vec![
28 expect::span().at_level(Level::ERROR),
29 expect::span().at_level(Level::WARN),
30 expect::span().at_level(Level::INFO),
31 ]))
32 .exit(expect::span().at_level(Level::ERROR))
33 .exit(expect::span().at_level(Level::WARN))
34 .exit(expect::span().at_level(Level::INFO))
35 .only()
36 .run_with_handle();
37 let (warn_layer, warn_handle) = layer::named("warn")
38 .enter(expect::span().at_level(Level::WARN))
39 .enter(expect::span().at_level(Level::ERROR))
40 .event(event::msg("hello world").in_scope(vec![
41 expect::span().at_level(Level::ERROR),
42 expect::span().at_level(Level::WARN),
43 ]))
44 .exit(expect::span().at_level(Level::ERROR))
45 .exit(expect::span().at_level(Level::WARN))
46 .only()
47 .run_with_handle();
48
49 let _subscriber = tracing_subscriber::registry()
50 .with(debug_layer.with_filter(LevelFilter::DEBUG))
51 .with(info_layer.with_filter(LevelFilter::INFO))
52 .with(warn_layer.with_filter(LevelFilter::WARN))
53 .set_default();
54
55 {
56 let _trace = tracing::trace_span!("my_span").entered();
57 let _debug = tracing::debug_span!("my_span").entered();
58 let _info = tracing::info_span!("my_span").entered();
59 let _warn = tracing::warn_span!("my_span").entered();
60 let _error = tracing::error_span!("my_span").entered();
61 tracing::error!("hello world");
62 }
63
64 debug_handle.assert_finished();
65 info_handle.assert_finished();
66 warn_handle.assert_finished();
67}
68
69#[test]
70fn filters_interleaved_span_scopes() {
71 fn target_layer(target: &'static str) -> (MockLayer, subscriber::MockHandle) {
72 layer::named(format!("target_{}", target))
73 .enter(expect::span().with_target(target))
74 .enter(expect::span().with_target(target))
75 .event(event::msg("hello world").in_scope(vec![
76 expect::span().with_target(target),
77 expect::span().with_target(target),
78 ]))
79 .event(
80 event::msg("hello to my target")
81 .in_scope(vec![
82 expect::span().with_target(target),
83 expect::span().with_target(target),
84 ])
85 .with_target(target),
86 )
87 .exit(expect::span().with_target(target))
88 .exit(expect::span().with_target(target))
89 .only()
90 .run_with_handle()
91 }
92
93 let (a_layer, a_handle) = target_layer("a");
94 let (b_layer, b_handle) = target_layer("b");
95 let (all_layer, all_handle) = layer::named("all")
96 .enter(expect::span().with_target("b"))
97 .enter(expect::span().with_target("a"))
98 .event(event::msg("hello world").in_scope(vec![
99 expect::span().with_target("a"),
100 expect::span().with_target("b"),
101 ]))
102 .exit(expect::span().with_target("a"))
103 .exit(expect::span().with_target("b"))
104 .only()
105 .run_with_handle();
106
107 let _subscriber = tracing_subscriber::registry()
108 .with(all_layer.with_filter(LevelFilter::INFO))
109 .with(a_layer.with_filter(filter::filter_fn(|meta| {
110 let target = meta.target();
111 target == "a" || target == module_path!()
112 })))
113 .with(b_layer.with_filter(filter::filter_fn(|meta| {
114 let target = meta.target();
115 target == "b" || target == module_path!()
116 })))
117 .set_default();
118
119 {
120 let _a1 = tracing::trace_span!(target: "a", "a/trace").entered();
121 let _b1 = tracing::info_span!(target: "b", "b/info").entered();
122 let _a2 = tracing::info_span!(target: "a", "a/info").entered();
123 let _b2 = tracing::trace_span!(target: "b", "b/trace").entered();
124 tracing::info!("hello world");
125 tracing::debug!(target: "a", "hello to my target");
126 tracing::debug!(target: "b", "hello to my target");
127 }
128
129 a_handle.assert_finished();
130 b_handle.assert_finished();
131 all_handle.assert_finished();
132}
133