feat: Add Clock abstraction for testable time and implement Hybrid Logical Clock (HLC).

This commit is contained in:
2025-12-20 14:29:08 +01:00
parent e1405bb910
commit 2f48483d0e
3 changed files with 393 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
//! Clock abstraction for testable time
//!
//! Provides a trait for getting the current time, with implementations
//! for real system time and mock time for testing.
use std::time::{SystemTime, UNIX_EPOCH};
/// Trait for getting the current wall clock time in milliseconds
pub trait Clock: Send + Sync {
/// Get the current time in milliseconds since Unix epoch
fn now_ms(&self) -> u64;
}
/// Real system clock implementation
#[derive(Debug, Clone, Copy, Default)]
pub struct SystemClock;
impl Clock for SystemClock {
fn now_ms(&self) -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Time went backwards")
.as_millis() as u64
}
}
/// Mock clock for testing - returns a fixed time
#[derive(Debug, Clone, Copy)]
pub struct MockClock {
pub time_ms: u64,
}
impl MockClock {
pub fn new(time_ms: u64) -> Self {
Self { time_ms }
}
}
impl Clock for MockClock {
fn now_ms(&self) -> u64 {
self.time_ms
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_system_clock_returns_reasonable_time() {
let clock = SystemClock;
let now = clock.now_ms();
// Should be after 2025-01-01
assert!(now > 1_735_689_600_000);
}
#[test]
fn test_mock_clock_returns_fixed_time() {
let clock = MockClock::new(12345);
assert_eq!(clock.now_ms(), 12345);
}
}