diff options
Diffstat (limited to '')
-rw-r--r-- | vendor/rustix/tests/io/read_write.rs | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/vendor/rustix/tests/io/read_write.rs b/vendor/rustix/tests/io/read_write.rs new file mode 100644 index 000000000..65186bf21 --- /dev/null +++ b/vendor/rustix/tests/io/read_write.rs @@ -0,0 +1,118 @@ +#[cfg(feature = "fs")] +use std::io::{IoSlice, IoSliceMut}; + +#[cfg(feature = "fs")] +#[test] +fn test_readwrite_pv() { + use rustix::fs::{cwd, openat, Mode, OFlags}; + use rustix::io::{preadv, pwritev}; + + let tmp = tempfile::tempdir().unwrap(); + let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); + let foo = openat( + &dir, + "foo", + OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, + Mode::RUSR | Mode::WUSR, + ) + .unwrap(); + + // For most targets, just call `pwritev`. + #[cfg(not(any(target_os = "ios", target_os = "macos")))] + { + pwritev(&foo, &[IoSlice::new(b"hello")], 200).unwrap(); + } + // macOS only has pwritev in newer versions; allow it to fail with `ENOSYS`. + #[cfg(any(target_os = "ios", target_os = "macos"))] + { + match pwritev(&foo, &[IoSlice::new(b"hello")], 200) { + Ok(_) => (), + Err(rustix::io::Errno::NOSYS) => return, + Err(err) => Err(err).unwrap(), + } + } + pwritev(&foo, &[IoSlice::new(b"world")], 300).unwrap(); + let mut buf = [0_u8; 5]; + preadv(&foo, &mut [IoSliceMut::new(&mut buf)], 200).unwrap(); + assert_eq!(&buf, b"hello"); + preadv(&foo, &mut [IoSliceMut::new(&mut buf)], 300).unwrap(); + assert_eq!(&buf, b"world"); +} + +#[cfg(feature = "fs")] +#[test] +fn test_readwrite_p() { + use rustix::fs::{cwd, openat, Mode, OFlags}; + use rustix::io::{pread, pwrite}; + + let tmp = tempfile::tempdir().unwrap(); + let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); + let foo = openat( + &dir, + "foo", + OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, + Mode::RUSR | Mode::WUSR, + ) + .unwrap(); + + pwrite(&foo, b"hello", 200).unwrap(); + pwrite(&foo, b"world", 300).unwrap(); + let mut buf = [0_u8; 5]; + pread(&foo, &mut buf, 200).unwrap(); + assert_eq!(&buf, b"hello"); + pread(&foo, &mut buf, 300).unwrap(); + assert_eq!(&buf, b"world"); +} + +#[cfg(feature = "fs")] +#[test] +fn test_readwrite_v() { + use rustix::fs::{cwd, openat, seek, Mode, OFlags}; + use rustix::io::{readv, writev, SeekFrom}; + + let tmp = tempfile::tempdir().unwrap(); + let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); + let foo = openat( + &dir, + "foo", + OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, + Mode::RUSR | Mode::WUSR, + ) + .unwrap(); + + writev(&foo, &[IoSlice::new(b"hello")]).unwrap(); + writev(&foo, &[IoSlice::new(b"world")]).unwrap(); + seek(&foo, SeekFrom::Start(0)).unwrap(); + let mut buf = [0_u8; 5]; + readv(&foo, &mut [IoSliceMut::new(&mut buf)]).unwrap(); + assert_eq!(&buf, b"hello"); + readv(&foo, &mut [IoSliceMut::new(&mut buf)]).unwrap(); + assert_eq!(&buf, b"world"); +} + +#[cfg(feature = "fs")] +#[test] +fn test_readwrite() { + use rustix::fs::{cwd, openat, seek, Mode, OFlags}; + use rustix::io::{read, write}; + use std::io::SeekFrom; + + let tmp = tempfile::tempdir().unwrap(); + let dir = openat(cwd(), tmp.path(), OFlags::RDONLY, Mode::empty()).unwrap(); + let foo = openat( + &dir, + "foo", + OFlags::RDWR | OFlags::CREATE | OFlags::TRUNC, + Mode::RUSR | Mode::WUSR, + ) + .unwrap(); + + write(&foo, b"hello").unwrap(); + write(&foo, b"world").unwrap(); + seek(&foo, SeekFrom::Start(0)).unwrap(); + let mut buf = [0_u8; 5]; + read(&foo, &mut buf).unwrap(); + assert_eq!(&buf, b"hello"); + read(&foo, &mut buf).unwrap(); + assert_eq!(&buf, b"world"); +} |