aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/test_support
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-01 12:15:25 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-01 12:15:25 +0200
commit1f652b8b5ca5dbea588975466801cb1479f3dda8 (patch)
tree2852f1d7cc6d33d0cb06c66fcfcf8c03dac2a112 /kernel/src/test_support
parent0369fb7c4baa543dfb36ebb39ab53ac7560994ba (diff)
downloadteachos-1f652b8b5ca5dbea588975466801cb1479f3dda8.tar.xz
teachos-1f652b8b5ca5dbea588975466801cb1479f3dda8.zip
kernel/tests: dissolve tests into source tree
Diffstat (limited to 'kernel/src/test_support')
-rw-r--r--kernel/src/test_support/kapi/cio.cpp38
-rw-r--r--kernel/src/test_support/kapi/cpu.cpp29
-rw-r--r--kernel/src/test_support/kapi/interrupts.cpp11
-rw-r--r--kernel/src/test_support/kapi/memory.cpp86
-rw-r--r--kernel/src/test_support/log_buffer.cpp39
-rw-r--r--kernel/src/test_support/simulated_memory.cpp33
6 files changed, 236 insertions, 0 deletions
diff --git a/kernel/src/test_support/kapi/cio.cpp b/kernel/src/test_support/kapi/cio.cpp
new file mode 100644
index 0000000..6359fa8
--- /dev/null
+++ b/kernel/src/test_support/kapi/cio.cpp
@@ -0,0 +1,38 @@
+#include <kapi/cio.hpp>
+
+#include "kernel/tests/log_buffer.hpp"
+
+#include <iostream>
+#include <string>
+#include <string_view>
+
+namespace kapi::cio
+{
+
+ namespace
+ {
+
+ class test_output_device : public output_device
+ {
+ public:
+ test_output_device() = default;
+
+ auto write(output_stream stream, std::string_view text) -> void override
+ {
+ auto & standard_stream = stream == output_stream::stdout ? std::cout : std::cerr;
+ standard_stream << text;
+ if (text != "\n")
+ {
+ kernel::tests::log_buffer::append(std::string{text});
+ }
+ }
+ } device{};
+
+ } // namespace
+
+ auto init() -> void
+ {
+ set_output_device(device);
+ }
+
+} // 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
new file mode 100644
index 0000000..3ecaadc
--- /dev/null
+++ b/kernel/src/test_support/kapi/cpu.cpp
@@ -0,0 +1,29 @@
+#include "kernel/tests/cpu.hpp"
+
+#include <kapi/cpu.hpp>
+
+#include <atomic>
+#include <stdexcept>
+
+namespace kapi::cpu
+{
+
+ auto init() -> void
+ {
+ auto static initialized = std::atomic_flag{};
+ 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
+ {
+ throw kernel::tests::cpu::halt{};
+ }
+
+} // namespace kapi::cpu \ No newline at end of file
diff --git a/kernel/src/test_support/kapi/interrupts.cpp b/kernel/src/test_support/kapi/interrupts.cpp
new file mode 100644
index 0000000..0077266
--- /dev/null
+++ b/kernel/src/test_support/kapi/interrupts.cpp
@@ -0,0 +1,11 @@
+#include <kapi/interrupts.hpp>
+
+namespace kapi::interrupts
+{
+
+ auto enable() -> void
+ {
+ // TODO: enable simulated interrupts.
+ }
+
+} // namespace kapi::interrupts \ No newline at end of file
diff --git a/kernel/src/test_support/kapi/memory.cpp b/kernel/src/test_support/kapi/memory.cpp
new file mode 100644
index 0000000..6de2f60
--- /dev/null
+++ b/kernel/src/test_support/kapi/memory.cpp
@@ -0,0 +1,86 @@
+#include "kapi/memory.hpp"
+
+#include <kapi/memory.hpp>
+
+#include "kernel/tests/simulated_memory.hpp"
+
+#include <kstd/print>
+#include <kstd/units>
+
+#include <cstddef>
+#include <cstdint>
+#include <optional>
+#include <utility>
+
+namespace kapi::memory
+{
+
+ namespace
+ {
+ //! The size of the simulated RAM.
+ constexpr auto simulate_memory_size = kstd::units::MiB(32);
+
+ struct test_boostrap_frame_allocator : frame_allocator
+ {
+ auto mark_used(frame) -> void override {}
+
+ auto allocate_many(std::size_t count) noexcept -> std::optional<std::pair<frame, std::size_t>> override
+ {
+ auto start = next_free_frame;
+ next_free_frame += count;
+ return std::pair{frame{start}, count};
+ }
+
+ auto release_many(std::pair<frame, std::size_t>) -> void override {}
+
+ std::size_t next_free_frame{};
+ } boostrap_allocator;
+
+ struct test_page_mapper : page_mapper
+ {
+ auto map(page page, frame frame, flags flags) -> std::byte * override
+ {
+ kstd::println("mapping page {} onto frame {} with flags {}", page.number(), frame.number(),
+ static_cast<std::uint64_t>(flags));
+
+ if ((page.start_address() & pmm_metadata_base.raw()) == pmm_metadata_base.raw())
+ {
+ auto offset = page.start_address() & ~pmm_metadata_base.raw();
+ return kernel::tests::simulated_memory::pmm_metadata_base() + offset;
+ }
+
+ return nullptr;
+ }
+
+ auto unmap(page page) -> void override
+ {
+ kstd::println("unmapping page {}", page.number());
+ }
+
+ auto try_unmap(page page) noexcept -> bool override
+ {
+ kstd::println("trying to unmap page {}", page.number());
+ return false;
+ }
+ } test_mapper;
+
+ auto handoff_to_kernel_pmm(frame_allocator & new_allocator) -> void
+ {
+ for (auto i = 0uz; i < boostrap_allocator.next_free_frame; ++i)
+ {
+ new_allocator.mark_used(frame{i});
+ }
+ }
+
+ } // namespace
+
+ auto init() -> void
+ {
+ kernel::tests::simulated_memory::init(simulate_memory_size);
+ set_frame_allocator(boostrap_allocator);
+ set_page_mapper(test_mapper);
+
+ init_pmm(simulate_memory_size / frame::size, handoff_to_kernel_pmm);
+ }
+
+} // namespace kapi::memory \ No newline at end of file
diff --git a/kernel/src/test_support/log_buffer.cpp b/kernel/src/test_support/log_buffer.cpp
new file mode 100644
index 0000000..9e30afb
--- /dev/null
+++ b/kernel/src/test_support/log_buffer.cpp
@@ -0,0 +1,39 @@
+#include "kernel/tests/log_buffer.hpp"
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+namespace kernel::tests::log_buffer
+{
+
+ namespace
+ {
+ std::vector<std::string> recorded_messages{};
+ }
+
+ auto append(std::string const & message) -> void
+ {
+ recorded_messages.push_back(message);
+ }
+
+ auto clear() -> void
+ {
+ recorded_messages.clear();
+ }
+
+ auto flat_messages() -> std::string
+ {
+ return std::ranges::fold_left(recorded_messages, std::string{},
+ [](std::string accumulator, std::string const & message) {
+ accumulator += message;
+ return accumulator;
+ });
+ }
+
+ auto messages() -> std::vector<std::string> const &
+ {
+ return recorded_messages;
+ }
+
+} // namespace kernel::tests::log_buffer
diff --git a/kernel/src/test_support/simulated_memory.cpp b/kernel/src/test_support/simulated_memory.cpp
new file mode 100644
index 0000000..9a9b354
--- /dev/null
+++ b/kernel/src/test_support/simulated_memory.cpp
@@ -0,0 +1,33 @@
+#include "kernel/tests/simulated_memory.hpp"
+
+#include <kstd/units>
+
+#include <cstddef>
+#include <vector>
+
+namespace kernel::tests::simulated_memory
+{
+
+ namespace
+ {
+ auto constinit ram_storage = std::vector<std::byte>{};
+ auto constinit pmm_storage = std::vector<std::byte>{};
+ } // namespace
+
+ auto init(kstd::units::bytes size) -> void
+ {
+ ram_storage.resize(size / kstd::units::bytes{1});
+ pmm_storage.resize(size / kstd::units::bytes{1});
+ }
+
+ auto pmm_metadata_base() -> std::byte *
+ {
+ return pmm_storage.data();
+ }
+
+ auto ram_base() -> std::byte *
+ {
+ return ram_storage.data();
+ }
+
+} // namespace kernel::tests::simulated_memory \ No newline at end of file