feat: add VFS test
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
#include "tests.h"
|
||||
|
||||
#include <seallib/vfs.h>
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
|
||||
using namespace seallib;
|
||||
|
||||
/*
|
||||
in-memory file provider
|
||||
*/
|
||||
class MemoryFileProvider : public IFileProvider
|
||||
{
|
||||
std::map<std::string, std::string> files;
|
||||
|
||||
public:
|
||||
bool exists(const std::string& path) const override { return files.count(path); }
|
||||
|
||||
VFSResult readFile(const std::string& path, FileBuffer& outBuffer) const override
|
||||
{
|
||||
if (!exists(path)) return VFSResult::FileNotFound;
|
||||
outBuffer = FileBuffer::fromString(files.at(path));
|
||||
return VFSResult::Success;
|
||||
}
|
||||
|
||||
VFSResult writeFile(const std::string& path, const FileBuffer& buffer) override
|
||||
{
|
||||
files[path] = buffer.toString();
|
||||
return VFSResult::Success;
|
||||
}
|
||||
|
||||
VFSResult deleteFile(const std::string& path) override
|
||||
{
|
||||
return files.erase(path) ? VFSResult::Success : VFSResult::FileNotFound;
|
||||
}
|
||||
|
||||
VFSResult createDirectory(const std::string& path) override { return VFSResult::Success; }
|
||||
|
||||
std::vector<std::string> listDirectory(const std::string& path) const override
|
||||
{
|
||||
std::vector<std::string> result;
|
||||
for (auto const& [key, val] : files)
|
||||
result.push_back(key);
|
||||
return result;
|
||||
}
|
||||
|
||||
std::string getProviderName() const override { return "MemoryProvider"; }
|
||||
};
|
||||
|
||||
class VFSTest : ITest
|
||||
{
|
||||
public:
|
||||
VFSTest() : ITest() {};
|
||||
|
||||
virtual void run() override
|
||||
{
|
||||
VirtualFileSystem vfs;
|
||||
|
||||
auto prov1 = std::make_unique<MemoryFileProvider>();
|
||||
auto prov2 = std::make_unique<MemoryFileProvider>();
|
||||
|
||||
/*
|
||||
mnt test
|
||||
*/
|
||||
vfs.mount("scripts", std::move(prov1));
|
||||
vfs.mount("config/network", std::move(prov2));
|
||||
|
||||
/*
|
||||
write / read tests
|
||||
*/
|
||||
logInfo("Writing to different mount points");
|
||||
vfs.writeFile("scripts/main.lua", FileBuffer::fromString("print('hello')"));
|
||||
vfs.writeFile("config/network/settings.json", FileBuffer::fromString("{ \"ip\": \"127.0.0.1\" }"));
|
||||
|
||||
logInfo("Reading from mount points");
|
||||
FileBuffer b1, b2;
|
||||
if (vfs.readFile("scripts/main.lua", b1) == VFSResult::Success) logInfo("Read Scripts: {}", b1.toString());
|
||||
|
||||
/*
|
||||
existence ands crosstalk
|
||||
*/
|
||||
if (!vfs.exists("scripts/main.lua")) logError("scripts/main.lua is missing?");
|
||||
if (vfs.exists("scripts/settings.json")) logError("wrong provider, settings.json should be inaccessible");
|
||||
logInfo("Path isolation verified");
|
||||
|
||||
/*
|
||||
priority / overlapping mounts
|
||||
*/
|
||||
auto overrideProv = std::make_unique<MemoryFileProvider>();
|
||||
overrideProv->writeFile("patch.txt", FileBuffer::fromString("Hotfix Data"));
|
||||
|
||||
vfs.mount("scripts", std::move(overrideProv), 10); // higher priority
|
||||
|
||||
FileBuffer b3;
|
||||
if (vfs.readFile("scripts/patch.txt", b3) == VFSResult::Success)
|
||||
logInfo("Priority mount successful: {}", b3.toString());
|
||||
|
||||
/*
|
||||
directory listing
|
||||
*/
|
||||
logInfo("Listing 'scripts' folder");
|
||||
|
||||
auto list = vfs.listDirectory("scripts");
|
||||
for (const auto& file : list)
|
||||
logInfo("\t* {}", file);
|
||||
|
||||
/*
|
||||
deletion
|
||||
*/
|
||||
VFSResult delRes = vfs.deleteFile("scripts/main.lua");
|
||||
logInfo("Deletion result: {}", vfsResultToString(delRes));
|
||||
if (vfs.exists("scripts/main.lua")) logError("Failed to delete file, scrips/main.lua still accessible");
|
||||
|
||||
/*
|
||||
unmounting
|
||||
*/
|
||||
vfs.unmount("scripts");
|
||||
if (!vfs.exists("scripts/patch.txt")) logInfo("Unmount successful");
|
||||
}
|
||||
|
||||
virtual const char* getName() override { return "VFSTest"; }
|
||||
};
|
||||
|
||||
static VFSTest g_vfsTest;
|
||||
Reference in New Issue
Block a user