123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825 |
- // These tests require the thread-local scoped dispatcher, which only works when
- // we have a standard library. The behaviour being tested should be the same
- // with the standard lib disabled.
- #![cfg(feature = "std")]
- use std::thread;
- use tracing::{
- field::{debug, display},
- subscriber::with_default,
- Level, Span,
- };
- use tracing_mock::*;
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn handles_to_the_same_span_are_equal() {
- // Create a mock subscriber that will return `true` on calls to
- // `Subscriber::enabled`, so that the spans will be constructed. We
- // won't enter any spans in this test, so the subscriber won't actually
- // expect to see any spans.
- with_default(subscriber::mock().run(), || {
- let foo1 = tracing::span!(Level::TRACE, "foo");
- let foo2 = foo1.clone();
- // Two handles that point to the same span are equal.
- assert_eq!(foo1, foo2);
- });
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn handles_to_different_spans_are_not_equal() {
- with_default(subscriber::mock().run(), || {
- // Even though these spans have the same name and fields, they will have
- // differing metadata, since they were created on different lines.
- let foo1 = tracing::span!(Level::TRACE, "foo", bar = 1u64, baz = false);
- let foo2 = tracing::span!(Level::TRACE, "foo", bar = 1u64, baz = false);
- assert_ne!(foo1, foo2);
- });
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn handles_to_different_spans_with_the_same_metadata_are_not_equal() {
- // Every time time this function is called, it will return a _new
- // instance_ of a span with the same metadata, name, and fields.
- fn make_span() -> Span {
- tracing::span!(Level::TRACE, "foo", bar = 1u64, baz = false)
- }
- with_default(subscriber::mock().run(), || {
- let foo1 = make_span();
- let foo2 = make_span();
- assert_ne!(foo1, foo2);
- // assert_ne!(foo1.data(), foo2.data());
- });
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn spans_always_go_to_the_subscriber_that_tagged_them() {
- let subscriber1 = subscriber::mock()
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run();
- let subscriber2 = subscriber::mock().run();
- let foo = with_default(subscriber1, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- foo.in_scope(|| {});
- foo
- });
- // Even though we enter subscriber 2's context, the subscriber that
- // tagged the span should see the enter/exit.
- with_default(subscriber2, move || foo.in_scope(|| {}));
- }
- // This gets exempt from testing in wasm because of: `thread::spawn` which is
- // not yet possible to do in WASM. There is work going on see:
- // <https://rustwasm.github.io/2018/10/24/multithreading-rust-and-wasm.html>
- //
- // But for now since it's not possible we don't need to test for it :)
- #[test]
- fn spans_always_go_to_the_subscriber_that_tagged_them_even_across_threads() {
- let subscriber1 = subscriber::mock()
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run();
- let foo = with_default(subscriber1, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- foo.in_scope(|| {});
- foo
- });
- // Even though we enter subscriber 2's context, the subscriber that
- // tagged the span should see the enter/exit.
- thread::spawn(move || {
- with_default(subscriber::mock().run(), || {
- foo.in_scope(|| {});
- })
- })
- .join()
- .unwrap();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn dropping_a_span_calls_drop_span() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo");
- span.in_scope(|| {});
- drop(span);
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn span_closes_after_event() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .event(event::mock())
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "foo").in_scope(|| {
- tracing::event!(Level::DEBUG, {}, "my tracing::event!");
- });
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn new_span_after_event() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .event(event::mock())
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .enter(span::mock().named("bar"))
- .exit(span::mock().named("bar"))
- .drop_span(span::mock().named("bar"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "foo").in_scope(|| {
- tracing::event!(Level::DEBUG, {}, "my tracing::event!");
- });
- tracing::span!(Level::TRACE, "bar").in_scope(|| {});
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn event_outside_of_span() {
- let (subscriber, handle) = subscriber::mock()
- .event(event::mock())
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::debug!("my tracing::event!");
- tracing::span!(Level::TRACE, "foo").in_scope(|| {});
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn cloning_a_span_calls_clone_span() {
- let (subscriber, handle) = subscriber::mock()
- .clone_span(span::mock().named("foo"))
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo");
- // Allow the "redundant" `.clone` since it is used to call into the `.clone_span` hook.
- #[allow(clippy::redundant_clone)]
- let _span2 = span.clone();
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn drop_span_when_exiting_dispatchers_context() {
- let (subscriber, handle) = subscriber::mock()
- .clone_span(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo");
- let _span2 = span.clone();
- drop(span);
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn clone_and_drop_span_always_go_to_the_subscriber_that_tagged_the_span() {
- let (subscriber1, handle1) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .clone_span(span::mock().named("foo"))
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .run_with_handle();
- let subscriber2 = subscriber::mock().done().run();
- let foo = with_default(subscriber1, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- foo.in_scope(|| {});
- foo
- });
- // Even though we enter subscriber 2's context, the subscriber that
- // tagged the span should see the enter/exit.
- with_default(subscriber2, move || {
- let foo2 = foo.clone();
- foo.in_scope(|| {});
- drop(foo);
- drop(foo2);
- });
- handle1.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn span_closes_when_exited() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- foo.in_scope(|| {});
- drop(foo);
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn enter() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .event(event::mock())
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- let _enter = foo.enter();
- tracing::debug!("dropping guard...");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn entered() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .event(event::mock())
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let _span = tracing::span!(Level::TRACE, "foo").entered();
- tracing::debug!("dropping guard...");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn entered_api() {
- let (subscriber, handle) = subscriber::mock()
- .enter(span::mock().named("foo"))
- .event(event::mock())
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo").entered();
- let _derefs_to_span = span.id();
- tracing::debug!("exiting span...");
- let _: Span = span.exit();
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn moved_field() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("foo").with_field(
- field::mock("bar")
- .with_value(&display("hello from my span"))
- .only(),
- ),
- )
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let from = "my span";
- let span = tracing::span!(
- Level::TRACE,
- "foo",
- bar = display(format!("hello from {}", from))
- );
- span.in_scope(|| {});
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn dotted_field_name() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock()
- .named("foo")
- .with_field(field::mock("fields.bar").with_value(&true).only()),
- )
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "foo", fields.bar = true);
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn borrowed_field() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("foo").with_field(
- field::mock("bar")
- .with_value(&display("hello from my span"))
- .only(),
- ),
- )
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let from = "my span";
- let mut message = format!("hello from {}", from);
- let span = tracing::span!(Level::TRACE, "foo", bar = display(&message));
- span.in_scope(|| {
- message.insert_str(10, " inside");
- });
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- // If emitting log instrumentation, this gets moved anyway, breaking the test.
- #[cfg(not(feature = "log"))]
- fn move_field_out_of_struct() {
- use tracing::field::debug;
- #[derive(Debug)]
- struct Position {
- x: f32,
- y: f32,
- }
- let pos = Position {
- x: 3.234,
- y: -1.223,
- };
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("foo").with_field(
- field::mock("x")
- .with_value(&debug(3.234))
- .and(field::mock("y").with_value(&debug(-1.223)))
- .only(),
- ),
- )
- .new_span(
- span::mock()
- .named("bar")
- .with_field(field::mock("position").with_value(&debug(&pos)).only()),
- )
- .run_with_handle();
- with_default(subscriber, || {
- let pos = Position {
- x: 3.234,
- y: -1.223,
- };
- let foo = tracing::span!(Level::TRACE, "foo", x = debug(pos.x), y = debug(pos.y));
- let bar = tracing::span!(Level::TRACE, "bar", position = debug(pos));
- foo.in_scope(|| {});
- bar.in_scope(|| {});
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn float_values() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("foo").with_field(
- field::mock("x")
- .with_value(&3.234)
- .and(field::mock("y").with_value(&-1.223))
- .only(),
- ),
- )
- .run_with_handle();
- with_default(subscriber, || {
- let foo = tracing::span!(Level::TRACE, "foo", x = 3.234, y = -1.223);
- foo.in_scope(|| {});
- });
- handle.assert_finished();
- }
- // TODO(#1138): determine a new syntax for uninitialized span fields, and
- // re-enable these.
- /*
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn add_field_after_new_span() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock()
- .named("foo")
- .with_field(field::mock("bar").with_value(&5)
- .and(field::mock("baz").with_value).only()),
- )
- .record(
- span::mock().named("foo"),
- field::mock("baz").with_value(&true).only(),
- )
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo", bar = 5, baz = false);
- span.record("baz", &true);
- span.in_scope(|| {})
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn add_fields_only_after_new_span() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo"))
- .record(
- span::mock().named("foo"),
- field::mock("bar").with_value(&5).only(),
- )
- .record(
- span::mock().named("foo"),
- field::mock("baz").with_value(&true).only(),
- )
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo", bar = _, baz = _);
- span.record("bar", &5);
- span.record("baz", &true);
- span.in_scope(|| {})
- });
- handle.assert_finished();
- }
- */
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn record_new_value_for_field() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("foo").with_field(
- field::mock("bar")
- .with_value(&5)
- .and(field::mock("baz").with_value(&false))
- .only(),
- ),
- )
- .record(
- span::mock().named("foo"),
- field::mock("baz").with_value(&true).only(),
- )
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo", bar = 5, baz = false);
- span.record("baz", &true);
- span.in_scope(|| {})
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn record_new_values_for_fields() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("foo").with_field(
- field::mock("bar")
- .with_value(&4)
- .and(field::mock("baz").with_value(&false))
- .only(),
- ),
- )
- .record(
- span::mock().named("foo"),
- field::mock("bar").with_value(&5).only(),
- )
- .record(
- span::mock().named("foo"),
- field::mock("baz").with_value(&true).only(),
- )
- .enter(span::mock().named("foo"))
- .exit(span::mock().named("foo"))
- .drop_span(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let span = tracing::span!(Level::TRACE, "foo", bar = 4, baz = false);
- span.record("bar", &5);
- span.record("baz", &true);
- span.in_scope(|| {})
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn new_span_with_target_and_log_level() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock()
- .named("foo")
- .with_target("app_span")
- .at_level(Level::DEBUG),
- )
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(target: "app_span", Level::DEBUG, "foo");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn explicit_root_span_is_root() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo").with_explicit_parent(None))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(parent: None, Level::TRACE, "foo");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn explicit_root_span_is_root_regardless_of_ctx() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo"))
- .enter(span::mock().named("foo"))
- .new_span(span::mock().named("bar").with_explicit_parent(None))
- .exit(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "foo").in_scope(|| {
- tracing::span!(parent: None, Level::TRACE, "bar");
- })
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn explicit_child() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo"))
- .new_span(span::mock().named("bar").with_explicit_parent(Some("foo")))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- tracing::span!(parent: foo.id(), Level::TRACE, "bar");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn explicit_child_at_levels() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo"))
- .new_span(span::mock().named("a").with_explicit_parent(Some("foo")))
- .new_span(span::mock().named("b").with_explicit_parent(Some("foo")))
- .new_span(span::mock().named("c").with_explicit_parent(Some("foo")))
- .new_span(span::mock().named("d").with_explicit_parent(Some("foo")))
- .new_span(span::mock().named("e").with_explicit_parent(Some("foo")))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- tracing::trace_span!(parent: foo.id(), "a");
- tracing::debug_span!(parent: foo.id(), "b");
- tracing::info_span!(parent: foo.id(), "c");
- tracing::warn_span!(parent: foo.id(), "d");
- tracing::error_span!(parent: foo.id(), "e");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn explicit_child_regardless_of_ctx() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo"))
- .new_span(span::mock().named("bar"))
- .enter(span::mock().named("bar"))
- .new_span(span::mock().named("baz").with_explicit_parent(Some("foo")))
- .exit(span::mock().named("bar"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- let foo = tracing::span!(Level::TRACE, "foo");
- tracing::span!(Level::TRACE, "bar")
- .in_scope(|| tracing::span!(parent: foo.id(), Level::TRACE, "baz"))
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn contextual_root() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo").with_contextual_parent(None))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "foo");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn contextual_child() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(span::mock().named("foo"))
- .enter(span::mock().named("foo"))
- .new_span(
- span::mock()
- .named("bar")
- .with_contextual_parent(Some("foo")),
- )
- .exit(span::mock().named("foo"))
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "foo").in_scope(|| {
- tracing::span!(Level::TRACE, "bar");
- })
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn display_shorthand() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("my_span").with_field(
- field::mock("my_field")
- .with_value(&display("hello world"))
- .only(),
- ),
- )
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "my_span", my_field = %"hello world");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn debug_shorthand() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("my_span").with_field(
- field::mock("my_field")
- .with_value(&debug("hello world"))
- .only(),
- ),
- )
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "my_span", my_field = ?"hello world");
- });
- handle.assert_finished();
- }
- #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
- #[test]
- fn both_shorthands() {
- let (subscriber, handle) = subscriber::mock()
- .new_span(
- span::mock().named("my_span").with_field(
- field::mock("display_field")
- .with_value(&display("hello world"))
- .and(field::mock("debug_field").with_value(&debug("hello world")))
- .only(),
- ),
- )
- .done()
- .run_with_handle();
- with_default(subscriber, || {
- tracing::span!(Level::TRACE, "my_span", display_field = %"hello world", debug_field = ?"hello world");
- });
- handle.assert_finished();
- }
|