[coco] Fix possible memory leak in DLinkedListTest (#1593)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 20 Sep 2018 04:07:46 +0000 (13:07 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 20 Sep 2018 04:07:46 +0000 (13:07 +0900)
With the current implementation, allocated objects will be leaked on
assert failure.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/src/ADT/DLinkedList.test.cpp

index 56f7264..7ff35c1 100644 (file)
@@ -1,5 +1,7 @@
 #include "coco/ADT/DLinkedList.h"
 
+#include <set>
+
 #include <gtest/gtest.h>
 
 namespace
@@ -39,14 +41,65 @@ template <> ChildList *DLinkedList<Child, Parent>::head(Parent *p) { return p->c
 
 } // namespace coco
 
-TEST(ADT_DLINKED_LINK, insert_two_elements)
+namespace
+{
+class DLinkedListTest : public ::testing::Test
+{
+public:
+  virtual ~DLinkedListTest()
+  {
+    // NOTE Child SHOULD BE freed before parent
+    for (auto child : _children)
+    {
+      delete child;
+    }
+
+    for (auto parent : _parents)
+    {
+      delete parent;
+    }
+  }
+
+protected:
+  template <typename T> T *create(void);
+
+  void destroy(Child *);
+
+private:
+  std::set<::Parent *> _parents;
+  std::set<::Child *> _children;
+};
+
+template <>::Parent *DLinkedListTest::create(void)
 {
   auto parent = new ::Parent;
+  _parents.insert(parent);
+  return parent;
+}
+
+template <>::Child *DLinkedListTest::create(void)
+{
+  auto child = new ::Child;
+  _children.insert(child);
+  return child;
+}
+
+void DLinkedListTest::destroy(Child *child)
+{
+  _children.erase(child);
+  delete child;
+}
+
+} // namespace
+
+TEST_F(DLinkedListTest, insert_two_elements)
+{
+  auto parent = create<::Parent>();
 
   ASSERT_EQ(parent->children()->head(), nullptr);
   ASSERT_EQ(parent->children()->tail(), nullptr);
 
-  auto child_1 = new ::Child;
+  auto child_1 = create<::Child>();
 
   ASSERT_EQ(child_1->parent(), nullptr);
   ASSERT_EQ(child_1->prev(), nullptr);
@@ -61,7 +114,7 @@ TEST(ADT_DLINKED_LINK, insert_two_elements)
   ASSERT_EQ(parent->children()->head(), child_1);
   ASSERT_EQ(parent->children()->tail(), child_1);
 
-  auto child_2 = new ::Child;
+  auto child_2 = create<::Child>();
 
   ASSERT_EQ(child_2->parent(), nullptr);
   ASSERT_EQ(child_2->prev(), nullptr);
@@ -79,18 +132,14 @@ TEST(ADT_DLINKED_LINK, insert_two_elements)
 
   ASSERT_EQ(parent->children()->head(), child_1);
   ASSERT_EQ(parent->children()->tail(), child_2);
-
-  delete child_2;
-  delete child_1;
-  delete parent;
 }
 
-TEST(ADT_DLINKED_LINK, insertBefore)
+TEST_F(DLinkedListTest, insertBefore)
 {
-  auto parent = new ::Parent;
+  auto parent = create<::Parent>();
 
-  auto child_1 = new ::Child;
-  auto child_2 = new ::Child;
+  auto child_1 = create<::Child>();
+  auto child_2 = create<::Child>();
 
   parent->children()->append(child_1);
   child_2->insertBefore(child_1);
@@ -105,18 +154,14 @@ TEST(ADT_DLINKED_LINK, insertBefore)
 
   ASSERT_EQ(parent->children()->head(), child_2);
   ASSERT_EQ(parent->children()->tail(), child_1);
-
-  delete child_2;
-  delete child_1;
-  delete parent;
 }
 
-TEST(ADT_DLINKED_LINK, prepend_after_append)
+TEST_F(DLinkedListTest, prepend_after_append)
 {
-  auto parent = new ::Parent;
+  auto parent = create<::Parent>();
 
-  auto child_1 = new ::Child;
-  auto child_2 = new ::Child;
+  auto child_1 = create<::Child>();
+  auto child_2 = create<::Child>();
 
   parent->children()->append(child_1);
   parent->children()->prepend(child_2);
@@ -129,18 +174,14 @@ TEST(ADT_DLINKED_LINK, prepend_after_append)
 
   ASSERT_EQ(parent->children()->head(), child_2);
   ASSERT_EQ(parent->children()->tail(), child_1);
-
-  delete child_2;
-  delete child_1;
-  delete parent;
 }
 
-TEST(ADT_DLINKED_LINK, detach)
+TEST_F(DLinkedListTest, detach)
 {
-  auto parent = new ::Parent;
+  auto parent = create<::Parent>();
 
-  auto child_1 = new ::Child;
-  auto child_2 = new ::Child;
+  auto child_1 = create<::Child>();
+  auto child_2 = create<::Child>();
 
   parent->children()->append(child_1);
   parent->children()->append(child_2);
@@ -166,33 +207,27 @@ TEST(ADT_DLINKED_LINK, detach)
   ASSERT_TRUE(parent->children()->empty());
   ASSERT_EQ(parent->children()->head(), nullptr);
   ASSERT_EQ(parent->children()->tail(), nullptr);
-
-  delete child_2;
-  delete child_1;
-  delete parent;
 }
 
-TEST(ADT_DLINKED_LINK, node_destructor)
+TEST_F(DLinkedListTest, node_destructor)
 {
-  auto parent = new ::Parent;
+  auto parent = create<::Parent>();
 
-  auto child_1 = new ::Child;
-  auto child_2 = new ::Child;
+  auto child_1 = create<::Child>();
+  auto child_2 = create<::Child>();
 
   parent->children()->append(child_1);
   parent->children()->append(child_2);
 
-  delete child_2;
+  destroy(child_2);
 
   ASSERT_EQ(parent->children()->head(), child_1);
   ASSERT_EQ(parent->children()->tail(), child_1);
   ASSERT_EQ(child_1->next(), nullptr);
   ASSERT_EQ(child_1->prev(), nullptr);
 
-  delete child_1;
+  destroy(child_1);
 
   ASSERT_EQ(parent->children()->head(), nullptr);
   ASSERT_EQ(parent->children()->tail(), nullptr);
-
-  delete parent;
 }