Skip to content

Commit ef4c4d6

Browse files
author
Chandramohan Harkude
committed
Add support for event loop to over come memory leak errors by CI
``` Changes Added : Added event loop support in test code problem : After adding support for sending events from phosphor-user-manager it is obsderved that it is calling sendEvent which internally calls async_send_handler and allocates memeory for context since the event loop is not present in test code, callback is never called and the CI was throwing memory leak error Direct leak of 1 byte(s) in 1 object(s) allocated from: #0 0x7ffa787b91e7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99 openbmc#1 0x7ffa77ad6383 in operator() /usr/local/include/sdbusplus/asio/detail/async_send_handler.hpp:40 openbmc#2 0x7ffa77ad6383 in async_send<sdbusplus::asio::connection::async_method_call_timed<phosphor::logging::sendEvent(phosphor::logging::MESSAGE_TYPE, sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level, const std::vector<std::__cxx11::basic_string<char> >&, const string&)::<lambda(boost::system::error_code)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > (phosphor::logging::sendEvent(phosphor::logging::MESSAGE_TYPE, sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level, const std::vector<std::__cxx11::basic_string<char> >&, const string&)::<lambda(boost::system::error_code)>&&, const string&, const string&, const string&, const string&, uint64_t, const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&, const std::map<std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >&)::<lambda(boost::system::error_code, sdbusplus::message_t&)> > /usr/local/include/sdbusplus/asio/connection.hpp:98 openbmc#3 0x7ffa77ad6383 in async_method_call_timed<phosphor::logging::sendEvent(phosphor::logging::MESSAGE_TYPE, sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level, const std::vector<std::__cxx11::basic_string<char> >&, const string&)::<lambda(boost::system::error_code)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > /usr/local/include/sdbusplus/asio/connection.hpp:192 openbmc#4 0x7ffa77ad6383 in async_method_call<phosphor::logging::sendEvent(phosphor::logging::MESSAGE_TYPE, sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level, const std::vector<std::__cxx11::basic_string<char> >&, const string&)::<lambda(boost::system::error_code)>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > /usr/local/include/sdbusplus/asio/connection.hpp:221 openbmc#5 0x7ffa77ad6383 in phosphor::logging::sendEvent(phosphor::logging::MESSAGE_TYPE, sdbusplus::xyz::openbmc_project::Logging::server::Entry::Level, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ../lib/redfish_event_log.cpp:112 openbmc#6 0x55dfba9084a3 in phosphor::certs::Manager::replaceCertificate(phosphor::certs::Certificate*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ../certs_manager.cpp:493 openbmc#7 0x55dfba8ab09d in phosphor::certs::Certificate::replace(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >) ../certificate.cpp:315 openbmc#8 0x55dfba7981e0 in TestBody ../test/certs_manager_test.cpp:677 openbmc#9 0x7ffa786e3f2e in void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /googletest-662fe38e44900c007eccb65a5d2ea19df7bd520e/googletest/src/gtest.cc:2607 openbmc#10 0x7ffa786e3f2e in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) /googletest-662fe38e44900c007eccb65a5d2ea19df7bd520e/googletest/src/gtest.cc:2643 ``` Solution : The memory leak error was thrown because the memory allocated by "async_send_handler" in sdbusplus was not getting de-allocated because the callback is never getting called called since there was no event loop present in test code. Added event loop support in test code Fixes jira https://jirasw.nvidia.com/browse/DGXOPENBMC-8881
1 parent 5a9927f commit ef4c4d6

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

test/ldap_config_test.cpp

+27-2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,21 @@ class TestLDAPConfig : public testing::Test
6060
fs.close();
6161
}
6262

