summaryrefslogtreecommitdiffstats
path: root/third_party/rust/mio/test/test_tcp_level.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/mio/test/test_tcp_level.rs')
-rw-r--r--third_party/rust/mio/test/test_tcp_level.rs142
1 files changed, 142 insertions, 0 deletions
diff --git a/third_party/rust/mio/test/test_tcp_level.rs b/third_party/rust/mio/test/test_tcp_level.rs
new file mode 100644
index 0000000000..c384caac53
--- /dev/null
+++ b/third_party/rust/mio/test/test_tcp_level.rs
@@ -0,0 +1,142 @@
+use {expect_events, sleep_ms, TryRead};
+use mio::{Events, Poll, PollOpt, Ready, Token};
+use mio::event::Event;
+use mio::net::{TcpListener, TcpStream};
+use std::io::Write;
+use std::time::Duration;
+
+const MS: u64 = 1_000;
+
+#[test]
+pub fn test_tcp_listener_level_triggered() {
+ let poll = Poll::new().unwrap();
+ let mut pevents = 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();
+
+ let s1 = TcpStream::connect(&l.local_addr().unwrap()).unwrap();
+ poll.register(&s1, Token(1), Ready::readable(), PollOpt::edge()).unwrap();
+
+ while filter(&pevents, Token(0)).is_empty() {
+ poll.poll(&mut pevents, Some(Duration::from_millis(MS))).unwrap();
+ }
+ let events = filter(&pevents, Token(0));
+
+ assert_eq!(events.len(), 1);
+ assert_eq!(events[0], Event::new(Ready::readable(), Token(0)));
+
+ poll.poll(&mut pevents, Some(Duration::from_millis(MS))).unwrap();
+ let events = filter(&pevents, Token(0));
+ assert_eq!(events.len(), 1);
+ assert_eq!(events[0], Event::new(Ready::readable(), Token(0)));
+
+ // Accept the connection then test that the events stop
+ let _ = l.accept().unwrap();
+
+ poll.poll(&mut pevents, Some(Duration::from_millis(MS))).unwrap();
+ let events = filter(&pevents, Token(0));
+ assert!(events.is_empty(), "actual={:?}", events);
+
+ let s3 = TcpStream::connect(&l.local_addr().unwrap()).unwrap();
+ poll.register(&s3, Token(2), Ready::readable(), PollOpt::edge()).unwrap();
+
+ while filter(&pevents, Token(0)).is_empty() {
+ poll.poll(&mut pevents, Some(Duration::from_millis(MS))).unwrap();
+ }
+ let events = filter(&pevents, Token(0));
+
+ assert_eq!(events.len(), 1);
+ assert_eq!(events[0], Event::new(Ready::readable(), Token(0)));
+
+ drop(l);
+
+ poll.poll(&mut pevents, Some(Duration::from_millis(MS))).unwrap();
+ let events = filter(&pevents, Token(0));
+ assert!(events.is_empty());
+}
+
+#[test]
+pub fn test_tcp_stream_level_triggered() {
+ drop(::env_logger::init());
+ let poll = Poll::new().unwrap();
+ let mut pevents = 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::edge()).unwrap();
+
+ let mut s1 = TcpStream::connect(&l.local_addr().unwrap()).unwrap();
+ poll.register(&s1, Token(1), Ready::readable() | Ready::writable(), PollOpt::level()).unwrap();
+
+ // Sleep a bit to ensure it arrives at dest
+ sleep_ms(250);
+
+ expect_events(&poll, &mut pevents, 2, vec![
+ Event::new(Ready::readable(), Token(0)),
+ Event::new(Ready::writable(), Token(1)),
+ ]);
+
+ // Server side of socket
+ let (mut s1_tx, _) = l.accept().unwrap();
+
+ // Sleep a bit to ensure it arrives at dest
+ sleep_ms(250);
+
+ expect_events(&poll, &mut pevents, 2, vec![
+ Event::new(Ready::writable(), Token(1))
+ ]);
+
+ // Register the socket
+ poll.register(&s1_tx, Token(123), Ready::readable(), PollOpt::edge()).unwrap();
+
+ debug!("writing some data ----------");
+
+ // Write some data
+ let res = s1_tx.write(b"hello world!");
+ assert!(res.unwrap() > 0);
+
+ // Sleep a bit to ensure it arrives at dest
+ sleep_ms(250);
+
+ debug!("looking at rx end ----------");
+
+ // Poll rx end
+ expect_events(&poll, &mut pevents, 2, vec![
+ Event::new(Ready::readable(), Token(1))
+ ]);
+
+ debug!("reading ----------");
+
+ // Reading the data should clear it
+ let mut res = vec![];
+ while s1.try_read_buf(&mut res).unwrap().is_some() {
+ }
+
+ assert_eq!(res, b"hello world!");
+
+ debug!("checking just read ----------");
+
+ expect_events(&poll, &mut pevents, 1, vec![
+ Event::new(Ready::writable(), Token(1))]);
+
+ // Closing the socket clears all active level events
+ drop(s1);
+
+ debug!("checking everything is gone ----------");
+
+ poll.poll(&mut pevents, Some(Duration::from_millis(MS))).unwrap();
+ let events = filter(&pevents, Token(1));
+ assert!(events.is_empty());
+}
+
+fn filter(events: &Events, token: Token) -> Vec<Event> {
+ (0..events.len()).map(|i| events.get(i).unwrap())
+ .filter(|e| e.token() == token)
+ .collect()
+}