blob: 727bc408df33cf33a65703758836e99aa67e74bb [file] [log] [blame]
#include "gpio-presence/device_presence.hpp"
#include "gpio-presence/gpio_presence_manager.hpp"
#include <gpiod.hpp>
#include <phosphor-logging/lg2.hpp>
#include <xyz/openbmc_project/Inventory/Source/DevicePresence/client.hpp>
#include <gtest/gtest.h>
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<std::string> gpioNames = {gpioName};
std::vector<uint64_t> gpioValues = {0};
auto c = std::make_unique<gpio_presence::DevicePresence>(
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<std::string> gpioNames = {gpioName};
std::vector<uint64_t> gpioValues = {0};
auto c = std::make_unique<gpio_presence::DevicePresence>(
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<std::string> gpioNames = {gpioName};
std::vector<uint64_t> gpioValues = {0};
auto c = std::make_unique<gpio_presence::DevicePresence>(
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();
}