pjs/xpcom/tests/FilesTest.cpp

1069 строки
32 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsFileSpec.h"
#include "nsFileStream.h"
#include "nsSpecialSystemDirectory.h"
//#include "string.h"
//void* operator new(size_t n) { return malloc(n); }
struct FilesTest
{
FilesTest() : mConsole() {}
int RunAllTests();
void WriteStuff(nsOutputStream& s);
int InputStream(const char* relativePath);
int FileSizeAndDate(const char* relativePath);
int OutputStream(const char* relativePath);
int IOStream(const char* relativePath);
int StringStream();
int Parent(const char* relativePath, nsFileSpec& outParent);
int Delete(nsFileSpec& victim);
int CreateDirectory(nsFileSpec& victim);
int CreateDirectoryRecursive(const char* aPath);
int IterateDirectoryChildren(nsFileSpec& startChild);
int CanonicalPath(const char* relativePath);
int Persistence(const char* relativePath);
int FileSpecEquality(const char *aFile, const char *bFile);
int FileSpecAppend(nsFileSpec& parent, const char* relativePath);
int Copy(const char* sourceFile, const char* targDir);
int Move(const char* sourceFile, const char* targDir);
int Rename(const char* sourceFile, const char* newName);
int Execute(const char* appName, const char* args);
int SpecialSystemDirectories();
int NSPRCompatibility(const char* sourceFile);
void Banner(const char* bannerString);
int Passed();
int Failed(const char* explanation = nsnull);
int Inspect();
nsOutputConsoleStream mConsole;
};
//----------------------------------------------------------------------------------------
void FilesTest::Banner(const char* bannerString)
//----------------------------------------------------------------------------------------
{
mConsole
<< nsEndl
<< "---------------------------" << nsEndl
<< bannerString << " Test" << nsEndl
<< "---------------------------" << nsEndl;
}
//----------------------------------------------------------------------------------------
int FilesTest::Passed()
//----------------------------------------------------------------------------------------
{
((nsOutputStream&)mConsole) << "Test passed.";
mConsole << nsEndl;
return 0; // for convenience
}
//----------------------------------------------------------------------------------------
int FilesTest::Failed(const char* explanation)
//----------------------------------------------------------------------------------------
{
mConsole << "ERROR : Test failed." << nsEndl;
if (explanation)
mConsole << "REASON: " << explanation << nsEndl;
return -1; // for convenience
}
//----------------------------------------------------------------------------------------
int FilesTest::Inspect()
//----------------------------------------------------------------------------------------
{
mConsole << nsEndl << "^^^^^^^^^^ PLEASE INSPECT OUTPUT FOR ERRORS" << nsEndl;
return 0; // for convenience
}
//----------------------------------------------------------------------------------------
void FilesTest::WriteStuff(nsOutputStream& s)
//----------------------------------------------------------------------------------------
{
// Initialize a URL from a string without suffix. Change the path to suit your machine.
nsFileURL fileURL("file:///Development/MPW/MPW%20Shell", PR_FALSE);
s << "File URL initialized to: \"" << fileURL << "\""<< nsEndl;
// Initialize a Unix path from a URL
nsFilePath filePath(fileURL);
s << "As a unix path: \"" << (const char*)filePath << "\""<< nsEndl;
// Initialize a native file spec from a URL
nsFileSpec fileSpec(fileURL);
s << "As a file spec: " << fileSpec.GetNativePathCString() << nsEndl;
// Make the spec unique (this one has no suffix).
fileSpec.MakeUnique();
s << "Unique file spec: " << fileSpec.GetNativePathCString() << nsEndl;
// Assign the spec to a URL
fileURL = fileSpec;
s << "File URL assigned from spec: \"" << fileURL.GetURLString() << "\""<< nsEndl;
// Assign a unix path using a string with a suffix.
filePath = "/Development/MPW/SysErrs.err";
s << "File path reassigned to: \"" << (const char*)filePath << "\""<< nsEndl;
// Assign to a file spec using a unix path.
fileSpec = filePath;
s << "File spec reassigned to: " << fileSpec.GetNativePathCString() << nsEndl;
// Make this unique (this one has a suffix).
fileSpec.MakeUnique();
s << "File spec made unique: " << fileSpec.GetNativePathCString() << nsEndl;
} // WriteStuff
//----------------------------------------------------------------------------------------
int FilesTest::OutputStream(const char* relativeUnixPath)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativeUnixPath, PR_TRUE); // convert to full path.
nsFileSpec mySpec(myTextFilePath);
const char* pathAsString = (const char*)mySpec;
{
mConsole << "WRITING IDENTICAL OUTPUT TO " << pathAsString << nsEndl << nsEndl;
nsOutputFileStream testStream(mySpec);
if (!testStream.is_open())
{
mConsole
<< "ERROR: File "
<< pathAsString
<< " could not be opened for output"
<< nsEndl;
return -1;
}
FilesTest::WriteStuff(testStream);
} // <-- Scope closes the stream (and the file).
if (!mySpec.Exists() || mySpec.IsDirectory() || !mySpec.IsFile())
{
mConsole
<< "ERROR: File "
<< pathAsString
<< " is not a file (cela n'est pas un pipe)"
<< nsEndl;
return -1;
}
FileSizeAndDate(relativeUnixPath);
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::StringStream()
//----------------------------------------------------------------------------------------
{
char* string1 = nsnull, *string2 = nsnull;
{
mConsole << "WRITING USUAL STUFF TO string1" << nsEndl << nsEndl;
nsOutputStringStream streamout(string1);
FilesTest::WriteStuff(streamout);
}
{
nsInputStringStream streamin(string1);
nsOutputStringStream streamout2(string2);
mConsole << "READING LINES FROM string1, writing to string2"
<< nsEndl << nsEndl;
while (!streamin.eof())
{
char line[5000]; // Use a buffer longer than the file!
streamin.readline(line, sizeof(line));
streamout2 << line << nsEndl;
}
if (strcmp(string1, string2) != 0)
{
mConsole << "Results disagree!" << nsEndl;
mConsole << "First string is:" << nsEndl;
mConsole << string1 << nsEndl << nsEndl;
mConsole << "Second string is:" << nsEndl;
mConsole << string2 << nsEndl << nsEndl;
return Failed();
}
}
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::IOStream(const char* relativePath)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativePath, PR_TRUE); // relative path.
const char* pathAsString = (const char*)myTextFilePath;
nsFileSpec mySpec(myTextFilePath);
mConsole
<< "Replacing \"path\" by \"ZUUL\" in " << pathAsString << nsEndl << nsEndl;
nsIOFileStream testStream(mySpec);
if (!testStream.is_open())
{
mConsole
<< "ERROR: File "
<< pathAsString
<< " could not be opened for input+output"
<< nsEndl;
return -1;
}
char line[5000]; // Use a buffer longer than the file!
testStream.seek(0); // check that the seek compiles
while (!testStream.eof())
{
PRInt32 pos = testStream.tell();
testStream.readline(line, sizeof(line));
char* replacementSubstring = strstr(line, "path");
if (replacementSubstring)
{
testStream.seek(pos + (replacementSubstring - line));
testStream << "ZUUL";
testStream.seek(pos); // back to the start of the line
}
}
return 0;
}
//----------------------------------------------------------------------------------------
int FilesTest::Persistence(
const char* relativePathToWrite)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativePathToWrite, PR_TRUE);
const char* pathAsString = (const char*)myTextFilePath;
nsFileSpec mySpec(myTextFilePath);
nsIOFileStream testStream(mySpec, (PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE));
if (!testStream.is_open())
{
mConsole
<< "ERROR: File "
<< pathAsString
<< " could not be opened for input+output"
<< nsEndl;
return -1;
}
nsPersistentFileDescriptor myPersistent(mySpec);
mConsole
<< "Writing persistent file data " << pathAsString << nsEndl << nsEndl;
testStream.seek(0); // check that the seek compiles
testStream << myPersistent;
testStream.seek(0);
nsPersistentFileDescriptor mySecondPersistent;
testStream >> mySecondPersistent;
mySpec = mySecondPersistent;
#ifdef XP_MAC
if (mySpec.Error())
return Failed();
#endif
if (!mySpec.Exists())
return Failed();
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::InputStream(const char* relativePath)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativePath, PR_TRUE);
const char* pathAsString = (const char*)myTextFilePath;
mConsole << "READING BACK DATA FROM " << pathAsString << nsEndl << nsEndl;
nsFileSpec mySpec(myTextFilePath);
nsInputFileStream testStream2(mySpec);
if (!testStream2.is_open())
{
mConsole
<< "ERROR: File "
<< pathAsString
<< " could not be opened for input"
<< nsEndl;
return -1;
}
char line[1000];
testStream2.seek(0); // check that the seek compiles
while (!testStream2.eof())
{
testStream2.readline(line, sizeof(line));
mConsole << line << nsEndl;
}
return Inspect();
}
//----------------------------------------------------------------------------------------
int FilesTest::FileSizeAndDate(const char* relativePath)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativePath, PR_TRUE);
const char* pathAsString = (const char*)myTextFilePath;
mConsole << "Info for " << pathAsString << nsEndl;
nsFileSpec mySpec(myTextFilePath);
mConsole << "Size " << mySpec.GetFileSize() << nsEndl;
static nsFileSpec::TimeStamp oldStamp = 0;
nsFileSpec::TimeStamp newStamp = 0;
mySpec.GetModDate(newStamp);
mConsole << "Date " << newStamp << nsEndl;
if (oldStamp != newStamp && oldStamp != 0)
mConsole << "Date has changed by " << (newStamp - oldStamp) << " seconds" << nsEndl << nsEndl;
oldStamp = newStamp;
return 0;
}
//----------------------------------------------------------------------------------------
int FilesTest::Parent(
const char* relativePath,
nsFileSpec& outParent)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativePath, PR_TRUE);
const char* pathAsString = (const char*)myTextFilePath;
nsFileSpec mySpec(myTextFilePath);
mySpec.GetParent(outParent);
nsFilePath parentPath(outParent);
nsFileURL url(parentPath);
mConsole
<< "GetParent() on "
<< "\n\t" << pathAsString
<< "\n yields "
<< "\n\t" << (const char*)parentPath
<< "\n or as a URL"
<< "\n\t" << (const char*)url
<< nsEndl;
return Inspect();
}
//----------------------------------------------------------------------------------------
int FilesTest::Delete(nsFileSpec& victim)
//----------------------------------------------------------------------------------------
{
// - Test of non-recursive delete
nsFilePath victimPath(victim);
mConsole
<< "Attempting to delete "
<< "\n\t" << (const char*)victimPath
<< "\n without recursive option (should fail)"
<< nsEndl;
victim.Delete(PR_FALSE);
if (victim.Exists())
Passed();
else
{
mConsole
<< "ERROR: File "
<< "\n\t" << (const char*)victimPath
<< "\n has been deleted without the recursion option,"
<< "\n and is a nonempty directory!"
<< nsEndl;
return -1;
}
// - Test of recursive delete
mConsole
<< nsEndl
<< "Deleting "
<< "\n\t" << (const char*)victimPath
<< "\n with recursive option"
<< nsEndl;
victim.Delete(PR_TRUE);
if (victim.Exists())
{
mConsole
<< "ERROR: Directory "
<< "\n\t" << (const char*)victimPath
<< "\n has NOT been deleted despite the recursion option!"
<< nsEndl;
return -1;
}
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::CreateDirectory(nsFileSpec& dirSpec)
//----------------------------------------------------------------------------------------
{
nsFilePath dirPath(dirSpec);
mConsole
<< "Testing CreateDirectory() using"
<< "\n\t" << (const char*)dirPath
<< nsEndl;
dirSpec.CreateDirectory();
if (!dirSpec.Exists())
return Failed();
dirSpec.Delete(PR_TRUE);
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::CreateDirectoryRecursive(const char* aPath)
//----------------------------------------------------------------------------------------
{
nsFilePath dirPath(aPath, PR_TRUE);
mConsole
<< "Testing nsFilePath(X, PR_TRUE) using"
<< "\n\t" << (const char*)aPath
<< nsEndl;
nsFileSpec spec(dirPath);
if (spec.Valid())
return Passed();
return Failed();
}
//----------------------------------------------------------------------------------------
int FilesTest::IterateDirectoryChildren(nsFileSpec& startChild)
//----------------------------------------------------------------------------------------
{
// - Test of directory iterator
nsFileSpec grandparent;
startChild.GetParent(grandparent); // should be the original default directory.
nsFilePath grandparentPath(grandparent);
mConsole << "Forwards listing of " << (const char*)grandparentPath << ":" << nsEndl;
for (nsDirectoryIterator i(grandparent, +1); i.Exists(); i++)
{
char* itemName = ((nsFileSpec&)i).GetLeafName();
mConsole << '\t' << itemName << nsEndl;
nsCRT::free(itemName);
}
mConsole << "Backwards listing of " << (const char*)grandparentPath << ":" << nsEndl;
for (nsDirectoryIterator j(grandparent, -1); j.Exists(); j--)
{
char* itemName = ((nsFileSpec&)j).GetLeafName();
mConsole << '\t' << itemName << nsEndl;
nsCRT::free(itemName);
}
return Inspect();
}
//----------------------------------------------------------------------------------------
int FilesTest::CanonicalPath(
const char* relativePath)
//----------------------------------------------------------------------------------------
{
nsFilePath myTextFilePath(relativePath, PR_TRUE);
const char* pathAsString = (const char*)myTextFilePath;
if (*pathAsString != '/')
{
#ifndef XP_PC
mConsole
<< "ERROR: after initializing the path object with a relative path,"
<< "\n the path consisted of the string "
<< "\n\t" << pathAsString
<< "\n which is not a canonical full path!"
<< nsEndl;
return -1;
#endif
}
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::FileSpecAppend(nsFileSpec& parent, const char* relativePath)
//----------------------------------------------------------------------------------------
{
nsFilePath initialPath(parent);
const char* initialPathString = (const char*)initialPath;
mConsole << "Initial nsFileSpec:\n\t\"" << initialPathString << "\"" << nsEndl;
nsFileSpec fileSpec(initialPath);
mConsole << "Appending:\t\"" << relativePath << "\"" << nsEndl;
fileSpec += relativePath;
nsFilePath resultPath(fileSpec);
const char* resultPathString = (const char*)resultPath;
mConsole << "Result:\n\t\"" << resultPathString << "\"" << nsEndl;
return Inspect();
} // FilesTest::FileSpecAppend
//----------------------------------------------------------------------------------------
int FilesTest::FileSpecEquality(const char *aFile, const char *bFile)
//----------------------------------------------------------------------------------------
{
nsFilePath aFilePath(aFile, PR_TRUE);
nsFilePath bFilePath(bFile, PR_TRUE);
nsFileSpec aFileSpec(aFilePath);
nsFileSpec bFileSpec(bFilePath);
nsFileSpec cFileSpec(bFilePath); // this should == bFile
if (aFileSpec != bFileSpec &&
bFileSpec == cFileSpec )
{
return Passed();
}
return Failed();
} // FilesTest::FileSpecEquality
//----------------------------------------------------------------------------------------
int FilesTest::Copy(const char* file, const char* dir)
//----------------------------------------------------------------------------------------
{
nsFileSpec dirPath(nsFilePath(dir, PR_TRUE));
dirPath.CreateDirectory();
if (! dirPath.Exists())
return Failed();
nsFileSpec mySpec(nsFilePath(file, PR_TRUE)); // relative path.
{
nsIOFileStream testStream(mySpec); // creates the file
// Scope ends here, file gets closed
}
nsFileSpec filePath(nsFilePath(file, PR_TRUE));
if (! filePath.Exists())
return Failed();
nsresult error = filePath.Copy(dirPath);
char* leafName = filePath.GetLeafName();
dirPath += leafName;
nsCRT::free(leafName);
if (! dirPath.Exists() || ! filePath.Exists() || NS_FAILED(error))
return Failed();
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::Move(const char* file, const char* dir)
//----------------------------------------------------------------------------------------
{
nsFileSpec dirPath(nsFilePath(dir, PR_TRUE));
dirPath.CreateDirectory();
if (! dirPath.Exists())
return Failed();
nsFileSpec srcSpec(nsFilePath(file, PR_TRUE)); // relative path.
{
nsIOFileStream testStream(srcSpec); // creates the file
// file gets closed here because scope ends here.
};
if (! srcSpec.Exists())
return Failed();
nsresult error = srcSpec.Move(dirPath);
char* leafName = srcSpec.GetLeafName();
dirPath += leafName;
nsCRT::free(leafName);
if (! dirPath.Exists() || ! srcSpec.Exists() || NS_FAILED(error))
return Failed();
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::Execute(const char* appName, const char* args)
//----------------------------------------------------------------------------------------
{
mConsole << "Attempting to execute " << appName << nsEndl;
nsFileSpec appSpec(appName, PR_FALSE);
if (!appSpec.Exists())
return Failed();
nsresult error = appSpec.Execute(args);
if (NS_FAILED(error))
return Failed();
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::NSPRCompatibility(const char* relativeUnixFilePath)
//----------------------------------------------------------------------------------------
{
nsFilePath filePath(relativeUnixFilePath, PR_TRUE); // relative path
nsFileSpec createTheFileSpec(filePath);
{
nsIOFileStream testStream(createTheFileSpec); // creates the file
// file gets closed here because scope ends here.
};
PRFileDesc* fOut = NULL;
// From an nsFilePath
fOut = PR_Open( nsNSPRPath(filePath), PR_RDONLY, 0 );
if ( fOut == NULL )
{
return Failed();
}
else
{
PR_Close( fOut );
fOut = NULL;
}
// From an nsFileSpec
nsFileSpec fileSpec(filePath);
fOut = PR_Open( nsNSPRPath(fileSpec), PR_RDONLY, 0 );
if ( fOut == NULL )
{
return Failed();
}
else
{
PR_Close( fOut );
fOut = NULL;
}
// From an nsFileURL
nsFileURL fileURL(fileSpec);
fOut = PR_Open( nsNSPRPath(fileURL), PR_RDONLY, 0 );
if ( fOut == NULL )
{
return Failed();
}
else
{
PR_Close( fOut );
fOut = NULL;
}
return Passed();
}
//----------------------------------------------------------------------------------------
int FilesTest::SpecialSystemDirectories()
//----------------------------------------------------------------------------------------
{
mConsole << "Please verify that these are the paths to various system directories:" << nsEndl;
nsSpecialSystemDirectory systemDir(nsSpecialSystemDirectory::OS_DriveDirectory);
if (!systemDir.Valid())
return Failed();
mConsole << "OS_DriveDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::OS_TemporaryDirectory;
mConsole << "OS_TemporaryDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::OS_CurrentProcessDirectory;
mConsole << "OS_CurrentProcessDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
#ifdef XP_MAC
systemDir = nsSpecialSystemDirectory::Mac_SystemDirectory;
mConsole << "Mac_SystemDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_DesktopDirectory;
mConsole << "Mac_DesktopDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_TrashDirectory;
mConsole << "Mac_TrashDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_StartupDirectory;
mConsole << "Mac_StartupDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_ShutdownDirectory;
mConsole << "Mac_ShutdownDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_AppleMenuDirectory;
mConsole << "Mac_AppleMenuDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_ControlPanelDirectory;
mConsole << "Mac_ControlPanelDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_ExtensionDirectory;
mConsole << "Mac_ExtensionDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_FontsDirectory;
mConsole << "Mac_FontsDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_PreferencesDirectory;
mConsole << "Mac_PreferencesDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Mac_DocumentsDirectory;
mConsole << "Mac_DocumentsDirectory yields \t";
if (systemDir.Valid())
{
mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
#elif XP_PC
systemDir = nsSpecialSystemDirectory::Win_SystemDirectory;
mConsole << "Win_SystemDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Win_WindowsDirectory;
mConsole << "Win_WindowsDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
#else
systemDir = nsSpecialSystemDirectory::Unix_LocalDirectory;
mConsole << "Unix_LocalDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
systemDir = nsSpecialSystemDirectory::Unix_LibDirectory;
mConsole << "Unix_LibDirectory yields \t";
if (systemDir.Valid())
{
(nsOutputStream&)mConsole << systemDir.GetNativePathCString() << nsEndl;
}
else
{
mConsole << "nsnull" << nsEndl;
return Failed();
}
#endif
return Passed();
} // FilesTest::SpecialSystemDirectories
//----------------------------------------------------------------------------------------
int FilesTest::RunAllTests()
// For use with DEBUG defined.
//----------------------------------------------------------------------------------------
{
int rv = 0;
// Test of mConsole output
mConsole << "WRITING TEST OUTPUT TO CONSOLE" << nsEndl << nsEndl;
// Test of nsFileSpec
Banner("Interconversion");
WriteStuff(mConsole);
rv = Inspect();
if (rv)
return rv;
Banner("Canonical Path");
rv = CanonicalPath("mumble/iotest.txt");
if (rv)
return rv;
Banner("OutputStream");
rv = OutputStream("mumble/iotest.txt");
if (rv)
return rv;
Banner("InputStream");
rv = InputStream("mumble/iotest.txt");
if (rv)
return rv;
Banner("IOStream");
rv = IOStream("mumble/iotest.txt");
if (rv)
return rv;
FileSizeAndDate("mumble/iotest.txt");
rv = InputStream("mumble/iotest.txt");
if (rv)
return rv;
Banner("StringStream");
rv = StringStream();
if (rv)
return rv;
Banner("Parent");
nsFileSpec parent;
rv = Parent("mumble/iotest.txt", parent);
if (rv)
goto Clean;
Banner("FileSpec Append using Unix relative path");
rv = FileSpecAppend(parent, "nested/unix/file.txt");
if (rv)
goto Clean;
Banner("FileSpec Append using Native relative path");
#ifdef XP_PC
rv = FileSpecAppend(parent, "nested\\windows\\file.txt");
#elif defined(XP_MAC)
rv = FileSpecAppend(parent, ":nested:mac:file.txt");
#else
rv = Passed();
#endif // XP_MAC
if (rv)
goto Clean;
Banner("Delete");
rv = Delete(parent);
if (rv)
goto Clean;
Banner("CreateDirectory");
rv = CreateDirectory(parent);
if (rv)
goto Clean;
Banner("CreateDirectoryRecursive Relative (using nsFileSpec)");
rv = CreateDirectoryRecursive("mumble/dir1/dir2/dir3/");
if (rv)
goto Clean;
#ifdef XP_PC
Banner("CreateDirectoryRecursive Absolute (using nsFileSpec)");
rv = CreateDirectoryRecursive("c:\\temp\\dir1\\dir2\\dir3\\");
if (rv)
goto Clean;
#endif
Banner("IterateDirectoryChildren");
rv = IterateDirectoryChildren(parent);
if (rv)
goto Clean;
Banner("nsFileSpec equality");
rv = FileSpecEquality("mumble/a", "mumble/b");
if (rv)
goto Clean;
Banner("Copy");
rv = Copy("mumble/copyfile.txt", "mumble/copy");
if (rv)
goto Clean;
Banner("Move");
rv = Move("mumble/moveFile.txt", "mumble/move");
if (rv)
goto Clean;
Banner("Execute");
#ifdef XP_MAC
// This path is hard-coded to test on jrm's machine. Finding an app
// on an arbitrary Macintosh would cost more trouble than it's worth.
// Change path to suit. This is currently a native path, as you can see.
if NS_FAILED(Execute("Projects:Nav45_BRANCH:ns:cmd:macfe:"\
"projects:client45:Client45PPC", ""))
#elif XP_PC
if NS_FAILED(Execute("c:\\windows\\notepad.exe", ""))
#else
if NS_FAILED(Execute("/bin/ls", "/"))
#endif
return -1;
Banner("NSPR Compatibility");
rv = NSPRCompatibility("mumble/aFile.txt");
if (rv)
goto Clean;
Banner("Special System Directories");
rv = SpecialSystemDirectories();
if (rv)
goto Clean;
Banner("Persistence");
rv = Persistence("mumble/filedesc.dat");
if (rv)
goto Clean;
Clean:
Banner("Delete again (to clean up our mess)");
Delete(parent);
return rv;
} // FilesTest::RunAllTests
//----------------------------------------------------------------------------------------
int main()
// For use with DEBUG defined.
//----------------------------------------------------------------------------------------
{
FilesTest tester;
return tester.RunAllTests();
} // main