Skip to content

Commit a3cf902

Browse files
author
jparisu
committed
Refs #15831: Fix memory leaks in some tests
Signed-off-by: jparisu <[email protected]>
1 parent 1a235a6 commit a3cf902

File tree

7 files changed

+80
-23
lines changed

7 files changed

+80
-23
lines changed

src/cpp/StatisticsBackendData.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ void StatisticsBackendData::stop_monitor(
367367

368368
// The monitor is inactive
369369
// NOTE: for test sake, this is not always set
370-
if (database_->is_entity_present(monitor_id))
370+
if (database_ && database_->is_entity_present(monitor_id))
371371
{
372372
database_->change_entity_status(monitor_id, false);
373373
}

src/cpp/database/database.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ class Database
7979
{
8080
public:
8181

82+
/**
83+
* @brief Destructor of Database.
84+
*
85+
* @note It requires a virtual dtor for test sake.
86+
*/
87+
virtual ~Database() = default;
88+
8289
/**
8390
* @brief Insert a new entity into the database.
8491
* @param entity The entity object to be inserted.

test/TrafficInjector/MessageSerializer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class MessageSerializer
6565
virtual void deserialize(
6666
void* data,
6767
const Message& message) = 0;
68+
69+
virtual ~MessageSerializer() = default;
6870
};
6971

7072
class GuidMessageSerializer : public MessageSerializer

test/TrafficInjector/TrafficInjector.h

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class TrafficInjector
179179
type.register_type(participant_);
180180
data_types_[kind] = type;
181181

182-
MessageSerializer* serializer = new WriterReaderDataMessageSerializer();
182+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<WriterReaderDataMessageSerializer>();
183183
serializers_[kind] = serializer;
184184

185185
// Add the type to all other event kinds that use it
@@ -197,7 +197,7 @@ class TrafficInjector
197197
type.register_type(participant_);
198198
data_types_[kind] = type;
199199

200-
MessageSerializer* serializer = new Locator2LocatorDataMessageSerializer();
200+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<Locator2LocatorDataMessageSerializer>();
201201
serializers_[kind] = serializer;
202202

203203
// Add the type to all other event kinds that use it
@@ -215,7 +215,7 @@ class TrafficInjector
215215
type.register_type(participant_);
216216
data_types_[kind] = type;
217217

218-
MessageSerializer* serializer = new EntityDataMessageSerializer();
218+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityDataMessageSerializer>();
219219
serializers_[kind] = serializer;
220220

221221
// Add the type to all other event kinds that use it
@@ -235,7 +235,7 @@ class TrafficInjector
235235
type.register_type(participant_);
236236
data_types_[kind] = type;
237237

238-
MessageSerializer* serializer = new EntityDataMessageSerializer();
238+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityDataMessageSerializer>();
239239
serializers_[kind] = serializer;
240240

241241
// Add the type to all other event kinds that use it
@@ -255,7 +255,7 @@ class TrafficInjector
255255
type.register_type(participant_);
256256
data_types_[kind] = type;
257257

258-
MessageSerializer* serializer = new Entity2LocatorTrafficMessageSerializer();
258+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<Entity2LocatorTrafficMessageSerializer>();
259259
serializers_[kind] = serializer;
260260

261261
// Add the type to all other event kinds that use it
@@ -275,7 +275,7 @@ class TrafficInjector
275275
type.register_type(participant_);
276276
data_types_[kind] = type;
277277

278-
MessageSerializer* serializer = new Entity2LocatorTrafficMessageSerializer();
278+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<Entity2LocatorTrafficMessageSerializer>();
279279
serializers_[kind] = serializer;
280280

281281
// Add the type to all other event kinds that use it
@@ -295,7 +295,7 @@ class TrafficInjector
295295
type.register_type(participant_);
296296
data_types_[kind] = type;
297297

298-
MessageSerializer* serializer = new EntityCountMessageSerializer();
298+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
299299
serializers_[kind] = serializer;
300300

301301
// Add the type to all other event kinds that use it
@@ -327,7 +327,7 @@ class TrafficInjector
327327
type.register_type(participant_);
328328
data_types_[kind] = type;
329329

330-
MessageSerializer* serializer = new EntityCountMessageSerializer();
330+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
331331
serializers_[kind] = serializer;
332332

333333
// Add the type to all other event kinds that use it
@@ -359,7 +359,7 @@ class TrafficInjector
359359
type.register_type(participant_);
360360
data_types_[kind] = type;
361361

362-
MessageSerializer* serializer = new EntityCountMessageSerializer();
362+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
363363
serializers_[kind] = serializer;
364364

365365
// Add the type to all other event kinds that use it
@@ -391,7 +391,7 @@ class TrafficInjector
391391
type.register_type(participant_);
392392
data_types_[kind] = type;
393393

394-
MessageSerializer* serializer = new EntityCountMessageSerializer();
394+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
395395
serializers_[kind] = serializer;
396396

397397
// Add the type to all other event kinds that use it
@@ -423,7 +423,7 @@ class TrafficInjector
423423
type.register_type(participant_);
424424
data_types_[kind] = type;
425425

426-
MessageSerializer* serializer = new EntityCountMessageSerializer();
426+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
427427
serializers_[kind] = serializer;
428428

429429
// Add the type to all other event kinds that use it
@@ -455,7 +455,7 @@ class TrafficInjector
455455
type.register_type(participant_);
456456
data_types_[kind] = type;
457457

458-
MessageSerializer* serializer = new EntityCountMessageSerializer();
458+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
459459
serializers_[kind] = serializer;
460460

461461
// Add the type to all other event kinds that use it
@@ -487,7 +487,7 @@ class TrafficInjector
487487
type.register_type(participant_);
488488
data_types_[kind] = type;
489489

490-
MessageSerializer* serializer = new EntityCountMessageSerializer();
490+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
491491
serializers_[kind] = serializer;
492492

493493
// Add the type to all other event kinds that use it
@@ -519,7 +519,7 @@ class TrafficInjector
519519
type.register_type(participant_);
520520
data_types_[kind] = type;
521521

522-
MessageSerializer* serializer = new EntityCountMessageSerializer();
522+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<EntityCountMessageSerializer>();
523523
serializers_[kind] = serializer;
524524

525525
// Add the type to all other event kinds that use it
@@ -551,7 +551,7 @@ class TrafficInjector
551551
type.register_type(participant_);
552552
data_types_[kind] = type;
553553

554-
MessageSerializer* serializer = new DiscoveryTimeMessageSerializer();
554+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<DiscoveryTimeMessageSerializer>();
555555
serializers_[kind] = serializer;
556556

557557
// Add the type to all other event kinds that use it
@@ -569,7 +569,7 @@ class TrafficInjector
569569
type.register_type(participant_);
570570
data_types_[kind] = type;
571571

572-
MessageSerializer* serializer = new SampleIdentityCountMessageSerializer();
572+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<SampleIdentityCountMessageSerializer>();
573573
serializers_[kind] = serializer;
574574

575575
// Add the type to all other event kinds that use it
@@ -587,7 +587,7 @@ class TrafficInjector
587587
type.register_type(participant_);
588588
data_types_[kind] = type;
589589

590-
MessageSerializer* serializer = new PhysicalDataMessageSerializer();
590+
std::shared_ptr<MessageSerializer> serializer = std::make_shared<PhysicalDataMessageSerializer>();
591591
serializers_[kind] = serializer;
592592

593593
// Add the type to all other event kinds that use it
@@ -715,7 +715,7 @@ class TrafficInjector
715715
std::map<StatisticsEventKind, Topic*> topics_;
716716
std::map<StatisticsEventKind, TypeSupport> data_types_;
717717

718-
std::map<StatisticsEventKind, MessageSerializer*> serializers_;
718+
std::map<StatisticsEventKind, std::shared_ptr<MessageSerializer>> serializers_;
719719
std::map<StatisticsEventKind, std::string> event_names_;
720720
std::map<std::string, StatisticsEventKind> event_kinds_;
721721

test/unittest/StatisticsBackend/IsActiveTests.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
using namespace eprosima::statistics_backend::subscriber;
2727

28+
bool StatisticsBackendTest::has_database_been_set_ = false;
29+
2830
/**
2931
* @brief Fixture for the is_active_tests
3032
* - Create a database loading it from a file.
@@ -36,7 +38,7 @@ class is_active_tests : public ::testing::Test
3638

3739
void SetUp()
3840
{
39-
db = new DataBaseTest;
41+
db = new DataBaseTest; // This will be deleted inside StatisticsBackendTest unset_database
4042
DatabaseDump dump;
4143
load_file(EMPTY_ENTITIES_DUMP_FILE, dump);
4244
db->load_database(dump);
@@ -106,6 +108,11 @@ class is_active_tests : public ::testing::Test
106108
delete entity_queue;
107109
delete data_queue;
108110
delete participant_listener;
111+
112+
if (!StatisticsBackendTest::unset_database())
113+
{
114+
delete db;
115+
}
109116
}
110117

111118
std::shared_ptr<Host> host;
@@ -121,13 +128,13 @@ class is_active_tests : public ::testing::Test
121128
DataBaseTest* db;
122129

123130
// Entity queue, attached to the database
124-
DatabaseEntityQueue* entity_queue;
131+
DatabaseEntityQueue* entity_queue = nullptr;
125132
// Data queue, attached to the database
126-
DatabaseDataQueue* data_queue;
133+
DatabaseDataQueue* data_queue = nullptr;
127134
// Statistics participant_, that is supposed to receive the callbacks
128135
eprosima::fastdds::dds::DomainParticipant statistics_participant;
129136
// Listener under tests. Will receive a pointer to statistics_participant
130-
StatisticsParticipantListener* participant_listener;
137+
StatisticsParticipantListener* participant_listener = nullptr;
131138
};
132139

133140
// Windows dll do not export ParticipantProxyData class members (private APIs)

test/unittest/StatisticsBackend/StatisticsBackendTests.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
using namespace eprosima::statistics_backend;
3535
using namespace eprosima::statistics_backend::database;
3636

37+
bool StatisticsBackendTest::has_database_been_set_ = false;
38+
3739
/**
3840
* @brief Fixture for the statistics_backend class tests
3941
*
@@ -56,6 +58,14 @@ class statistics_backend_tests : public ::testing::TestWithParam<std::tuple<Enti
5658
entities = PopulateDatabase::populate_database(*db);
5759
}
5860

61+
void TearDown()
62+
{
63+
if (!StatisticsBackendTest::unset_database())
64+
{
65+
delete db;
66+
}
67+
}
68+
5969
DataBaseTest* db;
6070
std::map<TestId, std::shared_ptr<const Entity>> entities;
6171
};

test/unittest/TestUtils/DatabaseUtils.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,8 +634,39 @@ class StatisticsBackendTest : public StatisticsBackend
634634
monitor->domain_listener = nullptr;
635635
details::StatisticsBackendData::get_instance()->monitors_by_entity_[domain->id] = monitor;
636636
}
637+
has_database_been_set_ = true;
637638
}
638639

640+
/**
641+
* @brief This method unset the internal database
642+
*
643+
* This method is required because the database is manually and hard set from the test, which makes
644+
* ASAN cry.
645+
* This will remove this instance in case it has been set, and do nothing otherwise.
646+
*
647+
* Be aware that in some cases where the database has not been set, it may be removed manually from
648+
* the test. (This is why you should not create a smart ptr from a ptr initialized somewhere else.)
649+
*
650+
* @return true if the database has been reset
651+
* @return false otherwise
652+
*/
653+
static bool unset_database()
654+
{
655+
if (has_database_been_set_)
656+
{
657+
details::StatisticsBackendData::get_instance()->database_.reset();
658+
return true;
659+
}
660+
else
661+
{
662+
return false;
663+
}
664+
}
665+
666+
protected:
667+
668+
static bool has_database_been_set_;
669+
639670
};
640671

641672
/**

0 commit comments

Comments
 (0)