Nothing to see here, move along meow
1use lancer_core::fs::{BLOCK_SIZE_MIN, INODE_DIRECT_REFS};
2use lancer_lancerfs::test_helpers::{setup_fs, with_fs};
3
4#[test]
5fn write_8kb_read_back() {
6 with_fs(4096, |fs| {
7 let root = fs.root_block();
8 let (_inode, block) = fs.create_file(root, b"testfile");
9
10 let data: Vec<u8> = (0..8192u64).map(|i| (i % 251) as u8).collect();
11 fs.write_file(block, 0, &data);
12
13 let read_back = fs.read_file(block, 0, 8192);
14 assert_eq!(read_back, data);
15 });
16}
17
18#[test]
19fn write_at_nonzero_offset() {
20 with_fs(4096, |fs| {
21 let root = fs.root_block();
22 let (_inode, block) = fs.create_file(root, b"offset_file");
23
24 let prefix = vec![0xAAu8; 100];
25 fs.write_file(block, 0, &prefix);
26
27 let payload = vec![0xBBu8; 200];
28 fs.write_file(block, 100, &payload);
29
30 let full = fs.read_file(block, 0, 300);
31 assert_eq!(&full[..100], &prefix[..]);
32 assert_eq!(&full[100..300], &payload[..]);
33 });
34}
35
36#[test]
37fn extend_past_direct_refs_triggers_indirect() {
38 let direct_capacity = INODE_DIRECT_REFS as u64 * BLOCK_SIZE_MIN as u64;
39 let total_size = direct_capacity + BLOCK_SIZE_MIN as u64;
40
41 with_fs(8192, |fs| {
42 let root = fs.root_block();
43 let (_inode, block) = fs.create_file(root, b"big_file");
44
45 let data: Vec<u8> = (0..total_size as usize).map(|i| (i % 199) as u8).collect();
46 fs.write_file(block, 0, &data);
47
48 let read_back = fs.read_file(block, 0, data.len());
49 assert_eq!(read_back, data);
50 });
51}
52
53#[test]
54fn read_spanning_block_boundary() {
55 with_fs(4096, |fs| {
56 let root = fs.root_block();
57 let (_inode, block) = fs.create_file(root, b"boundary_file");
58
59 let block_size = BLOCK_SIZE_MIN as usize;
60 let data: Vec<u8> = (0..block_size * 2).map(|i| (i % 179) as u8).collect();
61 fs.write_file(block, 0, &data);
62
63 let offset = block_size - 128;
64 let len = 256;
65 let read_back = fs.read_file(block, offset as u64, len);
66 assert_eq!(read_back, &data[offset..offset + len]);
67 });
68}
69
70#[test]
71fn read_at_eof_returns_partial() {
72 with_fs(4096, |fs| {
73 let root = fs.root_block();
74 let (_inode, block) = fs.create_file(root, b"partial_file");
75
76 let data = vec![0xCDu8; 500];
77 fs.write_file(block, 0, &data);
78
79 let read_back = fs.read_file(block, 400, 1000);
80 assert_eq!(read_back.len(), 100);
81 assert_eq!(read_back, &data[400..]);
82 });
83}
84
85#[test]
86fn write_commit_read_survives_cache_flush() {
87 let mut fs = setup_fs(4096);
88 let root = fs.root_block();
89 let (_inode, block) = fs.create_file(root, b"committed");
90
91 let data: Vec<u8> = (0..4096u64).map(|i| (i % 131) as u8).collect();
92 fs.write_file(block, 0, &data);
93 fs.commit();
94
95 let read_back = fs.read_file(block, 0, 4096);
96 assert_eq!(read_back, data);
97}
98
99#[test]
100fn read_past_eof_returns_empty() {
101 with_fs(4096, |fs| {
102 let root = fs.root_block();
103 let (_inode, block) = fs.create_file(root, b"empty_read");
104
105 let data = vec![0xABu8; 100];
106 fs.write_file(block, 0, &data);
107
108 let read_back = fs.read_file(block, 200, 100);
109 assert!(read_back.is_empty());
110 });
111}