Skip to main content

reifydb_runtime/context/clock/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4#[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		// Small busy loop to ensure time passes
41		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}