aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-01 16:27:51 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-01 16:27:51 +0200
commiteaec1833e978d2443ffdfc226fff60d0b5571cb6 (patch)
tree10eed22698de1fe6fa02ca6f5067bf38626d51e8
parent38bdee2ba829999862e37999dc212055ebedc4c6 (diff)
downloadteachos-eaec1833e978d2443ffdfc226fff60d0b5571cb6.tar.xz
teachos-eaec1833e978d2443ffdfc226fff60d0b5571cb6.zip
kernel/tests: move initialization to a listener
-rw-r--r--kernel/CMakeLists.txt6
-rw-r--r--kernel/include/kernel/tests/simulated_memory.hpp2
-rw-r--r--kernel/src/main.tests.cpp38
-rw-r--r--kernel/src/test_support/kapi/cio.cpp5
-rw-r--r--kernel/src/test_support/kapi/cpu.cpp18
-rw-r--r--kernel/src/test_support/kapi/memory.cpp14
-rw-r--r--kernel/src/test_support/simulated_memory.cpp6
-rw-r--r--kernel/src/test_support/state_reset_listener.cpp50
8 files changed, 90 insertions, 49 deletions
diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt
index 4fadf4c..ffd5156 100644
--- a/kernel/CMakeLists.txt
+++ b/kernel/CMakeLists.txt
@@ -95,12 +95,13 @@ else()
"src/test_support/kapi/memory.cpp"
"src/test_support/log_buffer.cpp"
"src/test_support/simulated_memory.cpp"
+ "src/test_support/state_reset_listener.cpp"
)
add_library("os::kernel_test_support" ALIAS "kernel_test_support")
target_link_libraries("kernel_test_support" PUBLIC
"os::kernel"
- "Catch2::Catch2"
+ "Catch2::Catch2WithMain"
)
add_executable("kernel_tests"
@@ -116,9 +117,6 @@ else()
# Storage Subsystem Tests
"src/devices/storage/ram_disk/device.tests.cpp"
-
- # Test Executable Main
- "src/main.tests.cpp"
)
add_executable("os::kernel_tests" ALIAS "kernel_tests")
diff --git a/kernel/include/kernel/tests/simulated_memory.hpp b/kernel/include/kernel/tests/simulated_memory.hpp
index 156b1e1..fee4d7a 100644
--- a/kernel/include/kernel/tests/simulated_memory.hpp
+++ b/kernel/include/kernel/tests/simulated_memory.hpp
@@ -10,6 +10,8 @@ namespace kernel::tests::simulated_memory
auto init(kstd::units::bytes size) -> void;
+ auto reset() -> void;
+
auto pmm_metadata_base() -> std::byte *;
auto ram_base() -> std::byte *;
diff --git a/kernel/src/main.tests.cpp b/kernel/src/main.tests.cpp
deleted file mode 100644
index b3ae142..0000000
--- a/kernel/src/main.tests.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#include "kapi/interrupts.hpp"
-#include "kapi/memory.hpp"
-#include <kapi/cio.hpp>
-#include <kapi/cpu.hpp>
-
-#include <catch2/catch_session.hpp>
-
-auto main(int argc, char ** argv) -> int
-{
- auto session = Catch::Session{};
-
- if (auto result = session.applyCommandLine(argc, argv); result != 0)
- {
- return result;
- }
-
- auto const & config = session.configData();
- auto skip_init = config.listTests || //
- config.listTags || //
- config.listReporters || //
- config.listListeners || //
- config.showHelp;
-
- if (!skip_init)
- {
- kapi::cio::init();
- kapi::cpu::init();
- kapi::interrupts::enable();
-
- kapi::memory::init();
- // note: no kernel heap is created, since we are in the test environment. Nonetheless, we still initialize the
- // memory subsystem, so that components that rely on it can be tested. No component must ever rely on the heap
- // allocator directly, rather they have to go through the new and delete. However, some components may use the frame
- // allocator and page mapper in order to perform their tasks.
- }
-
- return session.run();
-}
diff --git a/kernel/src/test_support/kapi/cio.cpp b/kernel/src/test_support/kapi/cio.cpp
index 6359fa8..0dd4b8c 100644
--- a/kernel/src/test_support/kapi/cio.cpp
+++ b/kernel/src/test_support/kapi/cio.cpp
@@ -35,4 +35,9 @@ namespace kapi::cio
set_output_device(device);
}
+ auto reset() -> void
+ {
+ kernel::tests::log_buffer::clear();
+ }
+
} // namespace kapi::cio \ No newline at end of file
diff --git a/kernel/src/test_support/kapi/cpu.cpp b/kernel/src/test_support/kapi/cpu.cpp
index 3ecaadc..9b2f0b9 100644
--- a/kernel/src/test_support/kapi/cpu.cpp
+++ b/kernel/src/test_support/kapi/cpu.cpp
@@ -8,17 +8,29 @@
namespace kapi::cpu
{
- auto init() -> void
+ namespace
{
auto static initialized = std::atomic_flag{};
+ }
+
+ auto reset() -> void
+ {
+ if (!initialized.test())
+ {
+ throw std::logic_error{"kapi::cpu::reset() called before kapi::cpu::init()"};
+ }
+
+ initialized.clear();
+ }
+
+ auto init() -> void
+ {
if (initialized.test_and_set())
{
throw std::logic_error("kapi::cpu::init() called more than once");
}
// TODO: make sure that simulated interrupt can run.
-
- return;
}
auto halt() -> void
diff --git a/kernel/src/test_support/kapi/memory.cpp b/kernel/src/test_support/kapi/memory.cpp
index 556962c..4f261ac 100644
--- a/kernel/src/test_support/kapi/memory.cpp
+++ b/kernel/src/test_support/kapi/memory.cpp
@@ -21,7 +21,7 @@ namespace kapi::memory
constexpr auto simulate_memory_size = kstd::units::MiB(32);
constexpr auto number_of_simulated_frames = simulate_memory_size / frame::size;
- struct test_boostrap_frame_allocator : frame_allocator
+ struct test_bootstrap_frame_allocator : frame_allocator
{
auto mark_used(frame) -> void override {}
@@ -35,7 +35,7 @@ namespace kapi::memory
auto release_many(std::pair<frame, std::size_t>) -> void override {}
std::size_t next_free_frame{};
- } boostrap_allocator;
+ } bootstrap_allocator;
struct test_page_mapper : page_mapper
{
@@ -67,7 +67,7 @@ namespace kapi::memory
auto handoff_to_kernel_pmm(frame_allocator & new_allocator) -> void
{
- auto first_free_frame = boostrap_allocator.next_free_frame;
+ auto first_free_frame = bootstrap_allocator.next_free_frame;
auto number_of_free_frames = number_of_simulated_frames - first_free_frame;
new_allocator.release_many({frame{first_free_frame}, number_of_free_frames});
}
@@ -77,10 +77,16 @@ namespace kapi::memory
auto init() -> void
{
kernel::tests::simulated_memory::init(simulate_memory_size);
- set_frame_allocator(boostrap_allocator);
+ set_frame_allocator(bootstrap_allocator);
set_page_mapper(test_mapper);
init_pmm(simulate_memory_size / frame::size, handoff_to_kernel_pmm);
}
+ auto reset() -> void
+ {
+ kernel::tests::simulated_memory::reset();
+ bootstrap_allocator.next_free_frame = 0;
+ }
+
} // namespace kapi::memory \ No newline at end of file
diff --git a/kernel/src/test_support/simulated_memory.cpp b/kernel/src/test_support/simulated_memory.cpp
index 9a9b354..49e172f 100644
--- a/kernel/src/test_support/simulated_memory.cpp
+++ b/kernel/src/test_support/simulated_memory.cpp
@@ -20,6 +20,12 @@ namespace kernel::tests::simulated_memory
pmm_storage.resize(size / kstd::units::bytes{1});
}
+ auto reset() -> void
+ {
+ ram_storage.clear();
+ pmm_storage.clear();
+ }
+
auto pmm_metadata_base() -> std::byte *
{
return pmm_storage.data();
diff --git a/kernel/src/test_support/state_reset_listener.cpp b/kernel/src/test_support/state_reset_listener.cpp
new file mode 100644
index 0000000..e201a10
--- /dev/null
+++ b/kernel/src/test_support/state_reset_listener.cpp
@@ -0,0 +1,50 @@
+#include "kapi/cio.hpp"
+#include "kapi/cpu.hpp"
+#include "kapi/memory.hpp"
+
+#include <catch2/catch_test_case_info.hpp>
+#include <catch2/interfaces/catch_interfaces_reporter.hpp>
+#include <catch2/reporters/catch_reporter_event_listener.hpp>
+#include <catch2/reporters/catch_reporter_registrars.hpp>
+
+namespace kapi
+{
+ namespace cio
+ {
+ auto reset() -> void;
+ }
+
+ namespace cpu
+ {
+ auto reset() -> void;
+ }
+
+ namespace memory
+ {
+ auto reset() -> void;
+ }
+} // namespace kapi
+
+struct state_reset_listener : Catch::EventListenerBase
+{
+ using EventListenerBase::EventListenerBase;
+
+ void testCaseStarting(Catch::TestCaseInfo const &) override
+ {
+ kapi::cio::init();
+ kapi::cpu::init();
+ kapi::memory::init();
+ }
+
+ void testCaseEnded(Catch::TestCaseStats const &) override
+ {
+ kapi::memory::reset();
+ kapi::cpu::reset();
+ kapi::cio::reset();
+ }
+};
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+CATCH_REGISTER_LISTENER(state_reset_listener);
+#pragma GCC diagnostic pop \ No newline at end of file