aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/test_support
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 /kernel/src/test_support
parent38bdee2ba829999862e37999dc212055ebedc4c6 (diff)
downloadteachos-eaec1833e978d2443ffdfc226fff60d0b5571cb6.tar.xz
teachos-eaec1833e978d2443ffdfc226fff60d0b5571cb6.zip
kernel/tests: move initialization to a listener
Diffstat (limited to 'kernel/src/test_support')
-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
5 files changed, 86 insertions, 7 deletions
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