/* ====================================================================
 * Copyright (c) 2003-2006, Martin Hauner
 *                          http://subcommander.tigris.org
 *
 * Subcommander is licensed as described in the file doc/COPYING, which
 * you should have received as part of this distribution.
 * ====================================================================
 */

#include "FileTest.h"

// cppunit
#include <cppunit/TestSuite.h>
#include <cppunit/TestCaller.h>

// sc
#include "util/Error.h"
#include "util/File.h"


FileTest::FileTest() : CppUnit::TestCase("FileTest")
{
}

FileTest::~FileTest()
{
}

void FileTest::setUp()
{
  _fileExists = new File( "../../tests/util/files/test.txt" );
  _fileNoFile = new File( "filedoesnotexist" );
}

void FileTest::tearDown()
{
  delete _fileExists;
  delete _fileNoFile;
}


CppUnit::Test *FileTest::suite()
{
  CppUnit::TestSuite *newSuite = new CppUnit::TestSuite("FileTest");

  newSuite->addTest(new CppUnit::TestCaller<FileTest>("testOpen",&FileTest::testOpen) );
  newSuite->addTest(new CppUnit::TestCaller<FileTest>("testMMap",&FileTest::testMMap) );

  return newSuite;
}


void FileTest::testOpen()
{
  const sc::Error* error;

  // try existing file..
  error = _fileExists->open();
  CPPUNIT_ASSERT_EQUAL( (const sc::Error*)sc::Success, error );
  error = _fileExists->close();
  CPPUNIT_ASSERT_EQUAL( (const sc::Error*)sc::Success, error );

  // try non existent file..
  error = _fileNoFile->open();
  CPPUNIT_ASSERT( error );

  // that does crash in apr...
  //status = _fileNoFile->close();
  //CPPUNIT_ASSERT( status != APR_SUCCESS );
}

void FileTest::testMMap()
{
  const sc::Error* error;

  error = _fileExists->open();
  error = _fileExists->mmap();
  CPPUNIT_ASSERT_EQUAL( (const sc::Error*)sc::Success, error );

  char*     buf  = (char*)_fileExists->mmaped();
  sc_size_t size = _fileExists->getSize();
  CPPUNIT_ASSERT_EQUAL( (sc_size_t)109, size );

  error = _fileExists->unmmap();
  CPPUNIT_ASSERT_EQUAL( (const sc::Error*)sc::Success, error );
  error = _fileExists->close();
  CPPUNIT_ASSERT_EQUAL( (const sc::Error*)sc::Success, error );
}

syntax highlighted by Code2HTML, v. 0.9.1