1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use std;
use mio::deprecated::{EventLoop, Handler, Sender};
use messages::{Message, Internal, IncomingMessage};
pub struct LocalServer {
core_tx: Sender<IncomingMessage>,
local_server_tx: std::sync::mpsc::Sender<Message>
}
pub fn start_server(core_tx: Sender<IncomingMessage>,
local_server_tx: std::sync::mpsc::Sender<Message>,
mut event_loop: EventLoop<LocalServer>) {
info!("Event loop starting...");
event_loop.run(&mut LocalServer { core_tx: core_tx, local_server_tx: local_server_tx }).expect("Failed to start event loop");
}
impl Handler for LocalServer {
type Timeout = usize;
type Message = Message;
fn notify(&mut self, _reactor: &mut EventLoop<LocalServer>, msg: Message) {
let new_out = self.local_server_tx.clone();
let incoming_msg = IncomingMessage {
msg: msg.clone(),
callback: Box::new(move |out_msg| {
new_out.send(out_msg);
})
};
self.core_tx.send(incoming_msg);
match msg {
Message::Internal(m) => {
match m {
Internal::Shutdown(_) => {
_reactor.shutdown();
}
}
},
_ => {}
}
}
}
#[cfg(test)]
mod tests {
use std::sync::mpsc::channel;
use mio::deprecated::EventLoop;
use buttplug_server;
use super::{start_server};
use std:: thread;
use config::Config;
use messages::{Shutdown, Message, RequestServerInfo, Host};
#[test]
fn test_local_server_shutdown() {
let (tx, rx) = channel();
let event_loop = EventLoop::new().expect("Failed to create event loop");
let server_tx = event_loop.channel();
let child = thread::spawn(move|| {
buttplug_server::start_server(Config::default(), Some(event_loop), Some(tx));
});
server_tx.send(Shutdown::as_message());
child.join();
}
#[test]
fn test_local_server_info() {
let (tx, rx) = channel();
let event_loop = EventLoop::new().expect("Failed to create event loop");
let server_tx = event_loop.channel();
let child = thread::spawn(move|| {
buttplug_server::start_server(Config::default(), Some(event_loop), Some(tx));
});
server_tx.send(RequestServerInfo::as_message());
match rx.recv().unwrap() {
Message::Host(h) => {
match h {
Host::ServerInfo(m) => {
},
_ => {
panic!("Wrong message type received!");
}
}
},
_ => {
panic!("Wrong message type received!");
}
}
server_tx.send(Shutdown::as_message());
child.join();
}
}