Interface & Factory implementation for VPD Parsers

This commit abstracts the implementation logic of different parser.
A parser factory is implemented to provide instance of required
parser based on the type of vpd file needed to be parsed.

The interface should be derived to implement any further parser logic
related to vpd.

Status: This does not add any new function, so basic testing of
VPD parsing, VPD tool and writes was performed.

Signed-off-by: Sunny Srivastava <sunnsr25@in.ibm.com>
Change-Id: I3ce1a2d6b7e8d8984fd7800132e78ab8a9a21e56
diff --git a/test/ipz_parser/parser.cpp b/test/ipz_parser/parser.cpp
index 40c60e9..c9ec93b 100644
--- a/test/ipz_parser/parser.cpp
+++ b/test/ipz_parser/parser.cpp
@@ -1,9 +1,10 @@
+#include "ipz_parser.hpp"
+
 #include <cassert>
 #include <defines.hpp>
 #include <fstream>
 #include <impl.hpp>
 #include <iterator>
-#include <parser.hpp>
 #include <store.hpp>
 
 #include <gtest/gtest.h>
diff --git a/test/keyword_vpd_parser_test/kw_vpd_test.cpp b/test/keyword_vpd_parser_test/kw_vpd_test.cpp
index 115d60a..48c3961 100644
--- a/test/keyword_vpd_parser_test/kw_vpd_test.cpp
+++ b/test/keyword_vpd_parser_test/kw_vpd_test.cpp
@@ -1,4 +1,5 @@
 #include "keyword_vpd_parser.hpp"
+#include "store.hpp"
 #include "types.hpp"
 
 #include <exception>
@@ -9,6 +10,7 @@
 using namespace vpd::keyword::parser;
 using namespace openpower::vpd;
 using namespace openpower::vpd::inventory;
+using namespace std;
 
 class KeywordVpdParserTest : public ::testing::Test
 {
@@ -59,7 +61,7 @@
           0x34}},
         {"CC", {0x32, 0x44, 0x33, 0x37}}};
 
-    auto map2 = parserObj1.parseKwVpd();
+    auto map2 = std::move(get<KeywordVpdMap>(parserObj1.parse()));
     ASSERT_EQ(1, map1 == map2);
 
     // BONO TYPE VPD
@@ -81,7 +83,7 @@
             {"Z5", {0x30}},
             {"Z6", {0x41, 0x31, 0x38, 0x30, 0x30, 0x32, 0x30, 0x30}}};
 
-    map2 = parserObj2.parseKwVpd();
+    map2 = std::move(get<KeywordVpdMap>(parserObj2.parse()));
     ASSERT_EQ(1, map1 == map2);
 }
 
@@ -90,12 +92,12 @@
     // Invalid Large resource type Identifier String - corrupted at index[0]
     keywordVpdVector[0] = 0x83;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // For BONO type VPD
     bonoKwVpdVector[0] = 0x83;
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, InvKwValTag)
@@ -103,12 +105,12 @@
     // Invalid Large resource type Vendor Defined - corrupted at index[19]
     keywordVpdVector[19] = 0x85;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // For BONO type VPD - corruputed at index[33]
     bonoKwVpdVector[33] = 0x91;
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, InvKwValSize)
@@ -116,12 +118,12 @@
     // Badly formed keyword VPD data - corrupted at index[20]
     keywordVpdVector[20] = 0x00;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // For BONO type VPD - corruputed at index[34]
     bonoKwVpdVector[34] = 0x00;
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, InvKwValEndTag)
@@ -129,7 +131,7 @@
     // Invalid Small resource type End - corrupted at index[177]
     keywordVpdVector[177] = 0x80;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, InvChecksum)
@@ -137,7 +139,7 @@
     // Invalid Check sum - corrupted at index[178]
     keywordVpdVector[178] = 0xb1;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, InvKwVpdEndTag)
