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