Add unit testcases for CA certificate authority manager

This test cases can be enabled by using below feature flag
"--enable-ca-cert-extension"

Testcases:
testObjectCreation
testInvalidArgument
DeleteAllCSRObjects
DeleteObjectEntry

Signed-off-by: Ravi Teja <raviteja28031990@gmail.com>
Change-Id: I9e30f28ef73ecdc377ae357e9c73c42063f85137
diff --git a/bmc-vmi-ca/ca_certs_manager.hpp b/bmc-vmi-ca/ca_certs_manager.hpp
index 9d6231e..a1db918 100644
--- a/bmc-vmi-ca/ca_certs_manager.hpp
+++ b/bmc-vmi-ca/ca_certs_manager.hpp
@@ -60,13 +60,14 @@
      */
     void deleteAll() override;
 
+  protected:
+    std::map<uint32_t, std::unique_ptr<Entry>> entries;
+
   private:
     /** @brief sdbusplus DBus bus connection. */
     sdbusplus::bus::bus& bus;
     // sdevent Event handle
     sdeventplus::Event& event;
-
-    std::map<uint32_t, std::unique_ptr<Entry>> entries;
     /** @brief object path */
     std::string objectPath;
     /** @brief Id of the last certificate entry */
diff --git a/test/Makefile.am b/test/Makefile.am
index 08aeeee..e500841 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -38,3 +38,14 @@
 certs_manager_test_LDADD += $(top_builddir)/csr.o
 certs_manager_test_LDADD += $(top_builddir)/watch.o
 certs_manager_test_LDADD += $(CODE_COVERAGE_LIBS)
+
+if CA_CERT_EXTENSION
+# Build/add ca_certs_manager_test to test suite
+check_PROGRAMS += ca_certs_manager_test
+ca_certs_manager_test_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_CPPFLAGS)
+ca_certs_manager_test_LDFLAGS = $(AM_LDFLAGS) $(PTHREAD_LIBS) $(OESDK_TESTCASE_FLAGS)
+ca_certs_manager_test_SOURCES = ca_certs_manager_test.cpp
+ca_certs_manager_test_LDADD = $(top_builddir)/bmc-vmi-ca/ca_certs_manager.o
+ca_certs_manager_test_LDADD += $(top_builddir)/bmc-vmi-ca/ca_cert_entry.o
+ca_certs_manager_test_LDADD += $(CODE_COVERAGE_LIBS)
+endif
diff --git a/test/ca_certs_manager_test.cpp b/test/ca_certs_manager_test.cpp
new file mode 100644
index 0000000..17c8589
--- /dev/null
+++ b/test/ca_certs_manager_test.cpp
@@ -0,0 +1,125 @@
+#include "config.h"
+
+#include "bmc-vmi-ca/ca_certs_manager.hpp"
+
+#include <iterator>
+#include <sdeventplus/event.hpp>
+#include <string>
+#include <xyz/openbmc_project/Certs/error.hpp>
+#include <xyz/openbmc_project/Common/error.hpp>
+
+#include <gtest/gtest.h>
+
+using InvalidArgument =
+    sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
+using namespace ca::cert;
+
+class MockCACertMgr : public CACertMgr
+{
+  public:
+    MockCACertMgr(sdbusplus::bus::bus& bus, sdeventplus::Event& event,
+                  const char* path) :
+        CACertMgr(bus, event, path)
+    {
+    }
+
+    void deleteAll()
+    {
+        CACertMgr::deleteAll();
+    }
+
+    void erase(uint32_t entryId)
+    {
+        CACertMgr::erase(entryId);
+    }
+    std::string createCSRObject(std::string csrString)
+    {
+        return (signCSR(csrString));
+    }
+
+    uint32_t getNumOfEntries()
+    {
+        return entries.size();
+    }
+
+    friend class TestCACertMgr;
+};
+/**
+ * Class to create certificate authority manager unit testcases.
+ */
+class TestCACertMgr : public ::testing::Test
+{
+  public:
+    TestCACertMgr() : bus(sdbusplus::bus::new_default())
+    {
+    }
+
+  protected:
+    sdbusplus::bus::bus bus;
+};
+
+TEST_F(TestCACertMgr, testObjectCreation)
+{
+    auto bus = sdbusplus::bus::new_default();
+    std::string objPath = "/xyz/openbmc_project/certs/ca";
+    auto event = sdeventplus::Event::get_default();
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+    MockCACertMgr manager(bus, event, objPath.c_str());
+
+    std::string csrString = "csr string";
+    EXPECT_NO_THROW(objPath = manager.createCSRObject(csrString));
+    EXPECT_TRUE(manager.getNumOfEntries() == 1);
+}
+
+TEST_F(TestCACertMgr, testInvalidArgument)
+{
+    auto bus = sdbusplus::bus::new_default();
+    std::string objPath = "/xyz/openbmc_project/certs/ca";
+    auto event = sdeventplus::Event::get_default();
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+    MockCACertMgr manager(bus, event, objPath.c_str());
+
+    std::string csrString(4097, 'C');
+
+    EXPECT_THROW(objPath = manager.createCSRObject(csrString), InvalidArgument);
+}
+TEST_F(TestCACertMgr, DeleteAllCSRObjects)
+{
+    auto bus = sdbusplus::bus::new_default();
+    std::string objPath = "/xyz/openbmc_project/certs/ca";
+    auto event = sdeventplus::Event::get_default();
+
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+    MockCACertMgr manager(bus, event, objPath.c_str());
+
+    std::string csrString = "csr string";
+
+    objPath = manager.createCSRObject(csrString);
+    objPath = manager.createCSRObject(csrString);
+    EXPECT_TRUE(manager.getNumOfEntries() == 2);
+    manager.deleteAll();
+
+    EXPECT_TRUE(manager.getNumOfEntries() == 0);
+}
+TEST_F(TestCACertMgr, DeleteObjectEntry)
+{
+
+    auto bus = sdbusplus::bus::new_default();
+    std::string objPath = "/xyz/openbmc_project/certs/ca";
+    auto event = sdeventplus::Event::get_default();
+    bus.attach_event(event.get(), SD_EVENT_PRIORITY_NORMAL);
+    MockCACertMgr manager(bus, event, objPath.c_str());
+
+    std::string csrString = "csr string";
+    std::string entryPath = manager.createCSRObject(csrString);
+    std::size_t pos = entryPath.rfind("/");
+
+    std::string id;
+    if (pos != std::string::npos)
+    {
+        id = entryPath.substr(pos + 1);
+    }
+
+    manager.erase(std::stoi(id));
+    EXPECT_TRUE(manager.getNumOfEntries() == 0);
+}