15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- FactoriesTest.cpp --------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstdlib>
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "FactoriesTest.h"
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string>
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcldtest;
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Constructor can do set-up work for all test here.
1737b74a387bb3993387029859c2d9d051c41c724eStephen HinesFactoriesTest::FactoriesTest() {
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pNodeAlloc = new NodeAlloc();
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pFileAlloc = new FileAlloc();
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
2337b74a387bb3993387029859c2d9d051c41c724eStephen HinesFactoriesTest::~FactoriesTest() {
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  delete m_pNodeAlloc;
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  delete m_pFileAlloc;
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SetUp() will be called immediately before each test.
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid FactoriesTest::SetUp() {
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TearDown() will be called immediately after each test.
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid FactoriesTest::TearDown() {
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================================================================//
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Testcases
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
3937b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, node_produce) {
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::NodeType* node = m_pNodeAlloc->produce();
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(1, m_pNodeAlloc->size());
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pNodeAlloc->empty());
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  node = m_pNodeAlloc->produce();
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(2, m_pNodeAlloc->size());
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pNodeAlloc->empty());
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  node = m_pNodeAlloc->produce();
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(3, m_pNodeAlloc->size());
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pNodeAlloc->empty());
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5137b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, node_iterate) {
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::NodeType* node = 0;
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node = m_pNodeAlloc->produce();
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node->data = (int*)malloc(sizeof(int));
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    *(node->data) = i;
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator data = m_pNodeAlloc->begin();
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (; data != dEnd; ++data) {
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_EQ(counter, *(*data).data);
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    free((*data).data);
6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    (*data).data = 0;
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++counter;
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
7037b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, node_delegate_empty) {
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::NodeType* node = 0;
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node = m_pNodeAlloc->produce();
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node->data = (int*)malloc(sizeof(int));
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    *(node->data) = i;
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
7737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc* delegatee = new NodeAlloc();
7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pNodeAlloc->delegate(*delegatee);
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(100, m_pNodeAlloc->size());
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator data = m_pNodeAlloc->begin();
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (; data != dEnd; ++data) {
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_EQ(counter, *(*data).data);
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    free((*data).data);
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    (*data).data = 0;
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++counter;
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  delete delegatee;
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9237b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, node_empty_delegate) {
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::NodeType* node = 0;
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc* delegatee = new NodeAlloc();
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node = delegatee->produce();
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node->data = (int*)malloc(sizeof(int));
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    *(node->data) = i;
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pNodeAlloc->delegate(*delegatee);
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(100, m_pNodeAlloc->size());
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator data = m_pNodeAlloc->begin();
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (; data != dEnd; ++data) {
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_EQ(counter, *(*data).data);
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    free((*data).data);
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    (*data).data = 0;
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++counter;
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(0, delegatee->size());
11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(delegatee->empty());
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  delete delegatee;
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
11637b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, node_delegate) {
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::NodeType* node = 0;
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc* delegatee = new NodeAlloc();
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // produce agent
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node = m_pNodeAlloc->produce();
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node->data = (int*)malloc(sizeof(int));
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    *(node->data) = counter;
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++counter;
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  // produce delegatee
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node = delegatee->produce();
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node->data = (int*)malloc(sizeof(int));
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    *(node->data) = counter;
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++counter;
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
13637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pNodeAlloc->delegate(*delegatee);
13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(200, m_pNodeAlloc->size());
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pNodeAlloc->empty());
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator data = m_pNodeAlloc->begin();
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (counter = 0; data != dEnd; ++data) {
14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_EQ(counter, *(*data).data);
14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    free((*data).data);
14437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    (*data).data = 0;
14537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++counter;
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(0, delegatee->size());
14837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(delegatee->empty());
14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  delete delegatee;
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15237b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, node_delegate_self) {
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  NodeAlloc::NodeType* node = 0;
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
15537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node = m_pNodeAlloc->produce();
15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    node->data = (int*)malloc(sizeof(int));
15737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    *(node->data) = i;
15837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(100, m_pNodeAlloc->size());
16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pNodeAlloc->delegate(*m_pNodeAlloc);
16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(100, m_pNodeAlloc->size());
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pNodeAlloc->empty());
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
16537b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, file_produce) {
16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (counter = 1; counter < 1000; ++counter) {
16837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MCLDFile* file = m_pFileAlloc->produce();
16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_EQ(counter, m_pFileAlloc->size());
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_FALSE(m_pFileAlloc->empty());
17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
17437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, file_produce_by_params) {
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (counter = 1; counter < 1000; ++counter) {
17737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    char name[100];
17837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sprintf(name, "file %d", counter);
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    char path_name[100];
18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sprintf(path_name, "/proj/mtk%d", counter);
18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MCLDFile* file = m_pFileAlloc->produce(
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines        string(name), sys::fs::Path(string(path_name)), MCLDFile::Archive);
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_EQ(counter, m_pFileAlloc->size());
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_FALSE(m_pFileAlloc->empty());
18537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_TRUE(file->isRecognized());
18637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_STREQ(name, file->name().data());
18737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
19037b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(FactoriesTest, file_iterate) {
19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  int counter = 0;
19237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (counter = 1; counter < 1000; ++counter) {
19337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    char name[100];
19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sprintf(name, "file %d", counter);
19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    char path_name[100];
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sprintf(path_name, "/proj/mtk%d", counter);
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    MCLDFile* file = m_pFileAlloc->produce(
19837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        string(name), sys::fs::Path(string(path_name)), MCLDFile::Archive);
19937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_EQ(counter - 1, m_pFileAlloc->size());
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pFileAlloc->empty());
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  MCLDFileFactory::iterator file = m_pFileAlloc->begin();
20537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  MCLDFileFactory::iterator fEnd = m_pFileAlloc->end();
20637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
20737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  while (file != fEnd) {
20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_TRUE((*file).isRecognized());
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ASSERT_FALSE((*file).name().empty());
21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ++file;
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  }
2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
213