summaryrefslogtreecommitdiffstats
path: root/vendor/rustix/tests/io/read_write.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/rustix/tests/io/read_write.rs')
-rw-r--r--vendor/rustix/tests/io/read_write.rs118
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");
+}