Skip to main content

dactor_mock/
node.rs

1use dactor::node::NodeId;
2use dactor::system_actors::{CancelManager, NodeDirectory, PeerStatus, SpawnManager, WatchManager};
3use dactor::test_support::test_runtime::TestRuntime;
4use dactor::type_registry::TypeRegistry;
5
6/// A simulated node in a MockCluster.
7///
8/// Each node has its own runtime, identity, and system actors for
9/// simulated remote operations (spawn, watch, cancel).
10pub struct MockNode {
11    pub node_id: NodeId,
12    pub runtime: TestRuntime,
13    /// Manages remote actor spawn requests for this node.
14    pub spawn_manager: SpawnManager,
15    /// Manages remote watch/unwatch subscriptions for this node.
16    pub watch_manager: WatchManager,
17    /// Manages remote cancellation requests for this node.
18    pub cancel_manager: CancelManager,
19    /// Tracks peer node connection state.
20    pub node_directory: NodeDirectory,
21}
22
23impl MockNode {
24    pub fn new(node_id: NodeId) -> Self {
25        let runtime = TestRuntime::with_node_id(node_id.clone());
26        Self {
27            node_id,
28            runtime,
29            spawn_manager: SpawnManager::new(TypeRegistry::new()),
30            watch_manager: WatchManager::new(),
31            cancel_manager: CancelManager::new(),
32            node_directory: NodeDirectory::new(),
33        }
34    }
35
36    /// Register an actor type for remote spawning on this node.
37    pub fn register_factory(
38        &mut self,
39        type_name: impl Into<String>,
40        factory: impl Fn(&[u8]) -> Result<Box<dyn std::any::Any + Send>, dactor::remote::SerializationError>
41            + Send
42            + Sync
43            + 'static,
44    ) {
45        self.spawn_manager
46            .type_registry_mut()
47            .register_factory(type_name, factory);
48    }
49
50    /// Connect this node to a peer (marks as Connected in directory).
51    pub fn connect_peer(&mut self, peer: &NodeId) {
52        self.node_directory.add_peer(peer.clone(), None);
53        self.node_directory.set_status(peer, PeerStatus::Connected);
54    }
55
56    /// Disconnect a peer node.
57    pub fn disconnect_peer(&mut self, peer: &NodeId) {
58        self.node_directory
59            .set_status(peer, PeerStatus::Disconnected);
60    }
61}