diff options
Diffstat (limited to 'kernel/kapi')
| -rw-r--r-- | kernel/kapi/devices.tests.cpp | 76 |
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); + } + } + } +} |
