summaryrefslogtreecommitdiff
path: root/test/sys
diff options
context:
space:
mode:
authorAlan Somers <asomers@gmail.com>2017-09-03 14:27:57 -0600
committerAlan Somers <asomers@gmail.com>2017-09-03 14:27:57 -0600
commitbd2cda18cec3d2acb1f7bb37778be557029b0268 (patch)
treebbc44568c20a417cc19c37e0de4eddf6894c691c /test/sys
parent0c9437338dbf36bb29d52e37e0c952ea1d55d800 (diff)
downloadnix-bd2cda18cec3d2acb1f7bb37778be557029b0268.zip
Fixed error handling in `AioCb::{fsync,read,write}`
Previously, the `AioCb`'s `in_progress` field would erroneously be set to `true`, even if the syscall had an error Fixes #714
Diffstat (limited to 'test/sys')
-rw-r--r--test/sys/test_aio.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/test/sys/test_aio.rs b/test/sys/test_aio.rs
index 23cab56e..67fd0850 100644
--- a/test/sys/test_aio.rs
+++ b/test/sys/test_aio.rs
@@ -88,6 +88,26 @@ fn test_fsync() {
aiocb.aio_return().unwrap();
}
+/// `AioCb::fsync` should not modify the `AioCb` object if libc::aio_fsync returns
+/// an error
+// Skip on Linux, because Linux's AIO implementation can't detect errors
+// synchronously
+#[test]
+#[cfg(any(target_os = "freebsd", target_os = "macos"))]
+fn test_fsync_error() {
+ use std::mem;
+
+ const INITIAL: &'static [u8] = b"abcdef123456";
+ // Create an invalid AioFsyncMode
+ let mode = unsafe { mem::transmute(666) };
+ let mut f = tempfile().unwrap();
+ f.write(INITIAL).unwrap();
+ let mut aiocb = AioCb::from_fd( f.as_raw_fd(),
+ 0, //priority
+ SigevNotify::SigevNone);
+ let err = aiocb.fsync(mode);
+ assert!(err.is_err());
+}
#[test]
#[cfg_attr(all(target_env = "musl", target_arch = "x86_64"), ignore)]
@@ -156,6 +176,26 @@ fn test_read() {
assert!(EXPECT == rbuf.deref().deref());
}
+/// `AioCb::read` should not modify the `AioCb` object if libc::aio_read returns
+/// an error
+// Skip on Linux, because Linux's AIO implementation can't detect errors
+// synchronously
+#[test]
+#[cfg(any(target_os = "freebsd", target_os = "macos"))]
+fn test_read_error() {
+ const INITIAL: &'static [u8] = b"abcdef123456";
+ let rbuf = Rc::new(vec![0; 4].into_boxed_slice());
+ let mut f = tempfile().unwrap();
+ f.write(INITIAL).unwrap();
+ let mut aiocb = AioCb::from_boxed_slice( f.as_raw_fd(),
+ -1, //an invalid offset
+ rbuf.clone(),
+ 0, //priority
+ SigevNotify::SigevNone,
+ LioOpcode::LIO_NOP);
+ assert!(aiocb.read().is_err());
+}
+
// Tests from_mut_slice
#[test]
#[cfg_attr(all(target_env = "musl", target_arch = "x86_64"), ignore)]
@@ -230,6 +270,23 @@ fn test_write() {
assert!(rbuf == EXPECT);
}
+/// `AioCb::write` should not modify the `AioCb` object if libc::aio_write returns
+/// an error
+// Skip on Linux, because Linux's AIO implementation can't detect errors
+// synchronously
+#[test]
+#[cfg(any(target_os = "freebsd", target_os = "macos"))]
+fn test_write_error() {
+ let wbuf = "CDEF".to_string().into_bytes();
+ let mut aiocb = AioCb::from_slice( 666, // An invalid file descriptor
+ 0, //offset
+ &wbuf,
+ 0, //priority
+ SigevNotify::SigevNone,
+ LioOpcode::LIO_NOP);
+ assert!(aiocb.write().is_err());
+}
+
lazy_static! {
pub static ref SIGNALED: AtomicBool = AtomicBool::new(false);
}