8#include <gtest/gtest.h>
53 [[nodiscard]]
auto GetName() const -> const
char*
override {
116 auto mount_result = mount_table.
Mount(
"/", &mock_fs,
nullptr);
121 mount_result = mount_table.
Mount(
"/", &mock_fs,
nullptr);
125 auto unmount_result = mount_table.
Unmount(
"/");
126 (void)unmount_result;
131 unmount_result = mount_table.
Unmount(
"/mnt");
139 auto mount_result = mount_table.
Mount(
"/", &mock_fs,
nullptr);
143 auto* mp = mount_table.
Lookup(
"/file.txt");
147 mp = mount_table.
Lookup(
"/mnt/nonexistent/file");
149 (void)mount_table.
Unmount(
"/");
173 auto alloc_result = fd_table_->Alloc(&mock_file);
175 int fd = alloc_result.value();
179 File* file = fd_table_->Get(fd);
183 auto free_result = fd_table_->Free(fd);
187 file = fd_table_->Get(fd);
193 File* file = fd_table_->Get(-1);
196 file = fd_table_->Get(999);
200 auto free_result = fd_table_->Free(-1);
208 auto alloc_result = fd_table_->Alloc(&mock_file);
210 int fd1 = alloc_result.value();
213 auto dup_result = fd_table_->Dup(fd1);
215 int fd2 = dup_result.value();
218 EXPECT_EQ(fd_table_->Get(fd1), fd_table_->Get(fd2));
221 (void)fd_table_->Free(fd1);
222 (void)fd_table_->Free(fd2);
231 fd_table_->SetupStandardFiles(&stdin_file, &stdout_file, &stderr_file);
235 EXPECT_EQ(fd_table_->Get(0), &stdin_file);
236 EXPECT_EQ(fd_table_->Get(1), &stdout_file);
237 EXPECT_EQ(fd_table_->Get(2), &stderr_file);
246 auto mount_result = mount_table.Mount(
"/", &mock_fs,
nullptr);
252 EXPECT_NE(lookup_result.value(),
nullptr);
278TEST(FileStructTest, FileOperations) {
288TEST(InodeStructTest, InodeDefaults) {
301TEST(DentryStructTest, DentryDefaults) {
312TEST(OpenFlagsTest, FlagValues) {
313 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kOReadOnly), 0x0000u);
314 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kOWriteOnly), 0x0001u);
315 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kOReadWrite), 0x0002u);
316 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kOCreate), 0x0040u);
317 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kOTruncate), 0x0200u);
318 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kOAppend), 0x0400u);
319 EXPECT_EQ(
static_cast<uint32_t
>(OpenFlags::kODirectory), 0x010000u);
323TEST(SeekWhenceTest, EnumValues) {
324 EXPECT_EQ(
static_cast<int>(SeekWhence::kSet), 0);
325 EXPECT_EQ(
static_cast<int>(SeekWhence::kCur), 1);
326 EXPECT_EQ(
static_cast<int>(SeekWhence::kEnd), 2);
test_env::TestEnvironmentState env_state_
FileDescriptorTable * fd_table_
auto Close(File *) -> Expected< void > override
关闭文件
auto ReadDir(File *, DirEntry *, size_t) -> Expected< size_t > override
读取目录项
auto Read(File *, void *, size_t) -> Expected< size_t > override
从文件读取数据
auto Write(File *, const void *, size_t) -> Expected< size_t > override
向文件写入数据
auto Seek(File *, int64_t, SeekWhence) -> Expected< uint64_t > override
调整文件偏移量
auto FreeInode(Inode *) -> Expected< void > override
释放 inode
auto AllocateInode() -> Expected< Inode * > override
分配新 inode
MockFileOps mock_file_ops_
BlockDevice * last_device
auto Sync() -> Expected< void > override
将缓存数据刷写到磁盘
auto GetFileOps() -> FileOps *override
获取文件系统的文件操作接口
auto Unmount() -> Expected< void > override
卸载文件系统
auto GetName() const -> const char *override
获取文件系统类型名(如 "ramfs", "fat32")
auto Mount(BlockDevice *device) -> Expected< Inode * > override
挂载文件系统
test_env::TestEnvironmentState env_state_
void ClearCurrentThreadEnvironment()
清除当前线程的环境实例指针
void BindThreadToCore(std::thread::id tid, size_t core_id)
将指定线程绑定到核心
void InitializeCores(size_t num_cores)
初始化指定数量的核心
void SetCurrentThreadEnvironment()
设置当前线程的环境实例指针
auto Unmount(const char *path) -> Expected< void >
卸载指定路径的文件系统
auto Mount(const char *path, FileSystem *fs, BlockDevice *device) -> Expected< void >
挂载文件系统到指定路径
auto Lookup(const char *path) -> MountPoint *
根据路径查找对应的挂载点
std::expected< T, Error > Expected
std::expected 别名模板
auto Lookup(const char *path) -> Expected< Dentry * >
路径解析,查找 dentry
auto GetMountTable() -> MountTable &
获取全局挂载表实例
auto Init() -> Expected< void >
VFS 全局初始化
Dentry — 目录项缓存(路径名 ↔ Inode 的映射)
void * fs_private
文件系统私有数据
Dentry * next_sibling
兄弟目录项(同一父目录下)
File — 打开的文件实例(每次 open 产生一个)
OpenFlags flags
打开标志 (OpenFlags)
Dentry * dentry
关联的 dentry
uint32_t permissions
权限位(简化版)
uint64_t ino
inode 编号(文件系统内唯一)
void * fs_private
文件系统私有数据指针
#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)
TEST(FileStructTest, FileOperations)
TEST_F(MountTableTest, MountAndUnmount)