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