| // Tests that depend on a count of the number of times their filter is evaluated |
| // cant exist in the same file with other tests that add subscribers to the |
| // registry. The registry was changed so that each time a new dispatcher is |
| // added all filters are re-evaluated. The tests being run only in separate |
| // threads with shared global state lets them interfere with each other |
| #[cfg(not(feature = "std"))] |
| extern crate std; |
| |
| use tracing::{span, Level}; |
| use tracing_mock::*; |
| |
| use std::sync::{ |
| atomic::{AtomicUsize, Ordering}, |
| Arc, |
| }; |
| |
| #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] |
| #[test] |
| fn filters_are_not_reevaluated_for_the_same_span() { |
| // Asserts that the `span!` macro caches the result of calling |
| // `Subscriber::enabled` for each span. |
| let alice_count = Arc::new(AtomicUsize::new(0)); |
| let bob_count = Arc::new(AtomicUsize::new(0)); |
| let alice_count2 = alice_count.clone(); |
| let bob_count2 = bob_count.clone(); |
| |
| let (subscriber, handle) = subscriber::mock() |
| .with_filter(move |meta| match meta.name() { |
| "alice" => { |
| alice_count2.fetch_add(1, Ordering::Relaxed); |
| false |
| } |
| "bob" => { |
| bob_count2.fetch_add(1, Ordering::Relaxed); |
| true |
| } |
| _ => false, |
| }) |
| .run_with_handle(); |
| |
| // Since this test is in its own file anyway, we can do this. Thus, this |
| // test will work even with no-std. |
| tracing::subscriber::set_global_default(subscriber).unwrap(); |
| |
| // Enter "alice" and then "bob". The dispatcher expects to see "bob" but |
| // not "alice." |
| let alice = span!(Level::TRACE, "alice"); |
| let bob = alice.in_scope(|| { |
| let bob = span!(Level::TRACE, "bob"); |
| bob.in_scope(|| ()); |
| bob |
| }); |
| |
| // The filter should have seen each span a single time. |
| assert_eq!(alice_count.load(Ordering::Relaxed), 1); |
| assert_eq!(bob_count.load(Ordering::Relaxed), 1); |
| |
| alice.in_scope(|| bob.in_scope(|| {})); |
| |
| // The subscriber should see "bob" again, but the filter should not have |
| // been called. |
| assert_eq!(alice_count.load(Ordering::Relaxed), 1); |
| assert_eq!(bob_count.load(Ordering::Relaxed), 1); |
| |
| bob.in_scope(|| {}); |
| assert_eq!(alice_count.load(Ordering::Relaxed), 1); |
| assert_eq!(bob_count.load(Ordering::Relaxed), 1); |
| |
| handle.assert_finished(); |
| } |