mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-07 02:57:34 +00:00
This PR adds a `SystemClock` trait for abstracting away the system clock. This allows us to swap out the real system clock with a `FakeSystemClock` in the tests, thus allowing the fake passage of time. We're using this in `Telemetry` to better mock the clock for testing purposes. Release Notes: - N/A
59 lines
1.4 KiB
Rust
59 lines
1.4 KiB
Rust
use chrono::{DateTime, Utc};
|
|
|
|
pub trait SystemClock: Send + Sync {
|
|
/// Returns the current date and time in UTC.
|
|
fn utc_now(&self) -> DateTime<Utc>;
|
|
}
|
|
|
|
pub struct RealSystemClock;
|
|
|
|
impl SystemClock for RealSystemClock {
|
|
fn utc_now(&self) -> DateTime<Utc> {
|
|
Utc::now()
|
|
}
|
|
}
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
pub struct FakeSystemClockState {
|
|
now: DateTime<Utc>,
|
|
}
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
pub struct FakeSystemClock {
|
|
// Use an unfair lock to ensure tests are deterministic.
|
|
state: parking_lot::Mutex<FakeSystemClockState>,
|
|
}
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
impl Default for FakeSystemClock {
|
|
fn default() -> Self {
|
|
Self::new(Utc::now())
|
|
}
|
|
}
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
impl FakeSystemClock {
|
|
pub fn new(now: DateTime<Utc>) -> Self {
|
|
let state = FakeSystemClockState { now };
|
|
|
|
Self {
|
|
state: parking_lot::Mutex::new(state),
|
|
}
|
|
}
|
|
|
|
pub fn set_now(&self, now: DateTime<Utc>) {
|
|
self.state.lock().now = now;
|
|
}
|
|
|
|
/// Advances the [`FakeSystemClock`] by the specified [`Duration`](chrono::Duration).
|
|
pub fn advance(&self, duration: chrono::Duration) {
|
|
self.state.lock().now += duration;
|
|
}
|
|
}
|
|
|
|
#[cfg(any(test, feature = "test-support"))]
|
|
impl SystemClock for FakeSystemClock {
|
|
fn utc_now(&self) -> DateTime<Utc> {
|
|
self.state.lock().now
|
|
}
|
|
}
|