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