diff options
| author | Marcel Braun <marcel.braun@ost.ch> | 2026-06-08 21:48:30 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-14 21:33:10 +0200 |
| commit | b0236a47309a5ceb2336acbf03460331ce0d0455 (patch) | |
| tree | 71d214394b352cd13afc15615cccb5172d880532 /kernel | |
| parent | 0b28a0df3406f011cd618cd5e7b2f15f38dbc516 (diff) | |
| download | kernel-b0236a47309a5ceb2336acbf03460331ce0d0455.tar.xz kernel-b0236a47309a5ceb2336acbf03460331ce0d0455.zip | |
Add tests for inode creation
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kernel/filesystem/ext2/filesystem.tests.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/kernel/kernel/filesystem/ext2/filesystem.tests.cpp b/kernel/kernel/filesystem/ext2/filesystem.tests.cpp index 2528db4b..277ff385 100644 --- a/kernel/kernel/filesystem/ext2/filesystem.tests.cpp +++ b/kernel/kernel/filesystem/ext2/filesystem.tests.cpp @@ -7,6 +7,7 @@ #include <kernel/filesystem/ext2/inode.hpp> #include <kernel/filesystem/ext2/superblock.hpp> #include <kernel/filesystem/filesystem.hpp> +#include <kernel/filesystem/vfs_types.hpp> #include <kernel/test_support/devices/block_device.hpp> #include <kernel/test_support/filesystem/ext2.hpp> #include <kernel/test_support/filesystem/storage_boot_module_fixture.hpp> @@ -21,6 +22,7 @@ #include <cstdint> #include <cstring> #include <filesystem> +#include <string_view> #include <vector> SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, @@ -73,6 +75,86 @@ SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, } } +SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture, + "Ext2 filesystem create new inodes with real image", "[filesystem][ext2][filesystem][img]") +{ + auto const image_path = std::filesystem::path{KERNEL_TEST_ASSETS_DIR} / "ext2_1KB_fs.img"; + + GIVEN("a mounted ext2 filesystem from a real image") + { + REQUIRE(std::filesystem::exists(image_path)); + REQUIRE_NOTHROW(setup_modules_from_img({"test_img_module"}, {image_path})); + + auto boot_device = kernel::devices::storage::management::get().determine_boot_device(); + REQUIRE(boot_device != nullptr); + + auto dev_inode = kstd::make_shared<kernel::filesystem::device_inode>(boot_device); + + auto fs = kernel::filesystem::ext2::filesystem{}; + REQUIRE(fs.mount(dev_inode) == kernel::filesystem::filesystem::operation_result::success); + + THEN("a file can be created") + { + auto lookup_result = fs.lookup(fs.root_inode(), "blub"); + REQUIRE(lookup_result == nullptr); + + auto new_inode = fs.create_inode(fs.root_inode(), "blub", kernel::filesystem::vfs_types::inode_type::regular); + REQUIRE(new_inode != nullptr); + REQUIRE(new_inode->is_regular()); + + lookup_result = fs.lookup(fs.root_inode(), "blub"); + REQUIRE(lookup_result != nullptr); + } + + THEN("a directory can be created") + { + auto lookup_result = fs.lookup(fs.root_inode(), "blub"); + REQUIRE(lookup_result == nullptr); + + auto new_directory = + fs.create_inode(fs.root_inode(), "blub", kernel::filesystem::vfs_types::inode_type::directory); + REQUIRE(new_directory != nullptr); + REQUIRE(new_directory->is_directory()); + + lookup_result = fs.lookup(fs.root_inode(), "blub"); + REQUIRE(lookup_result != nullptr); + } + + THEN("a directory and a file within can be created") + { + auto new_directory = + fs.create_inode(fs.root_inode(), "blub", kernel::filesystem::vfs_types::inode_type::directory); + REQUIRE(new_directory != nullptr); + + auto new_file = fs.create_inode(new_directory, "blub_file", kernel::filesystem::vfs_types::inode_type::regular); + REQUIRE(new_file != nullptr); + + auto lookup_result = fs.lookup(new_directory, "blub_file"); + REQUIRE(lookup_result != nullptr); + REQUIRE(lookup_result->is_regular()); + } + + THEN("a file can be created and written to") + { + auto new_inode = fs.create_inode(fs.root_inode(), "blub", kernel::filesystem::vfs_types::inode_type::regular); + REQUIRE(new_inode != nullptr); + + auto buffer = std::vector<std::byte>{std::byte{'H'}, std::byte{'e'}, std::byte{'l'}, std::byte{'l'}, + std::byte{'o'}, std::byte{' '}, std::byte{'W'}, std::byte{'o'}, + std::byte{'r'}, std::byte{'l'}, std::byte{'d'}, std::byte{'!'}}; + auto bytes_written = new_inode->write(buffer.data(), 0, buffer.size()); + REQUIRE(bytes_written == buffer.size()); + + auto read_buffer = std::vector<std::byte>(5, std::byte{0xAA}); + auto bytes_read = new_inode->read(read_buffer.data(), 0, read_buffer.size()); + REQUIRE(bytes_read == read_buffer.size()); + + std::string_view result{reinterpret_cast<char *>(read_buffer.data()), static_cast<size_t>(bytes_read)}; + REQUIRE(result == "Hello"); + } + } +} + SCENARIO("Ext2 filesystem rejects invalid magic", "[filesystem][ext2][filesystem]") { auto const block_size = 1024; |
