reifydb_runtime/context/clock/
mod.rs1#[cfg(any(reifydb_target = "native", reifydb_target = "dst"))]
13mod native;
14#[cfg(reifydb_target = "wasi")]
15mod wasi;
16#[cfg(reifydb_target = "wasm")]
17mod wasm;
18
19#[cfg(any(reifydb_target = "native", reifydb_target = "dst"))]
20pub use native::{Clock, Instant, MockClock};
21#[cfg(reifydb_target = "wasi")]
22pub use wasi::{Clock, Instant, MockClock};
23#[cfg(reifydb_target = "wasm")]
24pub use wasm::{Clock, Instant, MockClock};
25
26#[cfg(test)]
27mod tests {
28 #[cfg(reifydb_target = "native")]
29 use std::thread;
30
31 use super::*;
32
33 #[test]
34 fn test_real_clock() {
35 let clock = Clock::Real;
36 let t1 = clock.now_millis();
37 let mut sum = 0;
39 for i in 0..10000 {
40 sum += i;
41 }
42 let t2 = clock.now_millis();
43 assert!(t2 >= t1, "Time should not go backwards");
44 let _ = sum;
45 }
46
47 #[test]
48 fn test_mock_clock_initial() {
49 let mock = MockClock::from_millis(1000);
50 let clock = Clock::Mock(mock);
51
52 assert_eq!(clock.now_millis(), 1000);
53 assert_eq!(clock.now_micros(), 1_000_000);
54 assert_eq!(clock.now_nanos(), 1_000_000_000);
55 }
56
57 #[test]
58 fn test_mock_clock_set() {
59 let mock = MockClock::from_millis(0);
60 mock.set_millis(5000);
61
62 assert_eq!(mock.now_millis(), 5000);
63
64 mock.set_micros(6_000_000);
65 assert_eq!(mock.now_millis(), 6000);
66 }
67
68 #[test]
69 fn test_mock_clock_advance() {
70 let mock = MockClock::from_millis(1000);
71 let clock = Clock::Mock(mock.clone());
72
73 assert_eq!(clock.now_millis(), 1000);
74
75 mock.advance_millis(500);
76 assert_eq!(clock.now_millis(), 1500);
77
78 mock.advance_micros(500_000);
79 assert_eq!(clock.now_millis(), 2000);
80
81 mock.advance_nanos(500_000_000);
82 assert_eq!(clock.now_millis(), 2500);
83 }
84
85 #[cfg(reifydb_target = "native")]
86 #[test]
87 fn test_mock_clock_thread_safe() {
88 let mock = MockClock::from_millis(1000);
89 let mock_clone = mock.clone();
90
91 let handle = thread::spawn(move || {
92 mock_clone.advance_millis(500);
93 mock_clone.now_millis()
94 });
95
96 let result = handle.join().unwrap();
97 assert_eq!(result, 1500);
98 assert_eq!(mock.now_millis(), 1500);
99 }
100
101 #[test]
102 fn test_nanosecond_precision() {
103 let mock = MockClock::new(1_234_567_890_123_456_789);
104 let clock = Clock::Mock(mock);
105
106 assert_eq!(clock.now_nanos(), 1_234_567_890_123_456_789);
107 assert_eq!(clock.now_micros(), 1_234_567_890_123_456);
108 assert_eq!(clock.now_millis(), 1_234_567_890_123);
109 assert_eq!(clock.now_secs(), 1_234_567_890);
110 }
111}