aria2/test/FallocFileAllocationIteratorTest.cc
Tatsuhiro Tsujikawa a5cc350dcf 2010-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
When allocating disk space, for Linux system with fallocate()
	system call, first check file system supports fallocate.  This
	just run fallocate with small chunk and see it succeeds or fails.
	If it succeeds, use fallocate() to allocate entire file otherwise
	fall back to traditional slower method: writing zeros. This
	behavior is enabled in --file-allocation=prealloc, so this is
	enabled by default for most modern Linux.
	* configure.ac
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/AbstractSingleDiskAdaptor.cc
	* src/AdaptiveFileAllocationIterator.cc
	* src/AdaptiveFileAllocationIterator.h
	* src/DefaultPieceStorage.cc
	* src/DiskAdaptor.cc
	* src/DiskAdaptor.h
	* src/FallocFileAllocationIterator.cc
	* src/Makefile.am
	* src/MultiFileAllocationIterator.cc
	* src/OptionHandlerFactory.cc
	* test/FallocFileAllocationIteratorTest.cc
	* test/Makefile.am
2010-07-04 15:03:35 +00:00

57 lines
1.3 KiB
C++

#include "FallocFileAllocationIterator.h"
#include <fstream>
#include <cppunit/extensions/HelperMacros.h>
#include "File.h"
#include "DefaultDiskWriter.h"
namespace aria2 {
class FallocFileAllocationIteratorTest:public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(FallocFileAllocationIteratorTest);
CPPUNIT_TEST(testAllocate);
CPPUNIT_TEST_SUITE_END();
private:
public:
void setUp() {}
void testAllocate();
};
CPPUNIT_TEST_SUITE_REGISTRATION( FallocFileAllocationIteratorTest );
void FallocFileAllocationIteratorTest::testAllocate()
{
// When fallocate is used, test fails if file system does not
// support it. So skip it.
#ifndef HAVE_FALLOCATE
std::string dir = "./";
std::string fname = "aria2_FallocFileAllocationIteratorTest_testAllocate";
std::string fn = dir+"/"+fname;
std::ofstream of(fn.c_str(), std::ios::binary);
of << "0123456789";
of.close();
File f(fn);
CPPUNIT_ASSERT_EQUAL((uint64_t)10, f.size());
DefaultDiskWriter writer(fn);
int64_t offset = 10;
int64_t totalLength = 40960;
// we have to open file first.
writer.openExistingFile();
FallocFileAllocationIterator itr(&writer, offset, totalLength);
itr.allocateChunk();
CPPUNIT_ASSERT(itr.finished());
CPPUNIT_ASSERT_EQUAL((uint64_t)40960, f.size());
#endif // !HAVE_FALLOCATE
}
} // namespace aria2