blob: c073ee771a5696558ae04c4079d61c937d9cb464 [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
150TEST_F(TestSensorNotification, notifiesListenerWithValueWhenNoChangeOccurs)
151{
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100152 InSequence seq;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200153
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100154 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200155 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp)))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100156 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200157
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100158 sensorObject->setValue(42.7);
159 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200160
161 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
162}
163
164TEST_F(TestSensorNotification, doesntNotifyExpiredListener)
165{
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100166 InSequence seq;
167 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200168 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100169 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200170
171 registerForUpdates(listenerMock2);
172 listenerMock = nullptr;
173
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100174 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200175
176 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
177}
178
179TEST_F(TestSensorNotification, notifiesWithValueDuringRegister)
180{
181 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
182
183 registerForUpdates(listenerMock2);
184}
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100185
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200186TEST_F(TestSensorNotification, notNotifiesWithValueWhenUnregistered)
187{
188 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
189 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
190 .Times(0);
191 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
192 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
193
194 registerForUpdates(listenerMock2);
195 unregisterFromUpdates(listenerMock);
196
197 sensorObject->setValue(42.7);
198
199 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
200}
201
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100202TEST_F(TestSensorNotification,
203 dbusSensorIsAddedToSystemAfterSensorIsCreatedThenValueIsUpdated)
204{
205 InSequence seq;
206
207 EXPECT_CALL(*listenerMock,
208 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(42.7)))
209 .WillOnce(
210 InvokeWithoutArgs(DbusEnvironment::setPromise("notify-change")));
211 EXPECT_CALL(checkPoint, Call());
212 EXPECT_CALL(*listenerMock,
213 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(0.)))
214 .WillOnce(
215 InvokeWithoutArgs(DbusEnvironment::setPromise("notify-create")));
216
217 sensorObject->setValue(42.7);
218 DbusEnvironment::waitForFuture("notify-change");
219
220 checkPoint.Call();
221
222 sensorObject = nullptr;
223 sensorObject = makeSensorObject();
224 DbusEnvironment::waitForFuture("notify-create");
225}