Review fixes for 'Created metric class'

- Changed metric to_json to dumpConfiguration returning LabeledTuple
- LabeledTuple can be created and assigned directly to json
- LabeledTuple can be readed from json using json.get<LabeledTuple>
- Added PrintTo for LabeledMetricParams, LabeledSensorParams
- Added helper method expectMake to ReportFactoryMock
- sensorPaths are serialized to tuple<service, path> instead of single
  field with service and path separated via ':'
- Changed configuration version from 1 to 2

Change-Id: I7c45fb584687172f88fd549a93329264793b0b8e
Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
diff --git a/src/report_manager.cpp b/src/report_manager.cpp
index eb2d767..f9840d3 100644
--- a/src/report_manager.cpp
+++ b/src/report_manager.cpp
@@ -1,6 +1,8 @@
 #include "report_manager.hpp"
 
+#include "interfaces/types.hpp"
 #include "report.hpp"
+#include "utils/transform.hpp"
 
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/exception.hpp>
@@ -35,13 +37,13 @@
                                     const bool emitsReadingsUpdate,
                                     const bool logToMetricReportsCollection,
                                     const uint64_t interval,
-                                    const ReadingParameters& metricParams) {
+                                    ReadingParameters metricParams) {
                     return addReport(yield, reportName, reportingType,
                                      emitsReadingsUpdate,
                                      logToMetricReportsCollection,
                                      std::chrono::milliseconds(interval),
-                                     metricParams)
-                        ->getPath();
+                                     std::move(metricParams))
+                        .getPath();
                 });
         });
 }
@@ -54,11 +56,8 @@
         reports.end());
 }
 
-std::unique_ptr<interfaces::Report>& ReportManager::addReport(
-    std::optional<std::reference_wrapper<boost::asio::yield_context>> yield,
-    const std::string& reportName, const std::string& reportingType,
-    const bool emitsReadingsUpdate, const bool logToMetricReportsCollection,
-    std::chrono::milliseconds interval, const ReadingParameters& metricParams)
+void ReportManager::verifyAddReport(const std::string& reportName,
+                                    std::chrono::milliseconds interval)
 {
     if (reports.size() >= maxReports)
     {
@@ -81,12 +80,49 @@
         throw sdbusplus::exception::SdBusError(
             static_cast<int>(std::errc::invalid_argument), "Invalid interval");
     }
+}
 
-    reports.emplace_back(
-        reportFactory->make(yield, reportName, reportingType,
-                            emitsReadingsUpdate, logToMetricReportsCollection,
-                            interval, metricParams, *this, *reportStorage));
-    return reports.back();
+interfaces::Report& ReportManager::addReport(
+    boost::asio::yield_context& yield, const std::string& reportName,
+    const std::string& reportingType, const bool emitsReadingsUpdate,
+    const bool logToMetricReportsCollection, std::chrono::milliseconds interval,
+    ReadingParameters metricParams)
+{
+    verifyAddReport(reportName, interval);
+
+    reports.emplace_back(reportFactory->make(
+        yield, reportName, reportingType, emitsReadingsUpdate,
+        logToMetricReportsCollection, interval, std::move(metricParams), *this,
+        *reportStorage));
+    return *reports.back();
+}
+
+interfaces::Report& ReportManager::addReport(
+    const std::string& reportName, const std::string& reportingType,
+    const bool emitsReadingsUpdate, const bool logToMetricReportsCollection,
+    std::chrono::milliseconds interval,
+    std::vector<LabeledMetricParameters> labeledMetricParams)
+{
+    verifyAddReport(reportName, interval);
+
+    auto metricParams = utils::transform(
+        labeledMetricParams, [](const LabeledMetricParameters& param) {
+            using namespace utils::tstring;
+
+            return ReadingParameters::value_type(
+                utils::transform(param.at_index<0>(),
+                                 [](const LabeledSensorParameters& p) {
+                                     return sdbusplus::message::object_path(
+                                         p.at_label<Path>());
+                                 }),
+                param.at_index<1>(), param.at_index<2>(), param.at_index<3>());
+        });
+
+    reports.emplace_back(reportFactory->make(
+        reportName, reportingType, emitsReadingsUpdate,
+        logToMetricReportsCollection, interval, std::move(metricParams), *this,
+        *reportStorage, labeledMetricParams));
+    return *reports.back();
 }
 
 void ReportManager::loadFromPersistent()
@@ -112,16 +148,14 @@
             bool logToMetricReportsCollection =
                 data->at("LogToMetricReportsCollection").get<bool>();
             uint64_t interval = data->at("Interval").get<uint64_t>();
-            ReadingParameters readingParameters;
-            for (auto& item : data->at("ReadingParameters"))
-            {
-                readingParameters.emplace_back(
-                    LabeledReadingParameter::from_json(item));
-            }
+            auto readingParameters =
+                data->at("ReadingParameters")
+                    .get<std::vector<LabeledMetricParameters>>();
 
-            addReport(std::nullopt, name, reportingType, emitsReadingsSignal,
+            addReport(name, reportingType, emitsReadingsSignal,
                       logToMetricReportsCollection,
-                      std::chrono::milliseconds(interval), readingParameters);
+                      std::chrono::milliseconds(interval),
+                      std::move(readingParameters));
         }
         catch (const std::exception& e)
         {