pub struct ClockController { /* private fields */ }Expand description
Controller for artificial time operations.
This is only available for artificial clocks and provides methods to advance time, set time, and inspect pending wake events.
Created alongside a ClockHandle via
ClockHandle::artificial().
Implementations§
Source§impl ClockController
impl ClockController
Sourcepub async fn advance(&self, duration: Duration) -> usize
pub async fn advance(&self, duration: Duration) -> usize
Advance artificial time by the given duration.
Wake events are processed in chronological order. If you advance by
1 day and there are sleeps scheduled at 1 hour and 2 hours, they will
wake at their scheduled times (seeing the correct now() value),
not at +1 day.
Returns the number of wake events that were processed.
§Example
use es_entity::clock::{ClockHandle, ArtificialClockConfig};
use std::time::Duration;
let (clock, ctrl) = ClockHandle::artificial(ArtificialClockConfig::manual());
let t0 = clock.now();
let clock2 = clock.clone();
let handle = tokio::spawn(async move {
clock2.sleep(Duration::from_secs(3600)).await;
clock2.now() // Will be t0 + 1 hour
});
tokio::task::yield_now().await; // Let task register its sleep
// Advance 1 day - task wakes at exactly +1 hour
ctrl.advance(Duration::from_secs(86400)).await;
let wake_time = handle.await.unwrap();
assert_eq!(wake_time, t0 + chrono::Duration::hours(1));Sourcepub async fn advance_to_next_wake(&self) -> Option<DateTime<Utc>>
pub async fn advance_to_next_wake(&self) -> Option<DateTime<Utc>>
Advance to the next pending wake event.
Returns the time that was advanced to, or None if there are no
pending wake events.
This is useful for step-by-step testing where you want to process events one at a time.
§Example
use es_entity::clock::{ClockHandle, ArtificialClockConfig};
use std::time::Duration;
let (clock, ctrl) = ClockHandle::artificial(ArtificialClockConfig::manual());
let t0 = clock.now();
// Spawn tasks with different sleep durations
let c = clock.clone();
tokio::spawn(async move { c.sleep(Duration::from_secs(60)).await; });
let c = clock.clone();
tokio::spawn(async move { c.sleep(Duration::from_secs(120)).await; });
tokio::task::yield_now().await;
// Step through one wake at a time
let t1 = ctrl.advance_to_next_wake().await;
assert_eq!(t1, Some(t0 + chrono::Duration::seconds(60)));
let t2 = ctrl.advance_to_next_wake().await;
assert_eq!(t2, Some(t0 + chrono::Duration::seconds(120)));
let t3 = ctrl.advance_to_next_wake().await;
assert_eq!(t3, None); // No more pending wakesSourcepub fn set_time(&self, time: DateTime<Utc>)
pub fn set_time(&self, time: DateTime<Utc>)
Set the artificial time to a specific value.
Warning: Unlike advance(), this does NOT process wake events in order.
All tasks whose wake time has passed will see the new time when they wake.
Use this for “jump ahead, don’t care about intermediate events” scenarios.
For deterministic testing, prefer advance() or advance_to_next_wake().
Sourcepub fn pending_wake_count(&self) -> usize
pub fn pending_wake_count(&self) -> usize
Get the number of pending wake events.
This is useful for testing to verify that tasks have registered their sleeps before advancing time.
Sourcepub fn now(&self) -> DateTime<Utc>
pub fn now(&self) -> DateTime<Utc>
Get the current artificial time.
This is equivalent to calling now() on the associated ClockHandle.
Sourcepub fn transition_to_realtime(&self)
pub fn transition_to_realtime(&self)
Transition to realtime mode.
After this call:
now()returnsUtc::now()sleep()uses real tokio timersadvance()becomes a no-op
Pending sleeps are woken immediately and will re-register using real timers for their remaining duration (based on the original wake time).
Sourcepub fn is_realtime(&self) -> bool
pub fn is_realtime(&self) -> bool
Check if clock has transitioned to realtime.
Sourcepub fn clear_pending_wakes(&self)
pub fn clear_pending_wakes(&self)
Clear all pending wake events.
Trait Implementations§
Source§impl Clone for ClockController
impl Clone for ClockController
Source§fn clone(&self) -> ClockController
fn clone(&self) -> ClockController
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl Freeze for ClockController
impl !RefUnwindSafe for ClockController
impl Send for ClockController
impl Sync for ClockController
impl Unpin for ClockController
impl !UnwindSafe for ClockController
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more