]> git.proxmox.com Git - rustc.git/blobdiff - vendor/fd-lock/tests/test.rs
New upstream version 1.70.0+dfsg1
[rustc.git] / vendor / fd-lock / tests / test.rs
index 35fd5b33b5b3ee661b8d98d6840643a7c61b57af..dc43ae0733bd1434ceb7cab4db52021caac9e1bb 100644 (file)
@@ -31,3 +31,64 @@ fn double_write_lock() {
 
     drop(g0);
 }
+
+#[test]
+fn read_and_write_lock() {
+    let dir = tempdir().unwrap();
+    let path = dir.path().join("lockfile");
+
+    let l0 = RwLock::new(File::create(&path).unwrap());
+    let mut l1 = RwLock::new(File::open(path).unwrap());
+
+    let g0 = l0.try_read().unwrap();
+
+    let err = l1.try_write().unwrap_err();
+    assert!(matches!(err.kind(), ErrorKind::WouldBlock));
+
+    drop(g0);
+}
+
+#[test]
+fn write_and_read_lock() {
+    let dir = tempdir().unwrap();
+    let path = dir.path().join("lockfile");
+
+    let mut l0 = RwLock::new(File::create(&path).unwrap());
+    let l1 = RwLock::new(File::open(path).unwrap());
+
+    let g0 = l0.try_write().unwrap();
+
+    let err = l1.try_read().unwrap_err();
+    assert!(matches!(err.kind(), ErrorKind::WouldBlock));
+
+    drop(g0);
+}
+
+#[cfg(windows)]
+mod windows {
+    use super::*;
+    use std::os::windows::fs::OpenOptionsExt;
+
+    #[test]
+    fn try_lock_error() {
+        let dir = tempdir().unwrap();
+        let path = dir.path().join("lockfile");
+
+        // On Windows, opening with an access_mode as 0 will prevent all locking operations from succeeding, simulating an I/O error.
+        let mut l0 = RwLock::new(
+            File::options()
+                .create(true)
+                .read(true)
+                .write(true)
+                .access_mode(0)
+                .open(path)
+                .unwrap(),
+        );
+
+        let err1 = l0.try_read().unwrap_err();
+        assert!(matches!(err1.kind(), ErrorKind::PermissionDenied));
+
+        let err2 = l0.try_write().unwrap_err();
+        assert!(matches!(err2.kind(), ErrorKind::PermissionDenied));
+    }
+}