#include "gpio-presence/device_presence.hpp" #include "gpio-presence/gpio_presence_manager.hpp" #include #include #include #include using namespace gpio_presence; auto requestStop(sdbusplus::async::context& io) -> sdbusplus::async::task<> { io.request_stop(); co_return; } TEST(GpioPresence, ConstructionSucceeds) { sdbusplus::async::context ctx; gpio_presence::GPIOPresenceManager s(ctx); ctx.spawn(requestStop(ctx)); ctx.run(); } TEST(GpioPresence, AcceptConfig1Gpio) { sdbusplus::async::context ctx; gpio_presence::GPIOPresenceManager sensor(ctx); std::string name = "cable0"; std::string gpioName = "TEST_GPIO"; std::vector gpioNames = {gpioName}; std::vector gpioValues = {0}; auto c = std::make_unique( ctx, gpioNames, gpioValues, name, sensor.gpioState); sensor.addConfig(name, std::move(c)); sensor.updatePresence(gpioName, false); EXPECT_EQ(sensor.getPresence(name), true); sensor.updatePresence(gpioName, true); EXPECT_EQ(sensor.getPresence(name), false); ctx.spawn(requestStop(ctx)); ctx.run(); } auto testDevicePresentDbus(sdbusplus::async::context& ctx) -> sdbusplus::async::task<> { gpio_presence::GPIOPresenceManager sensor(ctx); std::string busName = sensor.setupBusName(); std::string name = "cable0"; std::string gpioName = "TEST_GPIO"; std::vector gpioNames = {gpioName}; std::vector gpioValues = {0}; auto c = std::make_unique( ctx, gpioNames, gpioValues, name, sensor.gpioState); sdbusplus::message::object_path objPath = c->getObjPath(); sensor.addConfig(name, std::move(c)); sensor.updatePresence(gpioName, false); lg2::debug("found obj path {OBJPATH}", "OBJPATH", objPath); auto client = sdbusplus::client::xyz::openbmc_project::inventory::source:: DevicePresence<>(ctx) .service(busName) .path(objPath.str); std::string nameFound = co_await client.name(); assert(nameFound == "cable0"); ctx.request_stop(); co_return; } TEST(GpioPresence, DevicePresentDbus) { sdbusplus::async::context ctx; ctx.spawn(testDevicePresentDbus(ctx)); ctx.run(); } auto testDevicePresentThenDisappearDbus(sdbusplus::async::context& ctx) -> sdbusplus::async::task<> { gpio_presence::GPIOPresenceManager sensor(ctx); std::string busName = sensor.setupBusName(); std::string name = "cable0"; std::string gpioName = "TEST_GPIO"; std::vector gpioNames = {gpioName}; std::vector gpioValues = {0}; auto c = std::make_unique( ctx, gpioNames, gpioValues, name, sensor.gpioState); sdbusplus::message::object_path objPath = c->getObjPath(); sensor.addConfig(name, std::move(c)); sensor.updatePresence(gpioName, false); lg2::debug("found obj path {OBJPATH}", "OBJPATH", objPath); auto client = sdbusplus::client::xyz::openbmc_project::inventory::source:: DevicePresence<>(ctx) .service(busName) .path(objPath.str); std::string nameFound = co_await client.name(); assert(nameFound == "cable0"); // gpio goes high, cable 0 should disappear sensor.updatePresence(gpioName, true); try { co_await client.name(); assert(false); } catch (std::exception& _) { // expected, since cable 0 is gone. // have to do something here to shut up clang-tidy std::cout << "" << std::endl; } ctx.request_stop(); co_return; } TEST(GpioPresence, DevicePresentThenDisappearDbus) { sdbusplus::async::context ctx; ctx.spawn(testDevicePresentThenDisappearDbus(ctx)); ctx.run(); }