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