aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-23 09:24:41 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-23 09:24:41 +0200
commitbf60a4c89130c5344b705367d7ab824a414a8521 (patch)
tree14862fa6594b6a2de8e6dd297998fcc8c6525d34 /kernel
parentf37a571da89a21262709694786573df01ce651cc (diff)
downloadkernel-bf60a4c89130c5344b705367d7ab824a414a8521.tar.xz
kernel-bf60a4c89130c5344b705367d7ab824a414a8521.zip
kapi: add device registry tests
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kapi/devices.tests.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/kernel/kapi/devices.tests.cpp b/kernel/kapi/devices.tests.cpp
new file mode 100644
index 00000000..236a812d
--- /dev/null
+++ b/kernel/kapi/devices.tests.cpp
@@ -0,0 +1,76 @@
+#include <kapi/devices.hpp>
+
+#include <kstd/memory.hpp>
+
+#include <catch2/catch_test_macros.hpp>
+
+namespace
+{
+
+ struct test_bus final : kapi::devices::bus
+ {
+ using kapi::devices::bus::bus;
+ };
+
+ struct test_device final : kapi::devices::device
+ {
+ using kapi::devices::device::device;
+
+ auto init() -> bool override
+ {
+ return true;
+ }
+ };
+
+} // namespace
+
+SCENARIO("the device registry holds devices weakly and prunes stale entries lazily", "[devices][registry]")
+{
+ GIVEN("a device attached to a bus, and therefore registered")
+ {
+ auto owner = kstd::make_shared<test_bus>("registry_test_owner");
+ owner->add_child(kstd::make_shared<test_device>("registry_test_device"));
+
+ THEN("it is discoverable via find_devices")
+ {
+ auto found = kapi::devices::find_device("registry_test_device");
+ REQUIRE(found);
+ REQUIRE(found->name() == "registry_test_device");
+ }
+
+ THEN("find_device reports no match for an uknown name")
+ {
+ REQUIRE_FALSE(kapi::devices::find_device("does_not_exist"));
+ }
+
+ WHEN("every strong reference to the device is dropped")
+ {
+ owner.reset();
+
+ THEN("find_device no longer resolves it")
+ {
+ REQUIRE_FALSE(kapi::devices::find_device("registry_test_device"));
+ }
+ }
+ }
+
+ GIVEN("a device name whose previous registration has since expired")
+ {
+ {
+ auto owner = kstd::make_shared<test_bus>("registry_reuse_owner_1");
+ owner->add_child(kstd::make_shared<test_device>("registry_reuse_device"));
+ }
+
+ WHEN("a new device is registered under the very same name")
+ {
+ auto new_device = kstd::make_shared<test_device>("registry_reuse_device");
+ auto registered = kapi::devices::register_device(new_device);
+
+ THEN("registration succeeds")
+ {
+ REQUIRE(registered);
+ REQUIRE(kapi::devices::find_device("registry_reuse_device") == new_device);
+ }
+ }
+ }
+}