| // 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. |
| // |
| // The alternative would be for each of these tests to be defined in a separate |
| // file, which is :( |
| #![cfg(feature = "std")] |
| |
| #[macro_use] |
| extern crate tracing; |
| use tracing::{ |
| span, |
| subscriber::{with_default, Interest, Subscriber}, |
| Event, Level, Metadata, |
| }; |
| |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| #[test] |
| fn event_macros_dont_infinite_loop() { |
| // This test ensures that an event macro within a subscriber |
| // won't cause an infinite loop of events. |
| struct TestSubscriber; |
| impl Subscriber for TestSubscriber { |
| fn register_callsite(&self, _: &Metadata<'_>) -> Interest { |
| // Always return sometimes so that `enabled` will be called |
| // (which can loop). |
| Interest::sometimes() |
| } |
| |
| fn enabled(&self, meta: &Metadata<'_>) -> bool { |
| assert!(meta.fields().iter().any(|f| f.name() == "foo")); |
| event!(Level::TRACE, bar = false); |
| true |
| } |
| |
| fn new_span(&self, _: &span::Attributes<'_>) -> span::Id { |
| span::Id::from_u64(0xAAAA) |
| } |
| |
| fn record(&self, _: &span::Id, _: &span::Record<'_>) {} |
| |
| fn record_follows_from(&self, _: &span::Id, _: &span::Id) {} |
| |
| fn event(&self, event: &Event<'_>) { |
| assert!(event.metadata().fields().iter().any(|f| f.name() == "foo")); |
| event!(Level::TRACE, baz = false); |
| } |
| |
| fn enter(&self, _: &span::Id) {} |
| |
| fn exit(&self, _: &span::Id) {} |
| } |
| |
| with_default(TestSubscriber, || { |
| event!(Level::TRACE, foo = false); |
| }) |
| } |