1 | #![cfg (feature = "registry" )] |
2 | use std::{ |
3 | collections::HashMap, |
4 | sync::{Arc, Mutex}, |
5 | }; |
6 | use tracing::{Level, Subscriber}; |
7 | use tracing_mock::{expect, layer}; |
8 | use tracing_subscriber::{filter, prelude::*}; |
9 | |
10 | #[test] |
11 | fn layer_filter_interests_are_cached() { |
12 | let seen = Arc::new(Mutex::new(HashMap::new())); |
13 | let seen2 = seen.clone(); |
14 | let filter = filter::filter_fn(move |meta| { |
15 | *seen |
16 | .lock() |
17 | .unwrap() |
18 | .entry(meta.callsite()) |
19 | .or_insert(0usize) += 1; |
20 | meta.level() == &Level::INFO |
21 | }); |
22 | |
23 | let (expect, handle) = layer::mock() |
24 | .event(expect::event().at_level(Level::INFO)) |
25 | .event(expect::event().at_level(Level::INFO)) |
26 | .only() |
27 | .run_with_handle(); |
28 | |
29 | let subscriber = tracing_subscriber::registry().with(expect.with_filter(filter)); |
30 | assert!(subscriber.max_level_hint().is_none()); |
31 | |
32 | let _subscriber = subscriber.set_default(); |
33 | |
34 | fn events() { |
35 | tracing::trace!("hello trace" ); |
36 | tracing::debug!("hello debug" ); |
37 | tracing::info!("hello info" ); |
38 | tracing::warn!("hello warn" ); |
39 | tracing::error!("hello error" ); |
40 | } |
41 | |
42 | events(); |
43 | { |
44 | let lock = seen2.lock().unwrap(); |
45 | for (callsite, &count) in lock.iter() { |
46 | assert_eq!( |
47 | count, 1, |
48 | "callsite {:?} should have been seen 1 time (after first set of events)" , |
49 | callsite |
50 | ); |
51 | } |
52 | } |
53 | |
54 | events(); |
55 | { |
56 | let lock = seen2.lock().unwrap(); |
57 | for (callsite, &count) in lock.iter() { |
58 | assert_eq!( |
59 | count, 1, |
60 | "callsite {:?} should have been seen 1 time (after second set of events)" , |
61 | callsite |
62 | ); |
63 | } |
64 | } |
65 | |
66 | handle.assert_finished(); |
67 | } |
68 | |