Hayden Stainsby 5197803f23 mock: change helper functions to expect::<thing> (#2377)
* mock: change helper functions to `expect::<thing>`

The current format of test expectations in `tracing-mock` isn't ideal.
The format `span::expect` requires importing `tracing_mock::<thing>` which
may conflict with imports from other tracing crates, especially
`tracing-core`.

So we change the order and move the functions into a module called
`expect` so that:
* `event::expect` becomes `expect::event`
* `span::expect` becomes `expect::span`
* `field::expect` becomes `expect::field`

This format has two advantages.
1. It reads as natural English, e.g "expect span"
2. It is no longer common to import the modules directly.

Regarding point (2), the following format was previously common:

```rust
use tracing_mock::field;

field::expect();
```

This import of the `field` module may then conflict with importing the
same from `tracing_core`, making it necessary to rename one of the
imports.

The same code would now be written:

```rust
use tracing_mock::expect;

expect::field();
```

Which is less likely to conflict.

This change also fixes an unused warning on `MockHandle::new` when the
`tracing-subscriber` feature is not enabled.

Refs: #539
2023-10-01 10:46:02 -07:00

308 lines
7.8 KiB
Rust

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();
}