Implemented sensor class

Sensor class was introduced, it monitors
xyz.openbmc_project.Sensor.Value, for change and notifies all
listeners.

Tested:
  - Unit tested with service stub that provides dbus interface
    xyz.openbmc_project.Sensor.Value
  - All changes are delivered to listeners
  - All other unit tests are passing

Change-Id: I8c9d58cc986c1fe2a4d2386815d559814016efa6
Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
diff --git a/tests/src/stubs/dbus_sensor_object.cpp b/tests/src/stubs/dbus_sensor_object.cpp
new file mode 100644
index 0000000..c3d4170
--- /dev/null
+++ b/tests/src/stubs/dbus_sensor_object.cpp
@@ -0,0 +1,59 @@
+#include "dbus_sensor_object.hpp"
+
+#include <boost/asio.hpp>
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+#include <sdbusplus/bus.hpp>
+
+namespace stubs
+{
+
+DbusSensorObject::DbusSensorObject(
+    boost::asio::io_context& ioc,
+    const std::shared_ptr<sdbusplus::asio::connection>& bus,
+    const std::shared_ptr<sdbusplus::asio::object_server>& objServer) :
+    ioc(ioc),
+    bus(bus), objServer(objServer)
+{
+    sensorIface = objServer->add_interface(path(), interface());
+
+    sensorIface->register_property_r(property.value(), double{},
+                                     sdbusplus::vtable::property_::emits_change,
+                                     [this](const auto&) { return value; });
+
+    sensorIface->initialize();
+}
+
+DbusSensorObject::~DbusSensorObject()
+{
+    objServer->remove_interface(sensorIface);
+}
+
+void DbusSensorObject::setValue(double v)
+{
+    value = v;
+
+    sensorIface->signal_property(property.value());
+}
+
+double DbusSensorObject::getValue() const
+{
+    return value;
+}
+
+const char* DbusSensorObject::path()
+{
+    return "/telemetry/ut/DbusSensorObject";
+}
+
+const char* DbusSensorObject::interface()
+{
+    return "xyz.openbmc_project.Sensor.Value";
+}
+
+const char* DbusSensorObject::Properties::value()
+{
+    return "Value";
+}
+
+} // namespace stubs
diff --git a/tests/src/stubs/dbus_sensor_object.hpp b/tests/src/stubs/dbus_sensor_object.hpp
new file mode 100644
index 0000000..99271fa
--- /dev/null
+++ b/tests/src/stubs/dbus_sensor_object.hpp
@@ -0,0 +1,43 @@
+#pragma once
+
+#include <boost/asio.hpp>
+#include <sdbusplus/asio/connection.hpp>
+#include <sdbusplus/asio/object_server.hpp>
+#include <sdbusplus/bus.hpp>
+
+namespace stubs
+{
+
+class DbusSensorObject
+{
+  public:
+    DbusSensorObject(
+        boost::asio::io_context& ioc,
+        const std::shared_ptr<sdbusplus::asio::connection>& bus,
+        const std::shared_ptr<sdbusplus::asio::object_server>& objServer);
+    ~DbusSensorObject();
+
+    static const char* path();
+    static const char* interface();
+
+    void setValue(double);
+    double getValue() const;
+
+    struct Properties
+    {
+        static const char* value();
+    };
+
+    static constexpr Properties property = {};
+
+  private:
+    boost::asio::io_context& ioc;
+    std::shared_ptr<sdbusplus::asio::connection> bus;
+    std::shared_ptr<sdbusplus::asio::object_server> objServer;
+
+    std::shared_ptr<sdbusplus::asio::dbus_interface> sensorIface;
+
+    double value = 0.0;
+};
+
+} // namespace stubs