/
test_register_deregister.rs
87 lines (68 loc) · 2.49 KB
/
test_register_deregister.rs
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
use mio::*;
use mio::tcp::*;
use super::localhost;
const SERVER: Token = Token(0);
const CLIENT: Token = Token(1);
struct TestHandler {
server: NonBlock<TcpListener>,
client: NonBlock<TcpStream>,
state: usize,
}
impl TestHandler {
fn new(srv: NonBlock<TcpListener>, cli: NonBlock<TcpStream>) -> TestHandler {
TestHandler {
server: srv,
client: cli,
state: 0,
}
}
}
impl Handler for TestHandler {
type Timeout = usize;
type Message = ();
fn readable(&mut self, event_loop: &mut EventLoop<TestHandler>, token: Token, _: ReadHint) {
match token {
SERVER => {
let mut sock = self.server.accept().unwrap().unwrap();
sock.write(&mut buf::SliceBuf::wrap("foobar".as_bytes())).unwrap();
}
CLIENT => {
assert!(self.state == 0, "unexpected state {}", self.state);
self.state = 1;
event_loop.reregister(&self.client, CLIENT, Interest::writable(), PollOpt::level()).unwrap();
}
_ => panic!("unexpected token"),
}
}
fn writable(&mut self, event_loop: &mut EventLoop<TestHandler>, token: Token) {
assert!(token == CLIENT, "unexpected token {:?}", token);
assert!(self.state == 1, "unexpected state {}", self.state);
self.state = 2;
event_loop.deregister(&self.client).unwrap();
event_loop.timeout_ms(1, 200).unwrap();
}
fn timeout(&mut self, event_loop: &mut EventLoop<TestHandler>, _: usize) {
event_loop.shutdown();
}
}
#[test]
pub fn test_register_deregister() {
debug!("Starting TEST_REGISTER_DEREGISTER");
let mut event_loop = EventLoop::new().unwrap();
let addr = localhost();
let server = tcp::v4().unwrap();
info!("setting re-use addr");
server.set_reuseaddr(true).unwrap();
server.bind(&addr).unwrap();
let server = server.listen(256).unwrap();
info!("register server socket");
event_loop.register_opt(&server, SERVER, Interest::readable(), PollOpt::edge()).unwrap();
let (client, _) = tcp::v4().unwrap()
.connect(&addr).unwrap();
// Register client socket only as writable
event_loop.register_opt(&client, CLIENT, Interest::readable(), PollOpt::level()).unwrap();
let mut handler = TestHandler::new(server, client);
// Start the event loop
event_loop.run(&mut handler).unwrap();
assert!(handler.state == 2, "unexpected final state {}", handler.state);
}