| Alexander Hansen | 8c4b1d9 | 2024-11-04 14:06:24 +0100 | [diff] [blame] | 1 | #include "gpio-presence/device_presence.hpp" | 
|  | 2 | #include "gpio-presence/gpio_presence_manager.hpp" | 
|  | 3 |  | 
|  | 4 | #include <gpiod.hpp> | 
|  | 5 | #include <phosphor-logging/lg2.hpp> | 
|  | 6 | #include <xyz/openbmc_project/Inventory/Source/DevicePresence/client.hpp> | 
|  | 7 |  | 
|  | 8 | #include <gtest/gtest.h> | 
|  | 9 |  | 
|  | 10 | using namespace gpio_presence; | 
|  | 11 |  | 
|  | 12 | auto requestStop(sdbusplus::async::context& io) -> sdbusplus::async::task<> | 
|  | 13 | { | 
|  | 14 | io.request_stop(); | 
|  | 15 | co_return; | 
|  | 16 | } | 
|  | 17 |  | 
|  | 18 | TEST(GpioPresence, ConstructionSucceeds) | 
|  | 19 | { | 
|  | 20 | sdbusplus::async::context ctx; | 
|  | 21 |  | 
|  | 22 | gpio_presence::GPIOPresenceManager s(ctx); | 
|  | 23 |  | 
|  | 24 | ctx.spawn(requestStop(ctx)); | 
|  | 25 | ctx.run(); | 
|  | 26 | } | 
|  | 27 |  | 
|  | 28 | TEST(GpioPresence, AcceptConfig1Gpio) | 
|  | 29 | { | 
|  | 30 | sdbusplus::async::context ctx; | 
|  | 31 |  | 
|  | 32 | gpio_presence::GPIOPresenceManager sensor(ctx); | 
|  | 33 |  | 
|  | 34 | std::string name = "cable0"; | 
|  | 35 | std::string gpioName = "TEST_GPIO"; | 
|  | 36 |  | 
|  | 37 | std::vector<std::string> gpioNames = {gpioName}; | 
|  | 38 | std::vector<uint64_t> gpioValues = {0}; | 
|  | 39 |  | 
|  | 40 | auto c = std::make_unique<gpio_presence::DevicePresence>( | 
|  | 41 | ctx, gpioNames, gpioValues, name, sensor.gpioState); | 
|  | 42 |  | 
|  | 43 | sensor.addConfig(name, std::move(c)); | 
|  | 44 |  | 
|  | 45 | sensor.updatePresence(gpioName, false); | 
|  | 46 |  | 
|  | 47 | EXPECT_EQ(sensor.getPresence(name), true); | 
|  | 48 |  | 
|  | 49 | sensor.updatePresence(gpioName, true); | 
|  | 50 |  | 
|  | 51 | EXPECT_EQ(sensor.getPresence(name), false); | 
|  | 52 |  | 
|  | 53 | ctx.spawn(requestStop(ctx)); | 
|  | 54 | ctx.run(); | 
|  | 55 | } | 
|  | 56 |  | 
|  | 57 | auto testDevicePresentDbus(sdbusplus::async::context& ctx) | 
|  | 58 | -> sdbusplus::async::task<> | 
|  | 59 | { | 
|  | 60 | gpio_presence::GPIOPresenceManager sensor(ctx); | 
|  | 61 |  | 
|  | 62 | std::string busName = sensor.setupBusName(); | 
|  | 63 |  | 
|  | 64 | std::string name = "cable0"; | 
|  | 65 | std::string gpioName = "TEST_GPIO"; | 
|  | 66 |  | 
|  | 67 | std::vector<std::string> gpioNames = {gpioName}; | 
|  | 68 | std::vector<uint64_t> gpioValues = {0}; | 
|  | 69 |  | 
|  | 70 | auto c = std::make_unique<gpio_presence::DevicePresence>( | 
|  | 71 | ctx, gpioNames, gpioValues, name, sensor.gpioState); | 
|  | 72 |  | 
|  | 73 | sdbusplus::message::object_path objPath = c->getObjPath(); | 
|  | 74 |  | 
|  | 75 | sensor.addConfig(name, std::move(c)); | 
|  | 76 |  | 
|  | 77 | sensor.updatePresence(gpioName, false); | 
|  | 78 |  | 
|  | 79 | lg2::debug("found obj path {OBJPATH}", "OBJPATH", objPath); | 
|  | 80 |  | 
|  | 81 | auto client = sdbusplus::client::xyz::openbmc_project::inventory::source:: | 
|  | 82 | DevicePresence<>(ctx) | 
|  | 83 | .service(busName) | 
|  | 84 | .path(objPath.str); | 
|  | 85 |  | 
|  | 86 | std::string nameFound = co_await client.name(); | 
|  | 87 |  | 
|  | 88 | assert(nameFound == "cable0"); | 
|  | 89 |  | 
|  | 90 | ctx.request_stop(); | 
|  | 91 |  | 
|  | 92 | co_return; | 
|  | 93 | } | 
|  | 94 |  | 
|  | 95 | TEST(GpioPresence, DevicePresentDbus) | 
|  | 96 | { | 
|  | 97 | sdbusplus::async::context ctx; | 
|  | 98 | ctx.spawn(testDevicePresentDbus(ctx)); | 
|  | 99 | ctx.run(); | 
|  | 100 | } | 
|  | 101 |  | 
|  | 102 | auto testDevicePresentThenDisappearDbus(sdbusplus::async::context& ctx) | 
|  | 103 | -> sdbusplus::async::task<> | 
|  | 104 | { | 
|  | 105 | gpio_presence::GPIOPresenceManager sensor(ctx); | 
|  | 106 |  | 
|  | 107 | std::string busName = sensor.setupBusName(); | 
|  | 108 |  | 
|  | 109 | std::string name = "cable0"; | 
|  | 110 | std::string gpioName = "TEST_GPIO"; | 
|  | 111 |  | 
|  | 112 | std::vector<std::string> gpioNames = {gpioName}; | 
|  | 113 | std::vector<uint64_t> gpioValues = {0}; | 
|  | 114 |  | 
|  | 115 | auto c = std::make_unique<gpio_presence::DevicePresence>( | 
|  | 116 | ctx, gpioNames, gpioValues, name, sensor.gpioState); | 
|  | 117 |  | 
|  | 118 | sdbusplus::message::object_path objPath = c->getObjPath(); | 
|  | 119 |  | 
|  | 120 | sensor.addConfig(name, std::move(c)); | 
|  | 121 |  | 
|  | 122 | sensor.updatePresence(gpioName, false); | 
|  | 123 |  | 
|  | 124 | lg2::debug("found obj path {OBJPATH}", "OBJPATH", objPath); | 
|  | 125 |  | 
|  | 126 | auto client = sdbusplus::client::xyz::openbmc_project::inventory::source:: | 
|  | 127 | DevicePresence<>(ctx) | 
|  | 128 | .service(busName) | 
|  | 129 | .path(objPath.str); | 
|  | 130 |  | 
|  | 131 | std::string nameFound = co_await client.name(); | 
|  | 132 |  | 
|  | 133 | assert(nameFound == "cable0"); | 
|  | 134 |  | 
|  | 135 | // gpio goes high, cable 0 should disappear | 
|  | 136 | sensor.updatePresence(gpioName, true); | 
|  | 137 |  | 
|  | 138 | try | 
|  | 139 | { | 
|  | 140 | co_await client.name(); | 
|  | 141 | assert(false); | 
|  | 142 | } | 
|  | 143 | catch (std::exception& _) | 
|  | 144 | { | 
|  | 145 | // expected, since cable 0 is gone. | 
|  | 146 | // have to do something here to shut up clang-tidy | 
|  | 147 | std::cout << "" << std::endl; | 
|  | 148 | } | 
|  | 149 |  | 
|  | 150 | ctx.request_stop(); | 
|  | 151 |  | 
|  | 152 | co_return; | 
|  | 153 | } | 
|  | 154 |  | 
|  | 155 | TEST(GpioPresence, DevicePresentThenDisappearDbus) | 
|  | 156 | { | 
|  | 157 | sdbusplus::async::context ctx; | 
|  | 158 | ctx.spawn(testDevicePresentThenDisappearDbus(ctx)); | 
|  | 159 | ctx.run(); | 
|  | 160 | } |