| #pragma once |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| #include <string> |
| |
| #include "data_types.hpp" |
| #include "sdbusplus/bus/match.hpp" |
| |
| namespace phosphor |
| { |
| namespace dbus |
| { |
| namespace monitoring |
| { |
| |
| /** @class CallMethodAndRead |
| * @brief GMock template member forwarding helper. |
| * |
| * The code under test calls callMethodAndRead, which is a templated, |
| * free function. Enable this under GMock by forwarding calls to it |
| * to functions that can be mocked. |
| * |
| * @tparam DBusInterfaceType - The mock object type. |
| * @tparam Ret - The return type of the method being called. |
| * @tparam Args - The argument types of the method being called. |
| * |
| * Specialize to implement new forwards. |
| */ |
| template < |
| typename DBusInterfaceType, |
| typename Ret, |
| typename ...Args > |
| struct CallMethodAndRead |
| { |
| static Ret op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| Args&& ... args) |
| { |
| static_assert(true, "Missing CallMethodAndRead definition."); |
| return Ret(); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * xyz.openbmc_project.ObjectMapper.GetObject. */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| GetObject, |
| const MapperPath&, |
| const std::vector<std::string>& > |
| { |
| static GetObject op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const MapperPath& objectPath, |
| const std::vector<std::string>& interfaces) |
| { |
| return dbus.mapperGetObject( |
| busName, |
| path, |
| interface, |
| method, |
| objectPath, |
| interfaces); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(uint64_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<uint64_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<uint64_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU64( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(uint32_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<uint32_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<uint32_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU32( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(uint16_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<uint16_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<uint16_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU16( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(uint8_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<uint8_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<uint8_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU8( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(int64_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<int64_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<int64_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU64( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(int32_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<int32_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<int32_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU32( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(int16_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<int16_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<int16_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU16( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(int8_t). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<int8_t>, |
| const std::string& > |
| { |
| static PropertiesChanged<int8_t> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesU8( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @brief CallMethodAndRead specialization for |
| * org.freedesktop.DBus.Properties.GetAll(std::string). */ |
| template <typename DBusInterfaceType> |
| struct CallMethodAndRead < |
| DBusInterfaceType, |
| PropertiesChanged<std::string>, |
| const std::string& > |
| { |
| static PropertiesChanged<std::string> op( |
| DBusInterfaceType& dbus, |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| const std::string& propertiesInterface) |
| { |
| return dbus.getPropertiesString( |
| busName, |
| path, |
| interface, |
| method, |
| propertiesInterface); |
| } |
| }; |
| |
| /** @class MockDBusInterface |
| * @brief DBus access delegate implementation for the property watch test |
| * suite. |
| */ |
| struct MockDBusInterface |
| { |
| MOCK_METHOD6( |
| mapperGetObject, |
| GetObject( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const MapperPath&, |
| const std::vector<std::string>&)); |
| |
| MOCK_METHOD5( |
| getPropertiesU64, |
| PropertiesChanged<uint64_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesU32, |
| PropertiesChanged<uint32_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesU16, |
| PropertiesChanged<uint16_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesU8, |
| PropertiesChanged<uint8_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesS64, |
| PropertiesChanged<int64_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesS32, |
| PropertiesChanged<int32_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesS16, |
| PropertiesChanged<int16_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesS8, |
| PropertiesChanged<int8_t>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD5( |
| getPropertiesString, |
| PropertiesChanged<std::string>( |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&, |
| const std::string&)); |
| |
| MOCK_METHOD2( |
| fwdAddMatch, |
| void( |
| const std::string&, |
| const sdbusplus::bus::match::match::callback_t&)); |
| |
| static MockDBusInterface* ptr; |
| static MockDBusInterface& instance() |
| { |
| return *ptr; |
| } |
| static void instance(MockDBusInterface& p) |
| { |
| ptr = &p; |
| } |
| |
| /** @brief GMock member template/free function forward. */ |
| template <typename Ret, typename ...Args> |
| static auto callMethodAndRead( |
| const std::string& busName, |
| const std::string& path, |
| const std::string& interface, |
| const std::string& method, |
| Args&& ... args) |
| { |
| return CallMethodAndRead <MockDBusInterface, Ret, Args... >::op( |
| instance(), |
| busName, |
| path, |
| interface, |
| method, |
| std::forward<Args>(args)...); |
| } |
| |
| /** @brief GMock free function forward. */ |
| static auto addMatch( |
| const std::string& match, |
| const sdbusplus::bus::match::match::callback_t& callback) |
| { |
| instance().fwdAddMatch(match, callback); |
| } |
| }; |
| |
| /** @class Expect |
| * @brief Enable use of EXPECT_CALL from a C++ template. |
| */ |
| template <typename T> struct Expect {}; |
| |
| template <> |
| struct Expect<uint64_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesU64( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<uint32_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesU32( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<uint16_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesU16( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<uint8_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesU8( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<int64_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesS64( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<int32_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesS32( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<int16_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesS16( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<int8_t> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesS8( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| template <> |
| struct Expect<std::string> |
| { |
| template <typename MockObjType> |
| static auto& getProperties( |
| MockObjType&& mockObj, |
| const std::string& path, |
| const std::string& interface) |
| { |
| return EXPECT_CALL( |
| std::forward<MockObjType>(mockObj), |
| getPropertiesString( |
| ::testing::_, |
| path, |
| "org.freedesktop.DBus.Properties", |
| "GetAll", |
| interface)); |
| } |
| }; |
| |
| } // namespace monitoring |
| } // namespace dbus |
| } // namespace phosphor |