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
impl MockSource
Sourcepub fn new(id: impl Into<String>, config: MockSourceConfig) -> Result<Self>
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_msis 0 (would cause spin loop)config.data_typeisSensorReadingwithsensor_countof 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)?;Sourcepub fn with_dispatch(
id: impl Into<String>,
config: MockSourceConfig,
dispatch_mode: Option<DispatchMode>,
dispatch_buffer_capacity: Option<usize>,
) -> Result<Self>
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 (ChannelorBroadcast).dispatch_buffer_capacity- Optional buffer size for dispatch channels.
§Errors
Returns anyhow::Error if:
config.interval_msis 0config.data_typeisSensorReadingwithsensor_countof 0
Source§impl MockSource
impl MockSource
Sourcepub async fn inject_event(&self, change: SourceChange) -> Result<()>
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- TheSourceChangeto inject (e.g.,SourceChange::Insert { element })
§Errors
Returns anyhow::Error if dispatching fails (e.g., all receivers have been dropped).
Sourcepub fn test_subscribe(&self) -> Box<dyn ChangeReceiver<SourceEventWrapper>>
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
impl MockSource
Sourcepub fn builder(id: impl Into<String>) -> MockSourceBuilder
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
impl Source for MockSource
Source§fn properties(&self) -> HashMap<String, Value>
fn properties(&self) -> HashMap<String, Value>
Source§fn auto_start(&self) -> bool
fn auto_start(&self) -> bool
Source§fn start<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn start<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn stop<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn stop<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn status<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ComponentStatus> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn status<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = ComponentStatus> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
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,
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,
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,
fn initialize<'life0, 'async_trait>(
&'life0 self,
context: SourceRuntimeContext,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
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,
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,
Source§fn dispatch_mode(&self) -> DispatchMode
fn dispatch_mode(&self) -> DispatchMode
Source§fn supports_replay(&self) -> bool
fn supports_replay(&self) -> bool
resume_from. Read more