1use tracing::{subscriber::with_default, Id, Level};
2use tracing_attributes::instrument;
3use tracing_mock::*;
4
5#[instrument]
6fn with_default_parent() {}
7
8#[instrument(parent = parent_span, skip(parent_span))]
9fn with_explicit_parent<P>(parent_span: P)
10where
11 P: Into<Option<Id>>,
12{
13}
14
15#[test]
16fn default_parent_test() {
17 let contextual_parent = expect::span().named("contextual_parent");
18 let child = expect::span().named("with_default_parent");
19
20 let (subscriber, handle) = subscriber::mock()
21 .new_span(
22 contextual_parent
23 .clone()
24 .with_contextual_parent(None)
25 .with_explicit_parent(None),
26 )
27 .new_span(
28 child
29 .clone()
30 .with_contextual_parent(Some("contextual_parent"))
31 .with_explicit_parent(None),
32 )
33 .enter(child.clone())
34 .exit(child.clone())
35 .enter(contextual_parent.clone())
36 .new_span(
37 child
38 .clone()
39 .with_contextual_parent(Some("contextual_parent"))
40 .with_explicit_parent(None),
41 )
42 .enter(child.clone())
43 .exit(child)
44 .exit(contextual_parent)
45 .only()
46 .run_with_handle();
47
48 with_default(subscriber, || {
49 let contextual_parent = tracing::span!(Level::TRACE, "contextual_parent");
50
51 with_default_parent();
52
53 contextual_parent.in_scope(|| {
54 with_default_parent();
55 });
56 });
57
58 handle.assert_finished();
59}
60
61#[test]
62fn explicit_parent_test() {
63 let contextual_parent = expect::span().named("contextual_parent");
64 let explicit_parent = expect::span().named("explicit_parent");
65 let child = expect::span().named("with_explicit_parent");
66
67 let (subscriber, handle) = subscriber::mock()
68 .new_span(
69 contextual_parent
70 .clone()
71 .with_contextual_parent(None)
72 .with_explicit_parent(None),
73 )
74 .new_span(
75 explicit_parent
76 .with_contextual_parent(None)
77 .with_explicit_parent(None),
78 )
79 .enter(contextual_parent.clone())
80 .new_span(
81 child
82 .clone()
83 .with_contextual_parent(Some("contextual_parent"))
84 .with_explicit_parent(Some("explicit_parent")),
85 )
86 .enter(child.clone())
87 .exit(child)
88 .exit(contextual_parent)
89 .only()
90 .run_with_handle();
91
92 with_default(subscriber, || {
93 let contextual_parent = tracing::span!(Level::INFO, "contextual_parent");
94 let explicit_parent = tracing::span!(Level::INFO, "explicit_parent");
95
96 contextual_parent.in_scope(|| {
97 with_explicit_parent(&explicit_parent);
98 });
99 });
100
101 handle.assert_finished();
102}
103