blob: c0a9dc319b73da75aafa89724ca4fbfe2a95a722 [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
100class TestSensorNotification : public TestSensor
101{
102 public:
103 void SetUp() override
104 {
105 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 0.))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100106 .WillOnce(
107 InvokeWithoutArgs(DbusEnvironment::setPromise("async_read")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200108
109 registerForUpdates(listenerMock);
110
111 ASSERT_TRUE(DbusEnvironment::waitForFuture("async_read"));
112 }
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200113};
114
115TEST_F(TestSensorNotification, notifiesListenerWithValueWhenChangeOccurs)
116{
117 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100118 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200119
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100120 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200121
122 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
123}
124
125TEST_F(TestSensorNotification, notifiesListenerWithValueWhenNoChangeOccurs)
126{
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100127 InSequence seq;
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200128
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100129 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200130 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp)))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100131 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200132
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100133 sensorObject->setValue(42.7);
134 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200135
136 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
137}
138
139TEST_F(TestSensorNotification, doesntNotifyExpiredListener)
140{
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100141 InSequence seq;
142 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200143 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
Wludzik, Jozef0e29f432020-11-17 08:22:33 +0100144 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200145
146 registerForUpdates(listenerMock2);
147 listenerMock = nullptr;
148
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100149 sensorObject->setValue(42.7);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200150
151 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
152}
153
154TEST_F(TestSensorNotification, notifiesWithValueDuringRegister)
155{
156 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
157
158 registerForUpdates(listenerMock2);
159}
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100160
Lukasz Kazmierczak7e098e92021-09-16 15:59:56 +0200161TEST_F(TestSensorNotification, notNotifiesWithValueWhenUnregistered)
162{
163 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 0.));
164 EXPECT_CALL(*listenerMock, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
165 .Times(0);
166 EXPECT_CALL(*listenerMock2, sensorUpdated(Ref(*sut), Ge(timestamp), 42.7))
167 .WillOnce(InvokeWithoutArgs(DbusEnvironment::setPromise("notify")));
168
169 registerForUpdates(listenerMock2);
170 unregisterFromUpdates(listenerMock);
171
172 sensorObject->setValue(42.7);
173
174 ASSERT_TRUE(DbusEnvironment::waitForFuture("notify"));
175}
176
Wludzik, Jozef5ade2b12020-11-16 14:00:23 +0100177TEST_F(TestSensorNotification,
178 dbusSensorIsAddedToSystemAfterSensorIsCreatedThenValueIsUpdated)
179{
180 InSequence seq;
181
182 EXPECT_CALL(*listenerMock,
183 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(42.7)))
184 .WillOnce(
185 InvokeWithoutArgs(DbusEnvironment::setPromise("notify-change")));
186 EXPECT_CALL(checkPoint, Call());
187 EXPECT_CALL(*listenerMock,
188 sensorUpdated(Ref(*sut), Ge(timestamp), DoubleEq(0.)))
189 .WillOnce(
190 InvokeWithoutArgs(DbusEnvironment::setPromise("notify-create")));
191
192 sensorObject->setValue(42.7);
193 DbusEnvironment::waitForFuture("notify-change");
194
195 checkPoint.Call();
196
197 sensorObject = nullptr;
198 sensorObject = makeSensorObject();
199 DbusEnvironment::waitForFuture("notify-create");
200}