1// These tests require the thread-local scoped dispatcher, which only works when
2// we have a standard library. The behaviour being tested should be the same
3// with the standard lib disabled.
4#![cfg(feature = "std")]
5
6use std::{future::Future, pin::Pin, task};
7
8use futures::FutureExt as _;
9use tracing::{subscriber::with_default, Instrument as _, Level};
10use tracing_mock::*;
11
12#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
13#[test]
14fn span_on_drop() {
15 #[derive(Clone, Debug)]
16 struct AssertSpanOnDrop;
17
18 impl Drop for AssertSpanOnDrop {
19 fn drop(&mut self) {
20 tracing::info!("Drop");
21 }
22 }
23
24 struct Fut(Option<AssertSpanOnDrop>);
25
26 impl Future for Fut {
27 type Output = ();
28
29 fn poll(mut self: Pin<&mut Self>, _: &mut task::Context<'_>) -> task::Poll<Self::Output> {
30 self.set(Fut(None));
31 task::Poll::Ready(())
32 }
33 }
34
35 let subscriber = subscriber::mock()
36 .enter(expect::span().named("foo"))
37 .event(expect::event().at_level(Level::INFO))
38 .exit(expect::span().named("foo"))
39 .enter(expect::span().named("foo"))
40 .exit(expect::span().named("foo"))
41 .drop_span(expect::span().named("foo"))
42 .enter(expect::span().named("bar"))
43 .event(expect::event().at_level(Level::INFO))
44 .exit(expect::span().named("bar"))
45 .drop_span(expect::span().named("bar"))
46 .only()
47 .run();
48
49 with_default(subscriber, || {
50 // polled once
51 Fut(Some(AssertSpanOnDrop))
52 .instrument(tracing::span!(Level::TRACE, "foo"))
53 .now_or_never()
54 .unwrap();
55
56 // never polled
57 drop(Fut(Some(AssertSpanOnDrop)).instrument(tracing::span!(Level::TRACE, "bar")));
58 });
59}
60