summaryrefslogtreecommitdiffstats
path: root/vendor/tracing-subscriber-0.3.3/tests/multiple_layer_filter_interests_cached.rs
blob: 5c25e7f03cfd6dce91c8b19e0b4ac992be9281f2 (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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#![cfg(feature = "registry")]
mod support;
use self::support::*;

use std::{
    collections::HashMap,
    sync::{Arc, Mutex},
};
use tracing::{Level, Subscriber};
use tracing_subscriber::{filter, prelude::*};

#[test]
fn multiple_layer_filter_interests_are_cached() {
    // This layer will return Interest::always for INFO and lower.
    let seen_info = Arc::new(Mutex::new(HashMap::new()));
    let seen_info2 = seen_info.clone();
    let filter = filter::filter_fn(move |meta| {
        *seen_info
            .lock()
            .unwrap()
            .entry(*meta.level())
            .or_insert(0usize) += 1;
        meta.level() <= &Level::INFO
    });
    let seen_info = seen_info2;

    let (info_layer, info_handle) = layer::named("info")
        .event(event::mock().at_level(Level::INFO))
        .event(event::mock().at_level(Level::WARN))
        .event(event::mock().at_level(Level::ERROR))
        .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 info_layer = info_layer.with_filter(filter);

    // This layer will return Interest::always for WARN and lower.
    let seen_warn = Arc::new(Mutex::new(HashMap::new()));
    let seen_warn2 = seen_warn.clone();
    let filter = filter::filter_fn(move |meta| {
        *seen_warn
            .lock()
            .unwrap()
            .entry(*meta.level())
            .or_insert(0usize) += 1;
        meta.level() <= &Level::WARN
    });
    let seen_warn = seen_warn2;

    let (warn_layer, warn_handle) = layer::named("warn")
        .event(event::mock().at_level(Level::WARN))
        .event(event::mock().at_level(Level::ERROR))
        .event(event::mock().at_level(Level::WARN))
        .event(event::mock().at_level(Level::ERROR))
        .done()
        .run_with_handle();
    let warn_layer = warn_layer.with_filter(filter);

    let subscriber = tracing_subscriber::registry()
        .with(warn_layer)
        .with(info_layer);
    assert!(subscriber.max_level_hint().is_none());

    let _subscriber = subscriber.set_default();

    fn events() {
        tracing::trace!("hello trace");
        tracing::debug!("hello debug");
        tracing::info!("hello info");
        tracing::warn!("hello warn");
        tracing::error!("hello error");
    }

    events();
    {
        let lock = seen_info.lock().unwrap();
        for (&level, &count) in lock.iter() {
            if level == Level::INFO {
                continue;
            }
            assert_eq!(
                count, 1,
                "level {:?} should have been seen 1 time by the INFO layer (after first set of events)",
                level
            );
        }

        let lock = seen_warn.lock().unwrap();
        for (&level, &count) in lock.iter() {
            if level == Level::INFO {
                continue;
            }
            assert_eq!(
                count, 1,
                "level {:?} should have been seen 1 time by the WARN layer (after first set of events)",
                level
            );
        }
    }

    events();
    {
        let lock = seen_info.lock().unwrap();
        for (&level, &count) in lock.iter() {
            if level == Level::INFO {
                continue;
            }
            assert_eq!(
                count, 1,
                "level {:?} should have been seen 1 time by the INFO layer (after second set of events)",
                level
            );
        }

        let lock = seen_warn.lock().unwrap();
        for (&level, &count) in lock.iter() {
            if level == Level::INFO {
                continue;
            }
            assert_eq!(
                count, 1,
                "level {:?} should have been seen 1 time by the WARN layer (after second set of events)",
                level
            );
        }
    }

    info_handle.assert_finished();
    warn_handle.assert_finished();
}