152a38012Sejakowatz// FileTest.cpp
252a38012Sejakowatz
352a38012Sejakowatz#include <Directory.h>
452a38012Sejakowatz#include <Entry.h>
552a38012Sejakowatz#include <File.h>
652a38012Sejakowatz#include <Path.h>
752a38012Sejakowatz
852a38012Sejakowatz#include <cppunit/TestCaller.h>
952a38012Sejakowatz#include <cppunit/TestSuite.h>
10aad997bdSTyler Dauwalder#include <TestShell.h>
1152a38012Sejakowatz
1252a38012Sejakowatz#include "FileTest.h"
1352a38012Sejakowatz
1452a38012Sejakowatz// Suite
1552a38012SejakowatzFileTest::Test*
1652a38012SejakowatzFileTest::Suite()
1752a38012Sejakowatz{
1852a38012Sejakowatz	CppUnit::TestSuite *suite = new CppUnit::TestSuite();
1952a38012Sejakowatz	typedef CppUnit::TestCaller<FileTest> TC;
2052a38012Sejakowatz
2152a38012Sejakowatz	NodeTest::AddBaseClassTests<FileTest>("BFile::", suite);
2252a38012Sejakowatz
2352a38012Sejakowatz	suite->addTest( new TC("BFile::Init Test 1", &FileTest::InitTest1) );
2452a38012Sejakowatz	suite->addTest( new TC("BFile::Init Test 2", &FileTest::InitTest2) );
2552a38012Sejakowatz	suite->addTest( new TC("BFile::IsRead-/IsWriteable Test",
2652a38012Sejakowatz						   &FileTest::RWAbleTest) );
2752a38012Sejakowatz	suite->addTest( new TC("BFile::Read/Write Test", &FileTest::RWTest) );
2852a38012Sejakowatz	suite->addTest( new TC("BFile::Position Test", &FileTest::PositionTest) );
2952a38012Sejakowatz	suite->addTest( new TC("BFile::Size Test", &FileTest::SizeTest) );
3052a38012Sejakowatz	suite->addTest( new TC("BFile::Assignment Test",
3152a38012Sejakowatz						   &FileTest::AssignmentTest) );
3252a38012Sejakowatz	return suite;
3352a38012Sejakowatz}
3452a38012Sejakowatz
3552a38012Sejakowatz// CreateRONodes
3652a38012Sejakowatzvoid
3752a38012SejakowatzFileTest::CreateRONodes(TestNodes& testEntries)
3852a38012Sejakowatz{
3952a38012Sejakowatz	testEntries.clear();
4052a38012Sejakowatz	const char *filename;
4152a38012Sejakowatz	filename = existingFilename;
4252a38012Sejakowatz	testEntries.add(new BFile(filename, B_READ_ONLY), filename);
4352a38012Sejakowatz}
4452a38012Sejakowatz
4552a38012Sejakowatz// CreateRWNodes
4652a38012Sejakowatzvoid
4752a38012SejakowatzFileTest::CreateRWNodes(TestNodes& testEntries)
4852a38012Sejakowatz{
4952a38012Sejakowatz	testEntries.clear();
5052a38012Sejakowatz	const char *filename;
5152a38012Sejakowatz	filename = existingFilename;
5252a38012Sejakowatz	testEntries.add(new BFile(filename, B_READ_WRITE), filename);
5352a38012Sejakowatz}
5452a38012Sejakowatz
5552a38012Sejakowatz// CreateUninitializedNodes
5652a38012Sejakowatzvoid
5752a38012SejakowatzFileTest::CreateUninitializedNodes(TestNodes& testEntries)
5852a38012Sejakowatz{
5952a38012Sejakowatz	testEntries.clear();
6052a38012Sejakowatz	testEntries.add(new BFile, "");
6152a38012Sejakowatz}
6252a38012Sejakowatz
6352a38012Sejakowatz// setUp
6452a38012Sejakowatzvoid FileTest::setUp()
6552a38012Sejakowatz{
6652a38012Sejakowatz	NodeTest::setUp();
6752a38012Sejakowatz}
6852a38012Sejakowatz
6952a38012Sejakowatz// tearDown
7052a38012Sejakowatzvoid FileTest::tearDown()
7152a38012Sejakowatz{
7252a38012Sejakowatz	NodeTest::tearDown();
7352a38012Sejakowatz}
7452a38012Sejakowatz
7552a38012Sejakowatz// InitTest1
7652a38012Sejakowatzvoid
7752a38012SejakowatzFileTest::InitTest1()
7852a38012Sejakowatz{
7952a38012Sejakowatz	// 1. default constructor
8052a38012Sejakowatz	{
8152a38012Sejakowatz		BFile file;
8252a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_NO_INIT );
8352a38012Sejakowatz	}
8452a38012Sejakowatz
8552a38012Sejakowatz	// helper class for the testing the different constructors versions
8652a38012Sejakowatz	struct Tester {
8752a38012Sejakowatz		void testAll() const
8852a38012Sejakowatz		{
8952a38012Sejakowatz			for (int32 i = 0; i < initTestCasesCount; i++) {
90aad997bdSTyler Dauwalder				if (BTestShell::GlobalBeVerbose()) {
9152a38012Sejakowatz					printf("[%ld]", i);
9252a38012Sejakowatz					fflush(stdout);
9352a38012Sejakowatz				}
9452a38012Sejakowatz				test(initTestCases[i]);
9552a38012Sejakowatz			}
96aad997bdSTyler Dauwalder			if (BTestShell::GlobalBeVerbose())
9752a38012Sejakowatz				printf("\n");
9852a38012Sejakowatz		}
9952a38012Sejakowatz
10052a38012Sejakowatz		virtual void test(const InitTestCase& tc) const = 0;
10152a38012Sejakowatz
10252a38012Sejakowatz		static void testInit(const InitTestCase& tc, BFile& file)
10352a38012Sejakowatz		{
10452a38012Sejakowatz			CPPUNIT_ASSERT( file.InitCheck() == tc.initCheck );
10552a38012Sejakowatz			if (tc.removeAfterTest)
10652a38012Sejakowatz				execCommand(string("rm ") + tc.filename);
10752a38012Sejakowatz		}
10852a38012Sejakowatz	};
10952a38012Sejakowatz
11052a38012Sejakowatz	// 2. BFile(const char *, uint32)
11152a38012Sejakowatz	struct Tester1 : public Tester {
11252a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
11352a38012Sejakowatz		{
11452a38012Sejakowatz			BFile file(tc.filename,
11552a38012Sejakowatz					   tc.rwmode
11652a38012Sejakowatz					   | (tc.createFile * B_CREATE_FILE)
11752a38012Sejakowatz					   | (tc.failIfExists * B_FAIL_IF_EXISTS)
11852a38012Sejakowatz					   | (tc.eraseFile * B_ERASE_FILE));
11952a38012Sejakowatz			testInit(tc, file);
12052a38012Sejakowatz		}
12152a38012Sejakowatz	};
12252a38012Sejakowatz
12352a38012Sejakowatz	// 3. BFile(entry_ref *, uint32)
12452a38012Sejakowatz	struct Tester2 : public Tester {
12552a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
12652a38012Sejakowatz		{
12752a38012Sejakowatz			entry_ref ref;
12852a38012Sejakowatz			BEntry entry(tc.filename);
12952a38012Sejakowatz			entry_ref *refToPass = &ref;
13052a38012Sejakowatz			if (tc.filename)
13152a38012Sejakowatz				CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
13252a38012Sejakowatz			else
13352a38012Sejakowatz				refToPass = NULL;
13452a38012Sejakowatz			BFile file(refToPass,
13552a38012Sejakowatz					   tc.rwmode
13652a38012Sejakowatz					   | (tc.createFile * B_CREATE_FILE)
13752a38012Sejakowatz					   | (tc.failIfExists * B_FAIL_IF_EXISTS)
13852a38012Sejakowatz					   | (tc.eraseFile * B_ERASE_FILE));
13952a38012Sejakowatz			testInit(tc, file);
14052a38012Sejakowatz		}
14152a38012Sejakowatz	};
14252a38012Sejakowatz
14352a38012Sejakowatz	// 4. BFile(BEntry *, uint32)
14452a38012Sejakowatz	struct Tester3 : public Tester {
14552a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
14652a38012Sejakowatz		{
14752a38012Sejakowatz			entry_ref ref;
14852a38012Sejakowatz			BEntry entry(tc.filename);
14952a38012Sejakowatz			BEntry *entryToPass = &entry;
15052a38012Sejakowatz			if (tc.filename)
15152a38012Sejakowatz				CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
15252a38012Sejakowatz			else
15352a38012Sejakowatz				entryToPass = NULL;
15452a38012Sejakowatz			BFile file(entryToPass,
15552a38012Sejakowatz					   tc.rwmode
15652a38012Sejakowatz					   | (tc.createFile * B_CREATE_FILE)
15752a38012Sejakowatz					   | (tc.failIfExists * B_FAIL_IF_EXISTS)
15852a38012Sejakowatz					   | (tc.eraseFile * B_ERASE_FILE));
15952a38012Sejakowatz			testInit(tc, file);
16052a38012Sejakowatz		}
16152a38012Sejakowatz	};
16252a38012Sejakowatz
16352a38012Sejakowatz	// 5. BFile(BEntry *, uint32)
16452a38012Sejakowatz	struct Tester4 : public Tester {
16552a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
16652a38012Sejakowatz		{
16752a38012Sejakowatz			if (tc.filename) {
16852a38012Sejakowatz				BPath path(tc.filename);
16952a38012Sejakowatz				CPPUNIT_ASSERT( path.InitCheck() == B_OK );
17052a38012Sejakowatz				BPath dirPath;
17152a38012Sejakowatz				CPPUNIT_ASSERT( path.GetParent(&dirPath) == B_OK );
17252a38012Sejakowatz				BDirectory dir(dirPath.Path());
17352a38012Sejakowatz				CPPUNIT_ASSERT( dir.InitCheck() == B_OK );
17452a38012Sejakowatz				BFile file(&dir, path.Leaf(),
17552a38012Sejakowatz						   tc.rwmode
17652a38012Sejakowatz						   | (tc.createFile * B_CREATE_FILE)
17752a38012Sejakowatz						   | (tc.failIfExists * B_FAIL_IF_EXISTS)
17852a38012Sejakowatz						   | (tc.eraseFile * B_ERASE_FILE));
17952a38012Sejakowatz				testInit(tc, file);
18052a38012Sejakowatz			}
18152a38012Sejakowatz		}
18252a38012Sejakowatz	};
18352a38012Sejakowatz
18452a38012Sejakowatz	Tester1().testAll();
18552a38012Sejakowatz	Tester2().testAll();
18652a38012Sejakowatz	Tester3().testAll();
18752a38012Sejakowatz	Tester4().testAll();
18852a38012Sejakowatz}
18952a38012Sejakowatz
19052a38012Sejakowatz// InitTest2
19152a38012Sejakowatzvoid
19252a38012SejakowatzFileTest::InitTest2()
19352a38012Sejakowatz{
19452a38012Sejakowatz	// helper class for the testing the different SetTo() versions
19552a38012Sejakowatz	struct Tester {
19652a38012Sejakowatz		void testAll() const
19752a38012Sejakowatz		{
19852a38012Sejakowatz			for (int32 i = 0; i < initTestCasesCount; i++) {
199aad997bdSTyler Dauwalder				if (BTestShell::GlobalBeVerbose()) {
20052a38012Sejakowatz					printf("[%ld]", i);
20152a38012Sejakowatz					fflush(stdout);
20252a38012Sejakowatz				}
20352a38012Sejakowatz				test(initTestCases[i]);
20452a38012Sejakowatz			}
205aad997bdSTyler Dauwalder			if (BTestShell::GlobalBeVerbose())
20652a38012Sejakowatz				printf("\n");
20752a38012Sejakowatz		}
20852a38012Sejakowatz
20952a38012Sejakowatz		virtual void test(const InitTestCase& tc) const = 0;
21052a38012Sejakowatz
21152a38012Sejakowatz		static void testInit(const InitTestCase& tc, BFile& file)
21252a38012Sejakowatz		{
21352a38012Sejakowatz			CPPUNIT_ASSERT( file.InitCheck() == tc.initCheck );
21452a38012Sejakowatz			file.Unset();
21552a38012Sejakowatz			CPPUNIT_ASSERT( file.InitCheck() == B_NO_INIT );
21652a38012Sejakowatz			if (tc.removeAfterTest)
21752a38012Sejakowatz				execCommand(string("rm ") + tc.filename);
21852a38012Sejakowatz		}
21952a38012Sejakowatz	};
22052a38012Sejakowatz
22152a38012Sejakowatz	// 2. BFile(const char *, uint32)
22252a38012Sejakowatz	struct Tester1 : public Tester {
22352a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
22452a38012Sejakowatz		{
22552a38012Sejakowatz			BFile file;
22652a38012Sejakowatz			status_t result = file.SetTo(tc.filename,
22752a38012Sejakowatz				tc.rwmode
22852a38012Sejakowatz				| (tc.createFile * B_CREATE_FILE)
22952a38012Sejakowatz				| (tc.failIfExists * B_FAIL_IF_EXISTS)
23052a38012Sejakowatz				| (tc.eraseFile * B_ERASE_FILE));
23152a38012Sejakowatz			CPPUNIT_ASSERT( result == tc.initCheck );
23252a38012Sejakowatz			testInit(tc, file);
23352a38012Sejakowatz		}
23452a38012Sejakowatz	};
23552a38012Sejakowatz
23652a38012Sejakowatz	// 3. BFile(entry_ref *, uint32)
23752a38012Sejakowatz	struct Tester2 : public Tester {
23852a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
23952a38012Sejakowatz		{
24052a38012Sejakowatz			entry_ref ref;
24152a38012Sejakowatz			BEntry entry(tc.filename);
24252a38012Sejakowatz			entry_ref *refToPass = &ref;
24352a38012Sejakowatz			if (tc.filename)
24452a38012Sejakowatz				CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
24552a38012Sejakowatz			else
24652a38012Sejakowatz				refToPass = NULL;
24752a38012Sejakowatz			BFile file;
24852a38012Sejakowatz			status_t result = file.SetTo(refToPass,
24952a38012Sejakowatz				tc.rwmode
25052a38012Sejakowatz				| (tc.createFile * B_CREATE_FILE)
25152a38012Sejakowatz				| (tc.failIfExists * B_FAIL_IF_EXISTS)
25252a38012Sejakowatz				| (tc.eraseFile * B_ERASE_FILE));
25352a38012Sejakowatz			CPPUNIT_ASSERT( result == tc.initCheck );
25452a38012Sejakowatz			testInit(tc, file);
25552a38012Sejakowatz		}
25652a38012Sejakowatz	};
25752a38012Sejakowatz
25852a38012Sejakowatz	// 4. BFile(BEntry *, uint32)
25952a38012Sejakowatz	struct Tester3 : public Tester {
26052a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
26152a38012Sejakowatz		{
26252a38012Sejakowatz			entry_ref ref;
26352a38012Sejakowatz			BEntry entry(tc.filename);
26452a38012Sejakowatz			BEntry *entryToPass = &entry;
26552a38012Sejakowatz			if (tc.filename)
26652a38012Sejakowatz				CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
26752a38012Sejakowatz			else
26852a38012Sejakowatz				entryToPass = NULL;
26952a38012Sejakowatz			BFile file;
27052a38012Sejakowatz			status_t result = file.SetTo(entryToPass,
27152a38012Sejakowatz				tc.rwmode
27252a38012Sejakowatz				| (tc.createFile * B_CREATE_FILE)
27352a38012Sejakowatz				| (tc.failIfExists * B_FAIL_IF_EXISTS)
27452a38012Sejakowatz				| (tc.eraseFile * B_ERASE_FILE));
27552a38012Sejakowatz			CPPUNIT_ASSERT( result == tc.initCheck );
27652a38012Sejakowatz			testInit(tc, file);
27752a38012Sejakowatz		}
27852a38012Sejakowatz	};
27952a38012Sejakowatz
28052a38012Sejakowatz	// 5. BFile(BEntry *, uint32)
28152a38012Sejakowatz	struct Tester4 : public Tester {
28252a38012Sejakowatz		virtual void test(const InitTestCase& tc) const
28352a38012Sejakowatz		{
28452a38012Sejakowatz			if (tc.filename) {
28552a38012Sejakowatz				BPath path(tc.filename);
28652a38012Sejakowatz				CPPUNIT_ASSERT( path.InitCheck() == B_OK );
28752a38012Sejakowatz				BPath dirPath;
28852a38012Sejakowatz				CPPUNIT_ASSERT( path.GetParent(&dirPath) == B_OK );
28952a38012Sejakowatz				BDirectory dir(dirPath.Path());
29052a38012Sejakowatz				CPPUNIT_ASSERT( dir.InitCheck() == B_OK );
29152a38012Sejakowatz				BFile file;
29252a38012Sejakowatz				status_t result = file.SetTo(&dir, path.Leaf(),
29352a38012Sejakowatz					tc.rwmode
29452a38012Sejakowatz					| (tc.createFile * B_CREATE_FILE)
29552a38012Sejakowatz					| (tc.failIfExists * B_FAIL_IF_EXISTS)
29652a38012Sejakowatz					| (tc.eraseFile * B_ERASE_FILE));
29752a38012Sejakowatz				CPPUNIT_ASSERT( result == tc.initCheck );
29852a38012Sejakowatz				testInit(tc, file);
29952a38012Sejakowatz			}
30052a38012Sejakowatz		}
30152a38012Sejakowatz	};
30252a38012Sejakowatz
30352a38012Sejakowatz	Tester1().testAll();
30452a38012Sejakowatz	Tester2().testAll();
30552a38012Sejakowatz	Tester3().testAll();
30652a38012Sejakowatz	Tester4().testAll();
30752a38012Sejakowatz}
30852a38012Sejakowatz
30952a38012Sejakowatz// RWAbleTest
31052a38012Sejakowatzvoid
31152a38012SejakowatzFileTest::RWAbleTest()
31252a38012Sejakowatz{
313aad997bdSTyler Dauwalder	NextSubTest();
31452a38012Sejakowatz	{
31552a38012Sejakowatz		BFile file;
31652a38012Sejakowatz		CPPUNIT_ASSERT( file.IsReadable() == false );
31752a38012Sejakowatz		CPPUNIT_ASSERT( file.IsWritable() == false );
31852a38012Sejakowatz	}
319aad997bdSTyler Dauwalder	NextSubTest();
32052a38012Sejakowatz	{
32152a38012Sejakowatz		BFile file(existingFilename, B_READ_ONLY);
32252a38012Sejakowatz		CPPUNIT_ASSERT( file.IsReadable() == true );
32352a38012Sejakowatz		CPPUNIT_ASSERT( file.IsWritable() == false );
32452a38012Sejakowatz	}
325aad997bdSTyler Dauwalder	NextSubTest();
32652a38012Sejakowatz	{
32752a38012Sejakowatz		BFile file(existingFilename, B_WRITE_ONLY);
32852a38012Sejakowatz		CPPUNIT_ASSERT( file.IsReadable() == false );
32952a38012Sejakowatz		CPPUNIT_ASSERT( file.IsWritable() == true );
33052a38012Sejakowatz	}
331aad997bdSTyler Dauwalder	NextSubTest();
33252a38012Sejakowatz	{
33352a38012Sejakowatz		BFile file(existingFilename, B_READ_WRITE);
33452a38012Sejakowatz		CPPUNIT_ASSERT( file.IsReadable() == true );
33552a38012Sejakowatz		CPPUNIT_ASSERT( file.IsWritable() == true );
33652a38012Sejakowatz	}
337aad997bdSTyler Dauwalder	NextSubTest();
33852a38012Sejakowatz	{
33952a38012Sejakowatz		BFile file(nonExistingFilename, B_READ_WRITE);
34052a38012Sejakowatz		CPPUNIT_ASSERT( file.IsReadable() == false );
34152a38012Sejakowatz		CPPUNIT_ASSERT( file.IsWritable() == false );
34252a38012Sejakowatz	}
34352a38012Sejakowatz}
34452a38012Sejakowatz
34552a38012Sejakowatz// RWTest
34652a38012Sejakowatzvoid
34752a38012SejakowatzFileTest::RWTest()
34852a38012Sejakowatz{
34952a38012Sejakowatz	// read/write an uninitialized BFile
350aad997bdSTyler Dauwalder	NextSubTest();
35152a38012Sejakowatz	BFile file;
35252a38012Sejakowatz	char buffer[10];
35352a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(buffer, sizeof(buffer)) < 0 );
35452a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(0, buffer, sizeof(buffer)) < 0 );
35552a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(buffer, sizeof(buffer)) < 0 );
35652a38012Sejakowatz	CPPUNIT_ASSERT( file.WriteAt(0, buffer, sizeof(buffer)) < 0 );
35752a38012Sejakowatz	file.Unset();
35852a38012Sejakowatz	// read/write an file opened for writing/reading only
359aad997bdSTyler Dauwalder	NextSubTest();
36052a38012Sejakowatz	file.SetTo(existingFilename, B_WRITE_ONLY);
36152a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
36252a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(buffer, sizeof(buffer)) < 0 );
36352a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(0, buffer, sizeof(buffer)) < 0 );
36452a38012Sejakowatz	file.SetTo(existingFilename, B_READ_ONLY);
36552a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
36652a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(buffer, sizeof(buffer)) < 0 );
36752a38012Sejakowatz	CPPUNIT_ASSERT( file.WriteAt(0, buffer, sizeof(buffer)) < 0 );
36852a38012Sejakowatz	file.Unset();
36952a38012Sejakowatz	// read from an empty file
370aad997bdSTyler Dauwalder	NextSubTest();
37152a38012Sejakowatz	file.SetTo(existingFilename, B_READ_ONLY);
37252a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
37352a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(buffer, sizeof(buffer)) == 0 );
37452a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(0, buffer, sizeof(buffer)) == 0 );
37552a38012Sejakowatz	file.Unset();
37652a38012Sejakowatz	// read from past an empty file
377aad997bdSTyler Dauwalder	NextSubTest();
37852a38012Sejakowatz	file.SetTo(existingFilename, B_READ_ONLY);
37952a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
38052a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(10, SEEK_SET) == 10 );
38152a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(buffer, sizeof(buffer)) == 0 );
38252a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(10, buffer, sizeof(buffer)) == 0 );
38352a38012Sejakowatz	file.Unset();
38452a38012Sejakowatz	// create a new empty file and write some data into it, then
38552a38012Sejakowatz	// read the file and check the data
386aad997bdSTyler Dauwalder	NextSubTest();
38752a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
38852a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
38952a38012Sejakowatz	char writeBuffer[256];
39052a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
39152a38012Sejakowatz		writeBuffer[i] = (char)i;
39252a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(writeBuffer, 128) == 128 );
39352a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 128 );
39452a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(writeBuffer + 128, 128) == 128 );
39552a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 256 );
39652a38012Sejakowatz	file.Unset();
39752a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY);
39852a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
39952a38012Sejakowatz	char readBuffer[256];
40052a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(readBuffer, 42) == 42 );
40152a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 42 );
40252a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(readBuffer + 42, 400) == 214 );
40352a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 256 );
40452a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
40552a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == (char)i );
40652a38012Sejakowatz	file.Unset();
40752a38012Sejakowatz	execCommand(string("rm -f ") + testFilename1);
40852a38012Sejakowatz	// same procedure, just using ReadAt()/WriteAt()
409aad997bdSTyler Dauwalder	NextSubTest();
41052a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
41152a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
41252a38012Sejakowatz	CPPUNIT_ASSERT( file.WriteAt(80, writeBuffer + 80, 50) == 50 );
41352a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
41452a38012Sejakowatz	CPPUNIT_ASSERT( file.WriteAt(0, writeBuffer, 80) == 80 );
41552a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
41652a38012Sejakowatz	CPPUNIT_ASSERT( file.WriteAt(130, writeBuffer + 130, 126) == 126 );
41752a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
41852a38012Sejakowatz	file.Unset();
41952a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY);
42052a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
42152a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
42252a38012Sejakowatz		readBuffer[i] = 0;
42352a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(42, readBuffer + 42, 84) == 84 );
42452a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
42552a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(0, readBuffer, 42) == 42 );
42652a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
42752a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(126, readBuffer + 126, 130) == 130 );
42852a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
42952a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
43052a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == (char)i );
43152a38012Sejakowatz	file.Unset();
43252a38012Sejakowatz	execCommand(string("rm -f ") + testFilename1);
43352a38012Sejakowatz	// write past the end of a file
434aad997bdSTyler Dauwalder	NextSubTest();
43552a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
43652a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
43752a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(128, SEEK_SET) == 128 );
43852a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(writeBuffer, 128) == 128 );
43952a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 256 );
44052a38012Sejakowatz	file.Unset();
44152a38012Sejakowatz	// open the file with B_OPEN_AT_END flag, Write() some data to it, close
44252a38012Sejakowatz	// and re-open it to check the file
443aad997bdSTyler Dauwalder	NextSubTest();
44452a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_OPEN_AT_END);
44552a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
44652a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
44752a38012Sejakowatz		writeBuffer[i] = (char)7;
44852a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(writeBuffer, 50) == 50 );
44952a38012Sejakowatz	file.Seek(0, SEEK_SET);	// might fail -- don't check the return value
45052a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(writeBuffer, 40) == 40 );
45152a38012Sejakowatz	file.Unset();
45252a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY);
45352a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
45452a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(256, readBuffer, 90) == 90 );
45552a38012Sejakowatz	for (int32 i = 0; i < 90; i++)
45652a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == 7 );
45752a38012Sejakowatz	file.Unset();
45852a38012Sejakowatz	// open the file with B_OPEN_AT_END flag, WriteAt() some data to it, close
45952a38012Sejakowatz	// and re-open it to check the file
460aad997bdSTyler Dauwalder	NextSubTest();
46152a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_OPEN_AT_END);
46252a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
46352a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
46452a38012Sejakowatz		writeBuffer[i] = (char)42;
46552a38012Sejakowatz	CPPUNIT_ASSERT( file.WriteAt(0, writeBuffer, 30) == 30 );
46652a38012Sejakowatz	file.Unset();
46752a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY);
46852a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
46952a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(346, readBuffer, 30) == 30 );
47052a38012Sejakowatz	for (int32 i = 0; i < 30; i++)
47152a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == 42 );
47252a38012Sejakowatz	file.Unset();
47352a38012Sejakowatz	// open the file with B_OPEN_AT_END flag, ReadAt() some data
474aad997bdSTyler Dauwalder	NextSubTest();
47552a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY | B_OPEN_AT_END);
47652a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
47752a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
47852a38012Sejakowatz		readBuffer[i] = 0;
47952a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(256, readBuffer, 90) == 90 );
48052a38012Sejakowatz	for (int32 i = 0; i < 90; i++)
48152a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == 7 );
48252a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(346, readBuffer, 30) == 30 );
48352a38012Sejakowatz	for (int32 i = 0; i < 30; i++)
48452a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == 42 );
48552a38012Sejakowatz	file.Unset();
48652a38012Sejakowatz	// same procedure, just using Seek() and Read()
487aad997bdSTyler Dauwalder	NextSubTest();
48852a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY | B_OPEN_AT_END);
48952a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
49052a38012Sejakowatz	for (int32 i = 0; i < 256; i++)
49152a38012Sejakowatz		readBuffer[i] = 0;
49252a38012Sejakowatz	file.Seek(256, SEEK_SET);	// might fail -- don't check the return value
49352a38012Sejakowatz	CPPUNIT_ASSERT( file.Read(readBuffer, 90) == 90 );
49452a38012Sejakowatz	for (int32 i = 0; i < 90; i++)
49552a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == 7 );
49652a38012Sejakowatz	CPPUNIT_ASSERT( file.ReadAt(346, readBuffer, 30) == 30 );
49752a38012Sejakowatz	for (int32 i = 0; i < 30; i++)
49852a38012Sejakowatz		CPPUNIT_ASSERT( readBuffer[i] == 42 );
49952a38012Sejakowatz	file.Unset();
50052a38012Sejakowatz
50152a38012Sejakowatz	execCommand(string("rm -f ") + testFilename1);
50252a38012Sejakowatz}
50352a38012Sejakowatz
50452a38012Sejakowatz// PositionTest
50552a38012Sejakowatzvoid
50652a38012SejakowatzFileTest::PositionTest()
50752a38012Sejakowatz{
50852a38012Sejakowatz	// unitialized file
509aad997bdSTyler Dauwalder	NextSubTest();
51052a38012Sejakowatz	BFile file;
51152a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == B_FILE_ERROR );
51252a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(10, SEEK_SET) == B_FILE_ERROR );
51352a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(10, SEEK_END) == B_FILE_ERROR );
51452a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(10, SEEK_CUR) == B_FILE_ERROR );
51552a38012Sejakowatz	// open new file, write some bytes to it and seek a bit around
516aad997bdSTyler Dauwalder	NextSubTest();
51752a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
51852a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
51952a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 0 );
52052a38012Sejakowatz	char writeBuffer[256];
52152a38012Sejakowatz	CPPUNIT_ASSERT( file.Write(writeBuffer, 256) == 256 );
52252a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 256 );
52352a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(10, SEEK_SET) == 10 );
52452a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 10 );
52552a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(-20, SEEK_END) == 236 );
52652a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 236 );
52752a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(-70, SEEK_CUR) == 166 );
52852a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 166 );
52952a38012Sejakowatz	file.Unset();
53052a38012Sejakowatz	// re-open the file at the end and seek a bit around once more
53152a38012Sejakowatz	// The BeBook is a bit unspecific about the B_OPEN_AT_END flag:
53252a38012Sejakowatz	// It has probably the same meaning as the POSIX flag O_APPEND, which
53352a38012Sejakowatz	// means, that all write()s append their data at the end. The behavior
53452a38012Sejakowatz	// of Seek() and Position() is a bit unclear for this case.
53552a38012Sejakowatz/*
536aad997bdSTyler Dauwalder	NextSubTest();
53752a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY | B_OPEN_AT_END);
53852a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
53952a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 256 );
54052a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(10, SEEK_SET) == 10 );
54152a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 10 );			// fails with R5
54252a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(-20, SEEK_END) == 236 );
54352a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 236 );			// fails with R5
54452a38012Sejakowatz	CPPUNIT_ASSERT( file.Seek(-70, SEEK_CUR) == 166 );	// fails with R5
54552a38012Sejakowatz	CPPUNIT_ASSERT( file.Position() == 166 );			// fails with R5
54652a38012Sejakowatz*/
54752a38012Sejakowatz	file.Unset();
54852a38012Sejakowatz	execCommand(string("rm -f ") + testFilename1);
54952a38012Sejakowatz}
55052a38012Sejakowatz
55152a38012Sejakowatz// SizeTest
55252a38012Sejakowatzvoid
55352a38012SejakowatzFileTest::SizeTest()
55452a38012Sejakowatz{
55552a38012Sejakowatz	// unitialized file
556aad997bdSTyler Dauwalder	NextSubTest();
55752a38012Sejakowatz	BFile file;
55852a38012Sejakowatz	off_t size;
55952a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) != B_OK );
56052a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(100) != B_OK );
56152a38012Sejakowatz	// read only file
562aad997bdSTyler Dauwalder	NextSubTest();
56352a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY | B_CREATE_FILE);
56452a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
56552a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
56652a38012Sejakowatz	CPPUNIT_ASSERT( size == 0 );
56752a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(100) == B_OK );
56852a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
56952a38012Sejakowatz	CPPUNIT_ASSERT( size == 100 );
57052a38012Sejakowatz	file.Unset();
57152a38012Sejakowatz	// shorten existing file
572aad997bdSTyler Dauwalder	NextSubTest();
57352a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY);
57452a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
57552a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
57652a38012Sejakowatz	CPPUNIT_ASSERT( size == 100 );
57752a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(73) == B_OK );
57852a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
57952a38012Sejakowatz	CPPUNIT_ASSERT( size == 73 );
58052a38012Sejakowatz	file.Unset();
58152a38012Sejakowatz	// enlarge existing file
582aad997bdSTyler Dauwalder	NextSubTest();
58352a38012Sejakowatz	file.SetTo(testFilename1, B_READ_WRITE);
58452a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
58552a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
58652a38012Sejakowatz	CPPUNIT_ASSERT( size == 73 );
58752a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(147) == B_OK );
58852a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
58952a38012Sejakowatz	CPPUNIT_ASSERT( size == 147 );
59052a38012Sejakowatz	file.Unset();
59152a38012Sejakowatz	// erase existing file (read only)
592aad997bdSTyler Dauwalder	NextSubTest();
59352a38012Sejakowatz	file.SetTo(testFilename1, B_READ_ONLY | B_ERASE_FILE);
59452a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
59552a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
59652a38012Sejakowatz	CPPUNIT_ASSERT( size == 0 );
59752a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(132) == B_OK );
59852a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
59952a38012Sejakowatz	CPPUNIT_ASSERT( size == 132 );
60052a38012Sejakowatz	file.Unset();
60152a38012Sejakowatz	// erase existing file (write only)
602aad997bdSTyler Dauwalder	NextSubTest();
60352a38012Sejakowatz	file.SetTo(testFilename1, B_WRITE_ONLY | B_ERASE_FILE);
60452a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
60552a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
60652a38012Sejakowatz	CPPUNIT_ASSERT( size == 0 );
60752a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(93) == B_OK );
60852a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
60952a38012Sejakowatz	CPPUNIT_ASSERT( size == 93 );
61052a38012Sejakowatz	file.Unset();
61152a38012Sejakowatz	// erase existing file using SetSize()
612aad997bdSTyler Dauwalder	NextSubTest();
61352a38012Sejakowatz	file.SetTo(testFilename1, B_READ_WRITE);
61452a38012Sejakowatz	CPPUNIT_ASSERT( file.InitCheck() == B_OK );
61552a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
61652a38012Sejakowatz	CPPUNIT_ASSERT( size == 93 );
61752a38012Sejakowatz	CPPUNIT_ASSERT( file.SetSize(0) == B_OK );
61852a38012Sejakowatz	CPPUNIT_ASSERT( file.GetSize(&size) == B_OK );
61952a38012Sejakowatz	CPPUNIT_ASSERT( size == 0 );
62052a38012Sejakowatz	file.Unset();
62152a38012Sejakowatz	execCommand(string("rm -f ") + testFilename1);
62252a38012Sejakowatz}
62352a38012Sejakowatz
62452a38012Sejakowatz// AssignmentTest
62552a38012Sejakowatzvoid
62652a38012SejakowatzFileTest::AssignmentTest()
62752a38012Sejakowatz{
62852a38012Sejakowatz	// copy constructor
62952a38012Sejakowatz	// uninitialized
630aad997bdSTyler Dauwalder	NextSubTest();
63152a38012Sejakowatz	{
63252a38012Sejakowatz		BFile file;
63352a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_NO_INIT );
63452a38012Sejakowatz		BFile file2(file);
63552a38012Sejakowatz		// R5 returns B_BAD_VALUE instead of B_NO_INIT
63652a38012Sejakowatz		CPPUNIT_ASSERT( equals(file2.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
63752a38012Sejakowatz	}
63852a38012Sejakowatz	// existing file, different open modes
639aad997bdSTyler Dauwalder	NextSubTest();
64052a38012Sejakowatz	{
64152a38012Sejakowatz		BFile file(existingFilename, B_READ_ONLY);
64252a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_OK );
64352a38012Sejakowatz		BFile file2(file);
64452a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
64552a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsReadable() == true );
64652a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsWritable() == false );
64752a38012Sejakowatz	}
648aad997bdSTyler Dauwalder	NextSubTest();
64952a38012Sejakowatz	{
65052a38012Sejakowatz		BFile file(existingFilename, B_WRITE_ONLY);
65152a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_OK );
65252a38012Sejakowatz		BFile file2(file);
65352a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
65452a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsReadable() == false );
65552a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsWritable() == true );
65652a38012Sejakowatz	}
657aad997bdSTyler Dauwalder	NextSubTest();
65852a38012Sejakowatz	{
65952a38012Sejakowatz		BFile file(existingFilename, B_READ_WRITE);
66052a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_OK );
66152a38012Sejakowatz		BFile file2(file);
66252a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
66352a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsReadable() == true );
66452a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsWritable() == true );
66552a38012Sejakowatz	}
66652a38012Sejakowatz	// assignment operator
66752a38012Sejakowatz	// uninitialized
668aad997bdSTyler Dauwalder	NextSubTest();
66952a38012Sejakowatz	{
67052a38012Sejakowatz		BFile file;
67152a38012Sejakowatz		BFile file2;
67252a38012Sejakowatz		file2 = file;
67352a38012Sejakowatz		// R5 returns B_BAD_VALUE instead of B_NO_INIT
67452a38012Sejakowatz		CPPUNIT_ASSERT( equals(file2.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
67552a38012Sejakowatz	}
676aad997bdSTyler Dauwalder	NextSubTest();
67752a38012Sejakowatz	{
67852a38012Sejakowatz		BFile file;
67952a38012Sejakowatz		BFile file2(existingFilename, B_READ_ONLY);
68052a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
68152a38012Sejakowatz		file2 = file;
68252a38012Sejakowatz		// R5 returns B_BAD_VALUE instead of B_NO_INIT
68352a38012Sejakowatz		CPPUNIT_ASSERT( equals(file2.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
68452a38012Sejakowatz	}
68552a38012Sejakowatz	// existing file, different open modes
686aad997bdSTyler Dauwalder	NextSubTest();
68752a38012Sejakowatz	{
68852a38012Sejakowatz		BFile file(existingFilename, B_READ_ONLY);
68952a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_OK );
69052a38012Sejakowatz		BFile file2;
69152a38012Sejakowatz		file2 = file;
69252a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
69352a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsReadable() == true );
69452a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsWritable() == false );
69552a38012Sejakowatz	}
696aad997bdSTyler Dauwalder	NextSubTest();
69752a38012Sejakowatz	{
69852a38012Sejakowatz		BFile file(existingFilename, B_WRITE_ONLY);
69952a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_OK );
70052a38012Sejakowatz		BFile file2;
70152a38012Sejakowatz		file2 = file;
70252a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
70352a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsReadable() == false );
70452a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsWritable() == true );
70552a38012Sejakowatz	}
706aad997bdSTyler Dauwalder	NextSubTest();
70752a38012Sejakowatz	{
70852a38012Sejakowatz		BFile file(existingFilename, B_READ_WRITE);
70952a38012Sejakowatz		CPPUNIT_ASSERT( file.InitCheck() == B_OK );
71052a38012Sejakowatz		BFile file2;
71152a38012Sejakowatz		file2 = file;
71252a38012Sejakowatz		CPPUNIT_ASSERT( file2.InitCheck() == B_OK );
71352a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsReadable() == true );
71452a38012Sejakowatz		CPPUNIT_ASSERT( file2.IsWritable() == true );
71552a38012Sejakowatz	}
71652a38012Sejakowatz}
71752a38012Sejakowatz
71852a38012Sejakowatz
71952a38012Sejakowatz
72052a38012Sejakowatz// test cases for the init tests
72152a38012Sejakowatzconst FileTest::InitTestCase FileTest::initTestCases[] = {
72252a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 0, 0, 0, false, B_OK				},
72352a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 0, 0, 0, false, B_OK				},
72452a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 0, 0, 0, false, B_OK				},
72552a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 1, 0, 0, false, B_OK				},
72652a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 1, 0, 0, false, B_OK				},
72752a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 1, 0, 0, false, B_OK				},
72852a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 0, 1, 0, false, B_OK				},
72952a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 0, 1, 0, false, B_OK				},
73052a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 0, 1, 0, false, B_OK				},
73152a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 0, 0, 1, false, B_OK				},
73252a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 0, 0, 1, false, B_OK				},
73352a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 0, 0, 1, false, B_OK				},
73452a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 1, 1, 0, false, B_FILE_EXISTS		},
73552a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 1, 1, 0, false, B_FILE_EXISTS		},
73652a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 1, 1, 0, false, B_FILE_EXISTS		},
73752a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 1, 0, 1, false, B_OK				},
73852a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 1, 0, 1, false, B_OK				},
73952a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 1, 0, 1, false, B_OK				},
74052a38012Sejakowatz	{ existingFilename	 , B_READ_ONLY , 1, 1, 1, false, B_FILE_EXISTS		},
74152a38012Sejakowatz	{ existingFilename	 , B_WRITE_ONLY, 1, 1, 1, false, B_FILE_EXISTS		},
74252a38012Sejakowatz	{ existingFilename	 , B_READ_WRITE, 1, 1, 1, false, B_FILE_EXISTS		},
74352a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 0, 0, 0, false, B_ENTRY_NOT_FOUND	},
74452a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 0, 0, 0, false, B_ENTRY_NOT_FOUND	},
74552a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 0, 0, 0, false, B_ENTRY_NOT_FOUND	},
74652a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 1, 0, 0, true , B_OK				},
74752a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 1, 0, 0, true , B_OK				},
74852a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 1, 0, 0, true , B_OK				},
74952a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 0, 1, 0, false, B_ENTRY_NOT_FOUND	},
75052a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 0, 1, 0, false, B_ENTRY_NOT_FOUND	},
75152a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 0, 1, 0, false, B_ENTRY_NOT_FOUND	},
75252a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 0, 0, 1, false, B_ENTRY_NOT_FOUND	},
75352a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 0, 0, 1, false, B_ENTRY_NOT_FOUND	},
75452a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 0, 0, 1, false, B_ENTRY_NOT_FOUND	},
75552a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 1, 1, 0, true , B_OK				},
75652a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 1, 1, 0, true , B_OK				},
75752a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 1, 1, 0, true , B_OK				},
75852a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 1, 0, 1, true , B_OK				},
75952a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 1, 0, 1, true , B_OK				},
76052a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 1, 0, 1, true , B_OK				},
76152a38012Sejakowatz	{ nonExistingFilename, B_READ_ONLY , 1, 1, 1, true , B_OK				},
76252a38012Sejakowatz	{ nonExistingFilename, B_WRITE_ONLY, 1, 1, 1, true , B_OK				},
76352a38012Sejakowatz	{ nonExistingFilename, B_READ_WRITE, 1, 1, 1, true , B_OK				},
76452a38012Sejakowatz	{ NULL,				   B_READ_ONLY , 1, 1, 1, false, B_BAD_VALUE		},
76552a38012Sejakowatz};
76652a38012Sejakowatzconst int32 FileTest::initTestCasesCount
76752a38012Sejakowatz	= sizeof(FileTest::initTestCases) / sizeof(FileTest::InitTestCase);
76852a38012Sejakowatz
769aad997bdSTyler Dauwalder
770aad997bdSTyler Dauwalder
771aad997bdSTyler Dauwalder
772aad997bdSTyler Dauwalder
773aad997bdSTyler Dauwalder
774aad997bdSTyler Dauwalder
775aad997bdSTyler Dauwalder
776aad997bdSTyler Dauwalder
777aad997bdSTyler Dauwalder
778aad997bdSTyler Dauwalder
779