src/tools/xattr.rs: impl unit tests for fsetattr and fgetattr
As git does not preserve xattrs they have to be set before they can be read. Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						
						Dietmar Maurer
					
				
			
			
				
	
			
			
			
						parent
						
							553610b43e
						
					
				
				
					commit
					de61bc9264
				
			@ -103,3 +103,69 @@ pub fn name_store(name: &[u8]) -> bool {
 | 
			
		||||
 | 
			
		||||
    false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    use std::fs::OpenOptions;
 | 
			
		||||
    use std::os::unix::io::AsRawFd;
 | 
			
		||||
    use nix::errno::Errno;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_fsetxattr_fgetxattr() {
 | 
			
		||||
        let path = "./tests/xattrs.txt";
 | 
			
		||||
        let file = OpenOptions::new()
 | 
			
		||||
            .write(true)
 | 
			
		||||
            .create(true)
 | 
			
		||||
            .open(&path)
 | 
			
		||||
            .unwrap();
 | 
			
		||||
 | 
			
		||||
        let fd = file.as_raw_fd();
 | 
			
		||||
 | 
			
		||||
        let valid_user = CaFormatXAttr {
 | 
			
		||||
            name: b"user.attribute0".to_vec(),
 | 
			
		||||
            value: b"value0".to_vec(),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let valid_empty_value = CaFormatXAttr {
 | 
			
		||||
            name: b"user.empty".to_vec(),
 | 
			
		||||
            value: Vec::new(),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let invalid_trusted = CaFormatXAttr {
 | 
			
		||||
            name: b"trusted.attribute0".to_vec(),
 | 
			
		||||
            value: b"value0".to_vec(),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let invalid_name_prefix = CaFormatXAttr {
 | 
			
		||||
            name: b"users.attribte0".to_vec(),
 | 
			
		||||
            value: b"value".to_vec(),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        let mut name = b"user.".to_vec();
 | 
			
		||||
        for _ in 0..260 {
 | 
			
		||||
            name.push(b'a');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let invalid_name_length = CaFormatXAttr {
 | 
			
		||||
            name: name,
 | 
			
		||||
            value: b"err".to_vec(),
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        assert!(fsetxattr(fd, valid_user).is_ok());
 | 
			
		||||
        assert!(fsetxattr(fd, valid_empty_value).is_ok());
 | 
			
		||||
        assert_eq!(fsetxattr(fd, invalid_trusted), Err(Errno::EPERM));
 | 
			
		||||
        assert_eq!(fsetxattr(fd, invalid_name_prefix), Err(Errno::EOPNOTSUPP));
 | 
			
		||||
        assert_eq!(fsetxattr(fd, invalid_name_length), Err(Errno::ERANGE));
 | 
			
		||||
 | 
			
		||||
        let v0 = fgetxattr(fd, b"user.attribute0\0".as_ref()).unwrap();
 | 
			
		||||
        let v1 = fgetxattr(fd, b"user.empty\0".as_ref()).unwrap();
 | 
			
		||||
 | 
			
		||||
        assert_eq!(v0, b"value0".as_ref());
 | 
			
		||||
        assert_eq!(v1, b"".as_ref());
 | 
			
		||||
        assert_eq!(fgetxattr(fd, b"user.attribute1\0".as_ref()), Err(Errno::ENODATA));
 | 
			
		||||
 | 
			
		||||
        std::fs::remove_file(&path).unwrap();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user