Nothing to see here, move along meow
1use lancer_core::fs::{INODE_INLINE_MAX, InodeFlags};
2use lancer_lancerfs::test_helpers::setup_fs;
3
4#[test]
5fn small_write_stays_inline() {
6 let mut fs = setup_fs(4096);
7 let root = fs.root_block();
8 let (_inode, block) = fs.create_file(root, b"small");
9
10 let alloc_before = fs.count_allocated_blocks();
11
12 let data = vec![0xABu8; 100];
13 let updated = fs.write_file(block, 0, &data);
14
15 assert!(updated.flags & InodeFlags::INLINE != 0);
16 assert_eq!(updated.size, 100);
17 assert_eq!(updated.block_count, 0);
18
19 let alloc_after = fs.count_allocated_blocks();
20 assert_eq!(
21 alloc_before, alloc_after,
22 "inline write must not allocate a data block"
23 );
24
25 let read_back = fs.read_file(block, 0, 100);
26 assert_eq!(read_back, data);
27}
28
29#[test]
30fn max_inline_write() {
31 let mut fs = setup_fs(4096);
32 let root = fs.root_block();
33 let (_inode, block) = fs.create_file(root, b"maxinline");
34
35 let data: Vec<u8> = (0..INODE_INLINE_MAX).map(|i| (i % 251) as u8).collect();
36 let updated = fs.write_file(block, 0, &data);
37
38 assert!(updated.flags & InodeFlags::INLINE != 0);
39 assert_eq!(updated.size, INODE_INLINE_MAX as u64);
40
41 let read_back = fs.read_file(block, 0, INODE_INLINE_MAX);
42 assert_eq!(read_back, data);
43}
44
45#[test]
46fn exceeding_inline_migrates_to_blocks() {
47 let mut fs = setup_fs(4096);
48 let root = fs.root_block();
49 let (_inode, block) = fs.create_file(root, b"migrated");
50
51 let alloc_before = fs.count_allocated_blocks();
52
53 let data: Vec<u8> = (0..INODE_INLINE_MAX + 100)
54 .map(|i| (i % 239) as u8)
55 .collect();
56 let updated = fs.write_file(block, 0, &data);
57
58 assert!(updated.flags & InodeFlags::INLINE == 0);
59 assert_eq!(updated.size, data.len() as u64);
60 assert!(updated.block_count > 0);
61
62 let alloc_after = fs.count_allocated_blocks();
63 assert!(
64 alloc_after > alloc_before,
65 "migration to blocks must allocate at least one data block: before={alloc_before}, after={alloc_after}"
66 );
67
68 let read_back = fs.read_file(block, 0, data.len());
69 assert_eq!(read_back, data);
70}
71
72#[test]
73fn inline_write_at_offset() {
74 let mut fs = setup_fs(4096);
75 let root = fs.root_block();
76 let (_inode, block) = fs.create_file(root, b"offset_inline");
77
78 let first = vec![0x11u8; 50];
79 fs.write_file(block, 0, &first);
80
81 let second = vec![0x22u8; 50];
82 fs.write_file(block, 50, &second);
83
84 let read_back = fs.read_file(block, 0, 100);
85 assert_eq!(&read_back[..50], &first[..]);
86 assert_eq!(&read_back[50..], &second[..]);
87}
88
89#[test]
90fn inline_then_grow_past_threshold() {
91 let mut fs = setup_fs(4096);
92 let root = fs.root_block();
93 let (_inode, block) = fs.create_file(root, b"growfile");
94
95 let small = vec![0xAAu8; 50];
96 let updated = fs.write_file(block, 0, &small);
97 assert!(updated.flags & InodeFlags::INLINE != 0);
98
99 let big: Vec<u8> = (0..INODE_INLINE_MAX + 200)
100 .map(|i| (i % 197) as u8)
101 .collect();
102 let updated = fs.write_file(block, 0, &big);
103 assert!(updated.flags & InodeFlags::INLINE == 0);
104
105 let read_back = fs.read_file(block, 0, big.len());
106 assert_eq!(read_back, big);
107}