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);
+}