1#![cfg(feature = "std")]
2
3use tracing::Level;
4use tracing_mock::*;
5
6#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
7#[test]
8fn multiple_max_level_hints() {
9 // This test ensures that when multiple subscribers are active, their max
10 // level hints are handled correctly. The global max level should be the
11 // maximum of the level filters returned by the two `Subscriber`'s
12 // `max_level_hint` method.
13 //
14 // In this test, we create a subscriber whose max level is `INFO`, and
15 // another whose max level is `DEBUG`. We then add an assertion to both of
16 // those subscribers' `enabled` method that no metadata for `TRACE` spans or
17 // events are filtered, since they are disabled by the global max filter.
18
19 fn do_events() {
20 tracing::info!("doing a thing that you might care about");
21 tracing::debug!("charging turboencabulator with interocitor");
22 tracing::warn!("extremely serious warning, pay attention");
23 tracing::trace!("interocitor charge level is 10%");
24 tracing::error!("everything is on fire");
25 }
26
27 let (subscriber1, handle1) = subscriber::mock()
28 .named("subscriber1")
29 .with_max_level_hint(Level::INFO)
30 .with_filter(|meta| {
31 let level = dbg!(meta.level());
32 assert!(
33 level <= &Level::DEBUG,
34 "a TRACE event was dynamically filtered by subscriber1"
35 );
36 level <= &Level::INFO
37 })
38 .event(expect::event().at_level(Level::INFO))
39 .event(expect::event().at_level(Level::WARN))
40 .event(expect::event().at_level(Level::ERROR))
41 .only()
42 .run_with_handle();
43 let (subscriber2, handle2) = subscriber::mock()
44 .named("subscriber2")
45 .with_max_level_hint(Level::DEBUG)
46 .with_filter(|meta| {
47 let level = dbg!(meta.level());
48 assert!(
49 level <= &Level::DEBUG,
50 "a TRACE event was dynamically filtered by subscriber2"
51 );
52 level <= &Level::DEBUG
53 })
54 .event(expect::event().at_level(Level::INFO))
55 .event(expect::event().at_level(Level::DEBUG))
56 .event(expect::event().at_level(Level::WARN))
57 .event(expect::event().at_level(Level::ERROR))
58 .only()
59 .run_with_handle();
60
61 let dispatch1 = tracing::Dispatch::new(subscriber1);
62
63 tracing::dispatcher::with_default(&dispatch1, do_events);
64 handle1.assert_finished();
65
66 let dispatch2 = tracing::Dispatch::new(subscriber2);
67 tracing::dispatcher::with_default(&dispatch2, do_events);
68 handle2.assert_finished();
69}
70