blob: 001e49df9174c51fa3678a12bbc240a845d94919 [file] [log] [blame]
use {TryWrite};
use mio::*;
use mio::deprecated::{EventLoop, Handler};
use mio::tcp::{TcpListener, TcpStream};
const LISTEN: Token = Token(0);
const CLIENT: Token = Token(1);
const SERVER: Token = Token(2);
struct MyHandler {
listener: TcpListener,
connected: TcpStream,
accepted: Option<TcpStream>,
}
impl Handler for MyHandler {
type Timeout = ();
type Message = ();
fn ready(&mut self,
event_loop: &mut EventLoop<MyHandler>,
token: Token,
_: Ready) {
match token {
LISTEN => {
let sock = self.listener.accept().unwrap().0;
event_loop.register(&sock,
SERVER,
Ready::writable(),
PollOpt::edge()).unwrap();
self.accepted = Some(sock);
}
SERVER => {
self.accepted.as_ref().unwrap().peer_addr().unwrap();
self.accepted.as_ref().unwrap().local_addr().unwrap();
self.accepted.as_mut().unwrap().try_write(&[1, 2, 3]).unwrap();
self.accepted = None;
}
CLIENT => {
self.connected.peer_addr().unwrap();
self.connected.local_addr().unwrap();
event_loop.shutdown();
}
_ => panic!("unexpected token"),
}
}
}
#[test]
fn local_addr_ready() {
let addr = "127.0.0.1:0".parse().unwrap();
let server = TcpListener::bind(&addr).unwrap();
let addr = server.local_addr().unwrap();
let mut event_loop = EventLoop::new().unwrap();
event_loop.register(&server, LISTEN, Ready::readable(),
PollOpt::edge()).unwrap();
let sock = TcpStream::connect(&addr).unwrap();
event_loop.register(&sock, CLIENT, Ready::readable(),
PollOpt::edge()).unwrap();
event_loop.run(&mut MyHandler {
listener: server,
connected: sock,
accepted: None,
}).unwrap();
}