1use std::any::Any;
6
7pub trait EventHandler: Send + Sync {
12 fn ev_start(&mut self, _worker: &dyn Any) {}
14
15 fn ev_pickup(&mut self, _worker: &dyn Any, _node: &str) {}
18
19 fn ev_read(&mut self, _worker: &dyn Any, _node: &str, _sname: &str, _msg: &str) {}
22
23 fn ev_error(&mut self, _worker: &dyn Any) {}
28
29 fn ev_written(&mut self, _worker: &dyn Any, _node: &str, _sname: &str, _size: usize) {}
32
33 fn ev_hup(&mut self, _worker: &dyn Any, _node: &str, _rc: i32) {}
36
37 fn ev_close(&mut self, _worker: &dyn Any, _timedout: bool) {}
39
40 fn _ev_routing(&mut self, _worker: &dyn Any, _arg: &str) {}
43
44 fn ev_msg(&mut self, _port: u16, _msg: &str) {}
46
47 fn ev_timer(&mut self, _timer: &dyn Any) {}
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
57 fn test_default_impls_callable() {
58 struct DefaultHandler;
59
60 impl EventHandler for DefaultHandler {}
61
62 let mut handler = DefaultHandler;
63
64 handler.ev_start(&dyn_any_placeholder());
66 handler.ev_pickup(&dyn_any_placeholder(), "node1");
67 handler.ev_read(&dyn_any_placeholder(), "node1", "stdout", "hello");
68 handler.ev_error(&dyn_any_placeholder());
69 handler.ev_written(&dyn_any_placeholder(), "node1", "stdout", 100);
70 handler.ev_hup(&dyn_any_placeholder(), "node1", 0);
71 handler.ev_close(&dyn_any_placeholder(), false);
72 handler._ev_routing(&dyn_any_placeholder(), "route_data");
73 handler.ev_msg(8080, "message");
74 handler.ev_timer(&dyn_any_placeholder());
75 }
76
77 #[test]
79 fn test_custom_overrides() {
80 struct CustomHandler {
81 pub start_count: usize,
82 pub close_count: usize,
83 }
84
85 impl CustomHandler {
86 fn new() -> Self {
87 Self {
88 start_count: 0,
89 close_count: 0,
90 }
91 }
92 }
93
94 impl EventHandler for CustomHandler {
95 fn ev_start(&mut self, _worker: &dyn Any) {
96 self.start_count += 1;
97 }
98
99 fn ev_close(&mut self, _worker: &dyn Any, timedout: bool) {
100 self.close_count += 1;
101 assert!(!timedout, "Expected no timeout in this test");
102 }
103 }
104
105 let mut handler = CustomHandler::new();
106
107 handler.ev_start(&dyn_any_placeholder());
108 handler.ev_start(&dyn_any_placeholder());
109 handler.ev_close(&dyn_any_placeholder(), false);
110
111 assert_eq!(handler.start_count, 2, "ev_start should be called twice");
112 assert_eq!(handler.close_count, 1, "ev_close should be called once");
113 }
114
115 #[test]
122 fn test_object_safety() {
123 struct Handler1 {
124 pub count: usize,
125 }
126
127 impl EventHandler for Handler1 {
128 fn ev_start(&mut self, _worker: &dyn Any) {
129 self.count += 1;
130 }
131 }
132
133 struct Handler2 {
134 pub messages: Vec<String>,
135 }
136
137 impl EventHandler for Handler2 {
138 fn ev_read(&mut self, _worker: &dyn Any, node: &str, sname: &str, msg: &str) {
139 self.messages.push(format!("{}:{}:{}", node, sname, msg));
140 }
141 }
142
143 let mut handlers: Vec<Box<dyn EventHandler>> = Vec::new();
146 handlers.push(Box::new(Handler1 { count: 0 }));
147 handlers.push(Box::new(Handler2 {
148 messages: Vec::new(),
149 }));
150
151 for handler in &mut handlers {
153 handler.ev_start(&dyn_any_placeholder());
154 }
155
156 for handler in &mut handlers {
158 handler.ev_read(&dyn_any_placeholder(), "node1", "stdout", "test");
159 }
160
161 assert!(
165 true,
166 "Object safety test passed - Box<dyn EventHandler> works"
167 );
168 }
169
170 fn dyn_any_placeholder() -> Box<dyn Any> {
172 Box::new(())
173 }
174
175 #[test]
177 fn test_send_sync() {
178 struct SendSyncHandler;
179
180 impl EventHandler for SendSyncHandler {}
181
182 fn assert_send<T: Send>() {}
183 fn assert_sync<T: Sync>() {}
184
185 assert_send::<Box<dyn EventHandler>>();
186 assert_sync::<Box<dyn EventHandler>>();
187 assert_send::<SendSyncHandler>();
188 assert_sync::<SendSyncHandler>();
189 }
190}