aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/open_file_description.tests.cpp
diff options
context:
space:
mode:
authorMarcel Braun <marcel.braun@ost.ch>2026-04-12 19:15:38 +0200
committerMarcel Braun <marcel.braun@ost.ch>2026-04-12 19:15:38 +0200
commit4d2a1d028f8ba28b655026b93124e71a12562619 (patch)
treef49deef4dd3e8728fd1000b04c0908966f37663f /kernel/src/filesystem/open_file_description.tests.cpp
parent21fd1281cf19572e202d583689b99c33ec68da50 (diff)
parentcb7edbe6d4454ee5b217b522f62f4a7b92475a32 (diff)
downloadteachos-develop-BA-FS26.tar.xz
teachos-develop-BA-FS26.zip
Merge branch 'ext2' into 'develop-BA-FS26'HEADdevelop-BA-FS26
ext2 and tests See merge request teachos/kernel!22
Diffstat (limited to 'kernel/src/filesystem/open_file_description.tests.cpp')
-rw-r--r--kernel/src/filesystem/open_file_description.tests.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/kernel/src/filesystem/open_file_description.tests.cpp b/kernel/src/filesystem/open_file_description.tests.cpp
new file mode 100644
index 0000000..db8eb49
--- /dev/null
+++ b/kernel/src/filesystem/open_file_description.tests.cpp
@@ -0,0 +1,114 @@
+#include "kernel/filesystem/open_file_description.hpp"
+
+#include "kernel/filesystem/vfs.hpp"
+#include "kernel/test_support/filesystem/inode.hpp"
+#include "kernel/test_support/filesystem/storage_boot_module_vfs_fixture.hpp"
+
+#include <kstd/memory>
+#include <kstd/print>
+#include <kstd/vector>
+
+#include <catch2/catch_test_macros.hpp>
+
+#include <cstddef>
+#include <filesystem>
+#include <string_view>
+
+SCENARIO("Open file description construction", "[filesystem][open_file_description]")
+{
+ GIVEN("an inode and an open file description for that inode")
+ {
+ auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
+ auto file_description = kernel::filesystem::open_file_description{inode};
+
+ THEN("the initial offset is zero")
+ {
+ REQUIRE(file_description.offset() == 0);
+ }
+ }
+}
+
+SCENARIO("Open file description read/write offset management", "[filesystem][open_file_description]")
+{
+ GIVEN("an inode that tracks read/write calls and an open file description for that inode")
+ {
+ auto inode = kstd::make_shared<kernel::tests::filesystem::inode>();
+ auto file_description = kernel::filesystem::open_file_description{inode};
+
+ THEN("the offset is updated correctly after reads")
+ {
+ REQUIRE(file_description.read(nullptr, 100) == 100);
+ REQUIRE(file_description.offset() == 100);
+ REQUIRE(file_description.read(nullptr, 50) == 50);
+ REQUIRE(file_description.offset() == 150);
+ }
+
+ THEN("the offset is updated correctly after writes")
+ {
+ REQUIRE(file_description.write(nullptr, 200) == 200);
+ REQUIRE(file_description.offset() == 200);
+ REQUIRE(file_description.write(nullptr, 25) == 25);
+ REQUIRE(file_description.offset() == 225);
+ }
+
+ THEN("reads and writes both update the same offset")
+ {
+ REQUIRE(file_description.read(nullptr, 10) == 10);
+ REQUIRE(file_description.offset() == 10);
+ REQUIRE(file_description.write(nullptr, 20) == 20);
+ REQUIRE(file_description.offset() == 30);
+ REQUIRE(file_description.read(nullptr, 5) == 5);
+ REQUIRE(file_description.offset() == 35);
+ REQUIRE(file_description.write(nullptr, 15) == 15);
+ REQUIRE(file_description.offset() == 50);
+ }
+ }
+}
+
+SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_vfs_fixture,
+ "Open file description read with real image", "[filesystem][open_file_description][img]")
+{
+ auto const image_path = std::filesystem::path{KERNEL_TEST_ASSETS_DIR} / "ext2_1KB_fs.img";
+
+ GIVEN("an open file description for a file in a real image")
+ {
+ 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();
+ auto ofd = vfs.open("/information/info_1.txt");
+ REQUIRE(ofd != nullptr);
+
+ THEN("the file can be read and the offset is updated")
+ {
+ kstd::vector<std::byte> buffer(32);
+ auto bytes_read = ofd->read(buffer.data(), buffer.size());
+ REQUIRE(bytes_read == 32);
+ REQUIRE(ofd->offset() == 32);
+
+ std::string_view buffer_as_str{reinterpret_cast<char *>(buffer.data()), static_cast<size_t>(bytes_read)};
+ auto const content_end = buffer_as_str.find('\0');
+ REQUIRE(buffer_as_str.substr(0, content_end) == "info_1\n");
+
+ for (auto i = content_end; i < buffer_as_str.size(); ++i)
+ {
+ REQUIRE(buffer_as_str[i] == '\0');
+ }
+ }
+
+ THEN("the file can be read multiple times")
+ {
+ kstd::vector<std::byte> buffer(4);
+ auto bytes_read_1 = ofd->read(buffer.data(), buffer.size() / 2);
+ REQUIRE(bytes_read_1 == buffer.size() / 2);
+ REQUIRE(ofd->offset() == buffer.size() / 2);
+
+ auto bytes_read_2 = ofd->read(buffer.data() + buffer.size() / 2, buffer.size() / 2);
+ REQUIRE(bytes_read_2 == buffer.size() / 2);
+ REQUIRE(ofd->offset() == buffer.size());
+
+ std::string_view buffer_as_str{reinterpret_cast<char *>(buffer.data()), bytes_read_1 + bytes_read_2};
+ REQUIRE(buffer_as_str == "info");
+ }
+ }
+}