#include "src/associations.hpp" #include #include #include class TestAssociations : public testing::Test { protected: // Make this global to the whole test suite since we want to share // the asio::object_server accross the test cases // NOTE - latest googltest changed to SetUpTestSuite() static void SetUpTestCase() { boost::asio::io_context io; auto conn = std::make_shared(io); conn->request_name("xyz.openbmc_project.ObjMgr.Test"); server = new sdbusplus::asio::object_server(conn); } // NOTE - latest googltest changed to TearDownTestSuite() static void TearDownTestCase() { delete server; server = nullptr; } static sdbusplus::asio::object_server* server; }; sdbusplus::asio::object_server* TestAssociations::server = nullptr; const std::string DEFAULT_SOURCE_PATH = "/logging/entry/1"; const std::string DEFAULT_DBUS_SVC = "xyz.openbmc_project.New.Interface"; const std::string DEFAULT_FWD_PATH = {DEFAULT_SOURCE_PATH + "/" + "inventory"}; const std::string DEFAULT_ENDPOINT = "/xyz/openbmc_project/inventory/system/chassis"; const std::string DEFAULT_REV_PATH = {DEFAULT_ENDPOINT + "/" + "error"}; const std::string EXTRA_ENDPOINT = "/xyz/openbmc_project/differnt/endpoint"; // Create a default AssociationOwnersType object AssociationOwnersType createDefaultOwnerAssociation() { AssociationPaths assocPathMap = {{DEFAULT_FWD_PATH, {DEFAULT_ENDPOINT}}, {DEFAULT_REV_PATH, {DEFAULT_SOURCE_PATH}}}; boost::container::flat_map serviceMap = { {DEFAULT_DBUS_SVC, assocPathMap}}; AssociationOwnersType ownerAssoc = {{DEFAULT_SOURCE_PATH, serviceMap}}; return ownerAssoc; } // Create a default AssociationInterfaces object AssociationInterfaces createDefaultInterfaceAssociation(sdbusplus::asio::object_server* server) { AssociationInterfaces interfaceAssoc; auto& iface = interfaceAssoc[DEFAULT_FWD_PATH]; auto& endpoints = std::get(iface); endpoints.push_back(DEFAULT_ENDPOINT); server->add_interface(DEFAULT_FWD_PATH, DEFAULT_DBUS_SVC); auto& iface2 = interfaceAssoc[DEFAULT_REV_PATH]; auto& endpoints2 = std::get(iface2); endpoints2.push_back(DEFAULT_SOURCE_PATH); server->add_interface(DEFAULT_REV_PATH, DEFAULT_DBUS_SVC); return interfaceAssoc; } // Just add an extra endpoint to the first association void addEndpointToInterfaceAssociation(AssociationInterfaces& interfaceAssoc) { auto iface = interfaceAssoc[DEFAULT_FWD_PATH]; auto endpoints = std::get(iface); endpoints.push_back(EXTRA_ENDPOINT); } // Verify call when path is not in associated owners TEST_F(TestAssociations, SourcePathNotInAssociations) { EXPECT_NE(nullptr, server); std::string sourcePath = "/xyz/openbmc_project/no/association"; AssociationOwnersType assocOwners; AssociationInterfaces assocInterfaces; removeAssociation(sourcePath, DEFAULT_DBUS_SVC, *server, assocOwners, assocInterfaces); } // Verify call when owner is not in associated owners TEST_F(TestAssociations, OwnerNotInAssociations) { AssociationInterfaces assocInterfaces; auto assocOwners = createDefaultOwnerAssociation(); removeAssociation(DEFAULT_SOURCE_PATH, DEFAULT_DBUS_SVC, *server, assocOwners, assocInterfaces); } // Verify call when path is not in associated interfaces TEST_F(TestAssociations, PathNotInAssocInterfaces) { AssociationInterfaces assocInterfaces; auto assocOwners = createDefaultOwnerAssociation(); removeAssociation(DEFAULT_SOURCE_PATH, DEFAULT_DBUS_SVC, *server, assocOwners, assocInterfaces); EXPECT_TRUE(assocOwners.empty()); } // Verify call when path is in associated interfaces TEST_F(TestAssociations, PathIsInAssociatedInterfaces) { // Build up these objects so that an associated interface will match // with the associated owner being removed auto assocOwners = createDefaultOwnerAssociation(); auto assocInterfaces = createDefaultInterfaceAssociation(server); removeAssociation(DEFAULT_SOURCE_PATH, DEFAULT_DBUS_SVC, *server, assocOwners, assocInterfaces); // Verify owner association was deleted EXPECT_TRUE(assocOwners.empty()); // Verify endpoint was deleted from interface association auto intfEndpoints = std::get(assocInterfaces[DEFAULT_FWD_PATH]); EXPECT_EQ(intfEndpoints.size(), 0); intfEndpoints = std::get(assocInterfaces[DEFAULT_REV_PATH]); EXPECT_EQ(intfEndpoints.size(), 0); } // Verify call when path is in associated interfaces, with extra endpoints TEST_F(TestAssociations, PathIsInAssociatedInterfacesExtraEndpoints) { // Build up these objects so that an associated interface will match // with the associated owner being removed auto assocOwners = createDefaultOwnerAssociation(); auto assocInterfaces = createDefaultInterfaceAssociation(server); // Add another endpoint to the assoc interfaces addEndpointToInterfaceAssociation(assocInterfaces); removeAssociation(DEFAULT_SOURCE_PATH, DEFAULT_DBUS_SVC, *server, assocOwners, assocInterfaces); // Verify owner association was deleted EXPECT_TRUE(assocOwners.empty()); // Verify all endpoints are deleted since source path was deleted auto intfEndpoints = std::get(assocInterfaces[DEFAULT_FWD_PATH]); EXPECT_EQ(intfEndpoints.size(), 0); intfEndpoints = std::get(assocInterfaces[DEFAULT_REV_PATH]); EXPECT_EQ(intfEndpoints.size(), 0); }