#![allow(dead_code)]
#[allow(unused_imports)] use super::*;
#[derive(Debug, MachineImpl)]
pub enum ComponentCmd {
Start,
Stop,
NewSession(u128, settings::Service, Arc<dyn std::any::Any + Send + Sync>),
}
pub type AnySender = Arc<dyn std::any::Any + Send + Sync>;
pub type ComponentSender = Sender<ComponentCmd>;
#[derive(Debug)]
pub enum ComponentError {
NotEnabled(String),
BadConfig(String),
}
#[derive(Debug, Clone)]
pub struct ComponentInfo {
component: settings::Component,
sender: ComponentSender,
}
impl ComponentInfo {
pub const fn new(component: settings::Component, sender: ComponentSender) -> Self { Self { component, sender } }
pub const fn component(&self) -> &settings::Component { &self.component }
pub const fn sender(&self) -> &ComponentSender { &self.sender }
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)] use super::*;
use simplelog::*;
use d3_core::executor;
#[derive(Debug, MachineImpl)]
pub enum TestMessage {
Test,
}
#[test]
fn test_new_session() {
#[derive(Default)]
struct Controller {
counter: AtomicCell<usize>,
}
impl Machine<ComponentCmd> for Controller {
fn receive(&self, cmd: ComponentCmd) {
match cmd {
ComponentCmd::NewSession(conn_id, service, sender) => {
assert_eq!(conn_id, 12345);
assert_eq!(service, "EchoServer".to_string());
assert_eq!(false, Arc::clone(&sender).downcast::<Sender<TestMessage>>().is_ok());
assert_eq!(true, Arc::clone(&sender).downcast::<Sender<ComponentCmd>>().is_ok());
self.counter.store(1);
},
_ => assert_eq!(true, false),
}
}
}
impl Machine<TestMessage> for Controller {
fn receive(&self, _cmd: TestMessage) {
assert_eq!(true, false);
}
}
CombinedLogger::init(vec![TermLogger::new(LevelFilter::Error, Config::default(), TerminalMode::Mixed)]).unwrap();
executor::start_server();
thread::sleep(std::time::Duration::from_millis(20));
let (m, component_sender) = executor::connect::<_, ComponentCmd>(Controller::default());
let _test_sender = executor::and_connect::<_, TestMessage>(&m);
if component_sender
.send(ComponentCmd::NewSession(
12345,
"EchoServer".to_string(),
Arc::new(component_sender.clone()),
))
.is_err()
{}
thread::sleep(std::time::Duration::from_millis(50));
assert_eq!(m.lock().counter.load(), 1);
executor::stop_server();
}
}