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