1 //===- UniqueGCFactoryBaseTest.cpp ----------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #include "mcld/MC/ContextFactory.h"
10 #include "mcld/Support/MemoryAreaFactory.h"
11 #include "mcld/Support/TargetSelect.h"
12 #include "mcld/Support/Path.h"
13 #include "UniqueGCFactoryBaseTest.h"
14 
15 using namespace mcld;
16 using namespace mcldtest;
17 
18 // Constructor can do set-up work for all test here.
UniqueGCFactoryBaseTest()19 UniqueGCFactoryBaseTest::UniqueGCFactoryBaseTest() {
20   m_pConfig = new LinkerConfig("arm-none-linux-gnueabi");
21 }
22 
23 // Destructor can do clean-up work that doesn't throw exceptions here.
~UniqueGCFactoryBaseTest()24 UniqueGCFactoryBaseTest::~UniqueGCFactoryBaseTest() {
25   delete m_pConfig;
26 }
27 
28 // SetUp() will be called immediately before each test.
SetUp()29 void UniqueGCFactoryBaseTest::SetUp() {
30 }
31 
32 // TearDown() will be called immediately after each test.
TearDown()33 void UniqueGCFactoryBaseTest::TearDown() {
34 }
35 
36 //==========================================================================//
37 // Testcases
38 //
TEST_F(UniqueGCFactoryBaseTest,number_constructor)39 TEST_F(UniqueGCFactoryBaseTest, number_constructor) {
40   ContextFactory* contextFactory = new ContextFactory(10);
41   contextFactory->produce("/");
42   contextFactory->produce("ab/c");
43   ASSERT_TRUE(2 == contextFactory->size());
44   delete contextFactory;
45 }
46 
TEST_F(UniqueGCFactoryBaseTest,unique_produce)47 TEST_F(UniqueGCFactoryBaseTest, unique_produce) {
48   ContextFactory* contextFactory = new ContextFactory(10);
49   LDContext* context1 = contextFactory->produce("/");
50   contextFactory->produce("ab/c");
51   ASSERT_TRUE(2 == contextFactory->size());
52   LDContext* context2 = contextFactory->produce("/");
53   ASSERT_EQ(context1, context2);
54   delete contextFactory;
55 }
56 
TEST_F(UniqueGCFactoryBaseTest,unique_produce2)57 TEST_F(UniqueGCFactoryBaseTest, unique_produce2) {
58   ContextFactory* contextFactory = new ContextFactory(10);
59   LDContext* context1 = contextFactory->produce("abc/def");
60   contextFactory->produce("ab/c");
61   ASSERT_TRUE(2 == contextFactory->size());
62   LDContext* context2 = contextFactory->produce("ttt/../abc/def");
63   ASSERT_EQ(context1, context2);
64   delete contextFactory;
65 }
66 
TEST_F(UniqueGCFactoryBaseTest,iterator)67 TEST_F(UniqueGCFactoryBaseTest, iterator) {
68   sys::fs::Path path1(TOPDIR), path2(TOPDIR);
69   path1.append("unittests/test.txt");
70   path2.append("unittests/test2.txt");
71 
72   MemoryAreaFactory* memFactory = new MemoryAreaFactory(10);
73   MemoryArea* area1 =
74       memFactory->produce(path1, FileHandle::OpenMode(FileHandle::ReadOnly),
75                           FileHandle::Permission(FileHandle::System));
76   MemoryArea* area2 =
77       memFactory->produce(path2, FileHandle::OpenMode(FileHandle::ReadOnly),
78                           FileHandle::Permission(FileHandle::System));
79   ASSERT_NE(area1, area2);
80 
81   MemoryArea* area3 =
82       memFactory->produce(path1, FileHandle::OpenMode(FileHandle::ReadOnly),
83                           FileHandle::Permission(FileHandle::System));
84 
85   ASSERT_EQ(area1, area3);
86   ASSERT_FALSE(memFactory->empty());
87   ASSERT_TRUE(2 == memFactory->size());
88   MemoryAreaFactory::iterator aIter = memFactory->begin();
89   ASSERT_EQ(area1, &(*aIter));
90   ++aIter;
91   ASSERT_EQ(area2, &(*aIter));
92   ++aIter;
93   MemoryAreaFactory::iterator aEnd = memFactory->end();
94   ASSERT_TRUE(aEnd == aIter);
95   delete memFactory;
96 }
97