Thread fuzz test cases
[rust-lightning] / fuzz / src / utils / test_logger.rs
1 use lightning::util::logger::{Logger, Record};
2 use std::sync::{Arc, Mutex};
3 use std::io::Write;
4
5 pub trait Output : Clone + Sync + Send + 'static {
6         fn locked_write(&self, data: &[u8]);
7 }
8
9 #[derive(Clone)]
10 pub struct DevNull {}
11 impl Output for DevNull {
12         fn locked_write(&self, _data: &[u8]) {}
13 }
14 #[derive(Clone)]
15 pub struct StringBuffer(Arc<Mutex<String>>);
16 impl Output for StringBuffer {
17         fn locked_write(&self, data: &[u8]) {
18                 self.0.lock().unwrap().push_str(&String::from_utf8(data.to_vec()).unwrap());
19         }
20 }
21 impl StringBuffer {
22         pub fn new() -> Self {
23                 Self(Arc::new(Mutex::new(String::new())))
24         }
25         pub fn into_string(self) -> String {
26                 Arc::try_unwrap(self.0).unwrap().into_inner().unwrap()
27         }
28 }
29
30 pub struct TestLogger<Out : Output> {
31         id: String,
32         out: Out,
33 }
34 impl<Out: Output> TestLogger<Out> {
35         pub fn new(id: String, out: Out) -> TestLogger<Out> {
36                 TestLogger { id, out }
37         }
38 }
39
40 struct LockedWriteAdapter<'a, Out: Output>(&'a Out);
41 impl<'a, Out: Output> Write for LockedWriteAdapter<'a, Out> {
42         fn write(&mut self, data: &[u8]) -> Result<usize, std::io::Error> {
43                 self.0.locked_write(data);
44                 Ok(data.len())
45         }
46         fn flush(&mut self) -> Result<(), std::io::Error> { Ok(()) }
47 }
48
49 impl<Out: Output> Logger for TestLogger<Out> {
50         fn log(&self, record: &Record) {
51                 write!(LockedWriteAdapter(&self.out),
52                         "{:<5} {} [{} : {}, {}] {}\n", record.level.to_string(), self.id, record.module_path, record.file, record.line, record.args)
53                         .unwrap();
54         }
55 }