@@ -145,12 +147,12 @@
     // Invalid Small resource type Last End Of Data - corrupted at index[179]
     keywordVpdVector[179] = 0x79;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // For BONO type VPD - corrupted at index[147]
     bonoKwVpdVector[147] = 0x79;
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, OutOfBoundGreaterSize)
@@ -159,12 +161,12 @@
     // at index[24]
     keywordVpdVector[24] = 0x32;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // For BONO type VPD - corrupted at index[38]
     bonoKwVpdVector[38] = 0x4D;
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, OutOfBoundLesserSize)
@@ -173,12 +175,12 @@
     // at index[24]
     keywordVpdVector[24] = 0x03;
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // For BONO type VPD - corrupted at index[38]
     bonoKwVpdVector[38] = 0x04;
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 TEST_F(KeywordVpdParserTest, BlankVpd)
@@ -186,12 +188,12 @@
     // Blank Kw Vpd
     keywordVpdVector.clear();
     KeywordVpdParser parserObj1(std::move(keywordVpdVector));
-    EXPECT_THROW(parserObj1.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj1.parse(), std::runtime_error);
 
     // Blank Bono Type Vpd
     bonoKwVpdVector.clear();
     KeywordVpdParser parserObj2(std::move(bonoKwVpdVector));
-    EXPECT_THROW(parserObj2.parseKwVpd(), std::runtime_error);
+    EXPECT_THROW(parserObj2.parse(), std::runtime_error);
 }
 
 int main(int argc, char** argv)
diff --git a/test/meson.build b/test/meson.build
index 3f144b9..97b5e1c 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -15,7 +15,7 @@
 gtest = dependency('gtest', main: true, disabler: true, required: build_tests)
 dependecy_list = [gtest, gmock, sdbusplus, phosphor_logging, phosphor_dbus_interfaces]
 
-configuration_inc = include_directories('..', '../vpd-manager', 'vpd-manager-test')
+configuration_inc = include_directories('..', '../vpd-manager', 'vpd-manager-test', '../vpd-parser')
 
 vpd_test = ['store/store.cpp',
             'ipz_parser/parser.cpp',
@@ -27,11 +27,13 @@
 application_src =['../impl.cpp',
                    '../vpdecc/vpdecc.c',
                    '../vpdecc/vpdecc_support.c',
-                   '../parser.cpp',
+                   '../vpd-parser/ipz_parser.cpp',
                    '../utils.cpp',
                    '../vpd-manager/reader_impl.cpp',
-                   '../keyword_vpd_parser.cpp',
-                   '../vpd-manager/editor_impl.cpp'
+                   '../vpd-parser/keyword_vpd_parser.cpp',
+                   '../vpd-manager/editor_impl.cpp',
+                   '../vpd-parser/parser_factory.cpp',
+                   '../vpd-parser/memory_vpd_parser.cpp'
                   ]
 
 foreach t : vpd_test
diff --git a/test/parser/parser.cpp b/test/parser/parser.cpp
index 139c4f2..57da82f 100644
--- a/test/parser/parser.cpp
+++ b/test/parser/parser.cpp
@@ -2,20 +2,21 @@
 #include <defines.hpp>
 #include <fstream>
 #include <iterator>
-#include <parser.hpp>
 #include <store.hpp>
+#include <vpd-parser/ipz_parser.hpp>
 
 void runTests()
 {
     using namespace openpower::vpd;
-
+    using namespace openpower::vpd::ipz::parser;
     // Test parse() API
     {
         std::ifstream vpdFile("test.vpd", std::ios::binary);
         Binary vpd((std::istreambuf_iterator<char>(vpdFile)),
                    std::istreambuf_iterator<char>());
 
-        auto vpdStore = parse(std::move(vpd));
+        IpzVpdParser ipzParser(std::move(vpd));
+        auto vpdStore = std::move(std::get<Store>(ipzParser.parse()));
 
         assert(("P012" == vpdStore.get<Record::VINI, record::Keyword::CC>()));
         assert(("2019-01-01-08:30:00" ==
diff --git a/test/vpd-manager-test/editor_test.cpp b/test/vpd-manager-test/editor_test.cpp
index c1e98b6..2f7114a 100644
--- a/test/vpd-manager-test/editor_test.cpp
+++ b/test/vpd-manager-test/editor_test.cpp
@@ -1,5 +1,5 @@
 #include "editor_impl.hpp"
-#include "parser.hpp"
+#include "ipz_parser.hpp"
 
 #include <algorithm>
 #include <nlohmann/json.hpp>