aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/test_support/filesystem
diff options
context:
space:
mode:
authorLukas Oesch <lukas.oesch@ost.ch>2026-06-10 10:40:46 +0200
committerLukas Oesch <lukas.oesch@ost.ch>2026-06-10 10:40:46 +0200
commit33abd5cf264cb9e34121082105b0bc17b3cf7a36 (patch)
tree36b15d53fea04f4f9d9af817100f7ad013bd9b5c /kernel/src/test_support/filesystem
parentd01caf1c4aef3c89c68b9d1cc9fe56445f0860b5 (diff)
parent7e27130c342b7299a1d2188a7192a7f17b5ac2ad (diff)
downloadkernel-33abd5cf264cb9e34121082105b0bc17b3cf7a36.tar.xz
kernel-33abd5cf264cb9e34121082105b0bc17b3cf7a36.zip
Merge branch 'develop-BA-FS26' into 'develop'HEADdevelop
Merge of BA-FS26 branch into develop See merge request teachos/kernel!49
Diffstat (limited to 'kernel/src/test_support/filesystem')
-rw-r--r--kernel/src/test_support/filesystem/ext2.cpp68
-rw-r--r--kernel/src/test_support/filesystem/filesystem.cpp17
-rw-r--r--kernel/src/test_support/filesystem/inode.cpp23
-rw-r--r--kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp139
-rw-r--r--kernel/src/test_support/filesystem/storage_boot_module_vfs_fixture.cpp31
l---------kernel/src/test_support/filesystem/test_assets/README.md1
-rw-r--r--kernel/src/test_support/filesystem/test_assets/ext2_1KB_fs.img3
-rw-r--r--kernel/src/test_support/filesystem/test_assets/ext2_2KB_fs.img3
-rw-r--r--kernel/src/test_support/filesystem/test_assets/ext2_4KB_fs.img3
9 files changed, 288 insertions, 0 deletions
diff --git a/kernel/src/test_support/filesystem/ext2.cpp b/kernel/src/test_support/filesystem/ext2.cpp
new file mode 100644
index 0000000..52b6efe
--- /dev/null
+++ b/kernel/src/test_support/filesystem/ext2.cpp
@@ -0,0 +1,68 @@
+#include <kernel/test_support/filesystem/ext2.hpp>
+
+#include <kernel/filesystem/ext2/block_group_descriptor.hpp>
+#include <kernel/filesystem/ext2/filesystem.hpp>
+#include <kernel/filesystem/ext2/inode.hpp>
+#include <kernel/filesystem/ext2/superblock.hpp>
+#include <kernel/test_support/devices/block_device.hpp>
+
+#include <cstdint>
+#include <cstring>
+
+namespace kernel::tests::filesystem::ext2
+{
+ namespace
+ {
+ constexpr uint32_t root_directory_data_block = 20;
+ } // namespace
+
+ auto write_bytes(kernel::tests::devices::block_device & device, size_t offset, void const * source, size_t size)
+ -> void
+ {
+ auto const required_size = offset + size;
+ if (device.data.size() < required_size)
+ {
+ device.data.resize(required_size, 0);
+ }
+
+ std::memcpy(device.data.data() + offset, source, size);
+ }
+
+ auto write_u32(kernel::tests::devices::block_device & device, size_t offset, uint32_t value) -> void
+ {
+ write_bytes(device, offset, &value, sizeof(value));
+ }
+
+ auto setup_mock_ext2_layout(kernel::tests::devices::block_device & device) -> void
+ {
+ auto superblock = kernel::filesystem::ext2::superblock{};
+ superblock.magic = kernel::filesystem::ext2::constants::magic_number;
+ superblock.log_block_size = 0;
+ superblock.blocks_count = 64;
+ superblock.blocks_per_group = 64;
+ superblock.inodes_per_group = 32;
+ superblock.rev_level = 1;
+ superblock.inode_size = 128;
+ setup_mock_ext2_layout(device, superblock);
+ }
+
+ auto setup_mock_ext2_layout(kernel::tests::devices::block_device & device,
+ kernel::filesystem::ext2::superblock const & superblock) -> void
+ {
+ write_bytes(device, kernel::filesystem::ext2::constants::superblock_offset, &superblock, sizeof(superblock));
+
+ auto group_descriptor = kernel::filesystem::ext2::block_group_descriptor{};
+ group_descriptor.inode_table = 5;
+ write_bytes(device, 2048, &group_descriptor, sizeof(group_descriptor));
+
+ auto root_inode_data = kernel::filesystem::ext2::inode_data{};
+ root_inode_data.mode = kernel::filesystem::ext2::constants::mode_directory;
+ root_inode_data.blocks = 2;
+ root_inode_data.block[0] = root_directory_data_block;
+
+ auto const root_inode_offset =
+ static_cast<size_t>(group_descriptor.inode_table) * kernel::filesystem::ext2::constants::base_block_size +
+ (kernel::filesystem::ext2::constants::root_inode_number - 1) * superblock.inode_size;
+ write_bytes(device, root_inode_offset, &root_inode_data, sizeof(root_inode_data));
+ }
+} // namespace kernel::tests::filesystem::ext2 \ No newline at end of file
diff --git a/kernel/src/test_support/filesystem/filesystem.cpp b/kernel/src/test_support/filesystem/filesystem.cpp
new file mode 100644
index 0000000..ec70607
--- /dev/null
+++ b/kernel/src/test_support/filesystem/filesystem.cpp
@@ -0,0 +1,17 @@
+#include <kernel/test_support/filesystem/filesystem.hpp>
+
+#include <kernel/filesystem/inode.hpp>
+#include <kernel/test_support/filesystem/inode.hpp>
+
+#include <kstd/memory>
+
+#include <string_view>
+
+namespace kernel::tests::filesystem
+{
+ auto filesystem::lookup(kstd::shared_ptr<kernel::filesystem::inode> const &, std::string_view) const
+ -> kstd::shared_ptr<kernel::filesystem::inode>
+ {
+ return kstd::make_shared<inode>();
+ }
+} // namespace kernel::tests::filesystem \ No newline at end of file
diff --git a/kernel/src/test_support/filesystem/inode.cpp b/kernel/src/test_support/filesystem/inode.cpp
new file mode 100644
index 0000000..0c8d956
--- /dev/null
+++ b/kernel/src/test_support/filesystem/inode.cpp
@@ -0,0 +1,23 @@
+#include <kernel/test_support/filesystem/inode.hpp>
+
+#include <kernel/filesystem/inode.hpp>
+
+#include <cstddef>
+
+namespace kernel::tests::filesystem
+{
+ auto inode::read(void *, size_t, size_t size) const -> size_t
+ {
+ return size;
+ }
+
+ auto inode::write(void const *, size_t, size_t size) -> size_t
+ {
+ return size;
+ }
+
+ auto inode::is_regular() const -> bool
+ {
+ return true;
+ }
+} // namespace kernel::tests::filesystem \ No newline at end of file
diff --git a/kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp b/kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp
new file mode 100644
index 0000000..aabaace
--- /dev/null
+++ b/kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp
@@ -0,0 +1,139 @@
+#include <kernel/test_support/filesystem/storage_boot_module_fixture.hpp>
+
+#include <kernel/devices/storage/management.hpp>
+#include <kernel/test_support/boot_modules.hpp>
+#include <kernel/test_support/devices/storage/management.hpp>
+
+#include <kapi/boot_module/boot_module.hpp>
+#include <kapi/boot_modules.hpp>
+#include <kapi/memory.hpp>
+
+#include <cstddef>
+#include <fcntl.h>
+#include <filesystem>
+#include <format>
+#include <stdexcept>
+#include <string>
+#include <unistd.h>
+#include <utility>
+#include <vector>
+
+#include <sys/mman.h>
+#include <sys/stat.h>
+
+namespace kernel::tests::filesystem
+{
+ storage_boot_module_fixture::mapped_image::mapped_image(std::filesystem::path path)
+ : file_descriptor(::open(path.c_str(), O_RDWR))
+ {
+ if (file_descriptor < 0)
+ {
+ throw std::runtime_error{"Failed to open image file for test boot module: " + path.string()};
+ }
+
+ struct stat statistics{};
+ if (::fstat(file_descriptor, &statistics) < 0)
+ {
+ throw std::runtime_error{"Failed to get statistics for image file: " + path.string()};
+ }
+
+ size = static_cast<std::size_t>(statistics.st_size);
+
+ mapping = static_cast<std::byte *>(::mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, file_descriptor, 0));
+ if (mapping == MAP_FAILED)
+ {
+ throw std::runtime_error{"Failed to map image file for test boot module: " + path.string()};
+ }
+ }
+
+ storage_boot_module_fixture::mapped_image::~mapped_image()
+ {
+ if (mapping != nullptr)
+ {
+ ::munmap(mapping, size);
+ }
+ if (file_descriptor >= 0)
+ {
+ ::close(file_descriptor);
+ }
+ }
+
+ storage_boot_module_fixture::mapped_image::mapped_image(mapped_image && other) noexcept
+ : file_descriptor{std::exchange(other.file_descriptor, -1)}
+ , mapping{std::exchange(other.mapping, nullptr)}
+ , size{std::exchange(other.size, 0)}
+ {}
+
+ auto storage_boot_module_fixture::mapped_image::operator=(mapped_image && other) noexcept -> mapped_image &
+ {
+ if (this != &other)
+ {
+ file_descriptor = std::exchange(other.file_descriptor, -1);
+ mapping = std::exchange(other.mapping, nullptr);
+ size = std::exchange(other.size, 0);
+ }
+ return *this;
+ }
+
+ storage_boot_module_fixture::~storage_boot_module_fixture()
+ {
+ kernel::tests::devices::storage::management::deinit();
+ kernel::tests::boot_modules::deinit();
+ }
+
+ auto storage_boot_module_fixture::setup_modules(std::size_t module_count, std::size_t module_size) -> void
+ {
+ m_module_names.clear();
+ m_module_data.clear();
+ m_registry = {};
+
+ m_module_names.reserve(module_count);
+ m_module_data.reserve(module_count);
+
+ for (std::size_t i = 0; i < module_count; ++i)
+ {
+ m_module_names.push_back(std::format("test_mod{}", i));
+ m_module_data.emplace_back(module_size, std::byte{static_cast<unsigned char>(0x40 + (i % 16))});
+ }
+
+ for (std::size_t i = 0; i < module_count; ++i)
+ {
+ m_registry.add_boot_module(kapi::boot_modules::boot_module{
+ m_module_names[i].c_str(), kapi::memory::linear_address{m_module_data[i].data()}, m_module_data[i].size()});
+ }
+
+ kapi::boot_modules::set_boot_module_registry(m_registry);
+ kernel::devices::storage::management::init();
+ }
+
+ auto storage_boot_module_fixture::setup_modules_from_img(std::vector<std::string> const & module_names,
+ std::vector<std::filesystem::path> const & img_paths) -> void
+ {
+ m_module_names.clear();
+ m_module_data.clear();
+ m_registry = {};
+
+ if (module_names.size() != img_paths.size())
+ {
+ throw std::invalid_argument{"Module names and image paths vectors must have the same size."};
+ }
+
+ for (size_t i = 0; i < module_names.size(); ++i)
+ {
+ setup_module_from_img(module_names[i], img_paths[i]);
+ }
+
+ kapi::boot_modules::set_boot_module_registry(m_registry);
+ kernel::devices::storage::management::init();
+ }
+
+ auto storage_boot_module_fixture::setup_module_from_img(std::string const & module_name,
+ std::filesystem::path const & img_path) -> void
+ {
+ m_module_names.push_back(module_name);
+ auto & mapped_image = m_mapped_images.emplace_back(img_path);
+
+ m_registry.add_boot_module(kapi::boot_modules::boot_module{
+ m_module_names.back().c_str(), kapi::memory::linear_address{mapped_image.mapping}, mapped_image.size});
+ }
+} // namespace kernel::tests::filesystem \ No newline at end of file
diff --git a/kernel/src/test_support/filesystem/storage_boot_module_vfs_fixture.cpp b/kernel/src/test_support/filesystem/storage_boot_module_vfs_fixture.cpp
new file mode 100644
index 0000000..02ccfec
--- /dev/null
+++ b/kernel/src/test_support/filesystem/storage_boot_module_vfs_fixture.cpp
@@ -0,0 +1,31 @@
+#include <kernel/test_support/filesystem/storage_boot_module_vfs_fixture.hpp>
+
+#include <kernel/filesystem/vfs.hpp>
+#include <kernel/test_support/filesystem/vfs.hpp>
+
+#include <cstddef>
+#include <filesystem>
+#include <string>
+#include <vector>
+
+namespace kernel::tests::filesystem
+{
+ storage_boot_module_vfs_fixture::~storage_boot_module_vfs_fixture()
+ {
+ kernel::tests::filesystem::vfs::deinit();
+ }
+
+ auto storage_boot_module_vfs_fixture::setup_modules_and_init_vfs(std::size_t module_count, std::size_t module_size)
+ -> void
+ {
+ setup_modules(module_count, module_size);
+ kernel::filesystem::vfs::init();
+ }
+
+ auto storage_boot_module_vfs_fixture::setup_modules_from_img_and_init_vfs(
+ std::vector<std::string> const & module_names, std::vector<std::filesystem::path> const & img_paths) -> void
+ {
+ setup_modules_from_img(module_names, img_paths);
+ kernel::filesystem::vfs::init();
+ }
+} // namespace kernel::tests::filesystem \ No newline at end of file
diff --git a/kernel/src/test_support/filesystem/test_assets/README.md b/kernel/src/test_support/filesystem/test_assets/README.md
new file mode 120000
index 0000000..718a227
--- /dev/null
+++ b/kernel/src/test_support/filesystem/test_assets/README.md
@@ -0,0 +1 @@
+/arch/x86_64/support/modules/README.md \ No newline at end of file
diff --git a/kernel/src/test_support/filesystem/test_assets/ext2_1KB_fs.img b/kernel/src/test_support/filesystem/test_assets/ext2_1KB_fs.img
new file mode 100644
index 0000000..a5202ca
--- /dev/null
+++ b/kernel/src/test_support/filesystem/test_assets/ext2_1KB_fs.img
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:98ac3c1be872806e25fb14eea168ca79a91959f4e6a5ac3d00c5d8224c1f73a3
+size 10485760
diff --git a/kernel/src/test_support/filesystem/test_assets/ext2_2KB_fs.img b/kernel/src/test_support/filesystem/test_assets/ext2_2KB_fs.img
new file mode 100644
index 0000000..7f297f0
--- /dev/null
+++ b/kernel/src/test_support/filesystem/test_assets/ext2_2KB_fs.img
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d9e872916e7d9107b321cc007e151899d5f19400a694666c0b24d482aef61ca
+size 5242880
diff --git a/kernel/src/test_support/filesystem/test_assets/ext2_4KB_fs.img b/kernel/src/test_support/filesystem/test_assets/ext2_4KB_fs.img
new file mode 100644
index 0000000..c3f6daf
--- /dev/null
+++ b/kernel/src/test_support/filesystem/test_assets/ext2_4KB_fs.img
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:026ca30269dbd80beb2dd74677c94676d1d4a7f6b5fe406c4ddb82836ba2dc00
+size 10485760