summaryrefslogtreecommitdiffstats
path: root/third_party/rust/tracing/tests/multiple_max_level_hints.rs
blob: dd50a193b5394a5f4d829a47a14cfd02172e37cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#![cfg(feature = "std")]

use tracing::Level;
use tracing_mock::*;

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[test]
fn multiple_max_level_hints() {
    // This test ensures that when multiple subscribers are active, their max
    // level hints are handled correctly. The global max level should be the
    // maximum of the level filters returned by the two `Subscriber`'s
    // `max_level_hint` method.
    //
    // In this test, we create a subscriber whose max level is `INFO`, and
    // another whose max level is `DEBUG`. We then add an assertion to both of
    // those subscribers' `enabled` method that no metadata for `TRACE` spans or
    // events are filtered, since they are disabled by the global max filter.

    fn do_events() {
        tracing::info!("doing a thing that you might care about");
        tracing::debug!("charging turboencabulator with interocitor");
        tracing::warn!("extremely serious warning, pay attention");
        tracing::trace!("interocitor charge level is 10%");
        tracing::error!("everything is on fire");
    }

    let (subscriber1, handle1) = subscriber::mock()
        .named("subscriber1")
        .with_max_level_hint(Level::INFO)
        .with_filter(|meta| {
            let level = dbg!(meta.level());
            assert!(
                level <= &Level::DEBUG,
                "a TRACE event was dynamically filtered by subscriber1"
            );
            level <= &Level::INFO
        })
        .event(event::mock().at_level(Level::INFO))
        .event(event::mock().at_level(Level::WARN))
        .event(event::mock().at_level(Level::ERROR))
        .done()
        .run_with_handle();
    let (subscriber2, handle2) = subscriber::mock()
        .named("subscriber2")
        .with_max_level_hint(Level::DEBUG)
        .with_filter(|meta| {
            let level = dbg!(meta.level());
            assert!(
                level <= &Level::DEBUG,
                "a TRACE event was dynamically filtered by subscriber2"
            );
            level <= &Level::DEBUG
        })
        .event(event::mock().at_level(Level::INFO))
        .event(event::mock().at_level(Level::DEBUG))
        .event(event::mock().at_level(Level::WARN))
        .event(event::mock().at_level(Level::ERROR))
        .done()
        .run_with_handle();

    let dispatch1 = tracing::Dispatch::new(subscriber1);

    tracing::dispatcher::with_default(&dispatch1, do_events);
    handle1.assert_finished();

    let dispatch2 = tracing::Dispatch::new(subscriber2);
    tracing::dispatcher::with_default(&dispatch2, do_events);
    handle2.assert_finished();
}