blob: 8738bde90507a2b1fd84cb756605570564d00f61 [file] [log] [blame]
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02001#include "dbus_environment.hpp"
Krzysztof Grobelnyd2238192020-12-02 09:27:28 +00002#include "helpers.hpp"
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02003#include "mocks/sensor_listener_mock.hpp"
4#include "sensor.hpp"
5#include "sensor_cache.hpp"
6#include "stubs/dbus_sensor_object.hpp"
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +01007#include "utils/clock.hpp"
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02008
9#include <sdbusplus/asio/property.hpp>
10
11#include <thread>
12
13#include <gmock/gmock.h>
14
15using namespace testing;
16using namespace std::chrono_literals;
17
18class TestSensor : public Test
19{
20 public:
21 void SetUp() override
22 {
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +010023 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020024 }
25
26 void TearDown() override
27 {
28 DbusEnvironment::synchronizeIoc();
29 }
30
31 void
32 registerForUpdates(std::shared_ptr<interfaces::SensorListener> listener)
33 {
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +010034 sut->registerForUpdates(listener);
35 DbusEnvironment::synchronizeIoc();
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020036 }
37
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +020038 void unregisterFromUpdates(
39 std::shared_ptr<interfaces::SensorListener> listener)
40 {
41 sut->unregisterFromUpdates(listener);
42 DbusEnvironment::synchronizeIoc();
43 }
44
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +010045 static std::unique_ptr<stubs::DbusSensorObject> makeSensorObject()
46 {
47 return std::make_unique<stubs::DbusSensorObject>(
48 DbusEnvironment::getIoc(), DbusEnvironment::getBus(),
49 DbusEnvironment::getObjServer());
50 }
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020051
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +010052 std::unique_ptr<stubs::DbusSensorObject> sensorObject = makeSensorObject();
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020053
54 SensorCache sensorCache;
Krzysztof Grobelny51f0fd52021-12-28 16:32:08 +010055 Milliseconds timestamp = Clock().steadyTimestamp();
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020056 std::shared_ptr<Sensor> sut = sensorCache.makeSensor<Sensor>(
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010057 DbusEnvironment::serviceName(), sensorObject->path(), "metadata",
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020058 DbusEnvironment::getIoc(), DbusEnvironment::getBus());
59 std::shared_ptr<SensorListenerMock> listenerMock =
60 std::make_shared<StrictMock<SensorListenerMock>>();
61 std::shared_ptr<SensorListenerMock> listenerMock2 =
62 std::make_shared<StrictMock<SensorListenerMock>>();
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +010063 MockFunction<void()> checkPoint;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020064};
65
66TEST_F(TestSensor, createsCorretlyViaSensorCache)
67{
68 ASSERT_THAT(sut->id(),
Krzysztof Grobelny6ccfcbf2020-11-04 09:31:36 +010069 Eq(Sensor::Id("Sensor", DbusEnvironment::serviceName(),
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +010070 sensorObject->path())));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020071}
72
73TEST_F(TestSensor, notifiesWithValueAfterRegister)
74{
75 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +010076 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020077
78 registerForUpdates(listenerMock);
79
80 ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
81}
82
83TEST_F(TestSensor, notifiesOnceWithValueAfterRegister)
84{
85 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +010086 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020087 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +010088 .WillOnce(
89 InvokeWithoutArgs(DbusEnvironment::setPromise("async_read2")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020090
91 DbusEnvironment::synchronizedPost([this] {
92 sut->registerForUpdates(listenerMock);
93 sut->registerForUpdates(listenerMock2);
94 });
95
96 ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
97 ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read2"));
98}
99
Szymon Dompke94f71c52021-12-10 07:16:33 +0100100TEST_F(TestSensor, getLabeledInfoReturnsCorrectly)
101{
102 auto expected = LabeledSensorInfo(DbusEnvironment::serviceName(),
103 sensorObject->path(), "metadata");
104 EXPECT_EQ(sut->getLabeledSensorInfo(), expected);
105}
106
107TEST_F(TestSensor, getNameReturnsPathWhenMetadataIsNotSet)
108{
109 static const char* path = "/telemetry/ut/DbusSensorObject2";
110 sut = sensorCache.makeSensor<Sensor>(DbusEnvironment::serviceName(), path,
111 "", DbusEnvironment::getIoc(),
112 DbusEnvironment::getBus());
113 EXPECT_EQ(sut->getName(), path);
114}
115
116TEST_F(TestSensor, getNameReturnsMetadataWhenMetadataIsSet)
117{
118 static const char* path = "/telemetry/ut/DbusSensorObject2";
119 sut = sensorCache.makeSensor<Sensor>(DbusEnvironment::serviceName(), path,
120 "metadata2", DbusEnvironment::getIoc(),
121 DbusEnvironment::getBus());
122 EXPECT_EQ(sut->getName(), "metadata2");
123}
124
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200125class TestSensorNotification : public TestSensor
126{
127 public:
128 void SetUp() override
129 {
130 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 0.))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100131 .WillOnce(
132 InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200133
134 registerForUpdates(listenerMock);
135
136 ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
137 }
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200138};
139
140TEST_F(TestSensorNotification, notifiesListenerWithValueWhenChangeOccurs)
141{
142 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100143 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200144
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100145 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200146
147 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
148}
149
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100150TEST_F(TestSensorNotification, doesntNotifyListenerWhenNoChangeOccurs)
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200151{
Krzysztof Grobelnyf7ea2992022-01-27 11:04:58 +0100152 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100153 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200154
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100155 sensorObject->setValue(42.7);
156 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200157
158 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
159}
160
161TEST_F(TestSensorNotification, doesntNotifyExpiredListener)
162{
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100163 InSequence seq;
164 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200165 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100166 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200167
168 registerForUpdates(listenerMock2);
169 listenerMock = nullptr;
170
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100171 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200172
173 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
174}
175
176TEST_F(TestSensorNotification, notifiesWithValueDuringRegister)
177{
178 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
179
180 registerForUpdates(listenerMock2);
181}
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100182
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200183TEST_F(TestSensorNotification, notNotifiesWithValueWhenUnregistered)
184{
185 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
186 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
187 .Times(0);
188 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
189 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
190
191 registerForUpdates(listenerMock2);
192 unregisterFromUpdates(listenerMock);
193
194 sensorObject->setValue(42.7);
195
196 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
197}
198
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100199TEST_F(TestSensorNotification,
200 dbusSensorIsAddedToSystemAfterSensorIsCreatedThenValueIsUpdated)
201{
202 InSequence seq;
203
204 EXPECT_CALL(*listenerMock,
205 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(42.7)))
206 .WillOnce(
207 InvokeWithoutArgs(DbusEnvironment::setPromise("notify-change")));
208 EXPECT_CALL(checkPoint, Call());
209 EXPECT_CALL(*listenerMock,
210 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(0.)))
211 .WillOnce(
212 InvokeWithoutArgs(DbusEnvironment::setPromise("notify-create")));
213
214 sensorObject->setValue(42.7);
215 DbusEnvironment::waitForFuture("notify-change");
216
217 checkPoint.Call();
218
219 sensorObject = nullptr;
220 sensorObject = makeSensorObject();
221 DbusEnvironment::waitForFuture("notify-create");
222}