blob: 236a812d7bf95f6e02e63ab9fedfeecf19cee6a9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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);
}
}
}
}
|