From 603922b4db7be385b55d286895201ebf46a71672 Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Wed, 11 Apr 2018 18:50:43 +0200
Subject: [PATCH] more work on config

---
 common/cpp/include/json_parser/json_parser.h  |  5 ++-
 common/cpp/src/data_structs/data_structs.cpp  |  2 +-
 common/cpp/src/json_parser/json_parser.cpp    | 10 ++++--
 common/cpp/src/json_parser/rapid_json.cpp     |  9 ++----
 common/cpp/src/json_parser/rapid_json.h       |  5 ++-
 .../json_parser/test_json_parser.cpp          | 31 ++++++++++---------
 receiver/CMakeLists.txt                       |  3 +-
 receiver/src/receiver_config.cpp              |  5 +--
 receiver/unittests/test_config.cpp            |  4 ++-
 .../parse_config_file/parse_config_file.cpp   |  3 +-
 10 files changed, 45 insertions(+), 32 deletions(-)

diff --git a/common/cpp/include/json_parser/json_parser.h b/common/cpp/include/json_parser/json_parser.h
index 7373e91a7..077c23bb2 100644
--- a/common/cpp/include/json_parser/json_parser.h
+++ b/common/cpp/include/json_parser/json_parser.h
@@ -7,6 +7,7 @@
 #include <string>
 
 #include "common/error.h"
+#include "io/io.h"
 
 namespace hidra2 {
 
@@ -14,7 +15,8 @@ class RapidJson;
 
 class JsonParser {
   public:
-    JsonParser(const std::string& json, bool read_from_file);
+    JsonParser(const std::string& json, const std::unique_ptr<IO>* io);
+    JsonParser(const std::string& json);
     ~JsonParser();
     JsonParser(JsonParser&& other);
     Error GetUInt64(const std::string& name, uint64_t* val) const noexcept;
@@ -23,6 +25,7 @@ class JsonParser {
     Error GetArrayString(const std::string& name, std::vector<std::string>* val) const noexcept;
     JsonParser Embedded(const std::string& name) const noexcept;
   private:
+    std::unique_ptr<IO> default_io_;
     std::unique_ptr<RapidJson>  rapid_json_;
     JsonParser(RapidJson* rapid_json_);
 
diff --git a/common/cpp/src/data_structs/data_structs.cpp b/common/cpp/src/data_structs/data_structs.cpp
index 331a741a3..4625c052f 100644
--- a/common/cpp/src/data_structs/data_structs.cpp
+++ b/common/cpp/src/data_structs/data_structs.cpp
@@ -34,7 +34,7 @@ bool TimeFromJson(const JsonParser& parser, const std::string name, std::chrono:
 bool FileInfo::SetFromJson(const std::string& json_string) {
     auto old = *this;
 
-    JsonParser parser(json_string, false);
+    JsonParser parser(json_string);
 
     if (parser.GetUInt64("_id", &id) ||
             parser.GetUInt64("size", &size) ||
diff --git a/common/cpp/src/json_parser/json_parser.cpp b/common/cpp/src/json_parser/json_parser.cpp
index 1a8485578..e0e1c680b 100644
--- a/common/cpp/src/json_parser/json_parser.cpp
+++ b/common/cpp/src/json_parser/json_parser.cpp
@@ -1,5 +1,6 @@
 #include "json_parser/json_parser.h"
 #include "rapid_json.h"
+#include "io/io_factory.h"
 
 namespace hidra2 {
 
@@ -8,9 +9,14 @@ JsonParser::~JsonParser() {
 
 }
 
-JsonParser::JsonParser(const std::string& json, bool read_from_file) : rapid_json_{new RapidJson(json, read_from_file)} {
+JsonParser::JsonParser(const std::string& json, const std::unique_ptr<IO>* io ) :
+    default_io_{GenerateDefaultIO()}, rapid_json_{new RapidJson(json, io != nullptr ? io : & default_io_)} {
 }
 
+JsonParser::JsonParser(const std::string& json) : rapid_json_{new RapidJson(json, nullptr)} {
+}
+
+
 Error JsonParser::GetArrayUInt64(const std::string& name, std::vector<uint64_t>* val) const noexcept {
     return rapid_json_->GetArrayUInt64(name, val);
 
@@ -30,7 +36,7 @@ Error JsonParser::GetString(const std::string& name, std::string* val) const noe
 }
 
 JsonParser JsonParser::Embedded(const std::string& name) const noexcept {
-    RapidJson* rapid_json = new RapidJson(*rapid_json_.get(), name);
+    RapidJson* rapid_json = new RapidJson(*rapid_json_.get(), name) ;
     return JsonParser(rapid_json);
 }
 
diff --git a/common/cpp/src/json_parser/rapid_json.cpp b/common/cpp/src/json_parser/rapid_json.cpp
index 37d1c8771..9eab80bce 100644
--- a/common/cpp/src/json_parser/rapid_json.cpp
+++ b/common/cpp/src/json_parser/rapid_json.cpp
@@ -3,12 +3,9 @@
 
 using namespace rapidjson;
 
-#include "io/io_factory.h"
-
 namespace hidra2 {
 
-RapidJson::RapidJson(const std::string& json, bool read_from_file): io__{GenerateDefaultIO()}, json_{json},
-    read_from_file_{read_from_file} {
+RapidJson::RapidJson(const std::string& json, const std::unique_ptr<IO>* io): io__{io}, json_{json} {
 
 }
 
@@ -21,9 +18,9 @@ Error RapidJson::LazyInitialize()const noexcept {
         return nullptr;
 
     auto str = json_;
-    if (read_from_file_) {
+    if (io__) {
         Error err;
-        str = io__->ReadFileToString(json_, &err);
+        str = (*io__)->ReadFileToString(json_, &err);
         if (err != nullptr) {
             return err;
         }
diff --git a/common/cpp/src/json_parser/rapid_json.h b/common/cpp/src/json_parser/rapid_json.h
index ef26611e4..36157fd42 100644
--- a/common/cpp/src/json_parser/rapid_json.h
+++ b/common/cpp/src/json_parser/rapid_json.h
@@ -17,18 +17,17 @@ enum class ValueType {
 
 class RapidJson {
   public:
-    RapidJson(const std::string& json, bool read_from_file);
+    RapidJson(const std::string& json, const std::unique_ptr<IO>* io);
     RapidJson(const RapidJson& parent, const std::string& subname);
     Error GetUInt64(const std::string& name, uint64_t* val) const noexcept;
     Error GetString(const std::string& name, std::string* val) const noexcept;
     Error GetArrayUInt64(const std::string& name, std::vector<uint64_t>* val) const noexcept;
     Error GetArrayString(const std::string& name, std::vector<std::string>* val) const noexcept;
-    std::unique_ptr<IO> io__;
   private:
+    const std::unique_ptr<IO>* io__;
     mutable rapidjson::Document doc_;
     mutable rapidjson::Value object_;
     std::string json_;
-    bool read_from_file_;
     mutable bool initialized_ = false;
     Error LazyInitialize() const noexcept;
     Error embedded_error_ = nullptr;
diff --git a/common/cpp/unittests/json_parser/test_json_parser.cpp b/common/cpp/unittests/json_parser/test_json_parser.cpp
index 0767fd020..3f97389e7 100644
--- a/common/cpp/unittests/json_parser/test_json_parser.cpp
+++ b/common/cpp/unittests/json_parser/test_json_parser.cpp
@@ -31,7 +31,7 @@ namespace {
 TEST(ParseString, SimpleConvertToJson) {
     std::string json = R"({"_id":2,"foo":"foo","bar":1})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id, bar;
     std::string foo;
@@ -52,7 +52,7 @@ TEST(ParseString, SimpleConvertToJson) {
 TEST(ParseString, EmbeddedConvertToJson) {
     std::string json = R"({"id":{"test":2}})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err1 = parser.Embedded("id").GetUInt64("test", &id);
@@ -64,7 +64,7 @@ TEST(ParseString, EmbeddedConvertToJson) {
 TEST(ParseString, DoubleEmbeddedConvertToJson) {
     std::string json = R"({"id":{"test":{"test2":2}}})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err1 = parser.Embedded("id").Embedded("test").GetUInt64("test2", &id);
@@ -76,7 +76,7 @@ TEST(ParseString, DoubleEmbeddedConvertToJson) {
 TEST(ParseString, ErrorOnWrongEmbeddedKey) {
     std::string json = R"({"id1":{"test":2}})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err = parser.Embedded("id").GetUInt64("test", &id);
@@ -88,7 +88,7 @@ TEST(ParseString, ErrorOnWrongEmbeddedKey) {
 TEST(ParseString, ErrorOnWrongEmbeddedSubKey) {
     std::string json = R"({"id1":{"test1":2}})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err = parser.Embedded("id").GetUInt64("test", &id);
@@ -100,7 +100,7 @@ TEST(ParseString, ErrorOnWrongEmbeddedSubKey) {
 TEST(ParseString, ErrorOnWrongKey) {
     std::string json = R"({"_id":"2"})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err = parser.GetUInt64("_id1", &id);
@@ -112,7 +112,7 @@ TEST(ParseString, ErrorOnWrongKey) {
 TEST(ParseString, ErrorOnWrongType) {
     std::string json = R"({"_id":"2"})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err = parser.GetUInt64("_id", &id);
@@ -125,7 +125,7 @@ TEST(ParseString, ErrorOnWrongType) {
 TEST(ParseString, ErrorOnWrongDocument) {
     std::string json = R"({"_id":2)";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     uint64_t id;
     auto err = parser.GetUInt64("_id", &id);
@@ -139,7 +139,7 @@ TEST(ParseString, ErrorOnWrongDocument) {
 TEST(ParseString, IntArrayConvertToJson) {
     std::string json = R"({"array":[1,2,3]})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     std::vector<uint64_t> vec;
     auto err = parser.GetArrayUInt64("array", &vec);
@@ -151,7 +151,7 @@ TEST(ParseString, IntArrayConvertToJson) {
 TEST(ParseString, IntArrayErrorConvertToJson) {
     std::string json = R"({"array":[1,2,"3"]})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     std::vector<uint64_t> vec;
     auto err = parser.GetArrayUInt64("array", &vec);
@@ -164,7 +164,7 @@ TEST(ParseString, IntArrayErrorConvertToJson) {
 TEST(ParseString, StringArrayConvertToJson) {
     std::string json = R"({"array":["s1","s2","s3"]})";
 
-    JsonParser parser{json, false};
+    JsonParser parser{json};
 
     std::vector<std::string> vec;
     auto err = parser.GetArrayString("array", &vec);
@@ -175,13 +175,16 @@ TEST(ParseString, StringArrayConvertToJson) {
 
 class ParseFileTests : public Test {
   public:
-    RapidJson parser{"filename", true};
     NiceMock<MockIO> mock_io;
+    std::unique_ptr<IO> io_ptr = std::unique_ptr<IO> {
+        &mock_io
+    };
+    JsonParser parser{"filename", &io_ptr};
+
     void SetUp() override {
-        parser.io__ = std::unique_ptr<IO> {&mock_io};
     }
     void TearDown() override {
-        parser.io__.release();
+        io_ptr.release();
     }
 };
 
diff --git a/receiver/CMakeLists.txt b/receiver/CMakeLists.txt
index 83f928fd4..5732d040a 100644
--- a/receiver/CMakeLists.txt
+++ b/receiver/CMakeLists.txt
@@ -15,7 +15,8 @@ set(SOURCE_FILES
 ################################
 
 
-add_library(${TARGET_NAME} STATIC ${SOURCE_FILES} $<TARGET_OBJECTS:system_io> $<TARGET_OBJECTS:curl_http_client>)
+add_library(${TARGET_NAME} STATIC ${SOURCE_FILES} $<TARGET_OBJECTS:system_io> $<TARGET_OBJECTS:curl_http_client>
+         $<TARGET_OBJECTS:json_parser>)
 set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX)
 target_include_directories(${TARGET_NAME} PUBLIC ${HIDRA2_CXX_COMMON_INCLUDE_DIR} ${CURL_INCLUDE_DIRS})
 target_link_libraries(${TARGET_NAME} ${CURL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
diff --git a/receiver/src/receiver_config.cpp b/receiver/src/receiver_config.cpp
index be8d221a2..faf6fdb0a 100644
--- a/receiver/src/receiver_config.cpp
+++ b/receiver/src/receiver_config.cpp
@@ -1,6 +1,7 @@
 #include "receiver_config.h"
 #include "receiver_config_factory.h"
 #include "io/io_factory.h"
+#include "json_parser/json_parser.h"
 
 namespace hidra2 {
 
@@ -11,8 +12,8 @@ ReceiverConfigFactory::ReceiverConfigFactory() : io__{GenerateDefaultIO()} {
 }
 
 Error ReceiverConfigFactory::SetConfigFromFile(std::string file_name) {
-    config.influxdb_uri = "localhost";
-    return {};
+    JsonParser parser(file_name, &io__);
+    return parser.GetString("uri",&config.influxdb_uri);
 }
 
 const ReceiverConfig*  GetReceiverConfig() {
diff --git a/receiver/unittests/test_config.cpp b/receiver/unittests/test_config.cpp
index fef17aa1f..22ed806d1 100644
--- a/receiver/unittests/test_config.cpp
+++ b/receiver/unittests/test_config.cpp
@@ -45,8 +45,10 @@ class ConfigTests : public Test {
 };
 
 
-TEST_F(ConfigTests, ErrorWaitForNewRequest) {
+TEST_F(ConfigTests, ReadSettings) {
+    EXPECT_CALL(mock_io,ReadFileToString_t("fname",_));
 
+    config_factory.SetConfigFromFile("fname");
 }
 
 }
diff --git a/tests/automatic/json_parser/parse_config_file/parse_config_file.cpp b/tests/automatic/json_parser/parse_config_file/parse_config_file.cpp
index c18524055..fc8962669 100644
--- a/tests/automatic/json_parser/parse_config_file/parse_config_file.cpp
+++ b/tests/automatic/json_parser/parse_config_file/parse_config_file.cpp
@@ -39,7 +39,8 @@ void AssertSettings(const Settings& settings) {
 }
 
 Settings Parse(const std::string& fname, Error* err) {
-    hidra2::JsonParser parser(fname, true);
+
+    hidra2::JsonParser parser(fname, nullptr);
 
     Settings settings;
 
-- 
GitLab