1//===- implTest.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/Support/FileHandle.h>
10#include <mcld/Support/Path.h>
11#include <fcntl.h>
12#include <errno.h>
13#include "FileHandleTest.h"
14
15using namespace mcld;
16using namespace mcldtest;
17
18
19// Constructor can do set-up work for all test here.
20FileHandleTest::FileHandleTest()
21{
22  // create testee. modify it if need
23  m_pTestee = new FileHandle();
24}
25
26// Destructor can do clean-up work that doesn't throw exceptions here.
27FileHandleTest::~FileHandleTest()
28{
29  delete m_pTestee;
30}
31
32// SetUp() will be called immediately before each test.
33void FileHandleTest::SetUp()
34{
35}
36
37// TearDown() will be called immediately after each test.
38void FileHandleTest::TearDown()
39{
40}
41
42//===----------------------------------------------------------------------===//
43// Testcases
44//===----------------------------------------------------------------------===//
45TEST_F(FileHandleTest, open_close) {
46  mcld::sys::fs::Path path(TOPDIR);
47  path.append("unittests/test.txt");
48  ASSERT_TRUE(m_pTestee->open(path, FileHandle::ReadOnly));
49  ASSERT_TRUE(m_pTestee->isOpened());
50  ASSERT_TRUE(m_pTestee->isGood());
51  ASSERT_TRUE(m_pTestee->isOwned());
52
53  ASSERT_TRUE(27 == m_pTestee->size());
54
55  ASSERT_TRUE(m_pTestee->close());
56  ASSERT_FALSE(m_pTestee->isOpened());
57  ASSERT_TRUE(m_pTestee->isGood());
58
59  ASSERT_TRUE(0 == m_pTestee->size());
60}
61
62TEST_F(FileHandleTest, delegate_close) {
63  mcld::sys::fs::Path path(TOPDIR);
64  path.append("unittests/test.txt");
65
66  int fd = ::open(path.native().c_str(), O_RDONLY);
67
68  ASSERT_TRUE(m_pTestee->delegate(fd, FileHandle::ReadOnly));
69  ASSERT_TRUE(m_pTestee->isOpened());
70  ASSERT_TRUE(m_pTestee->isGood());
71  ASSERT_FALSE(m_pTestee->isOwned());
72
73  ASSERT_TRUE(27 == m_pTestee->size());
74
75  ASSERT_TRUE(m_pTestee->close());
76  ASSERT_FALSE(m_pTestee->isOpened());
77  ASSERT_TRUE(m_pTestee->isGood());
78  ASSERT_TRUE(m_pTestee->isOwned());
79
80  ASSERT_TRUE(0 == m_pTestee->size());
81
82  int close_result = ::close(fd);
83  ASSERT_EQ(0, close_result);
84}
85
86TEST_F(FileHandleTest, fail_close) {
87  mcld::sys::fs::Path path(TOPDIR);
88  path.append("unittests/test.txt");
89  ASSERT_TRUE(m_pTestee->open(path, FileHandle::ReadOnly));
90  ASSERT_TRUE(m_pTestee->isOpened());
91  ASSERT_TRUE(m_pTestee->isGood());
92
93  ASSERT_TRUE(27 == m_pTestee->size());
94
95  int close_result = ::close(m_pTestee->handler());
96  ASSERT_EQ(0, close_result);
97
98  ASSERT_FALSE(m_pTestee->close());
99  ASSERT_FALSE(m_pTestee->isOpened());
100  ASSERT_FALSE(m_pTestee->isGood());
101}
102