Skip to content

Commit 04b49f4

Browse files
committed
chore: add filter tests
1 parent 049e2cc commit 04b49f4

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ streaming-stats = "0.2.3"
8888
humantime = "2.1"
8989
tempfile = "3.8"
9090
mock_instant = "0.3"
91+
serde_test = "1.0.176"
9192

9293
[[example]]
9394
name = "json_logger"

src/filter/mod.rs

+43
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ impl Deserializable for dyn Filter {
3131
}
3232
}
3333

34+
#[derive(PartialEq, Debug)]
3435
/// The response returned by a filter.
3536
pub enum Response {
3637
/// Accept the log event.
@@ -78,3 +79,45 @@ impl<'de> de::Deserialize<'de> for FilterConfig {
7879
})
7980
}
8081
}
82+
83+
#[cfg(test)]
84+
mod test {
85+
#[cfg(feature = "config_parsing")]
86+
use super::*;
87+
#[cfg(feature = "config_parsing")]
88+
use serde_test::{assert_de_tokens, assert_de_tokens_error, Token};
89+
90+
#[test]
91+
#[cfg(feature = "config_parsing")]
92+
fn test_cfg_deserializer() {
93+
94+
let filter = FilterConfig {
95+
kind: "threshold".to_owned(),
96+
config: Value::Map({
97+
let mut map = BTreeMap::new();
98+
map.insert(
99+
Value::String("level".to_owned()),
100+
Value::String("error".to_owned()),
101+
);
102+
map
103+
}),
104+
};
105+
106+
let mut cfg = vec![
107+
Token::Struct {
108+
name: "FilterConfig",
109+
len: 2,
110+
},
111+
Token::Str("kind"),
112+
Token::Str("threshold"),
113+
Token::Str("level"),
114+
Token::Str("error"),
115+
Token::StructEnd,
116+
];
117+
118+
assert_de_tokens(&filter, &cfg);
119+
120+
cfg[1] = Token::Str("knd");
121+
assert_de_tokens_error::<FilterConfig>(&cfg, "missing field `kind`");
122+
}
123+
}

src/filter/threshold.rs

+95
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,98 @@ impl Deserialize for ThresholdFilterDeserializer {
6666
Ok(Box::new(ThresholdFilter::new(config.level)))
6767
}
6868
}
69+
70+
#[cfg(test)]
71+
mod test {
72+
use log::{Level, LevelFilter, Record};
73+
74+
use super::*;
75+
76+
#[cfg(feature = "config_parsing")]
77+
use crate::config::Deserializers;
78+
79+
#[cfg(feature = "config_parsing")]
80+
use serde_test::{assert_de_tokens, assert_de_tokens_error, Token};
81+
82+
#[test]
83+
#[cfg(feature = "config_parsing")]
84+
fn test_cfg_deserialize() {
85+
let filter_cfg = ThresholdFilterConfig {
86+
level: LevelFilter::Off,
87+
};
88+
89+
let mut cfg = vec![
90+
Token::Struct {
91+
name: "ThresholdFilterConfig",
92+
len: 1,
93+
},
94+
Token::Str("level"),
95+
Token::Enum {
96+
name: "LevelFilter",
97+
},
98+
Token::Str("Off"),
99+
Token::Unit,
100+
Token::StructEnd,
101+
];
102+
103+
assert_de_tokens(&filter_cfg, &cfg);
104+
105+
cfg[1] = Token::Str("leel");
106+
assert_de_tokens_error::<ThresholdFilterConfig>(&cfg, "missing field `level`");
107+
108+
cfg[1] = Token::Str("level");
109+
cfg[3] = Token::Str("On");
110+
cfg.remove(4); // No Unit on this one as the Option is invalid
111+
assert_de_tokens_error::<ThresholdFilterConfig>(
112+
&cfg,
113+
"unknown variant `On`, expected one of `OFF`, `ERROR`, `WARN`, `INFO`, `DEBUG`, `TRACE`",
114+
);
115+
}
116+
117+
#[test]
118+
fn test_filter_new_vs_struct() {
119+
assert_eq!(
120+
ThresholdFilter::new(LevelFilter::Info),
121+
ThresholdFilter {
122+
level: LevelFilter::Info
123+
}
124+
);
125+
}
126+
127+
#[test]
128+
fn test_threshold_filter() {
129+
let thres = ThresholdFilter::new(LevelFilter::Info);
130+
let debug_record = Record::builder()
131+
.level(Level::Debug)
132+
.args(format_args!("the message"))
133+
.module_path(Some("path"))
134+
.file(Some("file"))
135+
.line(Some(132))
136+
.build();
137+
138+
assert_eq!(thres.filter(&debug_record), Response::Reject);
139+
140+
let error_record = Record::builder()
141+
.level(Level::Error)
142+
.args(format_args!("the message"))
143+
.module_path(Some("path"))
144+
.file(Some("file"))
145+
.line(Some(132))
146+
.build();
147+
148+
assert_eq!(thres.filter(&error_record), Response::Neutral);
149+
}
150+
151+
#[test]
152+
#[cfg(feature = "config_parsing")]
153+
fn test_cfg_deserializer() {
154+
let filter_cfg = ThresholdFilterConfig {
155+
level: LevelFilter::Off,
156+
};
157+
158+
let deserializer = ThresholdFilterDeserializer;
159+
160+
let res = deserializer.deserialize(filter_cfg, &Deserializers::default());
161+
assert!(res.is_ok());
162+
}
163+
}

0 commit comments

Comments
 (0)