diff options
| author | Lukas Oesch <lukasoesch20@gmail.com> | 2026-04-09 08:32:51 +0200 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-04-11 08:05:52 +0200 |
| commit | 3c9ad45492d7417c65594fa7fa2fb9a8d5439276 (patch) | |
| tree | c198818f2ba3f66d1dc7d8ce6ca783d43e4e70ca | |
| parent | 9ce8ed3dd3aa5f6e21b53d02bac4f62eb8b3f337 (diff) | |
| download | teachos-3c9ad45492d7417c65594fa7fa2fb9a8d5439276.tar.xz teachos-3c9ad45492d7417c65594fa7fa2fb9a8d5439276.zip | |
add deinit functions for singletons in tests
| -rw-r--r-- | kernel/include/kernel/filesystem/file_descriptor_table.hpp | 6 | ||||
| -rw-r--r-- | kernel/include/kernel/test_support/boot_modules.hpp | 10 | ||||
| -rw-r--r-- | kernel/include/kernel/test_support/devices/storage/management.hpp | 10 | ||||
| -rw-r--r-- | kernel/include/kernel/test_support/filesystem/file_descriptor_table.hpp | 10 | ||||
| -rw-r--r-- | kernel/include/kernel/test_support/filesystem/vfs.hpp | 10 | ||||
| -rw-r--r-- | kernel/kapi/boot_modules.cpp | 19 | ||||
| -rw-r--r-- | kernel/src/devices/storage/management.cpp | 28 | ||||
| -rw-r--r-- | kernel/src/filesystem/file_descriptor_table.cpp | 25 | ||||
| -rw-r--r-- | kernel/src/filesystem/file_descriptor_table.tests.cpp | 46 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 24 | ||||
| -rw-r--r-- | kernel/src/test_support/state_reset_listener.cpp | 12 |
11 files changed, 116 insertions, 84 deletions
diff --git a/kernel/include/kernel/filesystem/file_descriptor_table.hpp b/kernel/include/kernel/filesystem/file_descriptor_table.hpp index cc31511..5d52c19 100644 --- a/kernel/include/kernel/filesystem/file_descriptor_table.hpp +++ b/kernel/include/kernel/filesystem/file_descriptor_table.hpp @@ -29,12 +29,6 @@ namespace kernel::filesystem auto static get() -> file_descriptor_table &; /** - @brief Reset the file descriptor table to an empty state. This method is intended for testing purposes to allow - resetting the state of the file descriptor table between test cases. - */ - auto static reset() -> void; - - /** @brief Destructor for the file descriptor table. */ ~file_descriptor_table() = default; diff --git a/kernel/include/kernel/test_support/boot_modules.hpp b/kernel/include/kernel/test_support/boot_modules.hpp new file mode 100644 index 0000000..2343a10 --- /dev/null +++ b/kernel/include/kernel/test_support/boot_modules.hpp @@ -0,0 +1,10 @@ +#ifndef TEACHOS_KERNEL_TEST_SUPPORT_BOOT_MODULES_HPP +#define TEACHOS_KERNEL_TEST_SUPPORT_BOOT_MODULES_HPP + +namespace kernel::tests::boot_modules +{ + //! Deinitialize the boot module registry. + auto deinit() -> void; +} // namespace kernel::tests::boot_modules + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/test_support/devices/storage/management.hpp b/kernel/include/kernel/test_support/devices/storage/management.hpp new file mode 100644 index 0000000..7c0d304 --- /dev/null +++ b/kernel/include/kernel/test_support/devices/storage/management.hpp @@ -0,0 +1,10 @@ +#ifndef TEACHOS_KERNEL_TEST_SUPPORT_DEVICES_STORAGE_MANAGEMENT_HPP +#define TEACHOS_KERNEL_TEST_SUPPORT_DEVICES_STORAGE_MANAGEMENT_HPP + +namespace kernel::tests::devices::storage +{ + //! Deinitialize the storage management singleton. + auto deinit() -> void; +} // namespace kernel::tests::devices::storage + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/test_support/filesystem/file_descriptor_table.hpp b/kernel/include/kernel/test_support/filesystem/file_descriptor_table.hpp new file mode 100644 index 0000000..bbc0f4a --- /dev/null +++ b/kernel/include/kernel/test_support/filesystem/file_descriptor_table.hpp @@ -0,0 +1,10 @@ +#ifndef TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_FILE_DESCRIPTOR_TABLE_HPP +#define TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_FILE_DESCRIPTOR_TABLE_HPP + +namespace kernel::tests::filesystem::file_descriptor_table +{ + //! Deinitialize the file descriptor table singleton. + auto deinit() -> void; +} // namespace kernel::tests::filesystem::file_descriptor_table + +#endif
\ No newline at end of file diff --git a/kernel/include/kernel/test_support/filesystem/vfs.hpp b/kernel/include/kernel/test_support/filesystem/vfs.hpp new file mode 100644 index 0000000..739e353 --- /dev/null +++ b/kernel/include/kernel/test_support/filesystem/vfs.hpp @@ -0,0 +1,10 @@ +#ifndef TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_VFS_HPP +#define TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_VFS_HPP + +namespace kernel::tests::filesystem::vfs +{ + //! Deinitialize the VFS singleton. + auto deinit() -> void; +} // namespace kernel::tests::filesystem::vfs + +#endif
\ No newline at end of file diff --git a/kernel/kapi/boot_modules.cpp b/kernel/kapi/boot_modules.cpp index 5a0ef7f..0549368 100644 --- a/kernel/kapi/boot_modules.cpp +++ b/kernel/kapi/boot_modules.cpp @@ -4,14 +4,13 @@ #include <optional> -namespace kapi::boot_modules +namespace { + constinit auto static registry = std::optional<kapi::boot_modules::boot_module_registry>{}; +} // namespace - namespace - { - constinit auto static registry = std::optional<kapi::boot_modules::boot_module_registry>{}; - } // namespace - +namespace kapi::boot_modules +{ auto set_boot_module_registry(boot_module_registry & new_registry) -> void { if (registry) @@ -32,3 +31,11 @@ namespace kapi::boot_modules return *registry; } } // namespace kapi::boot_modules + +namespace kernel::tests::boot_modules +{ + auto deinit() -> void + { + registry.reset(); + } +} // namespace kernel::tests::boot_modules diff --git a/kernel/src/devices/storage/management.cpp b/kernel/src/devices/storage/management.cpp index d440bf0..14a045a 100644 --- a/kernel/src/devices/storage/management.cpp +++ b/kernel/src/devices/storage/management.cpp @@ -1,9 +1,9 @@ #include "kernel/devices/storage/management.hpp" #include "kapi/boot_modules.hpp" +#include "kapi/devices/device.hpp" #include "kapi/system.hpp" -#include "kapi/devices/device.hpp" #include "kernel/devices/storage/controller.hpp" #include "kernel/devices/storage/ram_disk/controller.hpp" @@ -14,17 +14,17 @@ #include <cstddef> #include <optional> -namespace kernel::devices::storage +namespace { - namespace - { - constexpr size_t static MINORS_PER_DEVICE = 16; - constexpr size_t static START_MAJOR = 1; - constinit size_t static next_free_major = START_MAJOR; + constexpr size_t static MINORS_PER_DEVICE = 16; + constexpr size_t static START_MAJOR = 1; + constinit size_t static next_free_major = START_MAJOR; - constinit auto static active_storage_management = std::optional<management>{}; - } // namespace + constinit auto static active_storage_management = std::optional<kernel::devices::storage::management>{}; +} // namespace +namespace kernel::devices::storage +{ auto management::init() -> void { if (active_storage_management) @@ -81,5 +81,13 @@ namespace kernel::devices::storage { return device_by_major_minor(START_MAJOR, 0); } +} // namespace kernel::devices::storage -} // namespace kernel::devices::storage
\ No newline at end of file +namespace kernel::tests::devices::storage +{ + auto deinit() -> void + { + active_storage_management.reset(); + next_free_major = START_MAJOR; + } +} // namespace kernel::tests::devices::storage diff --git a/kernel/src/filesystem/file_descriptor_table.cpp b/kernel/src/filesystem/file_descriptor_table.cpp index a31e2e6..1c062a1 100644 --- a/kernel/src/filesystem/file_descriptor_table.cpp +++ b/kernel/src/filesystem/file_descriptor_table.cpp @@ -10,13 +10,13 @@ #include <cstddef> #include <optional> -namespace kernel::filesystem +namespace { - namespace - { - constinit auto static global_file_descriptor_table = std::optional<file_descriptor_table>{}; - } // namespace + constinit auto static global_file_descriptor_table = std::optional<kernel::filesystem::file_descriptor_table>{}; +} // namespace +namespace kernel::filesystem +{ auto file_descriptor_table::init() -> void { if (global_file_descriptor_table) @@ -37,11 +37,6 @@ namespace kernel::filesystem return *global_file_descriptor_table; } - auto file_descriptor_table::reset() -> void - { - global_file_descriptor_table.reset(); - } - auto file_descriptor_table::add_file(kstd::shared_ptr<open_file_description> const & file_description) -> int { if (!file_description) @@ -92,4 +87,12 @@ namespace kernel::filesystem m_open_files.at(index) = nullptr; } -} // namespace kernel::filesystem
\ No newline at end of file +} // namespace kernel::filesystem + +namespace kernel::tests::filesystem::file_descriptor_table +{ + auto deinit() -> void + { + global_file_descriptor_table.reset(); + } +} // namespace kernel::tests::filesystem::file_descriptor_table diff --git a/kernel/src/filesystem/file_descriptor_table.tests.cpp b/kernel/src/filesystem/file_descriptor_table.tests.cpp index d8c05ca..5aeadb2 100644 --- a/kernel/src/filesystem/file_descriptor_table.tests.cpp +++ b/kernel/src/filesystem/file_descriptor_table.tests.cpp @@ -1,7 +1,6 @@ #include "kernel/filesystem/file_descriptor_table.hpp" #include "kernel/filesystem/open_file_description.hpp" -#include "kernel/test_support/cpu.hpp" #include "kernel/test_support/filesystem/inode.hpp" #include <kstd/memory> @@ -10,48 +9,7 @@ #include <catch2/catch_test_macros.hpp> -struct file_descriptor_table_RAII -{ - file_descriptor_table_RAII() - { - kernel::filesystem::file_descriptor_table::init(); - } - ~file_descriptor_table_RAII() - { - kernel::filesystem::file_descriptor_table::reset(); - } -}; - -struct file_descriptor_table_reset_only -{ - ~file_descriptor_table_reset_only() - { - kernel::filesystem::file_descriptor_table::reset(); - } -}; - -SCENARIO_METHOD(file_descriptor_table_reset_only, "File descriptor table initialization", - "[filesystem][file_descriptor_table]") -{ - THEN("accessing the file descriptor table before initialization panics") - { - REQUIRE_THROWS_AS(kernel::filesystem::file_descriptor_table::get(), kernel::tests::cpu::halt); - } - - THEN("the file descriptor table can be initialized and accessed") - { - kernel::filesystem::file_descriptor_table::init(); - REQUIRE_NOTHROW(kernel::filesystem::file_descriptor_table::get()); - } - - THEN("initializing the file descriptor table more than once panics") - { - kernel::filesystem::file_descriptor_table::init(); - REQUIRE_THROWS_AS(kernel::filesystem::file_descriptor_table::init(), kernel::tests::cpu::halt); - } -} - -SCENARIO_METHOD(file_descriptor_table_RAII, "File descriptor table add/get file", "[filesystem][file_descriptor_table]") +SCENARIO("File descriptor table add/get file", "[filesystem][file_descriptor_table]") { GIVEN("a file descriptor table and an open file description") { @@ -105,7 +63,7 @@ SCENARIO_METHOD(file_descriptor_table_RAII, "File descriptor table add/get file" } } -SCENARIO_METHOD(file_descriptor_table_RAII, "File descriptor table remove file", "[filesystem][file_descriptor_table]") +SCENARIO("File descriptor table remove file", "[filesystem][file_descriptor_table]") { GIVEN("a file descriptor table with an open file description") { diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index 45ae053..67d1af2 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -17,13 +17,13 @@ #include <ranges> #include <string_view> -namespace kernel::filesystem +namespace { - namespace - { - constinit auto static active_vfs = std::optional<vfs>{}; - } // namespace + constinit auto static active_vfs = std::optional<kernel::filesystem::vfs>{}; +} // namespace +namespace kernel::filesystem +{ auto vfs::init() -> void { if (active_vfs) @@ -47,7 +47,10 @@ namespace kernel::filesystem if (auto boot_device = storage_mgmt.determine_boot_device()) { auto boot_root_fs = kernel::filesystem::filesystem::probe_and_mount(boot_device); - do_mount_internal("/", root_fs_root_dentry, boot_root_fs); + if (boot_root_fs) + { + do_mount_internal("/", root_fs_root_dentry, boot_root_fs); + } } auto device_fs = kstd::make_shared<devfs::filesystem>(); @@ -172,5 +175,12 @@ namespace kernel::filesystem return current_dentry; } +} // namespace kernel::filesystem -} // namespace kernel::filesystem
\ No newline at end of file +namespace kernel::tests::filesystem::vfs +{ + auto deinit() -> void + { + active_vfs.reset(); + } +} // namespace kernel::tests::filesystem::vfs diff --git a/kernel/src/test_support/state_reset_listener.cpp b/kernel/src/test_support/state_reset_listener.cpp index 8c95cc8..af1091c 100644 --- a/kernel/src/test_support/state_reset_listener.cpp +++ b/kernel/src/test_support/state_reset_listener.cpp @@ -2,8 +2,13 @@ #include "kapi/cpu.hpp" #include "kapi/memory.hpp" +#include "kernel/filesystem/file_descriptor_table.hpp" +#include "kernel/test_support/boot_modules.hpp" #include "kernel/test_support/cio.hpp" #include "kernel/test_support/cpu.hpp" +#include "kernel/test_support/devices/storage/management.hpp" +#include "kernel/test_support/filesystem/file_descriptor_table.hpp" +#include "kernel/test_support/filesystem/vfs.hpp" #include "kernel/test_support/memory.hpp" #include <catch2/catch_test_case_info.hpp> @@ -17,6 +22,8 @@ struct state_reset_listener : Catch::EventListenerBase void testCaseStarting(Catch::TestCaseInfo const &) override { + kernel::filesystem::file_descriptor_table::init(); + kapi::cio::init(); kapi::cpu::init(); kapi::memory::init(); @@ -24,6 +31,11 @@ struct state_reset_listener : Catch::EventListenerBase void testCaseEnded(Catch::TestCaseStats const &) override { + kernel::tests::filesystem::file_descriptor_table::deinit(); + kernel::tests::filesystem::vfs::deinit(); + kernel::tests::devices::storage::deinit(); + kernel::tests::boot_modules::deinit(); + kernel::tests::memory::deinit(); kernel::tests::cpu::deinit(); kernel::tests::cio::deinit(); |
