| use std::convert::TryFrom; |
| use std::num::TryFromIntError; |
| use tracing_mock::*; |
| |
| use tracing::{subscriber::with_default, Level}; |
| use tracing_attributes::instrument; |
| use tracing_subscriber::layer::SubscriberExt; |
| use tracing_subscriber::EnvFilter; |
| |
| #[instrument(ret)] |
| fn ret() -> i32 { |
| 42 |
| } |
| |
| #[instrument(target = "my_target", ret)] |
| fn ret_with_target() -> i32 { |
| 42 |
| } |
| |
| #[test] |
| fn test() { |
| let span = expect::span().named("ret"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, ret); |
| handle.assert_finished(); |
| } |
| |
| #[test] |
| fn test_custom_target() { |
| let filter: EnvFilter = "my_target=info".parse().expect("filter should parse"); |
| let span = expect::span() |
| .named("ret_with_target") |
| .with_target("my_target"); |
| |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::INFO) |
| .with_target("my_target"), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| let subscriber = subscriber.with(filter); |
| |
| with_default(subscriber, ret_with_target); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(level = "warn", ret)] |
| fn ret_warn() -> i32 { |
| 42 |
| } |
| |
| #[test] |
| fn test_warn() { |
| let span = expect::span().named("ret_warn"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::WARN), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, ret_warn); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(ret)] |
| fn ret_mut(a: &mut i32) -> i32 { |
| *a *= 2; |
| tracing::info!(?a); |
| *a |
| } |
| |
| #[test] |
| fn test_mut() { |
| let span = expect::span().named("ret_mut"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("a").with_value(&tracing::field::display(2))) |
| .at_level(Level::INFO), |
| ) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(2))) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, || ret_mut(&mut 1)); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(ret)] |
| async fn ret_async() -> i32 { |
| 42 |
| } |
| |
| #[test] |
| fn test_async() { |
| let span = expect::span().named("ret_async"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .enter(span.clone()) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, || block_on_future(async { ret_async().await })); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(ret)] |
| fn ret_impl_type() -> impl Copy { |
| 42 |
| } |
| |
| #[test] |
| fn test_impl_type() { |
| let span = expect::span().named("ret_impl_type"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, ret_impl_type); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(ret(Display))] |
| fn ret_display() -> i32 { |
| 42 |
| } |
| |
| #[test] |
| fn test_dbg() { |
| let span = expect::span().named("ret_display"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::display(42))) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, ret_display); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(err, ret)] |
| fn ret_and_err() -> Result<u8, TryFromIntError> { |
| u8::try_from(1234) |
| } |
| |
| #[test] |
| fn test_ret_and_err() { |
| let span = expect::span().named("ret_and_err"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields( |
| expect::field("error") |
| .with_value(&tracing::field::display(u8::try_from(1234).unwrap_err())) |
| .only(), |
| ) |
| .at_level(Level::ERROR), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, || ret_and_err().ok()); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(err, ret)] |
| fn ret_and_ok() -> Result<u8, TryFromIntError> { |
| u8::try_from(123) |
| } |
| |
| #[test] |
| fn test_ret_and_ok() { |
| let span = expect::span().named("ret_and_ok"); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields( |
| expect::field("return") |
| .with_value(&tracing::field::debug(u8::try_from(123).unwrap())) |
| .only(), |
| ) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, || ret_and_ok().ok()); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(level = "warn", ret(level = "info"))] |
| fn ret_warn_info() -> i32 { |
| 42 |
| } |
| |
| #[test] |
| fn test_warn_info() { |
| let span = expect::span().named("ret_warn_info").at_level(Level::WARN); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::INFO), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, ret_warn_info); |
| handle.assert_finished(); |
| } |
| |
| #[instrument(ret(level = "warn", Debug))] |
| fn ret_dbg_warn() -> i32 { |
| 42 |
| } |
| |
| #[test] |
| fn test_dbg_warn() { |
| let span = expect::span().named("ret_dbg_warn").at_level(Level::INFO); |
| let (subscriber, handle) = subscriber::mock() |
| .new_span(span.clone()) |
| .enter(span.clone()) |
| .event( |
| expect::event() |
| .with_fields(expect::field("return").with_value(&tracing::field::debug(42))) |
| .at_level(Level::WARN), |
| ) |
| .exit(span.clone()) |
| .drop_span(span) |
| .only() |
| .run_with_handle(); |
| |
| with_default(subscriber, ret_dbg_warn); |
| handle.assert_finished(); |
| } |