feat(ext4): seek, rmdir (e2fsck-clean)
This commit is contained in:
@@ -183,3 +183,38 @@ fn holes_read_as_zeros() {
|
||||
let mut fs = Ext4::mount(FileDisk(img)).expect("mount");
|
||||
assert_eq!(read_all(&mut fs, b"sparse.bin"), data);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn an_empty_directory_goes_and_e2fsck_agrees() {
|
||||
let Some((dir, img)) = setup("rmdir") else { return };
|
||||
let mut fs = Ext4::mount(FileDisk(img)).expect("mount");
|
||||
assert!(fs.mkdir(b"/gone"));
|
||||
assert!(fs.mkdir(b"/gone/deeper"));
|
||||
let h = fs.create(b"/gone/deeper/f").expect("create");
|
||||
fs.close(h);
|
||||
assert!(!fs.rmdir(b"/gone"), "not empty");
|
||||
assert!(fs.delete(b"/gone/deeper/f"));
|
||||
assert!(fs.rmdir(b"/gone/deeper"));
|
||||
assert!(fs.rmdir(b"/gone"));
|
||||
assert!(!names(&mut fs, b"/").iter().any(|n| n == "gone"));
|
||||
assert!(!fs.rmdir(b"/hello.txt"), "a file is not a directory");
|
||||
let (clean, report) = fsck_clean(&dir, &fs.into_device().0);
|
||||
assert!(clean, "e2fsck: {report}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn writes_land_where_seek_says() {
|
||||
let Some((dir, img)) = setup("seek") else { return };
|
||||
let mut fs = Ext4::mount(FileDisk(img)).expect("mount");
|
||||
let h = fs.create(b"/f").expect("create");
|
||||
assert_eq!(fs.write(h, &[b'a'; 5000]), Some(5000));
|
||||
assert!(fs.seek(h, 4090));
|
||||
assert_eq!(fs.write(h, b"XYZXYZXYZXYZ"), Some(12));
|
||||
assert!(!fs.seek(h, 6000), "not past the end");
|
||||
fs.close(h);
|
||||
let back = read_all(&mut fs, b"/f");
|
||||
assert_eq!(back.len(), 5000);
|
||||
assert_eq!(&back[4088..4104], b"aaXYZXYZXYZXYZaa");
|
||||
let (clean, report) = fsck_clean(&dir, &fs.into_device().0);
|
||||
assert!(clean, "e2fsck: {report}");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user