aboutsummaryrefslogtreecommitdiff
path: root/unittests/FileHandleTest.cpp
blob: 67935fbb2012ee9b8b15a40ef247047eaee99d45 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//===- implTest.cpp -------------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/Support/FileHandle.h>
#include <mcld/Support/Path.h>
#include <fcntl.h>
#include <errno.h>
#include "FileHandleTest.h"

using namespace mcld;
using namespace mcldtest;

// Constructor can do set-up work for all test here.
FileHandleTest::FileHandleTest() {
  // create testee. modify it if need
  m_pTestee = new FileHandle();
}

// Destructor can do clean-up work that doesn't throw exceptions here.
FileHandleTest::~FileHandleTest() {
  delete m_pTestee;
}

// SetUp() will be called immediately before each test.
void FileHandleTest::SetUp() {
}

// TearDown() will be called immediately after each test.
void FileHandleTest::TearDown() {
}

//===----------------------------------------------------------------------===//
// Testcases
//===----------------------------------------------------------------------===//
TEST_F(FileHandleTest, open_close) {
  mcld::sys::fs::Path path(TOPDIR);
  path.append("unittests/test.txt");
  ASSERT_TRUE(m_pTestee->open(path, FileHandle::ReadOnly));
  ASSERT_TRUE(m_pTestee->isOpened());
  ASSERT_TRUE(m_pTestee->isGood());
  ASSERT_TRUE(m_pTestee->isOwned());

  ASSERT_TRUE(27 == m_pTestee->size());

  ASSERT_TRUE(m_pTestee->close());
  ASSERT_FALSE(m_pTestee->isOpened());
  ASSERT_TRUE(m_pTestee->isGood());

  ASSERT_TRUE(0 == m_pTestee->size());
}

TEST_F(FileHandleTest, delegate_close) {
  mcld::sys::fs::Path path(TOPDIR);
  path.append("unittests/test.txt");

  int fd = ::open(path.native().c_str(), O_RDONLY);

  ASSERT_TRUE(m_pTestee->delegate(fd, FileHandle::ReadOnly));
  ASSERT_TRUE(m_pTestee->isOpened());
  ASSERT_TRUE(m_pTestee->isGood());
  ASSERT_FALSE(m_pTestee->isOwned());

  ASSERT_TRUE(27 == m_pTestee->size());

  ASSERT_TRUE(m_pTestee->close());
  ASSERT_FALSE(m_pTestee->isOpened());
  ASSERT_TRUE(m_pTestee->isGood());
  ASSERT_TRUE(m_pTestee->isOwned());

  ASSERT_TRUE(0 == m_pTestee->size());

  int close_result = ::close(fd);
  ASSERT_EQ(0, close_result);
}

TEST_F(FileHandleTest, fail_close) {
  mcld::sys::fs::Path path(TOPDIR);
  path.append("unittests/test.txt");
  ASSERT_TRUE(m_pTestee->open(path, FileHandle::ReadOnly));
  ASSERT_TRUE(m_pTestee->isOpened());
  ASSERT_TRUE(m_pTestee->isGood());

  ASSERT_TRUE(27 == m_pTestee->size());

  int close_result = ::close(m_pTestee->handler());
  ASSERT_EQ(0, close_result);

  ASSERT_FALSE(m_pTestee->close());
  ASSERT_FALSE(m_pTestee->isOpened());
  ASSERT_FALSE(m_pTestee->isGood());
}