use std::time::{Duration, SystemTime};
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct MetricsSnapshot {
pub message_count: u64,
pub avg_processing_time: Duration,
pub max_processing_time: Duration,
pub error_count: u64,
pub uptime: Duration,
pub last_activity: Option<SystemTime>,
}
impl Default for MetricsSnapshot {
fn default() -> Self {
Self {
message_count: 0,
avg_processing_time: Duration::ZERO,
max_processing_time: Duration::ZERO,
error_count: 0,
uptime: Duration::ZERO,
last_activity: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metrics_snapshot_default() {
let snapshot = MetricsSnapshot::default();
assert_eq!(snapshot.message_count, 0);
assert_eq!(snapshot.avg_processing_time, Duration::ZERO);
assert_eq!(snapshot.max_processing_time, Duration::ZERO);
assert_eq!(snapshot.error_count, 0);
assert_eq!(snapshot.uptime, Duration::ZERO);
assert!(snapshot.last_activity.is_none());
}
#[test]
fn test_metrics_snapshot_clone() {
let original = MetricsSnapshot {
message_count: 42,
avg_processing_time: Duration::from_millis(100),
max_processing_time: Duration::from_millis(500),
error_count: 3,
uptime: Duration::from_secs(60),
last_activity: Some(SystemTime::now()),
};
let cloned = original.clone();
assert_eq!(cloned.message_count, 42);
assert_eq!(cloned.avg_processing_time, Duration::from_millis(100));
assert_eq!(cloned.max_processing_time, Duration::from_millis(500));
assert_eq!(cloned.error_count, 3);
assert_eq!(cloned.uptime, Duration::from_secs(60));
assert!(cloned.last_activity.is_some());
}
#[test]
fn test_metrics_snapshot_debug() {
let snapshot = MetricsSnapshot::default();
let debug_str = format!("{:?}", snapshot);
assert!(debug_str.contains("MetricsSnapshot"));
assert!(debug_str.contains("message_count"));
assert!(debug_str.contains("error_count"));
}
}