use dactor::node::NodeId;
use dactor::system_actors::{CancelManager, NodeDirectory, PeerStatus, SpawnManager, WatchManager};
use dactor::test_support::test_runtime::TestRuntime;
use dactor::type_registry::TypeRegistry;
pub struct MockNode {
pub node_id: NodeId,
pub runtime: TestRuntime,
pub spawn_manager: SpawnManager,
pub watch_manager: WatchManager,
pub cancel_manager: CancelManager,
pub node_directory: NodeDirectory,
}
impl MockNode {
pub fn new(node_id: NodeId) -> Self {
let runtime = TestRuntime::with_node_id(node_id.clone());
Self {
node_id,
runtime,
spawn_manager: SpawnManager::new(TypeRegistry::new()),
watch_manager: WatchManager::new(),
cancel_manager: CancelManager::new(),
node_directory: NodeDirectory::new(),
}
}
pub fn register_factory(
&mut self,
type_name: impl Into<String>,
factory: impl Fn(&[u8]) -> Result<Box<dyn std::any::Any + Send>, dactor::remote::SerializationError>
+ Send
+ Sync
+ 'static,
) {
self.spawn_manager
.type_registry_mut()
.register_factory(type_name, factory);
}
pub fn connect_peer(&mut self, peer: &NodeId) {
self.node_directory.add_peer(peer.clone(), None);
self.node_directory.set_status(peer, PeerStatus::Connected);
}
pub fn disconnect_peer(&mut self, peer: &NodeId) {
self.node_directory
.set_status(peer, PeerStatus::Disconnected);
}
}