diff options
Diffstat (limited to 'vendor/rustix/tests/io/poll.rs')
-rw-r--r-- | vendor/rustix/tests/io/poll.rs | 63 |
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(); +} |