blob: e27ba1867d019bbc87bd4589985b6907b76ffc89 [file] [log] [blame]
Brad Bishop13fd8722017-05-15 12:44:01 -04001#pragma once
Brad Bishop13fd8722017-05-15 12:44:01 -04002#include "data_types.hpp"
3#include "sdbusplus/bus/match.hpp"
4
Patrick Venture3d6d3182018-08-31 09:33:09 -07005#include <string>
6
7#include <gmock/gmock.h>
8#include <gtest/gtest.h>
9
Brad Bishop13fd8722017-05-15 12:44:01 -040010namespace phosphor
11{
12namespace dbus
13{
14namespace monitoring
15{
16
17/** @class CallMethodAndRead
18 * @brief GMock template member forwarding helper.
19 *
20 * The code under test calls callMethodAndRead, which is a templated,
21 * free function. Enable this under GMock by forwarding calls to it
22 * to functions that can be mocked.
23 *
24 * @tparam DBusInterfaceType - The mock object type.
25 * @tparam Ret - The return type of the method being called.
26 * @tparam Args - The argument types of the method being called.
27 *
28 * Specialize to implement new forwards.
29 */
Brad Bishopd1eac882018-03-29 10:34:05 -040030template <typename DBusInterfaceType, typename Ret, typename... Args>
Brad Bishop13fd8722017-05-15 12:44:01 -040031struct CallMethodAndRead
32{
Brad Bishopd1eac882018-03-29 10:34:05 -040033 static Ret op(DBusInterfaceType& dbus, const std::string& busName,
34 const std::string& path, const std::string& interface,
35 const std::string& method, Args&&... args)
Brad Bishop13fd8722017-05-15 12:44:01 -040036 {
37 static_assert(true, "Missing CallMethodAndRead definition.");
38 return Ret();
39 }
40};
41
42/** @brief CallMethodAndRead specialization for
43 * xyz.openbmc_project.ObjectMapper.GetObject. */
44template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -040045struct CallMethodAndRead<DBusInterfaceType, GetObject, const MapperPath&,
46 const std::vector<std::string>&>
Brad Bishop13fd8722017-05-15 12:44:01 -040047{
Brad Bishopd1eac882018-03-29 10:34:05 -040048 static GetObject op(DBusInterfaceType& dbus, const std::string& busName,
49 const std::string& path, const std::string& interface,
50 const std::string& method, const MapperPath& objectPath,
51 const std::vector<std::string>& interfaces)
Brad Bishop13fd8722017-05-15 12:44:01 -040052 {
Brad Bishopd1eac882018-03-29 10:34:05 -040053 return dbus.mapperGetObject(busName, path, interface, method,
54 objectPath, interfaces);
Brad Bishop13fd8722017-05-15 12:44:01 -040055 }
56};
57
58/** @brief CallMethodAndRead specialization for
59 * org.freedesktop.DBus.Properties.GetAll(uint64_t). */
60template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -040061struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<uint64_t>,
62 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -040063{
Brad Bishopd1eac882018-03-29 10:34:05 -040064 static PropertiesChanged<uint64_t>
65 op(DBusInterfaceType& dbus, const std::string& busName,
66 const std::string& path, const std::string& interface,
67 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -040068 {
Brad Bishopd1eac882018-03-29 10:34:05 -040069 return dbus.getPropertiesU64(busName, path, interface, method,
70 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -040071 }
72};
73
74/** @brief CallMethodAndRead specialization for
75 * org.freedesktop.DBus.Properties.GetAll(uint32_t). */
76template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -040077struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<uint32_t>,
78 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -040079{
Brad Bishopd1eac882018-03-29 10:34:05 -040080 static PropertiesChanged<uint32_t>
81 op(DBusInterfaceType& dbus, const std::string& busName,
82 const std::string& path, const std::string& interface,
83 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -040084 {
Brad Bishopd1eac882018-03-29 10:34:05 -040085 return dbus.getPropertiesU32(busName, path, interface, method,
86 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -040087 }
88};
89
90/** @brief CallMethodAndRead specialization for
91 * org.freedesktop.DBus.Properties.GetAll(uint16_t). */
92template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -040093struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<uint16_t>,
94 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -040095{
Brad Bishopd1eac882018-03-29 10:34:05 -040096 static PropertiesChanged<uint16_t>
97 op(DBusInterfaceType& dbus, const std::string& busName,
98 const std::string& path, const std::string& interface,
99 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400100 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400101 return dbus.getPropertiesU16(busName, path, interface, method,
102 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400103 }
104};
105
106/** @brief CallMethodAndRead specialization for
107 * org.freedesktop.DBus.Properties.GetAll(uint8_t). */
108template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400109struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<uint8_t>,
110 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -0400111{
Brad Bishopd1eac882018-03-29 10:34:05 -0400112 static PropertiesChanged<uint8_t>
113 op(DBusInterfaceType& dbus, const std::string& busName,
114 const std::string& path, const std::string& interface,
115 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400116 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400117 return dbus.getPropertiesU8(busName, path, interface, method,
118 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400119 }
120};
121
122/** @brief CallMethodAndRead specialization for
123 * org.freedesktop.DBus.Properties.GetAll(int64_t). */
124template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400125struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<int64_t>,
126 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -0400127{
Brad Bishopd1eac882018-03-29 10:34:05 -0400128 static PropertiesChanged<int64_t>
129 op(DBusInterfaceType& dbus, const std::string& busName,
130 const std::string& path, const std::string& interface,
131 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400132 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400133 return dbus.getPropertiesU64(busName, path, interface, method,
134 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400135 }
136};
137
138/** @brief CallMethodAndRead specialization for
139 * org.freedesktop.DBus.Properties.GetAll(int32_t). */
140template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400141struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<int32_t>,
142 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -0400143{
Brad Bishopd1eac882018-03-29 10:34:05 -0400144 static PropertiesChanged<int32_t>
145 op(DBusInterfaceType& dbus, const std::string& busName,
146 const std::string& path, const std::string& interface,
147 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400148 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400149 return dbus.getPropertiesU32(busName, path, interface, method,
150 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400151 }
152};
153
154/** @brief CallMethodAndRead specialization for
155 * org.freedesktop.DBus.Properties.GetAll(int16_t). */
156template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400157struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<int16_t>,
158 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -0400159{
Brad Bishopd1eac882018-03-29 10:34:05 -0400160 static PropertiesChanged<int16_t>
161 op(DBusInterfaceType& dbus, const std::string& busName,
162 const std::string& path, const std::string& interface,
163 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400164 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400165 return dbus.getPropertiesU16(busName, path, interface, method,
166 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400167 }
168};
169
170/** @brief CallMethodAndRead specialization for
171 * org.freedesktop.DBus.Properties.GetAll(int8_t). */
172template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400173struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<int8_t>,
174 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -0400175{
Brad Bishopd1eac882018-03-29 10:34:05 -0400176 static PropertiesChanged<int8_t>
177 op(DBusInterfaceType& dbus, const std::string& busName,
178 const std::string& path, const std::string& interface,
179 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400180 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400181 return dbus.getPropertiesU8(busName, path, interface, method,
182 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400183 }
184};
185
186/** @brief CallMethodAndRead specialization for
187 * org.freedesktop.DBus.Properties.GetAll(std::string). */
188template <typename DBusInterfaceType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400189struct CallMethodAndRead<DBusInterfaceType, PropertiesChanged<std::string>,
190 const std::string&>
Brad Bishop13fd8722017-05-15 12:44:01 -0400191{
Brad Bishopd1eac882018-03-29 10:34:05 -0400192 static PropertiesChanged<std::string>
193 op(DBusInterfaceType& dbus, const std::string& busName,
194 const std::string& path, const std::string& interface,
195 const std::string& method, const std::string& propertiesInterface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400196 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400197 return dbus.getPropertiesString(busName, path, interface, method,
198 propertiesInterface);
Brad Bishop13fd8722017-05-15 12:44:01 -0400199 }
200};
201
202/** @class MockDBusInterface
203 * @brief DBus access delegate implementation for the property watch test
204 * suite.
205 */
206struct MockDBusInterface
207{
Brad Bishopd1eac882018-03-29 10:34:05 -0400208 MOCK_METHOD6(mapperGetObject,
209 GetObject(const std::string&, const std::string&,
210 const std::string&, const std::string&,
211 const MapperPath&, const std::vector<std::string>&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400212
Brad Bishopd1eac882018-03-29 10:34:05 -0400213 MOCK_METHOD5(getPropertiesU64,
214 PropertiesChanged<uint64_t>(
215 const std::string&, const std::string&, const std::string&,
216 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400217
Brad Bishopd1eac882018-03-29 10:34:05 -0400218 MOCK_METHOD5(getPropertiesU32,
219 PropertiesChanged<uint32_t>(
220 const std::string&, const std::string&, const std::string&,
221 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400222
Brad Bishopd1eac882018-03-29 10:34:05 -0400223 MOCK_METHOD5(getPropertiesU16,
224 PropertiesChanged<uint16_t>(
225 const std::string&, const std::string&, const std::string&,
226 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400227
Brad Bishopd1eac882018-03-29 10:34:05 -0400228 MOCK_METHOD5(getPropertiesU8,
229 PropertiesChanged<uint8_t>(
230 const std::string&, const std::string&, const std::string&,
231 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400232
Brad Bishopd1eac882018-03-29 10:34:05 -0400233 MOCK_METHOD5(getPropertiesS64,
234 PropertiesChanged<int64_t>(
235 const std::string&, const std::string&, const std::string&,
236 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400237
Brad Bishopd1eac882018-03-29 10:34:05 -0400238 MOCK_METHOD5(getPropertiesS32,
239 PropertiesChanged<int32_t>(
240 const std::string&, const std::string&, const std::string&,
241 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400242
Brad Bishopd1eac882018-03-29 10:34:05 -0400243 MOCK_METHOD5(getPropertiesS16,
244 PropertiesChanged<int16_t>(
245 const std::string&, const std::string&, const std::string&,
246 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400247
Brad Bishopd1eac882018-03-29 10:34:05 -0400248 MOCK_METHOD5(getPropertiesS8,
249 PropertiesChanged<int8_t>(
250 const std::string&, const std::string&, const std::string&,
251 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400252
Brad Bishopd1eac882018-03-29 10:34:05 -0400253 MOCK_METHOD5(getPropertiesString,
254 PropertiesChanged<std::string>(
255 const std::string&, const std::string&, const std::string&,
256 const std::string&, const std::string&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400257
Brad Bishopd1eac882018-03-29 10:34:05 -0400258 MOCK_METHOD2(fwdAddMatch,
259 void(const std::string&,
260 const sdbusplus::bus::match::match::callback_t&));
Brad Bishop13fd8722017-05-15 12:44:01 -0400261
262 static MockDBusInterface* ptr;
263 static MockDBusInterface& instance()
264 {
265 return *ptr;
266 }
267 static void instance(MockDBusInterface& p)
268 {
269 ptr = &p;
270 }
271
272 /** @brief GMock member template/free function forward. */
Brad Bishopd1eac882018-03-29 10:34:05 -0400273 template <typename Ret, typename... Args>
274 static auto callMethodAndRead(const std::string& busName,
275 const std::string& path,
276 const std::string& interface,
277 const std::string& method, Args&&... args)
Brad Bishop13fd8722017-05-15 12:44:01 -0400278 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400279 return CallMethodAndRead<MockDBusInterface, Ret, Args...>::op(
280 instance(), busName, path, interface, method,
281 std::forward<Args>(args)...);
Brad Bishop13fd8722017-05-15 12:44:01 -0400282 }
283
284 /** @brief GMock free function forward. */
Brad Bishopd1eac882018-03-29 10:34:05 -0400285 static auto
286 addMatch(const std::string& match,
287 const sdbusplus::bus::match::match::callback_t& callback)
Brad Bishop13fd8722017-05-15 12:44:01 -0400288 {
289 instance().fwdAddMatch(match, callback);
290 }
291};
292
293/** @class Expect
294 * @brief Enable use of EXPECT_CALL from a C++ template.
295 */
Patrick Venture3d6d3182018-08-31 09:33:09 -0700296template <typename T>
297struct Expect
Brad Bishopd1eac882018-03-29 10:34:05 -0400298{
299};
Brad Bishop13fd8722017-05-15 12:44:01 -0400300
Patrick Venture3d6d3182018-08-31 09:33:09 -0700301template <>
302struct Expect<uint64_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400303{
304 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400305 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
306 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400307 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400308 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
309 getPropertiesU64(::testing::_, path,
310 "org.freedesktop.DBus.Properties",
311 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400312 }
313};
314
Patrick Venture3d6d3182018-08-31 09:33:09 -0700315template <>
316struct Expect<uint32_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400317{
318 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400319 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
320 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400321 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400322 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
323 getPropertiesU32(::testing::_, path,
324 "org.freedesktop.DBus.Properties",
325 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400326 }
327};
328
Patrick Venture3d6d3182018-08-31 09:33:09 -0700329template <>
330struct Expect<uint16_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400331{
332 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400333 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
334 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400335 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400336 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
337 getPropertiesU16(::testing::_, path,
338 "org.freedesktop.DBus.Properties",
339 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400340 }
341};
342
Patrick Venture3d6d3182018-08-31 09:33:09 -0700343template <>
344struct Expect<uint8_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400345{
346 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400347 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
348 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400349 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400350 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
351 getPropertiesU8(::testing::_, path,
352 "org.freedesktop.DBus.Properties",
353 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400354 }
355};
356
Patrick Venture3d6d3182018-08-31 09:33:09 -0700357template <>
358struct Expect<int64_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400359{
360 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400361 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
362 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400363 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400364 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
365 getPropertiesS64(::testing::_, path,
366 "org.freedesktop.DBus.Properties",
367 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400368 }
369};
370
Patrick Venture3d6d3182018-08-31 09:33:09 -0700371template <>
372struct Expect<int32_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400373{
374 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400375 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
376 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400377 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400378 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
379 getPropertiesS32(::testing::_, path,
380 "org.freedesktop.DBus.Properties",
381 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400382 }
383};
384
Patrick Venture3d6d3182018-08-31 09:33:09 -0700385template <>
386struct Expect<int16_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400387{
388 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400389 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
390 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400391 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400392 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
393 getPropertiesS16(::testing::_, path,
394 "org.freedesktop.DBus.Properties",
395 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400396 }
397};
398
Patrick Venture3d6d3182018-08-31 09:33:09 -0700399template <>
400struct Expect<int8_t>
Brad Bishop13fd8722017-05-15 12:44:01 -0400401{
402 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400403 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
404 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400405 {
Brad Bishopd1eac882018-03-29 10:34:05 -0400406 return EXPECT_CALL(std::forward<MockObjType>(mockObj),
407 getPropertiesS8(::testing::_, path,
408 "org.freedesktop.DBus.Properties",
409 "GetAll", interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400410 }
411};
412
Patrick Venture3d6d3182018-08-31 09:33:09 -0700413template <>
414struct Expect<std::string>
Brad Bishop13fd8722017-05-15 12:44:01 -0400415{
416 template <typename MockObjType>
Brad Bishopd1eac882018-03-29 10:34:05 -0400417 static auto& getProperties(MockObjType&& mockObj, const std::string& path,
418 const std::string& interface)
Brad Bishop13fd8722017-05-15 12:44:01 -0400419 {
420 return EXPECT_CALL(
Brad Bishopd1eac882018-03-29 10:34:05 -0400421 std::forward<MockObjType>(mockObj),
422 getPropertiesString(::testing::_, path,
423 "org.freedesktop.DBus.Properties", "GetAll",
424 interface));
Brad Bishop13fd8722017-05-15 12:44:01 -0400425 }
426};
427
428} // namespace monitoring
429} // namespace dbus
430} // namespace phosphor