Skip to content

Commit d6061a1

Browse files
dianpopadpopa
authored and
dpopa
committed
logger: adding unit tests
Signed-off-by: Diana Popa <[email protected]>
1 parent 4d9fa2d commit d6061a1

File tree

3 files changed

+204
-0
lines changed

3 files changed

+204
-0
lines changed

logger/src/error.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,42 @@ impl fmt::Display for LoggerError {
3434
}
3535
}
3636

37+
#[cfg(test)]
38+
mod tests {
39+
use super::*;
40+
use std::io::ErrorKind;
41+
42+
#[test]
43+
fn test_formatting() {
44+
assert!(
45+
format!(
46+
"{:?}",
47+
LoggerError::NeverInitialized(String::from("Bad Log Path Provided"))
48+
).contains("NeverInitialized")
49+
);
50+
assert!(
51+
format!(
52+
"{:?}",
53+
LoggerError::Poisoned(String::from("Never Initialized"))
54+
).contains("Poisoned")
55+
);
56+
assert!(
57+
format!(
58+
"{:?}",
59+
LoggerError::FileLogWrite(std::io::Error::new(ErrorKind::Interrupted, "write"))
60+
).contains("FileLogWrite")
61+
);
62+
assert!(
63+
format!(
64+
"{:?}",
65+
LoggerError::FileLogFlush(std::io::Error::new(ErrorKind::Interrupted, "flush"))
66+
).contains("FileLogFlush")
67+
);
68+
assert!(
69+
format!(
70+
"{:?}",
71+
LoggerError::FileLogLock(String::from("File log lock"))
72+
).contains("FileLogLock")
73+
);
74+
}
75+
}

logger/src/lib.rs

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,3 +338,131 @@ impl Log for Logger {
338338
// everything else flushes by itself
339339
}
340340
}
341+
342+
#[cfg(test)]
343+
mod tests {
344+
use super::*;
345+
use std::fs::File;
346+
use std::io::BufReader;
347+
use std::io::BufRead;
348+
use std::fs::remove_file;
349+
use log::MetadataBuilder;
350+
351+
fn validate_logs(
352+
log_path: &str,
353+
expected: &[(&'static str, &'static str, &'static str)],
354+
) -> bool {
355+
let f = File::open(log_path).unwrap();
356+
let mut reader = BufReader::new(f);
357+
358+
let mut line = String::new();
359+
for tuple in expected {
360+
line.clear();
361+
reader.read_line(&mut line).unwrap();
362+
assert!(line.contains(&tuple.0));
363+
assert!(line.contains(&tuple.1));
364+
assert!(line.contains(&tuple.2));
365+
}
366+
false
367+
}
368+
369+
#[test]
370+
fn test_default_values() {
371+
let l = Logger::new();
372+
assert_eq!(l.level_info.code, log::Level::Warn);
373+
assert_eq!(l.level_info.writer, Destination::Stderr);
374+
assert_eq!(l.show_line_numbers, true);
375+
assert_eq!(l.show_level, true);
376+
format!("{:?}", l.level_info.code);
377+
format!("{:?}", l.level_info.writer);
378+
format!("{:?}", l.show_line_numbers);
379+
format!("{:?}", l);
380+
}
381+
382+
#[test]
383+
fn test_init() {
384+
let l = Logger::new().set_include_origin(false, true);
385+
assert_eq!(l.show_line_numbers, false);
386+
387+
let l = Logger::new()
388+
.set_include_origin(true, true)
389+
.set_include_level(true)
390+
.set_level(log::Level::Info);
391+
assert_eq!(l.show_line_numbers, true);
392+
assert_eq!(l.show_file_path, true);
393+
assert_eq!(l.show_level, true);
394+
395+
assert!(l.init(Some(String::from("tmp.log"))).is_ok());
396+
info!("info");
397+
warn!("warning");
398+
399+
let l = Logger::new();
400+
assert!(l.init(None).is_ok());
401+
402+
info!("info");
403+
warn!("warning");
404+
error!("error");
405+
406+
// here we also test that the second initialization had no effect given that the
407+
// logging system can only be initialized once per program
408+
validate_logs(
409+
"tmp.log",
410+
&[
411+
("[INFO", "lib.rs", "info"),
412+
("[WARN", "lib.rs", "warn"),
413+
("[INFO", "lib.rs", "info"),
414+
("[WARN", "lib.rs", "warn"),
415+
("[ERROR", "lib.rs", "error"),
416+
],
417+
);
418+
remove_file("tmp.log").unwrap();
419+
420+
let l = Logger::new();
421+
unsafe {
422+
if let Err(e) = set_boxed_logger(Box::new(l)) {
423+
INIT_RES = Err(LoggerError::NeverInitialized(format!("{}", e)));
424+
}
425+
assert!(format!("{:?}", INIT_RES).contains("NeverInitialized"));
426+
}
427+
let l = Logger::new();
428+
assert!(l.init(None).is_err());
429+
unsafe {
430+
assert!(format!("{:?}", INIT_RES).contains("Poisoned"));
431+
}
432+
433+
let l = Logger::new()
434+
.set_include_level(true)
435+
.set_include_origin(false, false);
436+
let error_metadata = MetadataBuilder::new().level(Level::Error).build();
437+
let log_record = log::Record::builder().metadata(error_metadata).build();
438+
Logger::log(&l, &log_record);
439+
let l = Logger::new()
440+
.set_include_level(false)
441+
.set_include_origin(true, true);
442+
Logger::log(&l, &log_record);
443+
}
444+
445+
#[test]
446+
fn test_get_default_destination() {
447+
assert_eq!(
448+
get_default_destination(log::Level::Error),
449+
Destination::Stderr
450+
);
451+
assert_eq!(
452+
get_default_destination(log::Level::Warn),
453+
Destination::Stderr
454+
);
455+
assert_eq!(
456+
get_default_destination(log::Level::Info),
457+
Destination::Stdout
458+
);
459+
assert_eq!(
460+
get_default_destination(log::Level::Debug),
461+
Destination::Stdout
462+
);
463+
assert_eq!(
464+
get_default_destination(log::Level::Trace),
465+
Destination::Stdout
466+
);
467+
}
468+
}

logger/src/writers.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,40 @@ impl FileLogWriter {
5050
.map_err(|e| LoggerError::FileLogLock(format!("{}", e)))
5151
}
5252
}
53+
54+
#[cfg(test)]
55+
mod tests {
56+
use super::*;
57+
use std::fs::remove_file;
58+
59+
#[test]
60+
fn test_new() {
61+
let mut file: String = "./inexistent/tmp.log".to_string();
62+
assert!(FileLogWriter::new(&file).is_err());
63+
format!("{:?}", FileLogWriter::new(&file));
64+
file = "tmp_writers_new.log".to_string();
65+
let res = FileLogWriter::new(&file);
66+
format!("{:?}", res);
67+
remove_file(file).unwrap();
68+
assert!(res.is_ok())
69+
}
70+
71+
#[test]
72+
fn test_write() {
73+
let file: String = "tmp_writers_write.log".to_string();
74+
let fw = FileLogWriter::new(&file).unwrap();
75+
let msg = String::from("some message");
76+
let res = fw.write(&msg);
77+
remove_file(file).unwrap();
78+
assert!(res.is_ok())
79+
}
80+
81+
#[test]
82+
fn test_flush() {
83+
let file: String = "tmp_writers_flush.log".to_string();
84+
let fw = FileLogWriter::new(&file).unwrap();
85+
let res = fw.flush();
86+
remove_file(file).unwrap();
87+
assert!(res.is_ok())
88+
}
89+
}

0 commit comments

Comments
 (0)