aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-22 16:23:39 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-22 16:23:39 +0200
commit45a364e5564ebaad30f426a5bec0a3097dbf2cfb (patch)
treeb7b275b96d8057646efdb8a7296f71133024d6ff
parent032c309e51a3631c31c22a62cf406ce06d1c2f0a (diff)
downloadkernel-45a364e5564ebaad30f426a5bec0a3097dbf2cfb.tar.xz
kernel-45a364e5564ebaad30f426a5bec0a3097dbf2cfb.zip
kernel/fs: add missing unit tests
-rw-r--r--kernel/kernel/filesystem/ext2/inode.cpp11
-rw-r--r--kernel/kernel/filesystem/ext2/inode.hpp4
-rw-r--r--kernel/kernel/filesystem/ext2/inode.tests.cpp28
-rw-r--r--kernel/kernel/filesystem/vfs.tests.cpp32
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{});
+ }
+ }
+}