aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-01 09:36:31 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-01 09:37:52 +0200
commitfa1ea53e6f3dd6b9b5f5f8160776b230184a30bf (patch)
tree483d7a4b48a879d535b80d20ae43dcebaec99079
parent5ae03c52fe33882416aa6044993d8422ccb33ab4 (diff)
downloadteachos-fa1ea53e6f3dd6b9b5f5f8160776b230184a30bf.tar.xz
teachos-fa1ea53e6f3dd6b9b5f5f8160776b230184a30bf.zip
kernel/tests: implement platform CIO kapi
-rw-r--r--kapi/include/kapi/cio.hpp5
-rw-r--r--kernel/tests/CMakeLists.txt5
-rw-r--r--kernel/tests/include/kernel/tests/log_buffer.hpp32
-rw-r--r--kernel/tests/kapi/cio.cpp38
-rw-r--r--kernel/tests/src/log_buffer.cpp39
-rw-r--r--kernel/tests/src/main.cpp4
-rw-r--r--kernel/tests/src/test_support.cpp19
-rw-r--r--kernel/tests/src/test_support.tests.cpp51
8 files changed, 173 insertions, 20 deletions
diff --git a/kapi/include/kapi/cio.hpp b/kapi/include/kapi/cio.hpp
index 48f3000..71b5b02 100644
--- a/kapi/include/kapi/cio.hpp
+++ b/kapi/include/kapi/cio.hpp
@@ -25,6 +25,11 @@ namespace kapi::cio
//! @return The previously active output device.
auto set_output_device(output_device & device) -> std::optional<output_device *>;
+ //! @qualifier kernel-defined
+ //! Write a string to the given output stream.
+ //!
+ //! @param stream The output stream to write to.
+ //! @param text The text to write to the stream.
auto write(output_stream stream, std::string_view text) -> void;
} // namespace kapi::cio
diff --git a/kernel/tests/CMakeLists.txt b/kernel/tests/CMakeLists.txt
index 96053f1..39ab3b7 100644
--- a/kernel/tests/CMakeLists.txt
+++ b/kernel/tests/CMakeLists.txt
@@ -3,6 +3,7 @@
#]============================================================================]
add_library("kernel_test_support"
+ "kapi/cio.cpp"
"kapi/cpu.cpp"
)
@@ -21,8 +22,10 @@ add_library("os::kernel_test_support" ALIAS "kernel_test_support")
#]============================================================================]
add_executable("kernel_tests"
+ "src/log_buffer.cpp"
"src/main.cpp"
- "src/test_support.cpp"
+
+ "src/test_support.tests.cpp"
)
target_include_directories("kernel_tests" PRIVATE
diff --git a/kernel/tests/include/kernel/tests/log_buffer.hpp b/kernel/tests/include/kernel/tests/log_buffer.hpp
new file mode 100644
index 0000000..5f2a1a7
--- /dev/null
+++ b/kernel/tests/include/kernel/tests/log_buffer.hpp
@@ -0,0 +1,32 @@
+#ifndef KERNEL_TESTS_LOG_BUFFER_HPP
+#define KERNEL_TESTS_LOG_BUFFER_HPP
+
+#include <string>
+#include <vector>
+
+namespace kernel::tests::log_buffer
+{
+
+ //! Append a message to the testing log buffer.
+ //!
+ //! @param message The message to append.
+ auto append(std::string const & message) -> void;
+
+ //! Clear the testing log buffer.
+ auto clear() -> void;
+
+ //! Get the testing log buffer as a single string.
+ //!
+ //! @return The testing log buffer as a single string.
+ auto flat_messages() -> std::string;
+
+ //! Get the testing log buffer.
+ //!
+ //! @note Messages may be split across multiple entries if they are longer than the internal kernel print buffer size.
+ //!
+ //! @return The testing log buffer.
+ auto messages() -> std::vector<std::string> const &;
+
+} // namespace kernel::tests::log_buffer
+
+#endif \ No newline at end of file
diff --git a/kernel/tests/kapi/cio.cpp b/kernel/tests/kapi/cio.cpp
new file mode 100644
index 0000000..6359fa8
--- /dev/null
+++ b/kernel/tests/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/tests/src/log_buffer.cpp b/kernel/tests/src/log_buffer.cpp
new file mode 100644
index 0000000..9e30afb
--- /dev/null
+++ b/kernel/tests/src/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/tests/src/main.cpp b/kernel/tests/src/main.cpp
index 89bb1c7..f1f9bb4 100644
--- a/kernel/tests/src/main.cpp
+++ b/kernel/tests/src/main.cpp
@@ -1,6 +1,10 @@
+#include <kapi/cio.hpp>
+
#include <catch2/catch_session.hpp>
auto main(int argc, char ** argv) -> int
{
+ kapi::cio::init();
+
return Catch::Session().run(argc, argv);
} \ No newline at end of file
diff --git a/kernel/tests/src/test_support.cpp b/kernel/tests/src/test_support.cpp
deleted file mode 100644
index bbf5dc0..0000000
--- a/kernel/tests/src/test_support.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "kapi/cpu.hpp"
-
-#include "kernel/tests/cpu.hpp"
-
-#include <catch2/catch_test_macros.hpp>
-
-SCENARIO("Kernel test support infrastructure", "[support]")
-{
- GIVEN("the test support infrastructure is initialized")
- {
- WHEN("when a CPU halt is requested")
- {
- THEN("the correct exception is thrown")
- {
- REQUIRE_THROWS_AS(kapi::cpu::halt(), kernel::tests::cpu::halt);
- }
- }
- }
-} \ No newline at end of file
diff --git a/kernel/tests/src/test_support.tests.cpp b/kernel/tests/src/test_support.tests.cpp
new file mode 100644
index 0000000..f835e65
--- /dev/null
+++ b/kernel/tests/src/test_support.tests.cpp
@@ -0,0 +1,51 @@
+#include "kapi/cpu.hpp"
+#include "kapi/system.hpp"
+
+#include "kernel/tests/cpu.hpp"
+#include "kernel/tests/log_buffer.hpp"
+
+#include <kstd/print>
+
+#include <catch2/catch_test_macros.hpp>
+
+SCENARIO("Kernel test support infrastructure", "[support]")
+{
+ GIVEN("the test support infrastructure is initialized")
+ {
+ WHEN("a CPU halt is requested")
+ {
+ THEN("the correct exception is thrown")
+ {
+ REQUIRE_THROWS_AS(kapi::cpu::halt(), kernel::tests::cpu::halt);
+ }
+ }
+
+ WHEN("a the system panics")
+ {
+ kernel::tests::log_buffer::clear();
+
+ THEN("the correct exception is thrown")
+ {
+ REQUIRE_THROWS_AS(kapi::system::panic("[kernel:tests] Test Panic"), kernel::tests::cpu::halt);
+ }
+
+ THEN("the message is appended to the log buffer")
+ {
+ CHECK_THROWS(kapi::system::panic("[kernel:tests] Test Panic"));
+ REQUIRE(kernel::tests::log_buffer::flat_messages().contains("[kernel:tests] Test Panic"));
+ }
+ }
+
+ WHEN("a regular print is issued")
+ {
+ kernel::tests::log_buffer::clear();
+
+ kstd::println("[kernel:tests] Test Print");
+
+ THEN("the message is appended to the log buffer")
+ {
+ REQUIRE(kernel::tests::log_buffer::flat_messages().contains("[kernel:tests] Test Print"));
+ }
+ }
+ }
+} \ No newline at end of file