| //===- 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; |
| } |
| } |
| |