unit-test: Test deleting entry on name change

Breaking off into a separate function enables easier unit testing of the
specific function

Testing: 97% coverage of processing.cpp

Change-Id: I08f229657a8f44230b711fabbae20fb403792637
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/src/test/Makefile.am.include b/src/test/Makefile.am.include
index b54ddbf..394c610 100644
--- a/src/test/Makefile.am.include
+++ b/src/test/Makefile.am.include
@@ -1,12 +1,17 @@
-src_test_well_known_SOURCES = %reldir%/well_known.cpp src/processing.cpp
+src_test_well_known_SOURCES = %reldir%/well_known.cpp src/processing.cpp \
+	src/associations.cpp
 
 src_test_need_to_introspect_SOURCES = %reldir%/need_to_introspect.cpp \
-	src/processing.cpp
+	src/processing.cpp src/associations.cpp
 
 src_test_associations_SOURCES = %reldir%/associations.cpp \
     src/associations.cpp
 
+src_test_name_change_SOURCES = %reldir%/name_change.cpp \
+		src/associations.cpp src/processing.cpp
+
 check_PROGRAMS += \
 	%reldir%/well_known \
 	%reldir%/need_to_introspect \
-	%reldir%/associations
+	%reldir%/associations \
+	%reldir%/name_change
diff --git a/src/test/name_change.cpp b/src/test/name_change.cpp
new file mode 100644
index 0000000..f4a9662
--- /dev/null
+++ b/src/test/name_change.cpp
@@ -0,0 +1,62 @@
+#include "src/processing.hpp"
+#include "src/test/util/asio_server_class.hpp"
+#include "src/test/util/association_objects.hpp"
+
+#include <gtest/gtest.h>
+
+class TestNameChange : public AsioServerClassTest
+{
+};
+sdbusplus::asio::object_server* TestNameChange::AsioServerClassTest::server =
+    nullptr;
+
+// Verify unique name is removed from nameOwners
+TEST_F(TestNameChange, UniqueNameNoInterfaces)
+{
+    boost::container::flat_map<std::string, std::string> nameOwners = {
+        {":1.99", "test-name"}};
+    std::string wellKnown = {"test-name"};
+    std::string oldOwner = {":1.99"};
+    interface_map_type interfaceMap;
+    AssociationOwnersType assocOwners;
+    AssociationInterfaces assocInterfaces;
+
+    processNameChangeDelete(nameOwners, wellKnown, oldOwner, interfaceMap,
+                            assocOwners, assocInterfaces, *server);
+    EXPECT_EQ(nameOwners.size(), 0);
+}
+
+// Verify path removed from interface map and association objects
+TEST_F(TestNameChange, UniqueNameAssociationsAndInterface)
+{
+    boost::container::flat_map<std::string, std::string> nameOwners = {
+        {":1.99", DEFAULT_DBUS_SVC}};
+    std::string oldOwner = {":1.99"};
+    boost::container::flat_set<std::string> assocInterfacesSet = {
+        ASSOCIATIONS_INTERFACE};
+
+    // Build up these objects so that an associated interface will match
+    // with the associated owner being removed
+    auto assocOwners = createDefaultOwnerAssociation();
+    auto assocInterfaces = createDefaultInterfaceAssociation(server);
+    auto interfaceMap = createInterfaceMap(
+        DEFAULT_SOURCE_PATH, DEFAULT_DBUS_SVC, assocInterfacesSet);
+
+    processNameChangeDelete(nameOwners, DEFAULT_DBUS_SVC, oldOwner,
+                            interfaceMap, assocOwners, assocInterfaces,
+                            *server);
+    EXPECT_EQ(nameOwners.size(), 0);
+
+    // Verify owner association was deleted
+    EXPECT_TRUE(assocOwners.empty());
+
+    // Verify endpoint was deleted from interface association
+    auto intfEndpoints =
+        std::get<endpointsPos>(assocInterfaces[DEFAULT_FWD_PATH]);
+    EXPECT_EQ(intfEndpoints.size(), 0);
+    intfEndpoints = std::get<endpointsPos>(assocInterfaces[DEFAULT_REV_PATH]);
+    EXPECT_EQ(intfEndpoints.size(), 0);
+
+    // Verify interface map was deleted
+    EXPECT_TRUE(interfaceMap.empty());
+}
diff --git a/src/test/util/association_objects.hpp b/src/test/util/association_objects.hpp
index 081f891..45b89d6 100644
--- a/src/test/util/association_objects.hpp
+++ b/src/test/util/association_objects.hpp
@@ -1,4 +1,5 @@
 #include "src/associations.hpp"
+#include "src/processing.hpp"
 
 const std::string DEFAULT_SOURCE_PATH = "/logging/entry/1";
 const std::string DEFAULT_DBUS_SVC = "xyz.openbmc_project.New.Interface";
@@ -45,3 +46,15 @@
     auto endpoints = std::get<endpointsPos>(iface);
     endpoints.push_back(EXTRA_ENDPOINT);
 }
+
+// Create a default interface_map_type with input values
+interface_map_type createInterfaceMap(
+    const std::string& path, const std::string& connection_name,
+    const boost::container::flat_set<std::string>& interface_names)
+{
+    boost::container::flat_map<std::string,
+                               boost::container::flat_set<std::string>>
+        connectionMap = {{connection_name, interface_names}};
+    interface_map_type interfaceMap = {{path, connectionMap}};
+    return interfaceMap;
+}