use polling::{Event, Events, Poller};
use std::io::{self, Write};
use std::net::{TcpListener, TcpStream};
use std::sync::Arc;
use std::time::Duration;
#[test]
fn basic_io() {
let poller = Poller::new().unwrap();
let (read, mut write) = tcp_pair().unwrap();
unsafe {
poller.add(&read, Event::readable(1)).unwrap();
}
let mut events = Events::new();
assert_eq!(
poller
.wait(&mut events, Some(Duration::from_secs(0)))
.unwrap(),
0
);
assert!(events.is_empty());
write.write_all(&[1]).unwrap();
assert_eq!(
poller
.wait(&mut events, Some(Duration::from_secs(1)))
.unwrap(),
1
);
assert_eq!(events.len(), 1);
assert_eq!(
events.iter().next().unwrap().with_no_extra(),
Event::readable(1)
);
poller.delete(&read).unwrap();
}
#[test]
fn insert_twice() {
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
let (read, mut write) = tcp_pair().unwrap();
let read = Arc::new(read);
let poller = Poller::new().unwrap();
unsafe {
#[cfg(unix)]
let read = read.as_raw_fd();
poller.add(read, Event::readable(1)).unwrap();
assert_eq!(
poller.add(read, Event::readable(1)).unwrap_err().kind(),
io::ErrorKind::AlreadyExists
);
}
write.write_all(&[1]).unwrap();
let mut events = Events::new();
assert_eq!(
poller
.wait(&mut events, Some(Duration::from_secs(1)))
.unwrap(),
1
);
assert_eq!(events.len(), 1);
assert_eq!(
events.iter().next().unwrap().with_no_extra(),
Event::readable(1)
);
poller.delete(&read).unwrap();
}
#[test]
fn delete_unrecognized() {
let (read, _) = tcp_pair().unwrap();
let read = Arc::new(read);
let poller = Poller::new().unwrap();
match poller.delete(&read) {
Ok(_) => panic!("delete of unregistered source succeeded"),
Err(e) => assert_eq!(
e.kind(),
io::ErrorKind::NotFound,
"wrong error kind for delete of unregistered source",
),
}
}
#[test]
fn append_events() {
#[cfg(unix)]
use std::os::unix::io::AsRawFd;
let mut pairs = Vec::new();
for _ in 0..4 {
let (read, write) = tcp_pair().unwrap();
pairs.push((read, write));
}
let poller = Poller::new().unwrap();
unsafe {
for (read, _write) in &pairs {
#[cfg(unix)]
let read = read.as_raw_fd();
poller.add(read, Event::readable(1)).unwrap();
}
}
let mut events = Events::new();
for (index, (_read, ref mut write)) in pairs.iter_mut().enumerate() {
write.write_all(&[1]).unwrap();
assert_eq!(
poller
.wait(&mut events, Some(Duration::from_secs(1)))
.unwrap(),
index + 1
);
assert_eq!(events.len(), index + 1);
for event in events.iter() {
assert_eq!(event.with_no_extra(), Event::readable(1));
}
}
for (read, _write) in &pairs {
poller.delete(read).unwrap();
}
}
fn tcp_pair() -> io::Result<(TcpStream, TcpStream)> {
let listener = TcpListener::bind("127.0.0.1:0")?;
let a = TcpStream::connect(listener.local_addr()?)?;
let (b, _) = listener.accept()?;
Ok((a, b))
}