diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-22 16:23:39 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-22 16:23:39 +0200 |
| commit | 45a364e5564ebaad30f426a5bec0a3097dbf2cfb (patch) | |
| tree | b7b275b96d8057646efdb8a7296f71133024d6ff /kernel | |
| parent | 032c309e51a3631c31c22a62cf406ce06d1c2f0a (diff) | |
| download | kernel-45a364e5564ebaad30f426a5bec0a3097dbf2cfb.tar.xz kernel-45a364e5564ebaad30f426a5bec0a3097dbf2cfb.zip | |
kernel/fs: add missing unit tests
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.cpp | 11 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.hpp | 4 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/ext2/inode.tests.cpp | 28 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/vfs.tests.cpp | 32 |
4 files changed, 75 insertions, 0 deletions
diff --git a/kernel/kernel/filesystem/ext2/inode.cpp b/kernel/kernel/filesystem/ext2/inode.cpp index 89e52232..8e4c2e7c 100644 --- a/kernel/kernel/filesystem/ext2/inode.cpp +++ b/kernel/kernel/filesystem/ext2/inode.cpp @@ -203,6 +203,16 @@ namespace kernel::filesystem::ext2 return (m_data.mode & constants::mode_mask) == constants::mode_symbolic_link; } + auto inode::is_block_device() const -> bool + { + return (m_data.mode & constants::mode_mask) == constants::mode_block_device; + } + + auto inode::is_character_device() const -> bool + { + return (m_data.mode & constants::mode_mask) == constants::mode_character_device; + } + auto inode::status() const -> kstd::result<kapi::filesystem::file_status> { auto result = kernel::filesystem::inode::status(); @@ -211,6 +221,7 @@ namespace kernel::filesystem::ext2 return result; } + result->mode = m_data.mode; result->size = size(); result->inode_number = m_inode_number; result->link_count = m_data.links_count; diff --git a/kernel/kernel/filesystem/ext2/inode.hpp b/kernel/kernel/filesystem/ext2/inode.hpp index a15532b0..ce7aae54 100644 --- a/kernel/kernel/filesystem/ext2/inode.hpp +++ b/kernel/kernel/filesystem/ext2/inode.hpp @@ -110,6 +110,10 @@ namespace kernel::filesystem::ext2 */ [[nodiscard]] auto is_symbolic_link() const -> bool override; + [[nodiscard]] auto is_block_device() const -> bool override; + + [[nodiscard]] auto is_character_device() const -> bool override; + [[nodiscard]] auto status() const -> kstd::result<kapi::filesystem::file_status> override; [[nodiscard]] auto raw_device() const -> std::optional<kapi::filesystem::device_number> override; diff --git a/kernel/kernel/filesystem/ext2/inode.tests.cpp b/kernel/kernel/filesystem/ext2/inode.tests.cpp index e587d75e..e44011cf 100644 --- a/kernel/kernel/filesystem/ext2/inode.tests.cpp +++ b/kernel/kernel/filesystem/ext2/inode.tests.cpp @@ -11,6 +11,8 @@ #include <kernel/test_support/filesystem/ext2.hpp> #include <kernel/test_support/filesystem/storage_boot_module_fixture.hpp> +#include <kapi/filesystem.hpp> + #include <kstd/memory.hpp> #include <kstd/units.hpp> #include <kstd/vector.hpp> @@ -22,6 +24,7 @@ #include <cstdint> #include <filesystem> #include <string_view> +#include <utility> #include <vector> using namespace kstd::units_literals; @@ -603,4 +606,29 @@ SCENARIO("Ext2 inode get_size() and set_size() handles size correctly depending } } +SCENARIO("Ext2 inode status()", "[filesystem][ext2][inode]") +{ + GIVEN("an ext block device inode with real metadata") + { + auto fs = kernel::filesystem::ext2::filesystem{}; + auto data = kernel::filesystem::ext2::inode_data{}; + data.mode = kernel::filesystem::ext2::constants::mode_block_device; + data.block[0] = (1 << 8); + data.links_count = 1; + + auto inode = kernel::filesystem::ext2::inode(&fs, 42, data); + + THEN("status() reports the real inode number, link count, and decoded raw device") + { + auto result = inode.status(); + REQUIRE(result); + + REQUIRE(result->mode == std::to_underlying(kapi::filesystem::file_type::block_device)); + REQUIRE(result->inode_number == 42); + REQUIRE(result->link_count == 1); + REQUIRE(result->raw_device == kapi::filesystem::device_number{.major = 1, .minor = 0}); + } + } +} + // NOLINTEND(readability-magic-numbers)
\ No newline at end of file diff --git a/kernel/kernel/filesystem/vfs.tests.cpp b/kernel/kernel/filesystem/vfs.tests.cpp index 5e73db4a..6b8411b0 100644 --- a/kernel/kernel/filesystem/vfs.tests.cpp +++ b/kernel/kernel/filesystem/vfs.tests.cpp @@ -2,8 +2,11 @@ #include <kernel/filesystem/error.hpp> #include <kernel/filesystem/open_file_descriptor.hpp> +#include <kernel/filesystem/reserved_numbers.hpp> #include <kernel/test_support/filesystem/storage_boot_module_vfs_fixture.hpp> +#include <kapi/filesystem.hpp> + #include <kstd/memory.hpp> #include <kstd/system_error.hpp> #include <kstd/vector.hpp> @@ -604,3 +607,32 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "VFS } } } + +SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture, "VFS status()", "[filesystem][vfs][img]") +{ + auto const image_path = std::filesystem::path{KERNEL_TEST_ASSETS_DIR} / "ext2_1KB_fs.img"; + + GIVEN("a real image file") + { + REQUIRE(std::filesystem::exists(image_path)); + REQUIRE_NOTHROW(setup_modules_from_img_and_init_vfs({"test_img_module"}, {image_path})); + + auto & vfs = kernel::filesystem::vfs::get(); + + THEN("status(/dev/ram0) reports it as the correct block device") + { + auto result = vfs.status("/dev/ram0"); + REQUIRE(result); + REQUIRE(kapi::filesystem::is_block_device(result->mode)); + REQUIRE(result->raw_device.major == kernel::filesystem::block_major_numbers::ram_disk); + } + + THEN("status(/information/info_1.txt) reports it as a regular file") + { + auto result = vfs.status("/information/info_1.txt"); + REQUIRE(result); + REQUIRE(kapi::filesystem::is_regular(result->mode)); + REQUIRE(result->raw_device == kapi::filesystem::device_number{}); + } + } +} |
