diff options
Diffstat (limited to 'src/test/propertywatchtest.hpp')
-rw-r--r-- | src/test/propertywatchtest.hpp | 628 |
1 files changed, 628 insertions, 0 deletions
diff --git a/src/test/propertywatchtest.hpp b/src/test/propertywatchtest.hpp new file mode 100644 index 0000000..f965096 --- /dev/null +++ b/src/test/propertywatchtest.hpp @@ -0,0 +1,628 @@ +#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 |