8#include <gtest/gtest.h>
39 auto result = ramfs_.Mount(
nullptr);
46 Inode* root = ramfs_.GetRootInode();
54 std::vector<Inode*> inodes;
55 for (
int i = 0; i < 10; ++i) {
56 auto result = ramfs_.AllocateInode();
59 inodes.push_back(result.value());
63 for (
auto* inode : inodes) {
64 auto free_result = ramfs_.FreeInode(inode);
71 Inode* root = ramfs_.GetRootInode();
72 ASSERT_NE(root,
nullptr);
73 ASSERT_NE(root->
ops,
nullptr);
77 root->
ops->
Create(root,
"testfile.txt", FileType::kRegular);
80 Inode* file_inode = create_result.value();
85 auto lookup_result = root->
ops->
Lookup(root,
"testfile.txt");
87 EXPECT_EQ(lookup_result.value(), file_inode);
90 lookup_result = root->
ops->
Lookup(root,
"nonexistent.txt");
96 Inode* root = ramfs_.GetRootInode();
97 ASSERT_NE(root,
nullptr);
98 ASSERT_NE(root->
ops,
nullptr);
101 auto mkdir_result = root->
ops->
Mkdir(root,
"testdir");
104 Inode* dir_inode = mkdir_result.value();
111 Inode* root = ramfs_.GetRootInode();
112 ASSERT_NE(root,
nullptr);
116 root->
ops->
Create(root,
"todelete.txt", FileType::kRegular);
117 ASSERT_TRUE(create_result.has_value());
120 auto unlink_result = root->
ops->
Unlink(root,
"todelete.txt");
124 auto lookup_result = root->
ops->
Lookup(root,
"todelete.txt");
130 Inode* root = ramfs_.GetRootInode();
131 ASSERT_NE(root,
nullptr);
134 auto mkdir_result = root->
ops->
Mkdir(root,
"dir_to_remove");
135 ASSERT_TRUE(mkdir_result.has_value());
138 auto rmdir_result = root->
ops->
Rmdir(root,
"dir_to_remove");
142 auto lookup_result = root->
ops->
Lookup(root,
"dir_to_remove");
148 Inode* root = ramfs_.GetRootInode();
149 ASSERT_NE(root,
nullptr);
153 root->
ops->
Create(root,
"rwtest.txt", FileType::kRegular);
154 ASSERT_TRUE(create_result.has_value());
156 Inode* file_inode = create_result.value();
160 file.
inode = file_inode;
162 file.
ops = ramfs_.GetFileOps();
165 const char* write_data =
"Hello, RamFS!";
166 size_t write_len =
strlen(write_data);
168 auto write_result = file.
ops->
Write(&file, write_data, write_len);
170 EXPECT_EQ(write_result.value(), write_len);
174 char read_buffer[64] = {0};
176 auto read_result = file.
ops->
Read(&file, read_buffer,
sizeof(read_buffer));
178 EXPECT_EQ(read_result.value(), write_len);
179 EXPECT_STREQ(read_buffer, write_data);
184 Inode* root = ramfs_.GetRootInode();
185 ASSERT_NE(root,
nullptr);
189 root->
ops->
Create(root,
"seektest.txt", FileType::kRegular);
190 ASSERT_TRUE(create_result.has_value());
193 file.
inode = create_result.value();
195 file.
ops = ramfs_.GetFileOps();
197 const char* data =
"ABCDEFGHIJ";
201 auto seek_result = file.
ops->
Seek(&file, 5, SeekWhence::kSet);
206 seek_result = file.
ops->
Seek(&file, 2, SeekWhence::kCur);
211 seek_result = file.
ops->
Seek(&file, -3, SeekWhence::kEnd);
218 Inode* root = ramfs_.GetRootInode();
219 ASSERT_NE(root,
nullptr);
222 (void)root->
ops->
Create(root,
"file1.txt", FileType::kRegular);
223 (void)root->
ops->
Create(root,
"file2.txt", FileType::kRegular);
224 (void)root->
ops->
Mkdir(root,
"dir1");
228 dir_file.
inode = root;
230 dir_file.
ops = ramfs_.GetFileOps();
233 auto readdir_result = dir_file.
ops->
ReadDir(&dir_file, entries, 16);
237 size_t count = readdir_result.value();
243 Inode* root = ramfs_.GetRootInode();
244 ASSERT_NE(root,
nullptr);
248 root->
ops->
Create(root,
"duplicate.txt", FileType::kRegular);
252 create_result = root->
ops->
Create(root,
"duplicate.txt", FileType::kRegular);
258 Inode* root = ramfs_.GetRootInode();
259 ASSERT_NE(root,
nullptr);
262 auto mkdir_result = root->
ops->
Mkdir(root,
"nonempty_dir");
263 ASSERT_TRUE(mkdir_result.has_value());
265 Inode* dir = mkdir_result.value();
268 (void)dir->
ops->
Create(dir,
"file_inside.txt", FileType::kRegular);
271 auto rmdir_result = root->
ops->
Rmdir(root,
"nonempty_dir");
277 Inode* root = ramfs_.GetRootInode();
278 ASSERT_NE(root,
nullptr);
280 auto unlink_result = root->
ops->
Unlink(root,
"nonexistent.txt");
286 auto sync_result = ramfs_.Sync();
test_env::TestEnvironmentState env_state_
auto Unmount() -> Expected< void > override
卸载 ramfs
auto Mount(vfs::BlockDevice *device) -> Expected< vfs::Inode * > override
挂载 ramfs
void ClearCurrentThreadEnvironment()
清除当前线程的环境实例指针
void BindThreadToCore(std::thread::id tid, size_t core_id)
将指定线程绑定到核心
void InitializeCores(size_t num_cores)
初始化指定数量的核心
void SetCurrentThreadEnvironment()
设置当前线程的环境实例指针
virtual auto Read(File *file, void *buf, size_t count) -> Expected< size_t >=0
从文件读取数据
virtual auto Seek(File *file, int64_t offset, SeekWhence whence) -> Expected< uint64_t >=0
调整文件偏移量
virtual auto ReadDir(File *file, DirEntry *dirent, size_t count) -> Expected< size_t >=0
读取目录项
virtual auto Write(File *file, const void *buf, size_t count) -> Expected< size_t >=0
向文件写入数据
virtual auto Unlink(Inode *dir, const char *name) -> Expected< void >=0
删除文件(解除链接)
virtual auto Create(Inode *dir, const char *name, FileType type) -> Expected< Inode * >=0
在目录中创建新文件
virtual auto Rmdir(Inode *dir, const char *name) -> Expected< void >=0
删除目录
virtual auto Mkdir(Inode *dir, const char *name) -> Expected< Inode * >=0
创建目录
virtual auto Lookup(Inode *dir, const char *name) -> Expected< Inode * >=0
在目录中查找指定名称的 inode
TEST_F(RamFsTest, MountUnmount)
File — 打开的文件实例(每次 open 产生一个)
#define EXPECT_TRUE(cond, msg)
#define EXPECT_NE(val1, val2, msg)
#define EXPECT_FALSE(cond, msg)
#define EXPECT_GE(val1, val2, msg)
#define EXPECT_EQ(val1, val2, msg)