Skip to main content

MockSource

Struct MockSource 

Source
pub struct MockSource { /* private fields */ }
Expand description

Mock source that generates synthetic data for testing and development.

This source runs an internal tokio task that generates data at configurable intervals. It supports different data types (Counter, SensorReading, Generic) to simulate various real-world scenarios.

§Event Generation Behavior

  • Counter: Always emits INSERT events with sequential IDs
  • SensorReading: Emits INSERT for first reading per sensor, UPDATE thereafter
  • Generic: Always emits INSERT events with sequential IDs

§Thread Safety

This type is Send + Sync and can be safely shared across threads. Internal state is protected by RwLock.

Implementations§

Source§

impl MockSource

Source

pub fn new(id: impl Into<String>, config: MockSourceConfig) -> Result<Self>

Creates a new MockSource with the given ID and configuration.

The source is created in a stopped state. Call start() to begin generating events, or add it to DrasiLib which will start it automatically (unless auto_start is disabled via the builder).

§Arguments
  • id - Unique identifier for this source instance. Must be unique within a DrasiLib instance.
  • config - Configuration specifying data type and generation interval.
§Returns

A new MockSource instance, or an error if validation fails.

§Errors

Returns anyhow::Error if:

  • config.interval_ms is 0 (would cause spin loop)
  • config.data_type is SensorReading with sensor_count of 0
§Example
use drasi_source_mock::{MockSource, MockSourceConfig, DataType};

let config = MockSourceConfig {
    data_type: DataType::sensor_reading(10),
    interval_ms: 1000,
};

let source = MockSource::new("my-mock-source", config)?;
Source

pub fn with_dispatch( id: impl Into<String>, config: MockSourceConfig, dispatch_mode: Option<DispatchMode>, dispatch_buffer_capacity: Option<usize>, ) -> Result<Self>

Creates a new MockSource with custom dispatch settings.

This is a lower-level constructor for advanced use cases where you need control over event dispatching. For most cases, prefer MockSource::builder().

§Arguments
  • id - Unique identifier for this source instance.
  • config - Configuration specifying data type and generation interval.
  • dispatch_mode - Optional dispatch mode (Channel or Broadcast).
  • dispatch_buffer_capacity - Optional buffer size for dispatch channels.
§Errors

Returns anyhow::Error if:

  • config.interval_ms is 0
  • config.data_type is SensorReading with sensor_count of 0
Source§

impl MockSource

Source

pub async fn inject_event(&self, change: SourceChange) -> Result<()>

Injects a custom event into the source for testing purposes.

This allows tests to send specific SourceChange events (INSERT, UPDATE, DELETE) without waiting for automatic generation. Useful for deterministic testing scenarios.

The source does not need to be started to inject events.

§Arguments
  • change - The SourceChange to inject (e.g., SourceChange::Insert { element })
§Errors

Returns anyhow::Error if dispatching fails (e.g., all receivers have been dropped).

Source

pub fn test_subscribe(&self) -> Box<dyn ChangeReceiver<SourceEventWrapper>>

Creates a test subscription to receive events from this source.

This bypasses DrasiLib’s subscription mechanism and directly subscribes to the source’s event dispatcher. Useful for unit testing the source in isolation.

§Returns

A boxed receiver that yields SourceEventWrapper for each event generated or injected.

§Example
let source = MockSource::new("test", config)?;
let mut rx = source.test_subscribe();

source.start().await?;

// Receive events
while let Some(event) = rx.recv().await {
    println!("Received: {:?}", event);
}
Source§

impl MockSource

Source

pub fn builder(id: impl Into<String>) -> MockSourceBuilder

Create a builder for MockSource with the given ID.

This is the recommended way to construct a MockSource.

§Arguments
  • id - Unique identifier for the source instance
§Example
let source = MockSource::builder("my-source")
    .with_data_type(DataType::sensor_reading(10))
    .with_interval_ms(1000)
    .build()?;

Trait Implementations§

Source§

impl Source for MockSource

Source§

fn id(&self) -> &str

Get the source’s unique identifier
Source§

fn type_name(&self) -> &str

Get the source type name (e.g., “postgres”, “http”, “mock”)
Source§

fn properties(&self) -> HashMap<String, Value>

Get the source’s configuration properties for inspection Read more
Source§

fn auto_start(&self) -> bool

Whether this source should auto-start when DrasiLib starts Read more
Source§

fn start<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Start the source Read more
Source§

fn stop<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Stop the source Read more
Source§

fn status<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = ComponentStatus> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Get the current status of the source
Source§

fn subscribe<'life0, 'async_trait>( &'life0 self, settings: SourceSubscriptionSettings, ) -> Pin<Box<dyn Future<Output = Result<SubscriptionResponse>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Subscribe to this source for change events Read more
Source§

fn as_any(&self) -> &dyn Any

Downcast helper for testing - allows access to concrete types
Source§

fn initialize<'life0, 'async_trait>( &'life0 self, context: SourceRuntimeContext, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Initialize the source with runtime context. Read more
Source§

fn set_bootstrap_provider<'life0, 'async_trait>( &'life0 self, provider: Box<dyn BootstrapProvider + 'static>, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Set the bootstrap provider for this source Read more
Source§

fn dispatch_mode(&self) -> DispatchMode

Get the dispatch mode for this source (Channel or Broadcast) Read more
Source§

fn supports_replay(&self) -> bool

Whether this source supports positional replay via resume_from. Read more
Source§

fn deprovision<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>
where 'life0: 'async_trait, Self: 'async_trait,

Permanently clean up internal state when the source is being removed. 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> 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, 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