1#![cfg(feature = "registry")]
2use std::{
3 collections::HashMap,
4 sync::{Arc, Mutex},
5};
6use tracing::{Level, Subscriber};
7use tracing_mock::{expect, layer};
8use tracing_subscriber::{filter, prelude::*};
9
10#[test]
11fn 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