//===- FactoriesTest.cpp --------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include <cstdlib> #include "FactoriesTest.h" #include <string> using namespace mcld; using namespace mcldtest; // Constructor can do set-up work for all test here. FactoriesTest::FactoriesTest() { m_pNodeAlloc = new NodeAlloc(); m_pFileAlloc = new FileAlloc(); } // Destructor can do clean-up work that doesn't throw exceptions here. FactoriesTest::~FactoriesTest() { delete m_pNodeAlloc; delete m_pFileAlloc; } // SetUp() will be called immediately before each test. void FactoriesTest::SetUp() { } // TearDown() will be called immediately after each test. void FactoriesTest::TearDown() { } //==========================================================================// // Testcases // TEST_F(FactoriesTest, node_produce) { NodeAlloc::NodeType* node = m_pNodeAlloc->produce(); ASSERT_EQ(1, m_pNodeAlloc->size()); ASSERT_FALSE(m_pNodeAlloc->empty()); node = m_pNodeAlloc->produce(); ASSERT_EQ(2, m_pNodeAlloc->size()); ASSERT_FALSE(m_pNodeAlloc->empty()); node = m_pNodeAlloc->produce(); ASSERT_EQ(3, m_pNodeAlloc->size()); ASSERT_FALSE(m_pNodeAlloc->empty()); } TEST_F(FactoriesTest, node_iterate) { NodeAlloc::NodeType* node = 0; for (int i = 0; i < 100; ++i) { node = m_pNodeAlloc->produce(); node->data = (int*)malloc(sizeof(int)); *(node->data) = i; } int counter = 0; NodeAlloc::iterator data = m_pNodeAlloc->begin(); NodeAlloc::iterator dEnd = m_pNodeAlloc->end(); for (; data != dEnd; ++data) { ASSERT_EQ(counter, *(*data).data); free((*data).data); (*data).data = 0; ++counter; } } TEST_F(FactoriesTest, node_delegate_empty) { NodeAlloc::NodeType* node = 0; for (int i = 0; i < 100; ++i) { node = m_pNodeAlloc->produce(); node->data = (int*)malloc(sizeof(int)); *(node->data) = i; } NodeAlloc* delegatee = new NodeAlloc(); m_pNodeAlloc->delegate(*delegatee); ASSERT_EQ(100, m_pNodeAlloc->size()); int counter = 0; NodeAlloc::iterator data = m_pNodeAlloc->begin(); NodeAlloc::iterator dEnd = m_pNodeAlloc->end(); for (; data != dEnd; ++data) { ASSERT_EQ(counter, *(*data).data); free((*data).data); (*data).data = 0; ++counter; } delete delegatee; } TEST_F(FactoriesTest, node_empty_delegate) { NodeAlloc::NodeType* node = 0; NodeAlloc* delegatee = new NodeAlloc(); for (int i = 0; i < 100; ++i) { node = delegatee->produce(); node->data = (int*)malloc(sizeof(int)); *(node->data) = i; } m_pNodeAlloc->delegate(*delegatee); ASSERT_EQ(100, m_pNodeAlloc->size()); int counter = 0; NodeAlloc::iterator data = m_pNodeAlloc->begin(); NodeAlloc::iterator dEnd = m_pNodeAlloc->end(); for (; data != dEnd; ++data) { ASSERT_EQ(counter, *(*data).data); free((*data).data); (*data).data = 0; ++counter; } ASSERT_EQ(0, delegatee->size()); ASSERT_TRUE(delegatee->empty()); delete delegatee; } TEST_F(FactoriesTest, node_delegate) { NodeAlloc::NodeType* node = 0; NodeAlloc* delegatee = new NodeAlloc(); int counter = 0; // produce agent for (int i = 0; i < 100; ++i) { node = m_pNodeAlloc->produce(); node->data = (int*)malloc(sizeof(int)); *(node->data) = counter; ++counter; } // produce delegatee for (int i = 0; i < 100; ++i) { node = delegatee->produce(); node->data = (int*)malloc(sizeof(int)); *(node->data) = counter; ++counter; } m_pNodeAlloc->delegate(*delegatee); ASSERT_EQ(200, m_pNodeAlloc->size()); ASSERT_FALSE(m_pNodeAlloc->empty()); NodeAlloc::iterator data = m_pNodeAlloc->begin(); NodeAlloc::iterator dEnd = m_pNodeAlloc->end(); for (counter = 0; data != dEnd; ++data) { ASSERT_EQ(counter, *(*data).data); free((*data).data); (*data).data = 0; ++counter; } ASSERT_EQ(0, delegatee->size()); ASSERT_TRUE(delegatee->empty()); delete delegatee; } TEST_F(FactoriesTest, node_delegate_self) { NodeAlloc::NodeType* node = 0; for (int i = 0; i < 100; ++i) { node = m_pNodeAlloc->produce(); node->data = (int*)malloc(sizeof(int)); *(node->data) = i; } ASSERT_EQ(100, m_pNodeAlloc->size()); m_pNodeAlloc->delegate(*m_pNodeAlloc); ASSERT_EQ(100, m_pNodeAlloc->size()); ASSERT_FALSE(m_pNodeAlloc->empty()); } TEST_F(FactoriesTest, file_produce) { int counter = 0; for (counter = 1; counter < 1000; ++counter) { MCLDFile* file = m_pFileAlloc->produce(); ASSERT_EQ(counter, m_pFileAlloc->size()); ASSERT_FALSE(m_pFileAlloc->empty()); } } TEST_F(FactoriesTest, file_produce_by_params) { int counter = 0; for (counter = 1; counter < 1000; ++counter) { char name[100]; sprintf(name, "file %d", counter); char path_name[100]; sprintf(path_name, "/proj/mtk%d", counter); MCLDFile* file = m_pFileAlloc->produce( string(name), sys::fs::Path(string(path_name)), MCLDFile::Archive); ASSERT_EQ(counter, m_pFileAlloc->size()); ASSERT_FALSE(m_pFileAlloc->empty()); ASSERT_TRUE(file->isRecognized()); ASSERT_STREQ(name, file->name().data()); } } TEST_F(FactoriesTest, file_iterate) { int counter = 0; for (counter = 1; counter < 1000; ++counter) { char name[100]; sprintf(name, "file %d", counter); char path_name[100]; sprintf(path_name, "/proj/mtk%d", counter); MCLDFile* file = m_pFileAlloc->produce( string(name), sys::fs::Path(string(path_name)), MCLDFile::Archive); } ASSERT_EQ(counter - 1, m_pFileAlloc->size()); ASSERT_FALSE(m_pFileAlloc->empty()); MCLDFileFactory::iterator file = m_pFileAlloc->begin(); MCLDFileFactory::iterator fEnd = m_pFileAlloc->end(); while (file != fEnd) { ASSERT_TRUE((*file).isRecognized()); ASSERT_FALSE((*file).name().empty()); ++file; } }