| use std::{sync::mpsc, thread, time::Duration}; |
| use tracing::{ |
| metadata::Metadata, |
| span, |
| subscriber::{self, Interest, Subscriber}, |
| Event, |
| }; |
| |
| #[test] |
| fn register_callsite_doesnt_deadlock() { |
| pub struct EvilSubscriber; |
| |
| impl Subscriber for EvilSubscriber { |
| fn register_callsite(&self, meta: &'static Metadata<'static>) -> Interest { |
| tracing::info!(?meta, "registered a callsite"); |
| Interest::always() |
| } |
| |
| fn enabled(&self, _: &Metadata<'_>) -> bool { |
| true |
| } |
| fn new_span(&self, _: &span::Attributes<'_>) -> span::Id { |
| span::Id::from_u64(1) |
| } |
| fn record(&self, _: &span::Id, _: &span::Record<'_>) {} |
| fn record_follows_from(&self, _: &span::Id, _: &span::Id) {} |
| fn event(&self, _: &Event<'_>) {} |
| fn enter(&self, _: &span::Id) {} |
| fn exit(&self, _: &span::Id) {} |
| } |
| |
| subscriber::set_global_default(EvilSubscriber).unwrap(); |
| |
| // spawn a thread, and assert it doesn't hang... |
| let (tx, didnt_hang) = mpsc::channel(); |
| let th = thread::spawn(move || { |
| tracing::info!("hello world!"); |
| tx.send(()).unwrap(); |
| }); |
| |
| didnt_hang |
| // Note: 60 seconds is *way* more than enough, but let's be generous in |
| // case of e.g. slow CI machines. |
| .recv_timeout(Duration::from_secs(60)) |
| .expect("the thread must not have hung!"); |
| th.join().expect("thread should join successfully"); |
| } |