• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::convert::TryFrom;
2 use std::num::TryFromIntError;
3 use tracing_mock::*;
4 
5 use tracing::{subscriber::with_default, Level};
6 use tracing_attributes::instrument;
7 use tracing_subscriber::layer::SubscriberExt;
8 use tracing_subscriber::EnvFilter;
9 
10 #[instrument(ret)]
ret() -> i3211 fn ret() -> i32 {
12     42
13 }
14 
15 #[instrument(target = "my_target", ret)]
ret_with_target() -> i3216 fn ret_with_target() -> i32 {
17     42
18 }
19 
20 #[test]
test()21 fn 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]
test_custom_target()41 fn 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)]
ret_warn() -> i3268 fn ret_warn() -> i32 {
69     42
70 }
71 
72 #[test]
test_warn()73 fn 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)]
ret_mut(a: &mut i32) -> i3293 fn ret_mut(a: &mut i32) -> i32 {
94     *a *= 2;
95     tracing::info!(?a);
96     *a
97 }
98 
99 #[test]
test_mut()100 fn 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)]
ret_async() -> i32125 async fn ret_async() -> i32 {
126     42
127 }
128 
129 #[test]
test_async()130 fn 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)]
ret_impl_type() -> impl Copy150 fn ret_impl_type() -> impl Copy {
151     42
152 }
153 
154 #[test]
test_impl_type()155 fn 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))]
ret_display() -> i32175 fn ret_display() -> i32 {
176     42
177 }
178 
179 #[test]
test_dbg()180 fn 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)]
ret_and_err() -> Result<u8, TryFromIntError>200 fn ret_and_err() -> Result<u8, TryFromIntError> {
201     u8::try_from(1234)
202 }
203 
204 #[test]
test_ret_and_err()205 fn 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)]
ret_and_ok() -> Result<u8, TryFromIntError>229 fn ret_and_ok() -> Result<u8, TryFromIntError> {
230     u8::try_from(123)
231 }
232 
233 #[test]
test_ret_and_ok()234 fn 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 }
256