stackforge_core/flow/
udp_state.rs1use std::time::Duration;
2
3use super::config::FlowConfig;
4use super::state::ConversationStatus;
5
6#[derive(Debug, Clone)]
12pub struct UdpFlowState {
13 pub status: ConversationStatus,
14}
15
16impl UdpFlowState {
17 #[must_use]
18 pub fn new() -> Self {
19 Self {
20 status: ConversationStatus::Active,
21 }
22 }
23
24 pub fn process_packet(&mut self) {
26 self.status = ConversationStatus::Active;
27 }
28
29 #[must_use]
31 pub fn check_timeout(&self, last_seen: Duration, now: Duration, config: &FlowConfig) -> bool {
32 now.saturating_sub(last_seen) > config.udp_timeout
33 }
34}
35
36impl Default for UdpFlowState {
37 fn default() -> Self {
38 Self::new()
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45
46 #[test]
47 fn test_udp_state_new() {
48 let state = UdpFlowState::new();
49 assert_eq!(state.status, ConversationStatus::Active);
50 }
51
52 #[test]
53 fn test_udp_timeout_check() {
54 let config = FlowConfig::default(); let state = UdpFlowState::new();
56
57 assert!(!state.check_timeout(Duration::from_secs(100), Duration::from_secs(200), &config));
59
60 assert!(state.check_timeout(Duration::from_secs(100), Duration::from_secs(300), &config));
62 }
63
64 #[test]
65 fn test_udp_process_packet() {
66 let mut state = UdpFlowState::new();
67 state.status = ConversationStatus::TimedOut;
68 state.process_packet();
69 assert_eq!(state.status, ConversationStatus::Active);
70 }
71}