SimpleKernel 1.17.0
Loading...
Searching...
No Matches
ramfs_system_test.cpp File Reference
#include <cstddef>
#include <cstdint>
#include "kstd_cstring"
#include "system_test.h"
#include "vfs.hpp"
Include dependency graph for ramfs_system_test.cpp:

Go to the source code of this file.

Functions

auto ramfs_system_test () -> bool
 

Function Documentation

◆ ramfs_system_test()

auto ramfs_system_test ( ) -> bool

Definition at line 12 of file ramfs_system_test.cpp.

12 {
13 klog::Info("ramfs_system_test: start");
14
15 // FileSystemInit() has already been called in main.cpp.
16 // ramfs is mounted at "/" — use VFS directly.
17
18 // T1: Create file, write, read back
19 {
20 auto file_result = vfs::Open(
22 EXPECT_TRUE(file_result.has_value(),
23 "ramfs_system_test: open /hello.txt failed");
24 vfs::File* file = file_result.value();
25
26 const char kMsg[] = "Hello, ramfs!";
27 auto write_result = vfs::Write(file, kMsg, sizeof(kMsg) - 1);
28 EXPECT_TRUE(write_result.has_value(), "ramfs_system_test: write failed");
29 EXPECT_EQ(write_result.value(), sizeof(kMsg) - 1,
30 "ramfs_system_test: write byte count mismatch");
31 klog::Info("ramfs_system_test: wrote {} bytes", write_result.value());
32
33 // Seek back to start
34 auto seek_result = vfs::Seek(file, 0, vfs::SeekWhence::kSet);
35 EXPECT_TRUE(seek_result.has_value(),
36 "ramfs_system_test: seek to start failed");
37 EXPECT_EQ(seek_result.value(), static_cast<uint64_t>(0),
38 "ramfs_system_test: seek position mismatch");
39
40 // Read back
41 char buf[64] = {};
42 auto read_result = vfs::Read(file, buf, sizeof(buf) - 1);
43 EXPECT_TRUE(read_result.has_value(), "ramfs_system_test: read failed");
44 EXPECT_EQ(read_result.value(), sizeof(kMsg) - 1,
45 "ramfs_system_test: read byte count mismatch");
46 EXPECT_EQ(memcmp(buf, kMsg, sizeof(kMsg) - 1), 0,
47 "ramfs_system_test: read content mismatch");
48 klog::Info("ramfs_system_test: read back: {}", buf);
49
50 (void)vfs::Close(file);
51 }
52
53 // T3: Seek to middle, partial read
54 {
55 auto file_result = vfs::Open("/hello.txt", vfs::OpenFlags::kOReadOnly);
56 EXPECT_TRUE(file_result.has_value(),
57 "ramfs_system_test: re-open for seek test failed");
58 vfs::File* file = file_result.value();
59
60 // Seek to offset 7
61 auto seek_result = vfs::Seek(file, 7, vfs::SeekWhence::kSet);
62 EXPECT_TRUE(seek_result.has_value(),
63 "ramfs_system_test: seek to offset 7 failed");
64 EXPECT_EQ(seek_result.value(), static_cast<uint64_t>(7),
65 "ramfs_system_test: seek offset 7 mismatch");
66
67 char buf[32] = {};
68 auto read_result = vfs::Read(file, buf, 5);
69 EXPECT_TRUE(read_result.has_value(),
70 "ramfs_system_test: partial read failed");
71 // "Hello, ramfs!" -> offset 7 = "ramfs"
72 EXPECT_EQ(read_result.value(), static_cast<size_t>(5),
73 "ramfs_system_test: partial read count mismatch");
74 EXPECT_EQ(memcmp(buf, "ramfs", 5), 0,
75 "ramfs_system_test: partial read content mismatch");
76 klog::Info("ramfs_system_test: partial read from offset 7: {}", buf);
77
78 (void)vfs::Close(file);
79 }
80
81 // T4: MkDir + ReadDir
82 {
83 auto mkdir_result = vfs::MkDir("/testdir");
84 EXPECT_TRUE(mkdir_result.has_value(),
85 "ramfs_system_test: mkdir /testdir failed");
86 klog::Info("ramfs_system_test: mkdir /testdir ok");
87
88 // Create a file inside
89 auto inner =
90 vfs::Open("/testdir/inner.txt",
92 EXPECT_TRUE(inner.has_value(),
93 "ramfs_system_test: open /testdir/inner.txt failed");
94 (void)vfs::Close(inner.value());
95
96 // ReadDir on /testdir
97 auto dir_file_result = vfs::Open(
99 EXPECT_TRUE(dir_file_result.has_value(),
100 "ramfs_system_test: open /testdir as dir failed");
101 vfs::File* dir_file = dir_file_result.value();
102
103 vfs::DirEntry entries[8] = {};
104 auto readdir_result = vfs::ReadDir(dir_file, entries, 8);
105 EXPECT_TRUE(readdir_result.has_value(),
106 "ramfs_system_test: readdir failed");
107 // Expect at least "." + ".." + "inner.txt" = 3 entries
108 EXPECT_GT(readdir_result.value(), static_cast<size_t>(2),
109 "ramfs_system_test: readdir should return > 2 entries");
110 klog::Info("ramfs_system_test: readdir returned {} entries",
111 readdir_result.value());
112
113 (void)vfs::Close(dir_file);
114 }
115
116 // T5: Unlink a file, confirm it can't be re-opened without kOCreate
117 {
118 auto unlink_result = vfs::Unlink("/hello.txt");
119 EXPECT_TRUE(unlink_result.has_value(),
120 "ramfs_system_test: unlink /hello.txt failed");
121 klog::Info("ramfs_system_test: unlink /hello.txt ok");
122
123 auto reopen = vfs::Open("/hello.txt", vfs::OpenFlags::kOReadOnly);
124 EXPECT_FALSE(reopen.has_value(),
125 "ramfs_system_test: /hello.txt should be gone after unlink");
126 klog::Info("ramfs_system_test: confirmed /hello.txt no longer exists");
127 }
128
129 // T6: RmDir
130 {
131 // Remove inner file first
132 auto unlink_result = vfs::Unlink("/testdir/inner.txt");
133 EXPECT_TRUE(unlink_result.has_value(),
134 "ramfs_system_test: unlink /testdir/inner.txt failed");
135
136 auto rmdir_result = vfs::RmDir("/testdir");
137 EXPECT_TRUE(rmdir_result.has_value(),
138 "ramfs_system_test: rmdir /testdir failed");
139 klog::Info("ramfs_system_test: rmdir /testdir ok");
140 }
141
142 // T7: Two independent files do not share data
143 {
144 auto f1 = vfs::Open("/fileA.txt",
146 auto f2 = vfs::Open("/fileB.txt",
148 EXPECT_TRUE(f1.has_value(), "ramfs_system_test: open fileA failed");
149 EXPECT_TRUE(f2.has_value(), "ramfs_system_test: open fileB failed");
150
151 const char kDataA[] = "AAAA";
152 const char kDataB[] = "BBBB";
153 (void)vfs::Write(f1.value(), kDataA, 4);
154 (void)vfs::Write(f2.value(), kDataB, 4);
155
156 (void)vfs::Seek(f1.value(), 0, vfs::SeekWhence::kSet);
157 (void)vfs::Seek(f2.value(), 0, vfs::SeekWhence::kSet);
158
159 char buf1[8] = {};
160 char buf2[8] = {};
161 (void)vfs::Read(f1.value(), buf1, 4);
162 (void)vfs::Read(f2.value(), buf2, 4);
163
164 EXPECT_EQ(memcmp(buf1, kDataA, 4), 0,
165 "ramfs_system_test: fileA data corrupted by fileB");
166 EXPECT_EQ(memcmp(buf2, kDataB, 4), 0,
167 "ramfs_system_test: fileB data corrupted by fileA");
168 klog::Info("ramfs_system_test: two files are independent");
169
170 (void)vfs::Close(f1.value());
171 (void)vfs::Close(f2.value());
172 (void)vfs::Unlink("/fileA.txt");
173 (void)vfs::Unlink("/fileB.txt");
174 }
175
176 klog::Info("ramfs_system_test: all tests passed");
177 return true;
178}
auto Info(etl::format_string< Args... > fmt, Args &&... args) -> void
以 INFO 级别记录日志
@ kODirectory
必须是目录
auto Read(File *file, void *buf, size_t count) -> Expected< size_t >
从文件读取数据
Definition read.cpp:13
auto Write(File *file, const void *buf, size_t count) -> Expected< size_t >
向文件写入数据
Definition write.cpp:13
auto Open(const char *path, OpenFlags flags) -> Expected< File * >
打开文件
Definition open.cpp:14
auto ReadDir(File *file, DirEntry *dirent, size_t count) -> Expected< size_t >
读取目录内容
Definition readdir.cpp:13
auto MkDir(const char *path) -> Expected< void >
创建目录
Definition mkdir.cpp:14
auto Close(File *file) -> Expected< void >
关闭文件
Definition close.cpp:15
auto Unlink(const char *path) -> Expected< void >
删除文件
Definition unlink.cpp:15
auto RmDir(const char *path) -> Expected< void >
删除目录
Definition rmdir.cpp:15
auto Seek(File *file, int64_t offset, SeekWhence whence) -> Expected< uint64_t >
调整文件偏移量
Definition seek.cpp:13
@ kSet
从文件开头
#define memcmp
目录项结构(用于 readdir)
File — 打开的文件实例(每次 open 产生一个)
Definition vfs.hpp:65
#define EXPECT_TRUE(cond, msg)
#define EXPECT_FALSE(cond, msg)
#define EXPECT_GT(val1, val2, msg)
#define EXPECT_EQ(val1, val2, msg)
Here is the call graph for this function: