Implement config parsing

Add a configuration json parsing function to read the configuration file
from /usr/share/binaryblob/config.json for which system file and location
to serialize/deserialize the binarystore blobs. Add a simple unit test for
parsing configs as well.

Signed-off-by: Kun Yi <kunyi731@gmail.com>
Change-Id: Ie86d622e83991365bc202d659f5860ff01190311
diff --git a/test/parse_config_unittest.cpp b/test/parse_config_unittest.cpp
new file mode 100644
index 0000000..b450477
--- /dev/null
+++ b/test/parse_config_unittest.cpp
@@ -0,0 +1,66 @@
+#include "parse_config.hpp"
+
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+using json = nlohmann::json;
+using namespace conf;
+
+TEST(ParseConfigTest, ExceptionWhenMissingRequiredFields)
+{
+    auto j = R"(
+    {
+      "blobBaseId": "/test/"
+    }
+  )"_json;
+
+    BinaryBlobConfig config;
+
+    EXPECT_THROW(parseFromConfigFile(j, config), std::exception);
+}
+
+TEST(ParseConfigTest, TestSimpleConfig)
+{
+    auto j = R"(
+    {
+      "blobBaseId": "/test/",
+      "sysFilePath": "/sys/fake/path",
+      "offsetBytes": 32,
+      "maxSizeBytes": 2
+    }
+  )"_json;
+
+    BinaryBlobConfig config;
+
+    EXPECT_NO_THROW(parseFromConfigFile(j, config));
+    EXPECT_EQ(config.blobBaseId, "/test/");
+    EXPECT_EQ(config.sysFilePath, "/sys/fake/path");
+    EXPECT_EQ(config.offsetBytes, 32);
+    EXPECT_EQ(config.maxSizeBytes, 2);
+}
+
+TEST(ParseConfigTest, TestConfigArray)
+{
+    auto j = R"(
+    [{
+      "blobBaseId": "/test/",
+      "sysFilePath": "/sys/fake/path",
+      "offsetBytes": 32,
+      "maxSizeBytes": 32
+     },
+     {
+       "blobBaseId": "/test/",
+       "sysFilePath": "/another/path"
+    }]
+  )"_json;
+
+    for (auto& element : j)
+    {
+        BinaryBlobConfig config;
+
+        EXPECT_NO_THROW(parseFromConfigFile(element, config));
+        EXPECT_EQ(config.blobBaseId, "/test/");
+        EXPECT_TRUE(config.offsetBytes == 32 || config.offsetBytes == 0);
+        EXPECT_TRUE(config.maxSizeBytes == 32 || config.maxSizeBytes == 0);
+    }
+}