aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/CMakeLists.txt2
-rw-r--r--kernel/include/kernel/test_support/devices/storage/management.hpp4
-rw-r--r--kernel/include/kernel/test_support/filesystem/storage_boot_module_fixture.hpp23
-rw-r--r--kernel/src/devices/storage/management.cpp4
-rw-r--r--kernel/src/filesystem/devfs/filesystem.tests.cpp63
-rw-r--r--kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp43
-rw-r--r--kernel/src/test_support/state_reset_listener.cpp2
7 files changed, 136 insertions, 5 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 1cbb9e4..6a2e4b5 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -105,6 +105,7 @@ else()
"src/test_support/devices/character_device.cpp"
"src/test_support/filesystem/inode.cpp"
"src/test_support/filesystem/filesystem.cpp"
+ "src/test_support/filesystem/storage_boot_module_fixture.cpp"
"src/test_support/log_buffer.cpp"
"src/test_support/output_device.cpp"
"src/test_support/page_mapper.cpp"
@@ -131,6 +132,7 @@ else()
"src/memory/block_list_allocator.tests.cpp"
# Filesystem Subsystem Tests
+ "src/filesystem/devfs/filesystem.tests.cpp"
"src/filesystem/devfs/inode.tests.cpp"
"src/filesystem/rootfs/filesystem.tests.cpp"
"src/filesystem/rootfs/inode.tests.cpp"
diff --git a/kernel/include/kernel/test_support/devices/storage/management.hpp b/kernel/include/kernel/test_support/devices/storage/management.hpp
index 7c0d304..581aa91 100644
--- a/kernel/include/kernel/test_support/devices/storage/management.hpp
+++ b/kernel/include/kernel/test_support/devices/storage/management.hpp
@@ -1,10 +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
+namespace kernel::tests::devices::storage::management
{
//! Deinitialize the storage management singleton.
auto deinit() -> void;
-} // namespace kernel::tests::devices::storage
+} // namespace kernel::tests::devices::storage::management
#endif \ No newline at end of file
diff --git a/kernel/include/kernel/test_support/filesystem/storage_boot_module_fixture.hpp b/kernel/include/kernel/test_support/filesystem/storage_boot_module_fixture.hpp
new file mode 100644
index 0000000..a57659b
--- /dev/null
+++ b/kernel/include/kernel/test_support/filesystem/storage_boot_module_fixture.hpp
@@ -0,0 +1,23 @@
+#ifndef TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_STORAGE_BOOT_MODULE_FIXTURE_HPP
+#define TEACHOS_KERNEL_TEST_SUPPORT_FILESYSTEM_STORAGE_BOOT_MODULE_FIXTURE_HPP
+
+#include "kapi/boot_module/boot_module_registry.hpp"
+
+#include <cstddef>
+#include <string>
+#include <vector>
+
+namespace kernel::tests::filesystem
+{
+ struct storage_boot_module_fixture
+ {
+ auto setup_modules(std::size_t module_count, std::size_t module_size = 4096) -> void;
+
+ protected:
+ kapi::boot_modules::boot_module_registry registry{};
+ std::vector<std::string> module_names{};
+ std::vector<std::vector<std::byte>> module_data{};
+ };
+} // namespace kernel::tests::filesystem
+
+#endif \ No newline at end of file
diff --git a/kernel/src/devices/storage/management.cpp b/kernel/src/devices/storage/management.cpp
index 14a045a..c9fa0a8 100644
--- a/kernel/src/devices/storage/management.cpp
+++ b/kernel/src/devices/storage/management.cpp
@@ -83,11 +83,11 @@ namespace kernel::devices::storage
}
} // namespace kernel::devices::storage
-namespace kernel::tests::devices::storage
+namespace kernel::tests::devices::storage::management
{
auto deinit() -> void
{
active_storage_management.reset();
next_free_major = START_MAJOR;
}
-} // namespace kernel::tests::devices::storage
+} // namespace kernel::tests::devices::storage::management
diff --git a/kernel/src/filesystem/devfs/filesystem.tests.cpp b/kernel/src/filesystem/devfs/filesystem.tests.cpp
new file mode 100644
index 0000000..1d82bf9
--- /dev/null
+++ b/kernel/src/filesystem/devfs/filesystem.tests.cpp
@@ -0,0 +1,63 @@
+#include "kernel/filesystem/devfs/filesystem.hpp"
+
+#include "kernel/filesystem/filesystem.hpp"
+#include "kernel/test_support/filesystem/storage_boot_module_fixture.hpp"
+
+#include <catch2/catch_test_macros.hpp>
+
+SCENARIO_METHOD(kernel::tests::filesystem::storage_boot_module_fixture,
+ "Devfs filesystem lookup uses storage management devices", "[filesystem][devfs][filesystem]")
+{
+ GIVEN("a boot module registry with one module")
+ {
+ setup_modules(1);
+
+ auto fs = kernel::filesystem::devfs::filesystem{};
+ auto result = fs.mount(nullptr);
+
+ THEN("mount succeeds")
+ {
+ REQUIRE(result == kernel::filesystem::filesystem::operation_result::success);
+ REQUIRE(fs.root_inode() != nullptr);
+ }
+
+ THEN("lookup on root finds ram0 device inode")
+ {
+ auto inode = fs.lookup(fs.root_inode(), "ram0");
+ REQUIRE(inode != nullptr);
+ REQUIRE(inode->is_device());
+ }
+
+ THEN("lookup of an unknown device returns null")
+ {
+ auto inode = fs.lookup(fs.root_inode(), "ram99");
+ REQUIRE(inode == nullptr);
+ }
+
+ THEN("lookup with a non-directory parent returns null")
+ {
+ auto non_directory_inode = fs.lookup(fs.root_inode(), "ram0");
+ REQUIRE(non_directory_inode != nullptr);
+ REQUIRE(!non_directory_inode->is_directory());
+
+ auto result = fs.lookup(non_directory_inode, "anything");
+ REQUIRE(result == nullptr);
+ }
+ }
+
+ GIVEN("a boot module registry with three modules")
+ {
+ setup_modules(3, 2048);
+
+ auto fs = kernel::filesystem::devfs::filesystem{};
+ auto result = fs.mount(nullptr);
+ REQUIRE(result == kernel::filesystem::filesystem::operation_result::success);
+
+ THEN("lookup finds all generated RAM devices")
+ {
+ REQUIRE(fs.lookup(fs.root_inode(), "ram0") != nullptr);
+ REQUIRE(fs.lookup(fs.root_inode(), "ram16") != nullptr);
+ REQUIRE(fs.lookup(fs.root_inode(), "ram32") != nullptr);
+ }
+ }
+}
diff --git a/kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp b/kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp
new file mode 100644
index 0000000..8bbf194
--- /dev/null
+++ b/kernel/src/test_support/filesystem/storage_boot_module_fixture.cpp
@@ -0,0 +1,43 @@
+#include "kernel/test_support/filesystem/storage_boot_module_fixture.hpp"
+
+#include "kapi/boot_module/boot_module.hpp"
+#include "kapi/boot_modules.hpp"
+#include "kapi/memory.hpp"
+
+#include "kernel/devices/storage/management.hpp"
+#include "kernel/test_support/boot_modules.hpp"
+#include "kernel/test_support/devices/storage/management.hpp"
+
+#include <cstddef>
+#include <string>
+
+namespace kernel::tests::filesystem
+{
+ auto storage_boot_module_fixture::setup_modules(std::size_t module_count, std::size_t module_size) -> void
+ {
+ kernel::tests::devices::storage::management::deinit();
+ kernel::tests::boot_modules::deinit();
+
+ module_names.clear();
+ module_data.clear();
+ registry = {};
+
+ module_names.reserve(module_count);
+ module_data.reserve(module_count);
+
+ for (std::size_t i = 0; i < module_count; ++i)
+ {
+ module_names.push_back("test_mod" + std::to_string(i));
+ module_data.emplace_back(module_size, std::byte{static_cast<unsigned char>(0x40 + (i % 16))});
+ }
+
+ for (std::size_t i = 0; i < module_count; ++i)
+ {
+ registry.add_boot_module(kapi::boot_modules::boot_module{
+ module_names[i], kapi::memory::linear_address{module_data[i].data()}, module_data[i].size()});
+ }
+
+ kapi::boot_modules::set_boot_module_registry(registry);
+ kernel::devices::storage::management::init();
+ }
+} // namespace kernel::tests::filesystem \ No newline at end of file
diff --git a/kernel/src/test_support/state_reset_listener.cpp b/kernel/src/test_support/state_reset_listener.cpp
index af1091c..9120c89 100644
--- a/kernel/src/test_support/state_reset_listener.cpp
+++ b/kernel/src/test_support/state_reset_listener.cpp
@@ -33,8 +33,8 @@ struct state_reset_listener : Catch::EventListenerBase
{
kernel::tests::filesystem::file_descriptor_table::deinit();
kernel::tests::filesystem::vfs::deinit();
- kernel::tests::devices::storage::deinit();
kernel::tests::boot_modules::deinit();
+ kernel::tests::devices::storage::management::deinit();
kernel::tests::memory::deinit();
kernel::tests::cpu::deinit();