63+
void eventLoop(uint8_t numberOfTimes)
64+
{
65+
if (numberOfTimes == 0 || numberOfTimes > 15)
66+
{
67+
return;
68+
}
69+
70+
for (int i = 0; i < numberOfTimes; i++)
71+
{
72+
bus.process_discard();
73+
// wait for 1 seconds
74+
bus.wait(1 * 1000000);
75+
}
76+
}
77+
6378
void TearDown() override
6479
{
6580
fs::remove_all(dir);
@@ -461,7 +476,8 @@ TEST_F(TestLDAPConfig, testSearchScope)
461476
"MyLdap12", ldap_base::Create::SearchScope::sub,
462477
ldap_base::Create::Type::ActiveDirectory, "attr1", "attr2");
463478
managerPtr->getADConfigPtr()->enabled(true);
464-
479+
// Process D-Bus calls
480+
eventLoop(6);
465481
// Change LDAP SearchScope
466482
managerPtr->getADConfigPtr()->ldapSearchScope(
467483
ldap_base::Config::SearchScope::one);
@@ -618,7 +634,8 @@ TEST_F(TestLDAPConfig, ConditionalEnableConfig)
618634

619635
EXPECT_EQ(managerPtr->getADConfigPtr()->enabled(), true);
620636
EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), false);
621-
637+
// Process D-Bus calls
638+
eventLoop(5);
622639
// AS AD is already enabled so openldap can't be enabled.
623640
EXPECT_THROW(
624641
{
@@ -641,6 +658,8 @@ TEST_F(TestLDAPConfig, ConditionalEnableConfig)
641658
EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), false);
642659
// Now enable the openldap
643660
managerPtr->getOpenLdapConfigPtr()->enabled(true);
661+
// Process D-Bus calls
662+
eventLoop(5);
644663
EXPECT_EQ(managerPtr->getOpenLdapConfigPtr()->enabled(), true);
645664
EXPECT_EQ(managerPtr->getADConfigPtr()->enabled(), false);
646665

@@ -678,6 +697,8 @@ TEST_F(TestLDAPConfig, createPrivMapping)
678697
}
679698
},
680699
PrivilegeMappingExists);
700+
// Process D-Bus calls
701+
eventLoop(2);
681702
}
682703

683704
TEST_F(TestLDAPConfig, deletePrivMapping)
@@ -719,6 +740,8 @@ TEST_F(TestLDAPConfig, deletePrivMapping)
719740
EXPECT_NO_THROW(manager.getADConfigPtr()->checkPrivilegeMapper("admin"));
720741
manager.getADConfigPtr()->deletePrivilegeMapper(2);
721742
EXPECT_NO_THROW(manager.getADConfigPtr()->checkPrivilegeMapper("user"));
743+
// Process D-Bus calls
744+
eventLoop(2);
722745
}
723746

724747
TEST_F(TestLDAPConfig, restorePrivMapping)
@@ -798,6 +821,8 @@ TEST_F(TestLDAPConfig, testPrivileges)
798821

799822
EXPECT_NO_THROW(entry->privilege("priv-operator"));
800823
EXPECT_NO_THROW(entry->privilege("priv-user"));
824+
// Process D-Bus calls
825+
eventLoop(5);
801826
}
802827

803828
} // namespace ldap

test/ldap_mapper_test.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ class TestSerialization : public testing::Test
3333
char tempDir[] = "/tmp/privmapper_test.XXXXXX";
3434
dir = std::filesystem::path(mkdtemp(tempDir));
3535
}
36+
void eventLoop(uint8_t numberOfTimes)
37+
{
38+
if (numberOfTimes == 0 || numberOfTimes > 15)
39+
{
40+
return;
41+
}
42+
43+
for (int i = 0; i < numberOfTimes; i++)
44+
{
45+
bus.process_discard();
46+
// wait for 1 seconds
47+
bus.wait(1 * 1000000);
48+
}
49+
}
3650

3751
void TearDown() override
3852
{
@@ -139,6 +153,8 @@ TEST_F(TestSerialization, testValidPrivilege)
139153

140154
EXPECT_NO_THROW(entry->privilege("priv-operator"));
141155
EXPECT_NO_THROW(entry->privilege("priv-user"));
156+
// Process D-Bus calls
157+
eventLoop(5);
142158
}
143159

144160
TEST_F(TestSerialization, testInvalidPrivilege)

0 commit comments

Comments
 (0)