diff options
Diffstat (limited to 'third_party/rust/mio/test/test_oneshot.rs')
-rw-r--r-- | third_party/rust/mio/test/test_oneshot.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/third_party/rust/mio/test/test_oneshot.rs b/third_party/rust/mio/test/test_oneshot.rs new file mode 100644 index 0000000000..4dca219b73 --- /dev/null +++ b/third_party/rust/mio/test/test_oneshot.rs @@ -0,0 +1,64 @@ +use mio::*; +use mio::net::{TcpListener, TcpStream}; +use std::io::*; +use std::time::Duration; + +const MS: u64 = 1_000; + +#[test] +pub fn test_tcp_edge_oneshot() { + let _ = ::env_logger::init(); + + let mut poll = Poll::new().unwrap(); + let mut events = Events::with_capacity(1024); + + // Create the listener + let l = TcpListener::bind(&"127.0.0.1:0".parse().unwrap()).unwrap(); + + // Register the listener with `Poll` + poll.register(&l, Token(0), Ready::readable(), PollOpt::level()).unwrap(); + + // Connect a socket, we are going to write to it + let mut s1 = TcpStream::connect(&l.local_addr().unwrap()).unwrap(); + poll.register(&s1, Token(1), Ready::writable(), PollOpt::level()).unwrap(); + + wait_for(&mut poll, &mut events, Token(0)); + + // Get pair + let (mut s2, _) = l.accept().unwrap(); + poll.register(&s2, Token(2), Ready::readable(), PollOpt::edge() | PollOpt::oneshot()).unwrap(); + + wait_for(&mut poll, &mut events, Token(1)); + + let res = s1.write(b"foo").unwrap(); + assert_eq!(3, res); + + let mut buf = [0; 1]; + + for byte in b"foo" { + wait_for(&mut poll, &mut events, Token(2)); + + assert_eq!(1, s2.read(&mut buf).unwrap()); + assert_eq!(*byte, buf[0]); + + poll.reregister(&s2, Token(2), Ready::readable(), PollOpt::edge() | PollOpt::oneshot()).unwrap(); + + if *byte == b'o' { + poll.reregister(&s2, Token(2), Ready::readable(), PollOpt::edge() | PollOpt::oneshot()).unwrap(); + } + } +} + +fn wait_for(poll: &mut Poll, events: &mut Events, token: Token) { + loop { + poll.poll(events, Some(Duration::from_millis(MS))).unwrap(); + + let cnt = (0..events.len()).map(|i| events.get(i).unwrap()) + .filter(|e| e.token() == token) + .count(); + + assert!(cnt < 2, "token appeared multiple times in poll results; cnt={:}", cnt); + + if cnt == 1 { return }; + } +} |