blob: cfd2de10d32b09d9b5d4397a8c520712ab52b43b [file] [log] [blame]
Fedor Tsarevfa35e1e2023-03-24 09:59:21 +01001use std::convert::TryFrom;
2use std::num::TryFromIntError;
3use tracing_mock::*;
4
5use tracing::{subscriber::with_default, Level};
6use tracing_attributes::instrument;
7use tracing_subscriber::layer::SubscriberExt;
8use tracing_subscriber::EnvFilter;
9
10#[instrument(ret)]
11fn ret() -> i32 {
12 42
13}
14
15#[instrument(target = "my_target", ret)]
16fn ret_with_target() -> i32 {
17 42
18}
19
20#[test]
21fn test() {
22 let span = span::mock().named("ret");
23 let (subscriber, handle) = subscriber::mock()
24 .new_span(span.clone())
25 .enter(span.clone())
26 .event(
27 event::mock()
28 .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
29 .at_level(Level::INFO),
30 )
31 .exit(span.clone())
32 .drop_span(span)
33 .done()
34 .run_with_handle();
35
36 with_default(subscriber, ret);
37 handle.assert_finished();
38}
39
40#[test]
41fn test_custom_target() {
42 let filter: EnvFilter = "my_target=info".parse().expect("filter should parse");
43 let span = span::mock()
44 .named("ret_with_target")
45 .with_target("my_target");
46
47 let (subscriber, handle) = subscriber::mock()
48 .new_span(span.clone())
49 .enter(span.clone())
50 .event(
51 event::mock()
52 .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
53 .at_level(Level::INFO)
54 .with_target("my_target"),
55 )
56 .exit(span.clone())
57 .drop_span(span)
58 .done()
59 .run_with_handle();
60
61 let subscriber = subscriber.with(filter);
62
63 with_default(subscriber, ret_with_target);
64 handle.assert_finished();
65}
66
67#[instrument(level = "warn", ret)]
68fn ret_warn() -> i32 {
69 42
70}
71
72#[test]
73fn test_warn() {
74 let span = span::mock().named("ret_warn");
75 let (subscriber, handle) = subscriber::mock()
76 .new_span(span.clone())
77 .enter(span.clone())
78 .event(
79 event::mock()
80 .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
81 .at_level(Level::WARN),
82 )
83 .exit(span.clone())
84 .drop_span(span)
85 .done()
86 .run_with_handle();
87
88 with_default(subscriber, ret_warn);
89 handle.assert_finished();
90}
91
92#[instrument(ret)]
93fn ret_mut(a: &mut i32) -> i32 {
94 *a *= 2;
95 tracing::info!(?a);
96 *a
97}
98
99#[test]
100fn test_mut() {
101 let span = span::mock().named("ret_mut");
102 let (subscriber, handle) = subscriber::mock()
103 .new_span(span.clone())
104 .enter(span.clone())
105 .event(
106 event::mock()
107 .with_fields(field::mock("a").with_value(&tracing::field::display(2)))
108 .at_level(Level::INFO),
109 )
110 .event(
111 event::mock()
112 .with_fields(field::mock("return").with_value(&tracing::field::debug(2)))
113 .at_level(Level::INFO),
114 )
115 .exit(span.clone())
116 .drop_span(span)
117 .done()
118 .run_with_handle();
119
120 with_default(subscriber, || ret_mut(&mut 1));
121 handle.assert_finished();
122}
123
124#[instrument(ret)]
125async fn ret_async() -> i32 {
126 42
127}
128
129#[test]
130fn test_async() {
131 let span = span::mock().named("ret_async");
132 let (subscriber, handle) = subscriber::mock()
133 .new_span(span.clone())
134 .enter(span.clone())
135 .event(
136 event::mock()
137 .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
138 .at_level(Level::INFO),
139 )
140 .exit(span.clone())
141 .drop_span(span)
142 .done()
143 .run_with_handle();
144
145 with_default(subscriber, || block_on_future(async { ret_async().await }));
146 handle.assert_finished();
147}
148
149#[instrument(ret)]
150fn ret_impl_type() -> impl Copy {
151 42
152}
153
154#[test]
155fn test_impl_type() {
156 let span = span::mock().named("ret_impl_type");
157 let (subscriber, handle) = subscriber::mock()
158 .new_span(span.clone())
159 .enter(span.clone())
160 .event(
161 event::mock()
162 .with_fields(field::mock("return").with_value(&tracing::field::debug(42)))
163 .at_level(Level::INFO),
164 )
165 .exit(span.clone())
166 .drop_span(span)
167 .done()
168 .run_with_handle();
169
170 with_default(subscriber, ret_impl_type);
171 handle.assert_finished();
172}
173
174#[instrument(ret(Display))]
175fn ret_display() -> i32 {
176 42
177}
178
179#[test]
180fn test_dbg() {
181 let span = span::mock().named("ret_display");
182 let (subscriber, handle) = subscriber::mock()
183 .new_span(span.clone())
184 .enter(span.clone())
185 .event(
186 event::mock()
187 .with_fields(field::mock("return").with_value(&tracing::field::display(42)))
188 .at_level(Level::INFO),
189 )
190 .exit(span.clone())
191 .drop_span(span)
192 .done()
193 .run_with_handle();
194
195 with_default(subscriber, ret_display);
196 handle.assert_finished();
197}
198
199#[instrument(err, ret)]
200fn ret_and_err() -> Result<u8, TryFromIntError> {
201 u8::try_from(1234)
202}
203
204#[test]
205fn test_ret_and_err() {
206 let span = span::mock().named("ret_and_err");
207 let (subscriber, handle) = subscriber::mock()
208 .new_span(span.clone())
209 .enter(span.clone())
210 .event(
211 event::mock()
212 .with_fields(
213 field::mock("error")
214 .with_value(&tracing::field::display(u8::try_from(1234).unwrap_err()))
215 .only(),
216 )
217 .at_level(Level::ERROR),
218 )
219 .exit(span.clone())
220 .drop_span(span)
221 .done()
222 .run_with_handle();
223
224 with_default(subscriber, || ret_and_err().ok());
225 handle.assert_finished();
226}
227
228#[instrument(err, ret)]
229fn ret_and_ok() -> Result<u8, TryFromIntError> {
230 u8::try_from(123)
231}
232
233#[test]
234fn test_ret_and_ok() {
235 let span = span::mock().named("ret_and_ok");
236 let (subscriber, handle) = subscriber::mock()
237 .new_span(span.clone())
238 .enter(span.clone())
239 .event(
240 event::mock()
241 .with_fields(
242 field::mock("return")
243 .with_value(&tracing::field::debug(u8::try_from(123).unwrap()))
244 .only(),
245 )
246 .at_level(Level::INFO),
247 )
248 .exit(span.clone())
249 .drop_span(span)
250 .done()
251 .run_with_handle();
252
253 with_default(subscriber, || ret_and_ok().ok());
254 handle.assert_finished();
255}