summaryrefslogtreecommitdiffstats
path: root/vendor/rustix/tests/io/poll.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/rustix/tests/io/poll.rs')
-rw-r--r--vendor/rustix/tests/io/poll.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/rustix/tests/io/poll.rs b/vendor/rustix/tests/io/poll.rs
new file mode 100644
index 000000000..ff2da695b
--- /dev/null
+++ b/vendor/rustix/tests/io/poll.rs
@@ -0,0 +1,63 @@
+use rustix::fd::{AsFd, AsRawFd, FromRawFd, IntoRawFd, OwnedFd};
+#[cfg(not(windows))]
+use rustix::io::{poll, retry_on_intr};
+use rustix::io::{PollFd, PollFlags};
+
+#[cfg(not(windows))]
+#[test]
+fn test_poll() {
+ use rustix::io::{pipe, read, write};
+
+ // Create a pipe.
+ let (reader, writer) = pipe().unwrap();
+ let mut poll_fds = [PollFd::new(&reader, PollFlags::IN)];
+ assert_eq!(poll_fds[0].as_fd().as_raw_fd(), reader.as_fd().as_raw_fd());
+
+ // `poll` should say there's nothing ready to be read from the pipe.
+ let num = retry_on_intr(|| poll(&mut poll_fds, 0)).unwrap();
+ assert_eq!(num, 0);
+ assert!(poll_fds[0].revents().is_empty());
+ assert_eq!(poll_fds[0].as_fd().as_raw_fd(), reader.as_fd().as_raw_fd());
+
+ // Write a byte to the pipe.
+ assert_eq!(retry_on_intr(|| write(&writer, b"a")).unwrap(), 1);
+
+ // `poll` should now say there's data to be read.
+ let num = retry_on_intr(|| poll(&mut poll_fds, -1)).unwrap();
+ assert_eq!(num, 1);
+ assert_eq!(poll_fds[0].revents(), PollFlags::IN);
+ assert_eq!(poll_fds[0].as_fd().as_raw_fd(), reader.as_fd().as_raw_fd());
+
+ let mut temp = poll_fds[0].clone();
+ assert_eq!(temp.revents(), PollFlags::IN);
+ temp.clear_revents();
+ assert!(temp.revents().is_empty());
+
+ // Read the byte from the pipe.
+ let mut buf = [b'\0'];
+ assert_eq!(retry_on_intr(|| read(&reader, &mut buf)).unwrap(), 1);
+ assert_eq!(buf[0], b'a');
+ assert_eq!(poll_fds[0].as_fd().as_raw_fd(), reader.as_fd().as_raw_fd());
+
+ // Poll should now say there's no more data to be read.
+ let num = retry_on_intr(|| poll(&mut poll_fds, 0)).unwrap();
+ assert_eq!(num, 0);
+ assert!(poll_fds[0].revents().is_empty());
+ assert_eq!(poll_fds[0].as_fd().as_raw_fd(), reader.as_fd().as_raw_fd());
+}
+
+#[test]
+fn test_poll_fd_set_fd() {
+ // Make up some file descriptors so that we can test that set_fd works.
+ let a = unsafe { OwnedFd::from_raw_fd(777) };
+ let mut poll_fd = PollFd::new(&a, PollFlags::empty());
+ assert_eq!(poll_fd.as_fd().as_raw_fd(), 777);
+
+ let b = unsafe { OwnedFd::from_raw_fd(888) };
+ poll_fd.set_fd(&b);
+ assert_eq!(poll_fd.as_fd().as_raw_fd(), 888);
+
+ // Don't attempt to close our made-up file descriptors.
+ let _ = a.into_raw_fd();
+ let _ = b.into_raw_fd();
+}