908 lines
27 KiB
C++
908 lines
27 KiB
C++
// SymLinkTest.cpp
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <string>
|
|
using std::string;
|
|
|
|
#include <Directory.h>
|
|
#include <Entry.h>
|
|
#include <Path.h>
|
|
#include <SymLink.h>
|
|
|
|
#include "SymLinkTest.h"
|
|
|
|
// Suite
|
|
SymLinkTest::Test*
|
|
SymLinkTest::Suite()
|
|
{
|
|
CppUnit::TestSuite *suite = new CppUnit::TestSuite();
|
|
typedef CppUnit::TestCaller<SymLinkTest> TC;
|
|
|
|
NodeTest::AddBaseClassTests<SymLinkTest>("BSymLink::", suite);
|
|
|
|
suite->addTest( new TC("BSymLink::Init Test 1", &SymLinkTest::InitTest1) );
|
|
suite->addTest( new TC("BSymLink::Init Test 2", &SymLinkTest::InitTest2) );
|
|
suite->addTest( new TC("BSymLink::ReadLink Test",
|
|
&SymLinkTest::ReadLinkTest) );
|
|
suite->addTest( new TC("BSymLink::MakeLinkedPath Test",
|
|
&SymLinkTest::MakeLinkedPathTest) );
|
|
suite->addTest( new TC("BSymLink::IsAbsolute Test",
|
|
&SymLinkTest::IsAbsoluteTest) );
|
|
suite->addTest( new TC("BSymLink::Assignment Test",
|
|
&SymLinkTest::AssignmentTest) );
|
|
|
|
return suite;
|
|
}
|
|
|
|
// CreateRONodes
|
|
void
|
|
SymLinkTest::CreateRONodes(TestNodes& testEntries)
|
|
{
|
|
testEntries.clear();
|
|
const char *filename;
|
|
filename = "/tmp";
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
filename = dirLinkname;
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
filename = fileLinkname;
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
filename = badLinkname;
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
filename = cyclicLinkname1;
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
}
|
|
|
|
// CreateRWNodes
|
|
void
|
|
SymLinkTest::CreateRWNodes(TestNodes& testEntries)
|
|
{
|
|
testEntries.clear();
|
|
const char *filename;
|
|
filename = dirLinkname;
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
filename = fileLinkname;
|
|
testEntries.add(new BSymLink(filename), filename);
|
|
}
|
|
|
|
// CreateUninitializedNodes
|
|
void
|
|
SymLinkTest::CreateUninitializedNodes(TestNodes& testEntries)
|
|
{
|
|
testEntries.clear();
|
|
testEntries.add(new BSymLink, "");
|
|
}
|
|
|
|
// setUp
|
|
void SymLinkTest::setUp()
|
|
{
|
|
NodeTest::setUp();
|
|
}
|
|
|
|
// tearDown
|
|
void SymLinkTest::tearDown()
|
|
{
|
|
NodeTest::tearDown();
|
|
}
|
|
|
|
// InitTest1
|
|
void
|
|
SymLinkTest::InitTest1()
|
|
{
|
|
const char *dirLink = dirLinkname;
|
|
const char *dirSuperLink = dirSuperLinkname;
|
|
const char *dirRelLink = dirRelLinkname;
|
|
const char *fileLink = fileLinkname;
|
|
const char *existingDir = existingDirname;
|
|
const char *existingSuperDir = existingSuperDirname;
|
|
const char *existingRelDir = existingRelDirname;
|
|
const char *existingFile = existingFilename;
|
|
const char *existingSuperFile = existingSuperFilename;
|
|
const char *existingRelFile = existingRelFilename;
|
|
const char *nonExisting = nonExistingDirname;
|
|
const char *nonExistingSuper = nonExistingSuperDirname;
|
|
const char *nonExistingRel = nonExistingRelDirname;
|
|
// 1. default constructor
|
|
NextSubTest();
|
|
{
|
|
BSymLink link;
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NO_INIT );
|
|
}
|
|
|
|
// 2. BSymLink(const char*)
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(fileLink);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(nonExisting);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link((const char *)NULL);
|
|
CPPUNIT_ASSERT( equals(link.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link("");
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(existingFile);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(existingDir);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(tooLongEntryname);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NAME_TOO_LONG );
|
|
}
|
|
|
|
// 3. BSymLink(const BEntry*)
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(dirLink);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
BSymLink link(&entry);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(nonExisting);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
BSymLink link(&entry);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link((BEntry *)NULL);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry;
|
|
BSymLink link(&entry);
|
|
CPPUNIT_ASSERT( equals(link.InitCheck(), B_BAD_ADDRESS, B_BAD_VALUE) );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(existingFile);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
BSymLink link(&entry);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(existingDir);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
BSymLink link(&entry);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(tooLongEntryname);
|
|
// R5 returns E2BIG instead of B_NAME_TOO_LONG
|
|
CPPUNIT_ASSERT( equals(entry.InitCheck(), E2BIG, B_NAME_TOO_LONG) );
|
|
BSymLink link(&entry);
|
|
CPPUNIT_ASSERT( equals(link.InitCheck(), B_BAD_ADDRESS, B_BAD_VALUE) );
|
|
}
|
|
|
|
// 4. BSymLink(const entry_ref*)
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(dirLink);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
entry_ref ref;
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
BSymLink link(&ref);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(nonExisting);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
entry_ref ref;
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
BSymLink link(&ref);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link((entry_ref *)NULL);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(existingFile);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
entry_ref ref;
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
BSymLink link(&ref);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BEntry entry(existingDir);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
entry_ref ref;
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
BSymLink link(&ref);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
|
|
// 5. BSymLink(const BDirectory*, const char*)
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(dirSuperLink);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, dirRelLink);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(dirSuperLink);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, dirLink);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(nonExistingSuper);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, nonExistingRel);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link((BDirectory *)NULL, (const char *)NULL);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link((BDirectory *)NULL, dirLink);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(dirSuperLink);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, (const char *)NULL);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(dirSuperLink);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, "");
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(existingSuperFile);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, existingRelFile);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(existingSuperDir);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, existingRelDir);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(tooLongSuperEntryname);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, tooLongRelEntryname);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NAME_TOO_LONG );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BDirectory pathDir(fileSuperDirname);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
BSymLink link(&pathDir, fileRelDirname);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
}
|
|
|
|
// InitTest2
|
|
void
|
|
SymLinkTest::InitTest2()
|
|
{
|
|
const char *dirLink = dirLinkname;
|
|
const char *dirSuperLink = dirSuperLinkname;
|
|
const char *dirRelLink = dirRelLinkname;
|
|
const char *fileLink = fileLinkname;
|
|
const char *existingDir = existingDirname;
|
|
const char *existingSuperDir = existingSuperDirname;
|
|
const char *existingRelDir = existingRelDirname;
|
|
const char *existingFile = existingFilename;
|
|
const char *existingSuperFile = existingSuperFilename;
|
|
const char *existingRelFile = existingRelFilename;
|
|
const char *nonExisting = nonExistingDirname;
|
|
const char *nonExistingSuper = nonExistingSuperDirname;
|
|
const char *nonExistingRel = nonExistingRelDirname;
|
|
BSymLink link;
|
|
// 2. BSymLink(const char*)
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(fileLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(nonExisting) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( equals(link.SetTo((const char *)NULL), B_BAD_VALUE,
|
|
B_NO_INIT) );
|
|
CPPUNIT_ASSERT( equals(link.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo("") == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(tooLongEntryname) == B_NAME_TOO_LONG );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NAME_TOO_LONG );
|
|
|
|
// 3. BSymLink(const BEntry*)
|
|
NextSubTest();
|
|
BEntry entry(dirLink);
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&entry) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(nonExisting) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&entry) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo((BEntry *)NULL) == B_BAD_VALUE );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
//
|
|
NextSubTest();
|
|
entry.Unset();
|
|
CPPUNIT_ASSERT( entry.InitCheck() == B_NO_INIT );
|
|
CPPUNIT_ASSERT( equals(link.SetTo(&entry), B_BAD_ADDRESS, B_BAD_VALUE) );
|
|
CPPUNIT_ASSERT( equals(link.InitCheck(), B_BAD_ADDRESS, B_BAD_VALUE) );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&entry) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&entry) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
// R5 returns E2BIG instead of B_NAME_TOO_LONG
|
|
CPPUNIT_ASSERT( equals(entry.SetTo(tooLongEntryname), E2BIG,
|
|
B_NAME_TOO_LONG) );
|
|
CPPUNIT_ASSERT( equals(link.SetTo(&entry), B_BAD_ADDRESS, B_BAD_VALUE) );
|
|
CPPUNIT_ASSERT( equals(link.InitCheck(), B_BAD_ADDRESS, B_BAD_VALUE) );
|
|
|
|
// 4. BSymLink(const entry_ref*)
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(dirLink) == B_OK );
|
|
entry_ref ref;
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(nonExisting) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&ref) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo((entry_ref *)NULL) == B_BAD_VALUE );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetRef(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&ref) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
|
|
// 5. BSymLink(const BDirectory*, const char*)
|
|
NextSubTest();
|
|
BDirectory pathDir(dirSuperLink);
|
|
CPPUNIT_ASSERT( pathDir.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, dirRelLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(dirSuperLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, dirLink) == B_BAD_VALUE );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(nonExistingSuper) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, nonExistingRel) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo((BDirectory *)NULL, (const char *)NULL)
|
|
== B_BAD_VALUE );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo((BDirectory *)NULL, dirLink) == B_BAD_VALUE );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(dirSuperLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, (const char *)NULL) == B_BAD_VALUE );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_BAD_VALUE );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(dirSuperLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, "") == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(existingSuperFile) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, existingRelFile) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(existingSuperDir) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, existingRelDir) == B_OK );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(tooLongSuperEntryname) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, tooLongRelEntryname)
|
|
== B_NAME_TOO_LONG );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NAME_TOO_LONG );
|
|
//
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( pathDir.SetTo(fileSuperDirname) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(&pathDir, fileRelDirname) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_ENTRY_NOT_FOUND );
|
|
}
|
|
|
|
// ReadLinkTest
|
|
void
|
|
SymLinkTest::ReadLinkTest()
|
|
{
|
|
const char *dirLink = dirLinkname;
|
|
const char *fileLink = fileLinkname;
|
|
const char *badLink = badLinkname;
|
|
const char *cyclicLink1 = cyclicLinkname1;
|
|
const char *cyclicLink2 = cyclicLinkname2;
|
|
const char *existingDir = existingDirname;
|
|
const char *existingFile = existingFilename;
|
|
const char *nonExisting = nonExistingDirname;
|
|
BSymLink link;
|
|
char buffer[B_PATH_NAME_LENGTH + 1];
|
|
// uninitialized
|
|
// R5: returns B_BAD_ADDRESS instead of (as doc'ed) B_FILE_ERROR
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NO_INIT );
|
|
CPPUNIT_ASSERT( equals(link.ReadLink(buffer, sizeof(buffer)),
|
|
B_BAD_ADDRESS, B_FILE_ERROR) );
|
|
// existing dir link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(buffer, sizeof(buffer))
|
|
== (ssize_t)strlen(existingDir) );
|
|
CPPUNIT_ASSERT( strcmp(buffer, existingDir) == 0 );
|
|
// existing file link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(fileLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(buffer, sizeof(buffer))
|
|
== (ssize_t)strlen(existingFile) );
|
|
CPPUNIT_ASSERT( strcmp(buffer, existingFile) == 0 );
|
|
// existing cyclic link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(cyclicLink1) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(buffer, sizeof(buffer))
|
|
== (ssize_t)strlen(cyclicLink2) );
|
|
CPPUNIT_ASSERT( strcmp(buffer, cyclicLink2) == 0 );
|
|
// existing link to non-existing entry
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(badLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(buffer, sizeof(buffer))
|
|
== (ssize_t)strlen(nonExisting) );
|
|
CPPUNIT_ASSERT( strcmp(buffer, nonExisting) == 0 );
|
|
// non-existing link
|
|
// R5: returns B_BAD_ADDRESS instead of (as doc'ed) B_FILE_ERROR
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(nonExisting) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( equals(link.ReadLink(buffer, sizeof(buffer)),
|
|
B_BAD_ADDRESS, B_FILE_ERROR) );
|
|
// dir
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(buffer, sizeof(buffer)) == B_BAD_VALUE );
|
|
// file
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(buffer, sizeof(buffer)) == B_BAD_VALUE );
|
|
// small buffer
|
|
// R5: returns the size of the contents, not the number of bytes copied
|
|
// OBOS: ... so do we
|
|
NextSubTest();
|
|
char smallBuffer[2];
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.ReadLink(smallBuffer, sizeof(smallBuffer))
|
|
== (ssize_t)strlen(dirLink) );
|
|
CPPUNIT_ASSERT( strncmp(smallBuffer, existingDir, sizeof(smallBuffer)) == 0 );
|
|
// bad args
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(fileLink) == B_OK );
|
|
CPPUNIT_ASSERT( equals(link.ReadLink(NULL, sizeof(buffer)), B_BAD_ADDRESS,
|
|
B_BAD_VALUE) );
|
|
}
|
|
|
|
// MakeLinkedPathTest
|
|
void
|
|
SymLinkTest::MakeLinkedPathTest()
|
|
{
|
|
const char *dirLink = dirLinkname;
|
|
const char *fileLink = fileLinkname;
|
|
const char *relDirLink = relDirLinkname;
|
|
const char *relFileLink = relFileLinkname;
|
|
const char *cyclicLink1 = cyclicLinkname1;
|
|
const char *cyclicLink2 = cyclicLinkname2;
|
|
const char *existingDir = existingDirname;
|
|
const char *existingSuperDir = existingSuperDirname;
|
|
const char *existingFile = existingFilename;
|
|
const char *existingSuperFile = existingSuperFilename;
|
|
const char *nonExisting = nonExistingDirname;
|
|
BSymLink link;
|
|
BPath path;
|
|
// 1. MakeLinkedPath(const char*, BPath*)
|
|
// uninitialized
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NO_INIT );
|
|
CPPUNIT_ASSERT( equals(link.MakeLinkedPath("/boot", &path), B_BAD_ADDRESS,
|
|
B_FILE_ERROR) );
|
|
link.Unset();
|
|
path.Unset();
|
|
// existing absolute dir link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath("/boot", &path)
|
|
== (ssize_t)strlen(existingDir) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(existingDir) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
// existing absolute file link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(fileLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath("/boot", &path)
|
|
== (ssize_t)strlen(existingFile) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(existingFile) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
// existing absolute cyclic link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(cyclicLink1) == B_OK );
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath("/boot", &path)
|
|
== (ssize_t)strlen(cyclicLink2) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(cyclicLink2) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
// existing relative dir link
|
|
NextSubTest();
|
|
BEntry entry;
|
|
BPath entryPath;
|
|
CPPUNIT_ASSERT( entry.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetPath(&entryPath) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(relDirLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(existingSuperDir, &path)
|
|
== (ssize_t)strlen(entryPath.Path()) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( entryPath == path );
|
|
link.Unset();
|
|
path.Unset();
|
|
entry.Unset();
|
|
entryPath.Unset();
|
|
// existing relative file link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetPath(&entryPath) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(relFileLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(existingSuperFile, &path)
|
|
== (ssize_t)strlen(entryPath.Path()) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( entryPath == path );
|
|
link.Unset();
|
|
path.Unset();
|
|
entry.Unset();
|
|
entryPath.Unset();
|
|
// bad args
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
// R5: crashs, when passing a NULL path
|
|
#if !TEST_R5
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath("/boot", NULL) == B_BAD_VALUE );
|
|
#endif
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath((const char*)NULL, &path)
|
|
== B_BAD_VALUE );
|
|
// R5: crashs, when passing a NULL path
|
|
#if !TEST_R5
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath((const char*)NULL, NULL)
|
|
== B_BAD_VALUE );
|
|
#endif
|
|
link.Unset();
|
|
path.Unset();
|
|
|
|
// 2. MakeLinkedPath(const BDirectory*, BPath*)
|
|
// uninitialized
|
|
NextSubTest();
|
|
link.Unset();
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NO_INIT );
|
|
BDirectory dir;
|
|
CPPUNIT_ASSERT( dir.SetTo("/boot") == B_OK);
|
|
CPPUNIT_ASSERT( equals(link.MakeLinkedPath(&dir, &path), B_BAD_ADDRESS,
|
|
B_FILE_ERROR) );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
// existing absolute dir link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo("/boot") == B_OK);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(existingDir) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(existingDir) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
// existing absolute file link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(fileLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo("/boot") == B_OK);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(existingFile) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(existingFile) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
// existing absolute cyclic link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(cyclicLink1) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo("/boot") == B_OK);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(cyclicLink2) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(cyclicLink2) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
// existing relative dir link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetPath(&entryPath) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(relDirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo(existingSuperDir) == B_OK);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(entryPath.Path()) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( entryPath == path );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
entry.Unset();
|
|
entryPath.Unset();
|
|
// existing relative file link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( entry.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( entry.GetPath(&entryPath) == B_OK );
|
|
CPPUNIT_ASSERT( link.SetTo(relFileLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo(existingSuperFile) == B_OK);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(entryPath.Path()) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( entryPath == path );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
entry.Unset();
|
|
entryPath.Unset();
|
|
// absolute link, uninitialized dir
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.InitCheck() == B_NO_INIT);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(existingDir) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(existingDir) == path.Path() );
|
|
// absolute link, badly initialized dir
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo(nonExisting) == B_ENTRY_NOT_FOUND);
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, &path)
|
|
== (ssize_t)strlen(existingDir) );
|
|
CPPUNIT_ASSERT( path.InitCheck() == B_OK );
|
|
CPPUNIT_ASSERT( string(existingDir) == path.Path() );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
// relative link, uninitialized dir
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(relDirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.InitCheck() == B_NO_INIT);
|
|
CPPUNIT_ASSERT( equals(link.MakeLinkedPath(&dir, &path), B_NO_INIT,
|
|
B_BAD_VALUE) );
|
|
link.Unset();
|
|
// relative link, badly initialized dir
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(relDirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo(nonExisting) == B_ENTRY_NOT_FOUND);
|
|
CPPUNIT_ASSERT( equals(link.MakeLinkedPath(&dir, &path), B_NO_INIT,
|
|
B_BAD_VALUE) );
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
// bad args
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( dir.SetTo("/boot") == B_OK);
|
|
// R5: crashs, when passing a NULL path
|
|
#if !TEST_R5
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath(&dir, NULL) == B_BAD_VALUE );
|
|
#endif
|
|
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath((const BDirectory*)NULL, &path)
|
|
== B_BAD_VALUE );
|
|
// R5: crashs, when passing a NULL path
|
|
#if !TEST_R5
|
|
CPPUNIT_ASSERT( link.MakeLinkedPath((const BDirectory*)NULL, NULL)
|
|
== B_BAD_VALUE );
|
|
#endif
|
|
link.Unset();
|
|
path.Unset();
|
|
dir.Unset();
|
|
}
|
|
|
|
// IsAbsoluteTest
|
|
void
|
|
SymLinkTest::IsAbsoluteTest()
|
|
{
|
|
const char *dirLink = dirLinkname;
|
|
const char *relFileLink = relFileLinkname;
|
|
const char *existingDir = existingDirname;
|
|
const char *existingFile = existingFilename;
|
|
const char *nonExisting = nonExistingDirname;
|
|
BSymLink link;
|
|
// uninitialized
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NO_INIT );
|
|
CPPUNIT_ASSERT( link.IsAbsolute() == false );
|
|
link.Unset();
|
|
// existing absolute dir link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(dirLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.IsAbsolute() == true );
|
|
link.Unset();
|
|
// existing relative file link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(relFileLink) == B_OK );
|
|
CPPUNIT_ASSERT( link.IsAbsolute() == false );
|
|
link.Unset();
|
|
// non-existing link
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(nonExisting) == B_ENTRY_NOT_FOUND );
|
|
CPPUNIT_ASSERT( link.IsAbsolute() == false );
|
|
link.Unset();
|
|
// dir
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(existingDir) == B_OK );
|
|
CPPUNIT_ASSERT( link.IsAbsolute() == false );
|
|
link.Unset();
|
|
// file
|
|
NextSubTest();
|
|
CPPUNIT_ASSERT( link.SetTo(existingFile) == B_OK );
|
|
CPPUNIT_ASSERT( link.IsAbsolute() == false );
|
|
link.Unset();
|
|
}
|
|
|
|
// AssignmentTest
|
|
void
|
|
SymLinkTest::AssignmentTest()
|
|
{
|
|
const char *dirLink = dirLinkname;
|
|
const char *fileLink = fileLinkname;
|
|
// 1. copy constructor
|
|
// uninitialized
|
|
NextSubTest();
|
|
{
|
|
BSymLink link;
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_NO_INIT );
|
|
BSymLink link2(link);
|
|
// R5 returns B_BAD_VALUE instead of B_NO_INIT
|
|
CPPUNIT_ASSERT( equals(link2.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
|
|
}
|
|
// existing dir link
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(dirLink);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
BSymLink link2(link);
|
|
CPPUNIT_ASSERT( link2.InitCheck() == B_OK );
|
|
}
|
|
// existing file link
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(fileLink);
|
|
CPPUNIT_ASSERT( link.InitCheck() == B_OK );
|
|
BSymLink link2(link);
|
|
CPPUNIT_ASSERT( link2.InitCheck() == B_OK );
|
|
}
|
|
|
|
// 2. assignment operator
|
|
// uninitialized
|
|
NextSubTest();
|
|
{
|
|
BSymLink link;
|
|
BSymLink link2;
|
|
link2 = link;
|
|
// R5 returns B_BAD_VALUE instead of B_NO_INIT
|
|
CPPUNIT_ASSERT( equals(link2.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
|
|
}
|
|
NextSubTest();
|
|
{
|
|
BSymLink link;
|
|
BSymLink link2(dirLink);
|
|
link2 = link;
|
|
// R5 returns B_BAD_VALUE instead of B_NO_INIT
|
|
CPPUNIT_ASSERT( equals(link2.InitCheck(), B_BAD_VALUE, B_NO_INIT) );
|
|
}
|
|
// existing dir link
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(dirLink);
|
|
BSymLink link2;
|
|
link2 = link;
|
|
CPPUNIT_ASSERT( link2.InitCheck() == B_OK );
|
|
}
|
|
// existing file link
|
|
NextSubTest();
|
|
{
|
|
BSymLink link(fileLink);
|
|
BSymLink link2;
|
|
link2 = link;
|
|
CPPUNIT_ASSERT( link2.InitCheck() == B_OK );
|
|
}
|
|
}
|
|
|