aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/devices.tests.cpp
blob: 1064c00008b4bed2cf741951401327d4f4263077 (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
#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;
  };

}  // 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::device_registry::get().find("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::device_registry::get().find("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::device_registry::get().find("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::device_registry::get().add(new_device);

      THEN("registration succeeds")
      {
        REQUIRE(registered);
        REQUIRE(kapi::devices::device_registry::get().find("registry_reuse_device") == new_device);
      }
    }
  }
}