xref: /openbmc/telemetry/tests/src/test_sensor.cpp (revision 583ba441654657bb4ba9d051b747144a7258c159)
1b5645947SKrzysztof Grobelny #include "dbus_environment.hpp"
2d2238194SKrzysztof Grobelny #include "helpers.hpp"
3b5645947SKrzysztof Grobelny #include "mocks/sensor_listener_mock.hpp"
4b5645947SKrzysztof Grobelny #include "sensor.hpp"
5b5645947SKrzysztof Grobelny #include "sensor_cache.hpp"
6b5645947SKrzysztof Grobelny #include "stubs/dbus_sensor_object.hpp"
7b8cc78ddSKrzysztof Grobelny #include "utils/clock.hpp"
8b5645947SKrzysztof Grobelny 
9b5645947SKrzysztof Grobelny #include <sdbusplus/asio/property.hpp>
10b5645947SKrzysztof Grobelny 
11b5645947SKrzysztof Grobelny #include <thread>
12b5645947SKrzysztof Grobelny 
13b5645947SKrzysztof Grobelny #include <gmock/gmock.h>
14b5645947SKrzysztof Grobelny 
15b5645947SKrzysztof Grobelny using namespace testing;
16b5645947SKrzysztof Grobelny using namespace std::chrono_literals;
17b5645947SKrzysztof Grobelny 
18b5645947SKrzysztof Grobelny class TestSensor : public Test
19b5645947SKrzysztof Grobelny {
20b5645947SKrzysztof Grobelny   public:
SetUp()21b5645947SKrzysztof Grobelny     void SetUp() override
22b5645947SKrzysztof Grobelny     {
235ade2b1dSWludzik, Jozef         sensorObject->setValue(42.7);
24b5645947SKrzysztof Grobelny     }
25b5645947SKrzysztof Grobelny 
TearDown()26b5645947SKrzysztof Grobelny     void TearDown() override
27b5645947SKrzysztof Grobelny     {
28b5645947SKrzysztof Grobelny         DbusEnvironment::synchronizeIoc();
29b5645947SKrzysztof Grobelny     }
30b5645947SKrzysztof Grobelny 
registerForUpdates(std::shared_ptr<interfaces::SensorListener> listener)31*583ba441SPatrick Williams     void registerForUpdates(
32*583ba441SPatrick Williams         std::shared_ptr<interfaces::SensorListener> listener)
33b5645947SKrzysztof Grobelny     {
345ade2b1dSWludzik, Jozef         sut->registerForUpdates(listener);
355ade2b1dSWludzik, Jozef         DbusEnvironment::synchronizeIoc();
36b5645947SKrzysztof Grobelny     }
37b5645947SKrzysztof Grobelny 
unregisterFromUpdates(std::shared_ptr<interfaces::SensorListener> listener)387e098e93SLukasz Kazmierczak     void unregisterFromUpdates(
397e098e93SLukasz Kazmierczak         std::shared_ptr<interfaces::SensorListener> listener)
407e098e93SLukasz Kazmierczak     {
417e098e93SLukasz Kazmierczak         sut->unregisterFromUpdates(listener);
427e098e93SLukasz Kazmierczak         DbusEnvironment::synchronizeIoc();
437e098e93SLukasz Kazmierczak     }
447e098e93SLukasz Kazmierczak 
makeSensorObject()455ade2b1dSWludzik, Jozef     static std::unique_ptr<stubs::DbusSensorObject> makeSensorObject()
465ade2b1dSWludzik, Jozef     {
475ade2b1dSWludzik, Jozef         return std::make_unique<stubs::DbusSensorObject>(
485ade2b1dSWludzik, Jozef             DbusEnvironment::getIoc(), DbusEnvironment::getBus(),
495ade2b1dSWludzik, Jozef             DbusEnvironment::getObjServer());
505ade2b1dSWludzik, Jozef     }
51b5645947SKrzysztof Grobelny 
525ade2b1dSWludzik, Jozef     std::unique_ptr<stubs::DbusSensorObject> sensorObject = makeSensorObject();
53b5645947SKrzysztof Grobelny 
54b5645947SKrzysztof Grobelny     SensorCache sensorCache;
5551f0fd50SKrzysztof Grobelny     Milliseconds timestamp = Clock().steadyTimestamp();
56b5645947SKrzysztof Grobelny     std::shared_ptr<Sensor> sut = sensorCache.makeSensor<Sensor>(
57b8cc78ddSKrzysztof Grobelny         DbusEnvironment::serviceName(), sensorObject->path(), "metadata",
58b5645947SKrzysztof Grobelny         DbusEnvironment::getIoc(), DbusEnvironment::getBus());
59b5645947SKrzysztof Grobelny     std::shared_ptr<SensorListenerMock> listenerMock =
60b5645947SKrzysztof Grobelny         std::make_shared<StrictMock<SensorListenerMock>>();
61b5645947SKrzysztof Grobelny     std::shared_ptr<SensorListenerMock> listenerMock2 =
62b5645947SKrzysztof Grobelny         std::make_shared<StrictMock<SensorListenerMock>>();
635ade2b1dSWludzik, Jozef     MockFunction<void()> checkPoint;
64b5645947SKrzysztof Grobelny };
65b5645947SKrzysztof Grobelny 
TEST_F(TestSensor,createsCorretlyViaSensorCache)66b5645947SKrzysztof Grobelny TEST_F(TestSensor, createsCorretlyViaSensorCache)
67b5645947SKrzysztof Grobelny {
68b5645947SKrzysztof Grobelny     ASSERT_THAT(sut->id(),
696ccfcbf5SKrzysztof Grobelny                 Eq(Sensor::Id("Sensor", DbusEnvironment::serviceName(),
705ade2b1dSWludzik, Jozef                               sensorObject->path())));
71b5645947SKrzysztof Grobelny }
72b5645947SKrzysztof Grobelny 
TEST_F(TestSensor,notifiesWithValueAfterRegister)73b5645947SKrzysztof Grobelny TEST_F(TestSensor, notifiesWithValueAfterRegister)
74b5645947SKrzysztof Grobelny {
75b5645947SKrzysztof Grobelny     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
760e29f439SWludzik, Jozef         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
77b5645947SKrzysztof Grobelny 
78b5645947SKrzysztof Grobelny     registerForUpdates(listenerMock);
79b5645947SKrzysztof Grobelny 
80b5645947SKrzysztof Grobelny     ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
81b5645947SKrzysztof Grobelny }
82b5645947SKrzysztof Grobelny 
TEST_F(TestSensor,notifiesOnceWithValueAfterRegister)83b5645947SKrzysztof Grobelny TEST_F(TestSensor, notifiesOnceWithValueAfterRegister)
84b5645947SKrzysztof Grobelny {
85b5645947SKrzysztof Grobelny     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
860e29f439SWludzik, Jozef         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
87b5645947SKrzysztof Grobelny     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
880e29f439SWludzik, Jozef         .WillOnce(
890e29f439SWludzik, Jozef             InvokeWithoutArgs(DbusEnvironment::setPromise("async_read2")));
90b5645947SKrzysztof Grobelny 
91b5645947SKrzysztof Grobelny     DbusEnvironment::synchronizedPost([this] {
92b5645947SKrzysztof Grobelny         sut->registerForUpdates(listenerMock);
93b5645947SKrzysztof Grobelny         sut->registerForUpdates(listenerMock2);
94b5645947SKrzysztof Grobelny     });
95b5645947SKrzysztof Grobelny 
96b5645947SKrzysztof Grobelny     ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
97b5645947SKrzysztof Grobelny     ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read2"));
98b5645947SKrzysztof Grobelny }
99b5645947SKrzysztof Grobelny 
TEST_F(TestSensor,getLabeledInfoReturnsCorrectly)10094f71c51SSzymon Dompke TEST_F(TestSensor, getLabeledInfoReturnsCorrectly)
10194f71c51SSzymon Dompke {
10294f71c51SSzymon Dompke     auto expected = LabeledSensorInfo(DbusEnvironment::serviceName(),
10394f71c51SSzymon Dompke                                       sensorObject->path(), "metadata");
10494f71c51SSzymon Dompke     EXPECT_EQ(sut->getLabeledSensorInfo(), expected);
10594f71c51SSzymon Dompke }
10694f71c51SSzymon Dompke 
TEST_F(TestSensor,getNameReturnsPathWhenMetadataIsNotSet)10794f71c51SSzymon Dompke TEST_F(TestSensor, getNameReturnsPathWhenMetadataIsNotSet)
10894f71c51SSzymon Dompke {
10994f71c51SSzymon Dompke     static const char* path = "/telemetry/ut/DbusSensorObject2";
110*583ba441SPatrick Williams     sut = sensorCache.makeSensor<Sensor>(
111*583ba441SPatrick Williams         DbusEnvironment::serviceName(), path, "", DbusEnvironment::getIoc(),
11294f71c51SSzymon Dompke         DbusEnvironment::getBus());
11394f71c51SSzymon Dompke     EXPECT_EQ(sut->getName(), path);
11494f71c51SSzymon Dompke }
11594f71c51SSzymon Dompke 
TEST_F(TestSensor,getNameReturnsMetadataWhenMetadataIsSet)11694f71c51SSzymon Dompke TEST_F(TestSensor, getNameReturnsMetadataWhenMetadataIsSet)
11794f71c51SSzymon Dompke {
11894f71c51SSzymon Dompke     static const char* path = "/telemetry/ut/DbusSensorObject2";
119*583ba441SPatrick Williams     sut = sensorCache.makeSensor<Sensor>(
120*583ba441SPatrick Williams         DbusEnvironment::serviceName(), path, "metadata2",
121*583ba441SPatrick Williams         DbusEnvironment::getIoc(), DbusEnvironment::getBus());
12294f71c51SSzymon Dompke     EXPECT_EQ(sut->getName(), "metadata2");
12394f71c51SSzymon Dompke }
12494f71c51SSzymon Dompke 
125b5645947SKrzysztof Grobelny class TestSensorNotification : public TestSensor
126b5645947SKrzysztof Grobelny {
127b5645947SKrzysztof Grobelny   public:
SetUp()128b5645947SKrzysztof Grobelny     void SetUp() override
129b5645947SKrzysztof Grobelny     {
130b5645947SKrzysztof Grobelny         EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 0.))
1310e29f439SWludzik, Jozef             .WillOnce(
1320e29f439SWludzik, Jozef                 InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
133b5645947SKrzysztof Grobelny 
134b5645947SKrzysztof Grobelny         registerForUpdates(listenerMock);
135b5645947SKrzysztof Grobelny 
136b5645947SKrzysztof Grobelny         ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
137b5645947SKrzysztof Grobelny     }
138b5645947SKrzysztof Grobelny };
139b5645947SKrzysztof Grobelny 
TEST_F(TestSensorNotification,notifiesListenerWithValueWhenChangeOccurs)140b5645947SKrzysztof Grobelny TEST_F(TestSensorNotification, notifiesListenerWithValueWhenChangeOccurs)
141b5645947SKrzysztof Grobelny {
142b5645947SKrzysztof Grobelny     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
1430e29f439SWludzik, Jozef         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
144b5645947SKrzysztof Grobelny 
1455ade2b1dSWludzik, Jozef     sensorObject->setValue(42.7);
146b5645947SKrzysztof Grobelny 
147b5645947SKrzysztof Grobelny     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
148b5645947SKrzysztof Grobelny }
149b5645947SKrzysztof Grobelny 
TEST_F(TestSensorNotification,doesntNotifyListenerWhenNoChangeOccurs)150f7ea2997SKrzysztof Grobelny TEST_F(TestSensorNotification, doesntNotifyListenerWhenNoChangeOccurs)
151b5645947SKrzysztof Grobelny {
152f7ea2997SKrzysztof Grobelny     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
1530e29f439SWludzik, Jozef         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
154b5645947SKrzysztof Grobelny 
1555ade2b1dSWludzik, Jozef     sensorObject->setValue(42.7);
1565ade2b1dSWludzik, Jozef     sensorObject->setValue(42.7);
157b5645947SKrzysztof Grobelny 
158b5645947SKrzysztof Grobelny     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
159b5645947SKrzysztof Grobelny }
160b5645947SKrzysztof Grobelny 
TEST_F(TestSensorNotification,doesntNotifyExpiredListener)161b5645947SKrzysztof Grobelny TEST_F(TestSensorNotification, doesntNotifyExpiredListener)
162b5645947SKrzysztof Grobelny {
1635ade2b1dSWludzik, Jozef     InSequence seq;
1645ade2b1dSWludzik, Jozef     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
165b5645947SKrzysztof Grobelny     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
1660e29f439SWludzik, Jozef         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
167b5645947SKrzysztof Grobelny 
168b5645947SKrzysztof Grobelny     registerForUpdates(listenerMock2);
169b5645947SKrzysztof Grobelny     listenerMock = nullptr;
170b5645947SKrzysztof Grobelny 
1715ade2b1dSWludzik, Jozef     sensorObject->setValue(42.7);
172b5645947SKrzysztof Grobelny 
173b5645947SKrzysztof Grobelny     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
174b5645947SKrzysztof Grobelny }
175b5645947SKrzysztof Grobelny 
TEST_F(TestSensorNotification,notifiesWithValueDuringRegister)176b5645947SKrzysztof Grobelny TEST_F(TestSensorNotification, notifiesWithValueDuringRegister)
177b5645947SKrzysztof Grobelny {
178b5645947SKrzysztof Grobelny     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
179b5645947SKrzysztof Grobelny 
180b5645947SKrzysztof Grobelny     registerForUpdates(listenerMock2);
181b5645947SKrzysztof Grobelny }
1825ade2b1dSWludzik, Jozef 
TEST_F(TestSensorNotification,notNotifiesWithValueWhenUnregistered)1837e098e93SLukasz Kazmierczak TEST_F(TestSensorNotification, notNotifiesWithValueWhenUnregistered)
1847e098e93SLukasz Kazmierczak {
1857e098e93SLukasz Kazmierczak     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
1867e098e93SLukasz Kazmierczak     EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
1877e098e93SLukasz Kazmierczak         .Times(0);
1887e098e93SLukasz Kazmierczak     EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
1897e098e93SLukasz Kazmierczak         .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
1907e098e93SLukasz Kazmierczak 
1917e098e93SLukasz Kazmierczak     registerForUpdates(listenerMock2);
1927e098e93SLukasz Kazmierczak     unregisterFromUpdates(listenerMock);
1937e098e93SLukasz Kazmierczak 
1947e098e93SLukasz Kazmierczak     sensorObject->setValue(42.7);
1957e098e93SLukasz Kazmierczak 
1967e098e93SLukasz Kazmierczak     ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
1977e098e93SLukasz Kazmierczak }
1987e098e93SLukasz Kazmierczak 
TEST_F(TestSensorNotification,dbusSensorIsAddedToSystemAfterSensorIsCreatedThenValueIsUpdated)1995ade2b1dSWludzik, Jozef TEST_F(TestSensorNotification,
2005ade2b1dSWludzik, Jozef        dbusSensorIsAddedToSystemAfterSensorIsCreatedThenValueIsUpdated)
2015ade2b1dSWludzik, Jozef {
2025ade2b1dSWludzik, Jozef     InSequence seq;
2035ade2b1dSWludzik, Jozef 
2045ade2b1dSWludzik, Jozef     EXPECT_CALL(*listenerMock,
2055ade2b1dSWludzik, Jozef                 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(42.7)))
2065ade2b1dSWludzik, Jozef         .WillOnce(
2075ade2b1dSWludzik, Jozef             InvokeWithoutArgs(DbusEnvironment::setPromise("notify-change")));
2085ade2b1dSWludzik, Jozef     EXPECT_CALL(checkPoint, Call());
2095ade2b1dSWludzik, Jozef     EXPECT_CALL(*listenerMock,
2105ade2b1dSWludzik, Jozef                 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(0.)))
2115ade2b1dSWludzik, Jozef         .WillOnce(
2125ade2b1dSWludzik, Jozef             InvokeWithoutArgs(DbusEnvironment::setPromise("notify-create")));
2135ade2b1dSWludzik, Jozef 
2145ade2b1dSWludzik, Jozef     sensorObject->setValue(42.7);
2155ade2b1dSWludzik, Jozef     DbusEnvironment::waitForFuture("notify-change");
2165ade2b1dSWludzik, Jozef 
2175ade2b1dSWludzik, Jozef     checkPoint.Call();
2185ade2b1dSWludzik, Jozef 
2195ade2b1dSWludzik, Jozef     sensorObject = nullptr;
2205ade2b1dSWludzik, Jozef     sensorObject = makeSensorObject();
2215ade2b1dSWludzik, Jozef     DbusEnvironment::waitForFuture("notify-create");
2225ade2b1dSWludzik, Jozef }
223