moonpool_sim/providers/sim_providers.rs
1//! Simulation providers bundle implementation.
2
3use std::net::IpAddr;
4
5use moonpool_core::impl_providers_bundle;
6
7use crate::network::SimNetworkProvider;
8use crate::sim::WeakSimWorld;
9use crate::storage::SimStorageProvider;
10
11use super::{SimRandomProvider, SimTaskProvider, SimTimeProvider};
12
13/// Simulation providers bundle for deterministic testing.
14///
15/// This struct bundles all simulation-based providers into a single
16/// instance that implements [`Providers`]. Each bundle is scoped to a
17/// specific process IP for per-process storage fault injection.
18///
19/// ## Usage
20///
21/// ```rust,ignore
22/// use moonpool_sim::{SimWorld, SimProviders, Providers};
23///
24/// let sim = SimWorld::new();
25/// let ip: std::net::IpAddr = "10.0.1.1".parse().unwrap();
26/// let providers = SimProviders::new(sim.downgrade(), 42, ip);
27///
28/// // Access individual providers
29/// let network = providers.network();
30/// let storage = providers.storage();
31/// ```
32///
33/// ## Implementation Notes
34///
35/// - Uses `SimNetworkProvider` for simulated TCP connections
36/// - Uses `SimTimeProvider` for logical/simulated time
37/// - Uses `SimTaskProvider` for task spawning on the deterministic executor
38/// - Uses `SimRandomProvider` for seeded deterministic randomness
39/// - Uses `SimStorageProvider` for simulated file I/O with per-process fault injection
40#[derive(Clone)]
41pub struct SimProviders {
42 network: SimNetworkProvider,
43 time: SimTimeProvider,
44 task: SimTaskProvider,
45 random: SimRandomProvider,
46 storage: SimStorageProvider,
47}
48
49impl SimProviders {
50 /// Create a new simulation providers bundle scoped to a process IP.
51 ///
52 /// # Arguments
53 ///
54 /// * `sim` - Weak reference to the simulation world
55 /// * `seed` - Seed for deterministic random number generation
56 /// * `ip` - IP address of the owning process (for per-process storage scoping)
57 #[must_use]
58 pub fn new(sim: WeakSimWorld, seed: u64, ip: IpAddr) -> Self {
59 Self {
60 network: SimNetworkProvider::new(sim.clone()),
61 time: SimTimeProvider::new(sim.clone()),
62 task: SimTaskProvider,
63 random: SimRandomProvider::new(seed),
64 storage: SimStorageProvider::new(sim, ip),
65 }
66 }
67}
68
69impl_providers_bundle!(SimProviders {
70 network: SimNetworkProvider,
71 time: SimTimeProvider,
72 task: SimTaskProvider,
73 random: SimRandomProvider,
74 storage: SimStorageProvider,
75});