48 lines
1.5 KiB
Rust
48 lines
1.5 KiB
Rust
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");
|
|
}
|