blob: d5f86f40a499d26fe618bb456450a858c290bd01 [file] [log] [blame]
#include "src/associations.hpp"
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <gtest/gtest.h>
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<sdbusplus::asio::connection>(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<std::string, AssociationPaths> 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<endpointsPos>(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<endpointsPos>(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<endpointsPos>(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<endpointsPos>(assocInterfaces[DEFAULT_FWD_PATH]);
EXPECT_EQ(intfEndpoints.size(), 0);
intfEndpoints = std::get<endpointsPos>(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<endpointsPos>(assocInterfaces[DEFAULT_FWD_PATH]);
EXPECT_EQ(intfEndpoints.size(), 0);
intfEndpoints = std::get<endpointsPos>(assocInterfaces[DEFAULT_REV_PATH]);
EXPECT_EQ(intfEndpoints.size(), 0);
}