Nothing to see here, move along meow
1use lancer_core::fs::InodeType;
2use lancer_lancerfs::dir;
3use lancer_lancerfs::error::FsError;
4use lancer_lancerfs::test_helpers::with_fs;
5
6#[test]
7fn create_nested_dirs_3_levels() {
8 with_fs(4096, |fs| {
9 let root = fs.root_block();
10 let (_d1, d1_block) = fs.mkdir(root, b"level1");
11 let (_d2, d2_block) = fs.mkdir(d1_block, b"level2");
12 let (_d3, d3_block) = fs.mkdir(d2_block, b"level3");
13
14 let d3_inode = fs.read_inode(d3_block);
15 assert_eq!(d3_inode.inode_type_enum(), Some(InodeType::Directory));
16 });
17}
18
19#[test]
20fn create_10_files_in_deep_dir() {
21 with_fs(4096, |fs| {
22 let root = fs.root_block();
23 let (_, d1) = fs.mkdir(root, b"a");
24 let (_, d2) = fs.mkdir(d1, b"b");
25 let (_, d3) = fs.mkdir(d2, b"c");
26
27 (0u8..10).for_each(|i| {
28 let name = [b'f', b'0' + i];
29 fs.create_file(d3, &name);
30 });
31
32 let d3_inode = fs.read_inode(d3);
33 let mut iter = dir::dir_list(&d3_inode, None);
34 let count = (0..64)
35 .scan((), |(), _| {
36 iter.next(&mut fs.pool, &mut fs.cache, &mut fs.bio)
37 .ok()
38 .flatten()
39 })
40 .count();
41 assert_eq!(count, 10);
42 });
43}
44
45#[test]
46fn remove_5_of_10_files() {
47 with_fs(4096, |fs| {
48 let root = fs.root_block();
49 let (_, dir_block) = fs.mkdir(root, b"dir");
50
51 let names: Vec<[u8; 3]> = (0u8..10).map(|i| [b'f', b'_', b'0' + i]).collect();
52 names.iter().for_each(|name| {
53 fs.create_file(dir_block, name);
54 });
55
56 names.iter().take(5).for_each(|name| {
57 fs.delete_file(dir_block, name).unwrap();
58 });
59
60 let dir_inode = fs.read_inode(dir_block);
61 let mut iter = dir::dir_list(&dir_inode, None);
62 let remaining = (0..64)
63 .scan((), |(), _| {
64 iter.next(&mut fs.pool, &mut fs.cache, &mut fs.bio)
65 .ok()
66 .flatten()
67 })
68 .count();
69 assert_eq!(remaining, 5);
70 });
71}
72
73#[test]
74fn rmdir_nonempty_returns_error() {
75 with_fs(4096, |fs| {
76 let root = fs.root_block();
77 let (_, dir_block) = fs.mkdir(root, b"nonempty");
78 fs.create_file(dir_block, b"child");
79
80 let result = fs.rmdir(root, b"nonempty");
81 assert!(matches!(result, Err(FsError::DirectoryNotEmpty)));
82 });
83}
84
85#[test]
86fn rmdir_empty_succeeds() {
87 with_fs(4096, |fs| {
88 let root = fs.root_block();
89 fs.mkdir(root, b"empty_dir");
90
91 fs.rmdir(root, b"empty_dir").unwrap();
92
93 let root_inode = fs.root_inode();
94 let result = dir::dir_lookup(
95 &mut fs.pool,
96 &mut fs.cache,
97 &mut fs.bio,
98 &root_inode,
99 b"empty_dir",
100 None,
101 )
102 .unwrap();
103 assert!(result.is_none());
104 });
105}
106
107#[test]
108fn mkdir_duplicate_name_returns_error() {
109 with_fs(4096, |fs| {
110 let root = fs.root_block();
111 fs.mkdir(root, b"dup");
112
113 let parent = fs.root_inode();
114 let txn = fs.next_txn();
115 let obj_id = fs.alloc_object_id();
116 let result = lancer_lancerfs::ops::mkdir(
117 &mut fs.pool,
118 &mut fs.cache,
119 &mut fs.bio,
120 &mut fs.state.freemap,
121 &parent,
122 b"dup",
123 txn,
124 obj_id,
125 );
126 assert!(matches!(result, Err(FsError::FileExists)));
127 });
128}