ClockController

Struct ClockController 

Source
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

Source

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));
Source

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 wakes
Source

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().

Source

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.

Source

pub fn now(&self) -> DateTime<Utc>

Get the current artificial time.

This is equivalent to calling now() on the associated ClockHandle.

Source

pub fn transition_to_realtime(&self)

Transition to realtime mode.

After this call:

  • now() returns Utc::now()
  • sleep() uses real tokio timers
  • advance() 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).

Source

pub fn is_realtime(&self) -> bool

Check if clock has transitioned to realtime.

Source

pub fn clear_pending_wakes(&self)

Clear all pending wake events.

Source

pub fn reset_to(&self, time: DateTime<Utc>)

Reset clock to a specific time and clear all pending wakes.

Useful for test isolation between test cases.

Trait Implementations§

Source§

impl Clone for ClockController

Source§

fn clone(&self) -> ClockController

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ClockController

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more