Skip to content

Commit b08c0dd

Browse files
committed
Add test for current output of log impl
1 parent 17f4593 commit b08c0dd

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed

glib/tests/bridged_logging.rs

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
#![cfg(feature = "log")]
2+
3+
use std::sync::{Arc, Mutex};
4+
5+
use glib::LogLevel;
6+
use rs_log::Log;
7+
8+
#[derive(Debug, PartialEq, Eq)]
9+
struct LoggedEvent {
10+
level: LogLevel,
11+
fields: Vec<(String, Option<String>)>,
12+
}
13+
14+
fn setup_log_collector() -> Arc<Mutex<Vec<LoggedEvent>>> {
15+
let events = Arc::new(Mutex::new(Vec::new()));
16+
let event_writer = events.clone();
17+
glib::log_set_writer_func(move |level, fields| {
18+
let fields = fields
19+
.iter()
20+
.map(|field| {
21+
(
22+
field.key().to_string(),
23+
field.value_str().map(|s| s.to_owned()),
24+
)
25+
})
26+
.collect();
27+
event_writer
28+
.lock()
29+
.unwrap()
30+
.push(LoggedEvent { level, fields });
31+
glib::LogWriterOutput::Handled
32+
});
33+
events
34+
}
35+
36+
/// Test the glib Rust logger with different formats.
37+
///
38+
/// We put everything into one test because we can only set the log writer func once.
39+
#[test]
40+
fn glib_logger_formats() {
41+
let events = setup_log_collector();
42+
43+
let record = rs_log::RecordBuilder::new()
44+
.target("test_target")
45+
.level(rs_log::Level::Info)
46+
.args(format_args!("test message"))
47+
.file(Some("/path/to/a/test/file.rs"))
48+
.line(Some(42))
49+
.module_path(Some("foo::bar"))
50+
.build();
51+
52+
glib::GlibLogger::new(
53+
glib::GlibLoggerFormat::Plain,
54+
glib::GlibLoggerDomain::CrateTarget,
55+
)
56+
.log(&record);
57+
let event = events.lock().unwrap().pop().unwrap();
58+
assert_eq!(
59+
event,
60+
LoggedEvent {
61+
level: glib::LogLevel::Info,
62+
fields: vec![
63+
("GLIB_OLD_LOG_API".to_string(), Some("1".to_string())),
64+
("MESSAGE".to_string(), Some("test message".to_string())),
65+
("PRIORITY".to_string(), Some("6".to_string())),
66+
("GLIB_DOMAIN".to_string(), Some("test_target".to_string()))
67+
]
68+
}
69+
);
70+
events.lock().unwrap().clear();
71+
72+
glib::GlibLogger::new(
73+
glib::GlibLoggerFormat::LineAndFile,
74+
glib::GlibLoggerDomain::CrateTarget,
75+
)
76+
.log(&record);
77+
let event = events.lock().unwrap().pop().unwrap();
78+
assert_eq!(
79+
event,
80+
LoggedEvent {
81+
level: glib::LogLevel::Info,
82+
fields: vec![
83+
("GLIB_OLD_LOG_API".to_string(), Some("1".to_string())),
84+
(
85+
"MESSAGE".to_string(),
86+
Some("/path/to/a/test/file.rs:42: test message".to_string())
87+
),
88+
("PRIORITY".to_string(), Some("6".to_string())),
89+
("GLIB_DOMAIN".to_string(), Some("test_target".to_string()))
90+
]
91+
}
92+
);
93+
94+
glib::GlibLogger::new(
95+
glib::GlibLoggerFormat::Structured,
96+
glib::GlibLoggerDomain::CrateTarget,
97+
)
98+
.log(&record);
99+
let event = events.lock().unwrap().pop().unwrap();
100+
assert_eq!(
101+
event,
102+
LoggedEvent {
103+
level: glib::LogLevel::Info,
104+
fields: vec![
105+
("PRIORITY".to_string(), Some("6".to_string())),
106+
(
107+
"CODE_FILE".to_string(),
108+
Some("glib/src/bridged_logging.rs".to_string())
109+
),
110+
("CODE_LINE".to_string(), Some("147".to_string())),
111+
(
112+
"CODE_FUNC".to_string(),
113+
Some("glib::bridged_logging::GlibLogger::write_log_structured".to_string())
114+
),
115+
(
116+
"CODE_FILE".to_string(),
117+
Some("/path/to/a/test/file.rs".to_string())
118+
),
119+
("CODE_LINE".to_string(), Some("42".to_string())),
120+
("CODE_FUNC".to_string(), Some("foo::bar".to_string())),
121+
("MESSAGE".to_string(), Some("test message".to_string())),
122+
("GLIB_DOMAIN".to_string(), Some("test_target".to_string()))
123+
]
124+
}
125+
);
126+
127+
// Structured logging without location fields
128+
glib::GlibLogger::new(
129+
glib::GlibLoggerFormat::Structured,
130+
glib::GlibLoggerDomain::CrateTarget,
131+
)
132+
.log(
133+
&rs_log::RecordBuilder::new()
134+
.target("test_target")
135+
.level(rs_log::Level::Info)
136+
.args(format_args!("test message"))
137+
.build(),
138+
);
139+
let event = events.lock().unwrap().pop().unwrap();
140+
assert_eq!(
141+
event,
142+
LoggedEvent {
143+
level: glib::LogLevel::Info,
144+
fields: vec![
145+
("PRIORITY".to_string(), Some("6".to_string())),
146+
("CODE_FILE".to_string(), Some("<unknown file>".to_string())),
147+
("CODE_LINE".to_string(), Some("<unknown line>".to_string())),
148+
(
149+
"CODE_FUNC".to_string(),
150+
Some("<unknown module path>".to_string())
151+
),
152+
("MESSAGE".to_string(), Some("test message".to_string())),
153+
("GLIB_DOMAIN".to_string(), Some("test_target".to_string()))
154+
]
155+
}
156+
);
157+
}

0 commit comments

Comments
 (0)