#[path = "../../../os-vfs-dup/src/lib.rs"] mod dup; #[test] fn os_vfs_paths_dup_positive() { let mut table = dup::FdTable::new(); let second = table.dup(1).unwrap(); assert_eq!(second, 2); assert_eq!(table.description().open_fds, 2); let first_read = table.begin_read(1).unwrap(); assert_eq!(table.finish_read(first_read, 3), Ok(3)); assert_eq!(table.offset(second), Ok(3)); let second_read = table.begin_read(second).unwrap(); assert_eq!(table.finish_read(second_read, 2), Ok(5)); assert_eq!(table.offset(1), Ok(5)); assert_eq!(table.offset(second), Ok(5)); let before_full = table; assert_eq!(table.dup(1), Err(dup::Error::NoSpace)); assert_eq!(table, before_full); assert_eq!(table.close(1), Ok(())); assert!(table.description().live); assert_eq!(table.description().open_fds, 1); assert_eq!(table.close(second), Ok(())); assert!(!table.description().live); assert_eq!(table.description().open_fds, 0); } #[test] fn os_vfs_paths_dup_negative() { let mut table = dup::FdTable::new(); let lease = table.begin_read(1).unwrap(); let before_busy = table; assert_eq!(table.begin_read(1), Err(dup::Error::Busy)); assert_eq!(table, before_busy); assert_eq!(table.close(1), Ok(())); assert_eq!((table.description().open_fds, table.description().in_flight, table.description().live), (0, 1, true)); assert_eq!(table.finish_read(lease, 4), Ok(4)); assert_eq!((table.description().open_fds, table.description().in_flight, table.description().live), (0, 0, false)); let before = table; assert_eq!(table.begin_read(1), Err(dup::Error::BadFd)); assert_eq!(table.close(1), Err(dup::Error::BadFd)); assert_eq!(table.finish_read(lease, 1), Err(dup::Error::Stale)); assert_eq!(table, before); let mut overflow = dup::FdTable::new(); let first = overflow.begin_read(1).unwrap(); assert_eq!(overflow.finish_read(first, u64::MAX), Ok(u64::MAX)); let second = overflow.begin_read(1).unwrap(); let before_overflow = overflow; assert_eq!(overflow.finish_read(second, 1), Err(dup::Error::Overflow)); assert_eq!(overflow, before_overflow); assert_eq!(overflow.finish_read(second, 0), Ok(u64::MAX)); }