--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/symport/symfile/test.cpp Thu Jun 25 15:59:54 2009 +0100
@@ -0,0 +1,2676 @@
+// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Symbian Foundation License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#ifdef __TOOLS2__
+#include <sys/stat.h>
+#include <stdlib.h>
+#ifdef linux
+#include <string.h>
+#endif
+#endif
+
+#include <e32test.h>
+#include <f32file.h>
+
+RTest test(_L("SymFile RFs Tests"));
+
+void testAtt()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestDir1, "c:\\symport_test_rfs1\\");
+ _LIT(KTestFile, "c:\\symport_test_rfs1\\test.txt");
+
+ // Test with root
+ TUint att;
+ test(fs.Att(_L("C:\\"), att) == KErrBadName);
+ test(fs.Att(_L("\\"), att) == KErrBadName);
+
+ // Make sure the directory doesn't exist
+ TInt err = fs.Delete(KTestFile);
+ test(err == KErrNone || err == KErrNotFound || err == KErrPathNotFound);
+ err = fs.RmDir(KTestDir1);
+ test(err == KErrNone || err == KErrNotFound);
+
+ // Check it fails
+ test(fs.Att(KTestDir1, att) == KErrNotFound);
+
+ // See if it works for directories
+ test(fs.MkDir(KTestDir1) == KErrNone);
+ test(fs.Att(KTestDir1, att) == KErrNone && att&KEntryAttDir);
+
+ // See if it works for normal files
+ test(fs.Att(KTestFile, att) == KErrNotFound);
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+ test(fs.Att(KTestFile, att) == KErrNone);
+ test(!(att&KEntryAttDir));
+
+ // Check readonly flag
+ test(!(att&KEntryAttReadOnly));
+ test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly);
+
+ // Clear the flag
+ test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNone);
+ test(!(att&KEntryAttReadOnly));
+
+ // Delete the file and make sure it goes away
+ test(fs.RmDir(KTestDir1) == KErrInUse);
+ test(fs.Delete(KTestFile) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNotFound);
+
+ // Delete directory and make sure it really went away
+ test(fs.RmDir(KTestDir1) == KErrNone);
+ test(fs.Att(KTestDir1, att) == KErrNotFound);
+
+ fs.Close();
+ }
+
+void testSetAtt()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Make sure the file doesn't exist
+ _LIT(KTestFile, "c:\\symport_test_rfs2_test.txt");
+ fs.SetAtt(KTestFile, 0, KEntryAttReadOnly);
+ fs.Delete(KTestFile);
+
+ // File doesn't exist
+ test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNotFound);
+
+ // Create a file
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Set readonly flag
+ TUint att;
+ test(fs.Att(KTestFile, att) == KErrNone);
+ test(!(att&KEntryAttReadOnly));
+ test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly);
+
+ // Clear readonly flag
+ test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNone);
+ test(!(att&KEntryAttReadOnly));
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testModified()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Make sure the file doesn't exist
+ _LIT(KTestFile, "c:\\symport_test_rfs2a_test.txt");
+ fs.Delete(KTestFile);
+
+ // Get time now
+ TTime start;
+ start.UniversalTime();
+
+ // File doesn't exist
+ TTime time1;
+ test(fs.Modified(KTestFile, time1) == KErrNotFound);
+ User::After(1000000);
+
+ // Create a file
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Get modified time
+ test(fs.Modified(KTestFile, time1) == KErrNone && time1 > start);
+ User::After(1000000);
+
+ // Edit the file
+ test(file.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Get modified time
+ TTime time2;
+ test(fs.Modified(KTestFile, time2) == KErrNone && time2 > time1);
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testMkDirAll()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child");
+ fs.Delete(KTestFile);
+
+ // Make sure the directories don't exist already
+ _LIT(KTestDirParent1, "c:\\symport_test_rfs3_parent\\");
+ _LIT(KTestDir1, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child\\");
+ fs.RmDir(KTestDir1);
+ fs.RmDir(KTestDirParent1);
+
+ // Check it can handle drive letter
+ test(fs.MkDirAll(KTestDir1) == KErrNone);
+ test(fs.MkDirAll(KTestDir1) == KErrAlreadyExists);
+ TUint att;
+ test(fs.Att(KTestDir1, att) == KErrNone && att&KEntryAttDir);
+
+ // Delete the folder for the next test
+ test(fs.RmDir(KTestDir1) == KErrNone && fs.RmDir(KTestDirParent1) == KErrNone);
+ TInt err = fs.Att(KTestDir1, att);
+ test(err == KErrNotFound || err == KErrPathNotFound);
+
+ // Check it fails if file is encountered
+ test(fs.MkDir(KTestDirParent1) == KErrNone);
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+ test(fs.MkDirAll(KTestDir1) == KErrAccessDenied);
+
+ // Check for failure on itermediate file
+ _LIT(KTestDir3, "c:\\symport_test_rfs3_parent\\symport_test_rfs3_child\\wibble\\");
+ test(fs.MkDirAll(KTestDir3) == KErrAccessDenied);
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ test(fs.RmDir(KTestDirParent1) == KErrNone);
+
+ fs.Close();
+ }
+
+void testMkDir()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestDir1, "c:\\symport_test_rfs5\\");
+ _LIT(KTestFile, "c:\\symport_test_rfs5");
+ _LIT(KTestDir1Sub, "c:\\symport_test_rfs5\\sub\\");
+
+ // Make sure the test stuff doesn't exist already
+ fs.RmDir(KTestDir1Sub);
+ fs.Delete(KTestFile);
+ fs.RmDir(KTestDir1);
+
+ // Check the directory can be created
+ TUint att;
+ test(fs.MkDir(KTestDir1) == KErrNone);
+ test(fs.MkDir(KTestDir1) == KErrAlreadyExists);
+ test(fs.Att(KTestDir1, att) == KErrNone);
+ test(fs.MkDir(KTestDir1Sub) == KErrNone);
+ test(fs.MkDir(KTestDir1Sub) == KErrAlreadyExists);
+ test(fs.RmDir(KTestDir1Sub) == KErrNone);
+ test(fs.RmDir(KTestDir1) == KErrNone);
+ test(fs.Att(KTestDir1, att) == KErrNotFound);
+
+ // Check file error
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ test(fs.MkDir(KTestDir1) == KErrAccessDenied);
+ test(fs.Delete(KTestFile) == KErrNone);
+
+ fs.Close();
+ }
+
+void testRmDir()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Make sure the test stuff isn't there
+ _LIT(KTestDir1, "c:\\symport_test_rfs6\\");
+ _LIT(KTestFile, "c:\\symport_test_rfs6\\testfile");
+ _LIT(KTestDir3, "c:\\symport_test_rfs6\\testfile\\");
+ fs.Delete(KTestFile);
+ fs.RmDir(KTestDir1);
+
+ // Create the directory and make sure you can delete it
+ TUint att;
+ test(fs.MkDir(KTestDir1) == KErrNone);
+ test(fs.Att(KTestDir1, att) == KErrNone && att|KEntryAttDir);
+ test(fs.RmDir(KTestDir1) == KErrNone);
+ test(fs.RmDir(KTestDir1) == KErrNotFound);
+ test(fs.Att(KTestDir1, att) == KErrNotFound);
+
+ test(fs.MkDir(KTestDir1) == KErrNone);
+ test(fs.Att(KTestDir1, att) == KErrNone && att|KEntryAttDir);
+
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Check you can't delete a file or a none empty directory
+ TInt err = fs.RmDir(KTestDir3);
+ test(err == KErrNotFound || err == KErrPathNotFound);
+ test(fs.RmDir(KTestDir1) == KErrInUse);
+ test(fs.Delete(KTestFile) == KErrNone);
+ test(fs.RmDir(KTestDir1) == KErrNone);
+
+ // KErrInUse when removing a root directory
+ test(fs.RmDir(_L("c:\\")) == KErrInUse);
+
+ fs.Close();
+ }
+
+void testParse()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile, "c:\\symport_test_rfs7.txt");
+ fs.Delete(KTestFile);
+
+ // Parse file spec
+ TParse parse;
+ test(fs.Parse(KTestFile, parse) == KErrNone);
+
+ // See if we can create the file
+ RFile file;
+ test(file.Create(fs, parse.FullName(), EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+ test(fs.Delete(parse.FullName()) == KErrNone);
+
+ fs.Close();
+ }
+
+void testSessionPath()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Check we get a session path
+ TFileName name;
+ test(fs.SessionPath(name) == KErrNone);
+ test(name.Length() > 0);
+
+ // Check there's a backslash on the end and no forward slashes
+ test(name[name.Length() - 1] == TChar('\\'));
+ test(name.Locate(TChar('/')) == KErrNotFound);
+
+ fs.Close();
+ }
+
+void testSetSessionPath()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestDir1, "c:\\symport_test_rfs8\\");
+ _LIT(KTestFile1, "c:\\symport_test_rfs8\\test");
+ _LIT(KTestFilename1, "test");
+ fs.Delete(KTestFile1);
+ fs.RmDir(KTestDir1);
+
+ // Check we get a session path
+ TFileName name;
+ test(fs.SessionPath(name) == KErrNone);
+ test(name.Length() > 0);
+
+ // Check we can set it
+ fs.SetSessionPath(KTestDir1);
+ test(fs.MkDir(KTestDir1) == KErrNone);
+ test(fs.SetSessionPath(KTestDir1) == KErrNone);
+
+ // See if we can create a file in the session path
+ RFile file;
+ test(file.Create(fs, KTestFilename1, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Check the file is there
+ TUint att;
+ test(fs.Att(KTestFile1, att) == KErrNone);
+ test(fs.Delete(KTestFilename1) == KErrNone);
+
+ // Reset session path!
+ test(fs.SetSessionPath(name) == KErrNone);
+ test(fs.RmDir(KTestDir1) == KErrNone);
+
+ fs.Close();
+ }
+
+void testDelete()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestDir, "c:\\symport_test_rfs9\\");
+ _LIT(KTestFile, "c:\\symport_test_rfs9");
+ fs.Delete(KTestFile);
+ fs.RmDir(KTestDir);
+
+ // Error if the file doesn't exist
+ test(fs.Delete(KTestFile) == KErrNotFound);
+
+ // Create the file
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+
+
+
+// On Linux it seems it's perfectly correct to "delete" an open file
+
+// Removing an open file is sometimes recommended to hide the names of temporary files that may be prone to attack!
+
+ TInt err = 0;
+#ifndef linux
+
+ // Should be locked
+
+ err = fs.Delete(KTestFile);
+ test(err == KErrInUse || err == KErrAccessDenied);
+#endif
+
+ file.Close();
+
+ // Check success
+ test(fs.Delete(KTestFile) == KErrNone);
+ test(fs.Delete(KTestFile) == KErrNotFound);
+
+ // Check you can't delete a directory
+ test(fs.MkDir(KTestDir) == KErrNone);
+ test(fs.Delete(KTestFile) == KErrAccessDenied);
+
+ err = fs.Delete(KTestDir);
+ test(err == KErrBadName || err == KErrAccessDenied);
+ test(fs.RmDir(KTestDir) == KErrNone);
+
+ fs.Close();
+ }
+
+// This is only valid for TOOLS2
+#ifdef __TOOLS2__
+extern TInt gBlockSize;
+extern TInt gClusterSize;
+void testVolumeIOParam()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // We rely on this error code being returned - preventing STORE cleverness?
+ TVolumeIOParamInfo param;
+ param.iBlockSize = 0;
+ param.iClusterSize = 0;
+ param.iRecReadBufSize = 0;
+ param.iRecWriteBufSize = 0;
+
+ test(fs.VolumeIOParam(EDriveC, param) == KErrNone);
+
+ test(param.iBlockSize == 4096);
+ test(param.iClusterSize == 4096);
+ test(param.iRecReadBufSize == 4096);
+ test(param.iRecWriteBufSize == 4096);
+
+ gBlockSize = 8096;
+ gClusterSize = 8096;
+
+ test(fs.VolumeIOParam(EDriveC, param) == KErrNone);
+
+ test(param.iBlockSize == 8096);
+ test(param.iClusterSize == 8096);
+ test(param.iRecReadBufSize == 4096);
+ test(param.iRecWriteBufSize == 4096);
+
+ fs.Close();
+ }
+#endif
+
+void testEntry()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile, "c:\\symport_test_rfs10");
+ _LIT(KTestDir, "c:\\symport_test_rfs10_dir\\");
+ fs.Delete(KTestFile);
+ fs.RmDir(KTestDir);
+
+ // Check error when file doesn't exist
+ TEntry entry;
+ test(fs.Entry(KTestFile, entry) == KErrNotFound);
+
+ // Create test data
+ TUidType testUid(TUid::Uid(0x1), TUid::Uid(0x2), TUid::Uid(0x3));
+ TCheckedUid checkedUid(testUid);
+ TPckg<TCheckedUid> checkedUidBuf(checkedUid);
+
+ // Create the file
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(checkedUidBuf) == KErrNone);
+ file.Close();
+
+ // Get file details
+ User::After(1000000);
+ test(fs.Entry(KTestFile, entry) == KErrNone);
+
+ // Check the data looks right
+ test(entry.iSize == checkedUidBuf.Length());
+ test(entry.iType == testUid);
+ test(entry.iName == KTestFile().Mid(3)); // No path
+ test(!(entry.iAtt&KEntryAttDir));
+
+ TTimeIntervalSeconds sec;
+ TTime now; now.UniversalTime();
+ test(now.SecondsFrom(entry.iModified, sec) == KErrNone);
+ test(sec.Int() >= 1);
+
+ _LIT8(KTestText, "Some junk that is not a uid");
+ User::After(2000000);
+
+ test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ file.Close();
+
+ // Get file details
+ test(fs.Entry(KTestFile, entry) == KErrNone);
+
+ // Check the data looks right
+ test(entry.iSize == KTestText().Length());
+ test(entry.iType == TUidType(TUid::Uid(0), TUid::Uid(0), TUid::Uid(0)));
+ test(entry.iName == KTestFile().Mid(3)); // No path
+
+ test(now.SecondsFrom(entry.iModified, sec) == KErrNone);
+ test(sec.Int() <= -1);
+
+ // Test it works for directories
+ test(fs.Entry(KTestDir, entry) == KErrNotFound);
+ test(fs.MkDir(KTestDir) == KErrNone);
+ test(fs.Entry(KTestDir, entry) == KErrNone);
+ test(entry.iSize == 0);
+ test(entry.iType == TUidType(TUid::Null(), TUid::Null(), TUid::Null()));
+ test(entry.iName == KTestDir().Mid(3, KTestDir().Length() - 4)); // Lose path and end slash
+ test(entry.iAtt&KEntryAttDir);
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ test(fs.RmDir(KTestDir) == KErrNone);
+ fs.Close();
+ }
+
+void testSetEntry()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ TTime start;
+ start.UniversalTime();
+
+ // Make sure the file doesn't exist
+ _LIT(KTestFile, "c:\\symport_test_rfs2b_test.txt");
+ fs.SetEntry(KTestFile, start, 0, KEntryAttReadOnly);
+ fs.Delete(KTestFile);
+
+ // File doesn't exist
+ test(fs.SetEntry(KTestFile, start, KEntryAttReadOnly, 0) == KErrNotFound);
+
+ // Create a file
+ RFile file;
+ test(file.Create(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Set readonly flag
+ TUint att;
+ test(fs.Att(KTestFile, att) == KErrNone && !(att&KEntryAttReadOnly));
+ test(fs.SetEntry(KTestFile, start, KEntryAttReadOnly, 0) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNone && att&KEntryAttReadOnly);
+
+ // Clear readonly flag
+ test(fs.SetEntry(KTestFile, start, 0, KEntryAttReadOnly) == KErrNone);
+ test(fs.Att(KTestFile, att) == KErrNone && !(att&KEntryAttReadOnly));
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+// Only relevant to TOOLS2
+#ifdef __TOOLS2__
+void testSetErrorCondition()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ test(fs.SetErrorCondition(KErrGeneral, 1) == KErrNotSupported);
+ fs.Close();
+ }
+#endif
+
+void testCharToDrive()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ TInt drive;
+
+ // Test invalid
+ test(fs.CharToDrive(TChar('$'), drive) == KErrArgument);
+
+ // Test valid - upper and lower case
+ test(fs.CharToDrive(TChar('a'), drive) == KErrNone && drive == EDriveA);
+ test(fs.CharToDrive(TChar('A'), drive) == KErrNone && drive == EDriveA);
+ test(fs.CharToDrive(TChar('z'), drive) == KErrNone && drive == EDriveZ);
+ test(fs.CharToDrive(TChar('Z'), drive) == KErrNone && drive == EDriveZ);
+
+ fs.Close();
+ }
+
+void testDriveToChar()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ TChar dChar;
+
+ // Test invalid
+ test(fs.DriveToChar(99, dChar) == KErrArgument);
+
+ // Ask for default drive
+ test(fs.DriveToChar(KDefaultDrive, dChar) == KErrNone);
+
+ test(TUint(dChar) >= TUint(TChar('A')));
+
+ test(TUint(dChar) <= TUint(TChar('Z')));
+
+ // Check valid
+ test(fs.DriveToChar(EDriveA, dChar) == KErrNone && dChar == TChar('A'));
+ test(fs.DriveToChar(EDriveZ, dChar) == KErrNone && dChar == TChar('Z'));
+
+ fs.Close();
+ }
+
+void testIsValidDrive()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Invalid
+ test(!fs.IsValidDrive(99));
+ test(!fs.IsValidDrive(-99));
+
+ // Valid
+ test(fs.IsValidDrive(KDefaultDrive));
+ test(fs.IsValidDrive(EDriveA));
+ test(fs.IsValidDrive(EDriveZ));
+
+ fs.Close();
+ }
+
+void testDrive()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Test invalid drive
+ TDriveInfo drive;
+ test(fs.Drive(drive, 99) == KErrBadName);
+
+#ifdef __TOOLS2__
+ // Test valid drives
+ test(fs.Drive(drive, EDriveC) == KErrNone);
+ test(drive.iType == EMediaHardDisk && drive.iBattery == EBatNotSupported && drive.iDriveAtt&KDriveAttLocal|KDriveAttInternal && drive.iMediaAtt == 0);
+ test(fs.Drive(drive, KDefaultDrive) == KErrNone);
+ test(drive.iType == EMediaHardDisk && drive.iBattery == EBatNotSupported && drive.iDriveAtt&KDriveAttLocal|KDriveAttInternal && drive.iMediaAtt == 0);
+#endif
+
+ fs.Close();
+ }
+
+void testGetSystemDrive()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ test(fs.GetSystemDrive() == EDriveC);
+ test(fs.GetSystemDriveChar() == TChar('C'));
+ fs.Close();
+ }
+
+void testReplace()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile1, "c:\\symport_test_rfs11a");
+ _LIT(KTestFile2, "c:\\symport_test_rfs11b");
+
+ fs.Delete(KTestFile1);
+ fs.Delete(KTestFile2);
+
+ // Error when file doesn't exist
+ test(fs.Replace(KTestFile1, KTestFile2) == KErrNotFound);
+
+ RFile file;
+ test(file.Create(fs, KTestFile1, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ // Test success
+ test(fs.Replace(KTestFile1, KTestFile2) == KErrNone);
+
+ TUint att;
+ test(fs.Att(KTestFile1, att) == KErrNotFound);
+ test(fs.Att(KTestFile2, att) == KErrNone);
+ test(fs.Replace(KTestFile2, KTestFile1) == KErrNone);
+ test(fs.Att(KTestFile1, att) == KErrNone);
+ test(fs.Att(KTestFile2, att) == KErrNotFound);
+
+ // Test when both files exist
+ test(file.Create(fs, KTestFile2, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ test(fs.Att(KTestFile1, att) == KErrNone);
+ test(fs.Att(KTestFile2, att) == KErrNone);
+ test(fs.Replace(KTestFile1, KTestFile2) == KErrNone);
+ test(fs.Att(KTestFile1, att) == KErrNotFound);
+ test(fs.Att(KTestFile2, att) == KErrNone);
+
+ test(fs.Replace(KTestFile2, KTestFile1) == KErrNone);
+ test(fs.Att(KTestFile1, att) == KErrNone);
+ test(fs.Att(KTestFile2, att) == KErrNotFound);
+
+ test(fs.Delete(KTestFile1) == KErrNone);
+ fs.Close();
+ }
+
+void testRename()
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile1, "c:\\symport_test_rfs12a");
+ _LIT(KTestFile2, "c:\\symport_test_rfs12b");
+
+ _LIT(KTestDir1, "c:\\symport_test_rfs12a\\");
+ _LIT(KTestDir2, "c:\\symport_test_rfs12b\\");
+
+ fs.Delete(KTestFile1);
+ fs.Delete(KTestFile2);
+ fs.RmDir(KTestDir1);
+ fs.RmDir(KTestDir2);
+
+ // Error when source doesn't exist
+ test(fs.Rename(KTestFile1, KTestFile2) == KErrNotFound);
+
+ // Error when destination does exist
+ RFile file;
+ test(file.Create(fs, KTestFile1, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ test(file.Create(fs, KTestFile2, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ test(fs.Rename(KTestFile1, KTestFile2) == KErrAlreadyExists);
+ test(fs.Delete(KTestFile2) == KErrNone);
+
+ // Test Success
+ test(fs.SetAtt(KTestFile1, 0, KEntryAttReadOnly) == KErrNone);
+ test(fs.Rename(KTestFile1, KTestFile2) == KErrNone);
+
+ TUint att;
+ test(fs.Att(KTestFile1, att) == KErrNotFound);
+ test(fs.Att(KTestFile2, att) == KErrNone);
+ test(fs.Rename(KTestFile2, KTestFile1) == KErrNone);
+ test(fs.Att(KTestFile1, att) == KErrNone);
+ test(fs.Att(KTestFile2, att) == KErrNotFound);
+
+ test(fs.Delete(KTestFile1) == KErrNone);
+
+ fs.Close();
+ }
+
+TPtrC test_string=_L("Y:\\");
+LOCAL_C void TestTParse1()
+//
+// Test all TParse methods
+//
+ {
+ TBuf<16> relatedFiles(_L(".CCC"));
+ TBuf<16> defaultPath(_L("C:\\"));
+ TParse parser;
+ TInt r=parser.Set(_L("\\WWW\\XXX\\YYY\\ZZZ\\AAA"),&relatedFiles,&defaultPath);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"));
+ test(parser.Drive()==_L("C:"));
+ test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(parser.Name()==_L("AAA"));
+ test(parser.Ext()==_L(".CCC"));
+ test(parser.NameAndExt()==_L("AAA.CCC"));
+ test(parser.DrivePresent()==EFalse);
+ test(parser.PathPresent());
+ test(parser.NamePresent());
+ test(parser.ExtPresent()==EFalse);
+ test(parser.NameOrExtPresent());
+ test(parser.IsRoot()==EFalse);
+ test(parser.IsWild()==EFalse);
+ test(parser.IsNameWild()==EFalse);
+ test(parser.IsExtWild()==EFalse);
+ r=parser.SetNoWild(_L("\\WWW\\XXX\\YYY\\ZZZ\\AAA.EXT"),&relatedFiles,&defaultPath);
+ test(r==KErrNone);
+ test(parser.PopDir()==KErrNone);
+ test(parser.AddDir(_L("BBB"))==KErrNone);
+ }
+
+LOCAL_C void TestTParse2()
+//
+// Test multiple PopDirs
+//
+ {
+
+ TParse parser;
+ TInt r=parser.Set(_L("\\WWW\\XXX\\YYY\\ZZZ\\"),NULL,NULL);
+// TParsePtrC parser(_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(r==KErrNone);
+ r=parser.PopDir();
+ test(r==KErrNone);
+ test(parser.Path()==_L("\\WWW\\XXX\\YYY\\"));
+ r=parser.PopDir();
+ test(r==KErrNone);
+ test(parser.Path()==_L("\\WWW\\XXX\\"));
+ r=parser.PopDir();
+ test(r==KErrNone);
+ test(parser.Path()==_L("\\WWW\\"));
+ r=parser.PopDir();
+ test(r==KErrNone);
+ test(parser.Path()==_L("\\"));
+ r=parser.PopDir();
+ test(r==KErrGeneral);
+//
+ test(parser.Set(_L("C:\\Documents\\.TXT"),NULL,NULL)==KErrNone);
+ test(parser.PopDir()==KErrNone);
+ test(parser.FullName()==_L("C:\\.TXT"));
+ }
+
+LOCAL_C void TestTParse3()
+//
+// Test conflicting drive letters
+//
+ {
+
+ TParse parser;
+ TPtrC one=_L("\\ONE\\");
+ TPtrC null=_L("\\");
+ TPtrC x=_L("X:");
+ TPtrC x2=_L("X:\\");
+ TPtrC z=_L("Z:");
+ TInt r=parser.Set(_L("Z:\\Hello"),&one,&null);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Z:\\Hello"));
+ TPtrC sht=_L("*.SHT");
+ r=parser.Set(_L("Z:"),&sht,&x);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Z:*.SHT"));
+ r=parser.Set(_L("Hello"),&z,&x2);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Z:\\Hello"));
+ r=parser.Set(_L("W:\\Hello"),&z,&x2);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("W:\\Hello"));
+ TPtrC abcdefg=_L("abcdefg");
+ TPtrC onetwo=_L("X:\\ONE\\TWO\\.CCC");
+ r=parser.Set(_L("W:"),&abcdefg,&onetwo);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("W:\\ONE\\TWO\\abcdefg.CCC"));
+ TPtrC y=_L("Y:");
+ TPtrC xhello=_L("X:\\HELLO\\");
+ r=parser.Set(_L("World"),&y,&xhello);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Y:\\HELLO\\World"));
+ TPtrC xhelloext=_L("X:\\HELLO\\.EXT");
+ r=parser.Set(_L("World"),&y,&xhelloext);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Y:\\HELLO\\World.EXT"));
+ }
+
+LOCAL_C void TestTParse4()
+//
+// Conflicting relative path drives and names
+//
+ {
+
+ TParse parser;
+ TPtrC xone=_L("X:\\ONE\\");
+ TPtrC y=_L("Y:\\");
+ TInt r=parser.Set(_L("Z:\\Hello"),&xone,&y);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Z:\\Hello"));
+ TPtrC zone=_L("Z:\\ONE\\");
+ TPtrC xnew=_L("X:\\NEW\\");
+ r=parser.Set(_L("\\Hello"),&zone,&xnew);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("Z:\\Hello"));
+ TPtrC aone=_L("A:\\ONE\\");
+ TPtrC anew=_L("A:\\NEW\\");
+ r=parser.Set(_L("A:Hello"),&aone,&anew);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("A:\\ONE\\Hello"));
+ TPtrC a=_L("A:\\");
+ r=parser.Set(_L("Hello"),&a,&xnew);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("A:\\Hello"));
+ r=parser.Set(_L("Hello"),&aone,&xnew);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("A:\\ONE\\Hello"));
+ }
+
+
+LOCAL_C void TestTParse5()
+//
+// Test illegal paths
+//
+ {
+
+ TParse parser;
+ TInt r=parser.Set(_L("FOO\\"),NULL,NULL);
+ test(r==KErrBadName);
+ r=parser.Set(_L("C:\\FOO\\\\"),NULL,NULL);
+ test(r==KErrNone);
+ }
+
+LOCAL_C void TestTParse6()
+//
+// Test AddDir
+//
+ {
+
+ TParse parser;
+ test(parser.Set(_L("C:\\"),NULL,NULL)==KErrNone);
+ test(parser.IsRoot());
+ test(parser.FullName()==_L("C:\\"));
+ test(parser.AddDir(_L("HELLO"))==KErrNone);
+ test(parser.IsRoot()==EFalse);
+ test(parser.FullName()==_L("C:\\HELLO\\"));
+ test(parser.AddDir(_L("BYEBYE"))==KErrNone);
+ test(parser.IsRoot()==EFalse);
+ test(parser.FullName()==_L("C:\\HELLO\\BYEBYE\\"));
+ test(parser.PopDir()==KErrNone);
+ test(parser.IsRoot()==EFalse);
+ test(parser.FullName()==_L("C:\\HELLO\\"));
+ test(parser.PopDir()==KErrNone);
+ test(parser.IsRoot());
+ test(parser.FullName()==_L("C:\\"));
+//
+ test(parser.AddDir(_L(""))==KErrNone);
+ test(parser.IsRoot());
+ test(parser.FullName()==_L("C:\\"));
+ test(parser.AddDir(_L("HELLO"))==KErrNone);
+ test(parser.IsRoot()==EFalse);
+ test(parser.FullName()==_L("C:\\HELLO\\"));
+ test(parser.AddDir(_L(""))==KErrNone);
+ test(parser.IsRoot()==EFalse);
+ test(parser.FullName()==_L("C:\\HELLO\\"));
+//
+ test(parser.Set(_L("C:\\Documents\\.TXT"),NULL,NULL)==KErrNone);
+ test(parser.AddDir(_L("Documents"))==KErrNone);
+ test(parser.FullName()==_L("C:\\Documents\\Documents\\.TXT"));
+ }
+
+LOCAL_C void TestTParse7()
+//
+// Test TParsePtr
+//
+ {
+
+ TBuf<128> nameBuf=_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC");
+ TParsePtr parser(nameBuf);
+
+ test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"));
+ test(parser.Drive()==_L("C:"));
+ test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(parser.Name()==_L("AAA"));
+ test(parser.Ext()==_L(".CCC"));
+ test(parser.NameAndExt()==_L("AAA.CCC"));
+ test(parser.DrivePresent());
+ test(parser.PathPresent());
+ test(parser.NamePresent());
+ test(parser.ExtPresent());
+ test(parser.NameOrExtPresent());
+ test(parser.IsRoot()==EFalse);
+ test(parser.IsWild()==EFalse);
+ test(parser.IsNameWild()==EFalse);
+ test(parser.IsExtWild()==EFalse);
+
+ test(parser.AddDir(_L("HELLO"))==KErrNone);
+ test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\HELLO\\"));
+
+ TBuf<16> shortName=_L("1234567812345678");
+ TParsePtr parser2(shortName);
+ test(parser2.FullName()==_L("1234567812345678"));
+ test(parser2.Path()==_L(""));
+ test(parser2.DriveAndPath()==_L(""));
+ test(parser2.Ext()==_L(""));
+ test(parser2.Name()==_L("1234567812345678"));
+ test(parser2.AddDir(_L("TOOBIG"))==KErrGeneral);
+ }
+
+LOCAL_C void TestTParse8()
+//
+// Test TParsePtrC
+//
+ {
+
+ TBuf<128> nameBuf=_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC");
+ TParsePtrC parser(nameBuf);
+
+ test(parser.FullName()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\AAA.CCC"));
+ test(parser.Drive()==_L("C:"));
+ test(parser.Path()==_L("\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(parser.DriveAndPath()==_L("C:\\WWW\\XXX\\YYY\\ZZZ\\"));
+ test(parser.Name()==_L("AAA"));
+ test(parser.Ext()==_L(".CCC"));
+ test(parser.NameAndExt()==_L("AAA.CCC"));
+ test(parser.DrivePresent());
+ test(parser.PathPresent());
+ test(parser.NamePresent());
+ test(parser.ExtPresent());
+ test(parser.NameOrExtPresent());
+ test(parser.IsRoot()==EFalse);
+ test(parser.IsWild()==EFalse);
+ test(parser.IsNameWild()==EFalse);
+ test(parser.IsExtWild()==EFalse);
+ }
+
+LOCAL_C void TestTParse9()
+//
+// Test names with leading spaces
+//
+ {
+
+ TParse parser;
+ TBuf<16> nameBuf=_L(" name.txt");
+ TBuf<16> pathBuf=_L("\\PATH\\");
+
+ TInt r=parser.Set(pathBuf,NULL,&nameBuf);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("\\PATH\\ name.txt"));
+ r=parser.Set(_L(""),&nameBuf,&pathBuf);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("\\PATH\\ name.txt"));
+ r=parser.Set(_L(" name.txt"),NULL,&pathBuf);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("\\PATH\\ name.txt"));
+ r=parser.Set(nameBuf,&pathBuf,NULL);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("\\PATH\\ name.txt"));
+
+ TBuf<16> badPath=_L(" \\PATH\\");
+ r=parser.Set(_L("C:\\"),NULL,&badPath);
+ test(r==KErrBadName);
+ r=parser.Set(_L("C:\\"),&badPath,NULL);
+ test(r==KErrBadName);
+
+ TBuf<16> spacePath=_L("\\ PATH\\");
+ r=parser.Set(_L("C:"),&nameBuf,&spacePath);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\ PATH\\ name.txt"));
+
+ TBuf<32> spacename=_L("\\ name . txt ");
+ r=parser.Set(_L("C:"),&spacename,NULL);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\ name . txt"));
+
+// Illegal (?) values
+
+ TBuf<16> pureSpace=_L(" ");
+ r=parser.Set(_L("C:\\NAME\\"),NULL,&pureSpace);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\NAME\\")); // Trims right off name
+ r=parser.Set(_L("C:\\NAME\\ "),NULL,NULL);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\NAME\\"));
+
+ TBuf<16> spacePlusExt=_L(" . ext ");
+ r=parser.Set(_L("C:\\NAME\\"),NULL,&spacePlusExt);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\NAME\\ . ext")); // Trims right off ext
+ r=parser.Set(_L("C:\\NAME\\ . ext "),NULL,NULL);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\NAME\\ . ext"));
+
+ TBuf<32> pathSpace=_L("\\asdf\\zxcv\\ \\asdf\\");
+ r=parser.Set(_L("C:"),NULL,&pathSpace);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\asdf\\zxcv\\ \\asdf\\")); // Leaves spaces in path
+ r=parser.Set(_L("C:\\NAME\\ \\alt.sdf"),NULL,NULL);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\NAME\\ \\alt.sdf"));
+
+
+ TBuf<32> zeroPath=_L("\\asdf\\wqer\\\\asdf\\");
+ r=parser.Set(_L("NAME.TXT"),NULL,&zeroPath);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("\\asdf\\wqer\\\\asdf\\NAME.TXT")); // Leaves zerolength path
+ r=parser.Set(_L("C:\\NAME\\\\alt.sdf"),NULL,NULL);
+ test(r==KErrNone);
+ test(parser.FullName()==_L("C:\\NAME\\\\alt.sdf"));
+ }
+
+LOCAL_C void TestTParse10()
+//
+// Test a very long path
+//
+ {
+
+ TBuf<16> pathPart=_L("\\2345678");
+ TBuf<512> testPath;
+
+ for(TInt i=0;i<63;i++)
+ testPath+=pathPart;
+
+ RFs fs;
+ TInt r=fs.Connect();
+ test(r==KErrNone);
+ TParse parse;
+ r=fs.Parse(testPath,parse);
+ test(r==KErrBadName);
+ fs.Close();
+
+ TFileName longFileName;
+ longFileName.SetLength(254);
+// Mem::Fill((TUint8*)longFileName.Ptr(),254,'A');
+ Mem::Fill((TUint8*)longFileName.Ptr(),254*sizeof(TText),'A');
+ longFileName[0]='\\';
+ longFileName[253]='\\';
+ r=parse.Set(longFileName,&test_string,NULL);
+ test(r==KErrNone);
+ r=parse.PopDir();
+ test(r==KErrNone);
+
+ longFileName[123]='\\';
+ r=parse.Set(longFileName,&test_string,NULL);
+ test(r==KErrNone);
+ r=parse.PopDir();
+ test(r==KErrNone);
+ TPtrC startPath((TText*)longFileName.Ptr(),124);
+ test(parse.Path()==startPath);
+
+ TPtrC endPath((TText*)longFileName.Ptr()+124,252-124+1);
+ r=parse.AddDir(endPath);
+ test(r==KErrNone);
+ test(parse.Path()==longFileName);
+ }
+
+LOCAL_C void testTFileTextApi()
+//
+// Test TFileText class methods
+//
+ {
+
+ TPtrC record[5];
+ record[0].Set(_L("First record"));
+ record[1].Set(_L("Second record"));
+ record[2].Set(_L("Third record"));
+ record[3].Set(_L("Fourth record"));
+ record[4].Set(_L("Fifth record"));
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ RFile f;
+ TInt r=f.Replace(fs,_L("TEXTFILE.TXT"),0);
+ test(r==KErrNone);
+ TFileText textFile;
+ textFile.Set(f);
+ TInt i=0;
+ for (i=0;i<5;i++)
+ {
+ r=textFile.Write(record[i]);
+ test(r==KErrNone);
+ }
+ r=textFile.Seek(ESeekStart);
+ test(r==KErrNone);
+ TBuf<16> recBuf;
+ for(i=0;i<5;i++)
+ {
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[i]);
+ }
+ r=textFile.Read(recBuf);
+ test(r==KErrEof);
+ test(recBuf.Length()==0);
+ f.Close();
+
+ test.Next(_L("Test dosfile terminator"));
+ TPtrC8 trecord[7];
+ TPtrC tTextrecord[7];
+ tTextrecord[0].Set(_L("First record\r\n"));
+ tTextrecord[1].Set(_L("Second record\r\n"));
+ tTextrecord[2].Set(_L("Third record\r\n"));
+ tTextrecord[3].Set(_L("Fourth record\r\n"));
+ tTextrecord[4].Set(_L("Fifth record\r\n"));
+ tTextrecord[5].Set(_L("Sixth record\n\r"));
+ tTextrecord[6].Set(_L("Seventh record\n"));
+ trecord[0].Set((TUint8*)tTextrecord[0].Ptr(),tTextrecord[0].Length()*sizeof(TText));
+ trecord[1].Set((TUint8*)tTextrecord[1].Ptr(),tTextrecord[1].Length()*sizeof(TText));
+ trecord[2].Set((TUint8*)tTextrecord[2].Ptr(),tTextrecord[2].Length()*sizeof(TText));
+ trecord[3].Set((TUint8*)tTextrecord[3].Ptr(),tTextrecord[3].Length()*sizeof(TText));
+ trecord[4].Set((TUint8*)tTextrecord[4].Ptr(),tTextrecord[4].Length()*sizeof(TText));
+ trecord[5].Set((TUint8*)tTextrecord[5].Ptr(),tTextrecord[5].Length()*sizeof(TText));
+ trecord[6].Set((TUint8*)tTextrecord[6].Ptr(),tTextrecord[6].Length()*sizeof(TText));
+ r=f.Replace(fs,_L("TEXTFILE.TXT"),0);
+ test(r==KErrNone);
+ for(i=0;i<7;i++)
+ {
+ TBuf8<256> buf;
+ buf.Copy(trecord[i]);
+ r=f.Write(buf);
+ test(r==KErrNone);
+ }
+ textFile.Set(f);
+ textFile.Seek(ESeekStart);
+ for(i=0;i<5;i++)
+ {
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[i]);
+ }
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==_L("Sixth record"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==_L("\rSeventh record"));
+ r=textFile.Read(recBuf);
+ test(r==KErrEof);
+ test(recBuf.Length()==0);
+ f.Close();
+
+ test.Next(_L("Test read with bufferSize == dataSize"));
+ r=f.Replace(fs,_L("TEXTFILE.TXT"),0);
+ test(r==KErrNone);
+ record[0].Set(_L("1234567890123456"));
+// trecord[0].Set(_L8("1234567890123456\r\n"));
+// trecord[1].Set(_L8("1234567890123456\n"));
+
+ TPtrC tmpTextrecord;
+ tmpTextrecord.Set(_L("1234567890123456\r\n"));
+ trecord[0].Set((TUint8*)tmpTextrecord.Ptr(),tmpTextrecord.Length()*sizeof(TText));
+
+ tmpTextrecord.Set(_L("1234567890123456\n"));
+ trecord[1].Set((TUint8*)tmpTextrecord.Ptr(),tmpTextrecord.Length()*sizeof(TText));
+
+ for (i=0;i<2;i++)
+ {
+ r=f.Write(trecord[i]);
+ test(r==KErrNone);
+ }
+ textFile.Set(f);
+ textFile.Seek(ESeekStart);
+ for(i=0;i<2;i++)
+ {
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[0]);
+ }
+ r=textFile.Read(recBuf);
+ test(r==KErrEof);
+ test(recBuf.Length()==0);
+ f.Close();
+
+ test.Next(_L("Read into a buffer < recordSize"));
+ TBuf<8> smallBuf;
+ r=f.Open(fs,_L("TEXTFILE.txt"),0);
+ test(r==KErrNone);
+ textFile.Set(f);
+ for(i=0;i<2;i++)
+ {
+ r=textFile.Read(smallBuf);
+ test(r==KErrTooBig);
+ test(smallBuf==_L("12345678"));
+ }
+ f.Close();
+
+ test.Next(_L("Nasty cases: 1) split over buffer boundary"));
+ r=f.Replace(fs,_L("TEXTFILE.txt"),0);
+ test(r==KErrNone);
+ HBufC* largeRecord=HBufC::NewL(600);
+ largeRecord->Des().SetLength(250);
+ largeRecord->Des().Fill('A');
+ largeRecord->Des()[249]='\n';
+ TPtrC8 bufPtr;
+ bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size()); // Size() returns length in bytes
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ TBuf<16> boundaryBuf=_L("12345\r\n");
+ bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ r=f.Write(trecord[0]);
+ test(r==KErrNone);
+
+ textFile.Set(f);
+ textFile.Seek(ESeekStart);
+ r=textFile.Read(recBuf);
+ test(r==KErrTooBig);
+ test(recBuf==_L("AAAAAAAAAAAAAAAA"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==_L("12345"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[0]);
+ f.Close();
+
+ test.Next(_L("Nasty cases: 2) on buffer boundary"));
+ r=f.Replace(fs,_L("TEXTFILE.txt"),0);
+ test(r==KErrNone);
+ largeRecord->Des().SetLength(250);
+ largeRecord->Des().Fill('A');
+ largeRecord->Des()[249]='\n';
+ bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ boundaryBuf=_L("12345\rxyz\n");
+ bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ r=f.Write(trecord[0]);
+ test(r==KErrNone);
+
+ textFile.Set(f);
+ textFile.Seek(ESeekStart);
+ r=textFile.Read(recBuf);
+ test(r==KErrTooBig);
+ test(recBuf==_L("AAAAAAAAAAAAAAAA"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==_L("12345\rxyz"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[0]);
+ f.Close();
+
+ test.Next(_L("Nasty cases: 3) record size > buffer size"));
+ r=f.Replace(fs,_L("TEXTFILE.txt"),0);
+ test(r==KErrNone);
+ largeRecord->Des().SetLength(600);
+ largeRecord->Des().Fill('Z');
+ largeRecord->Des()[511]='\r';
+ largeRecord->Des()[599]='\n';
+ bufPtr.Set((TUint8*)largeRecord->Ptr(),largeRecord->Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ boundaryBuf=_L("12345\rxyz\n");
+ bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ r=f.Write(trecord[0]);
+ test(r==KErrNone);
+
+ textFile.Set(f);
+ textFile.Seek(ESeekStart);
+ r=textFile.Read(recBuf);
+ test(r==KErrTooBig);
+ test(recBuf==_L("ZZZZZZZZZZZZZZZZ"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==_L("12345\rxyz"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[0]);
+
+ TBuf<601> bigBuf;
+ TPtrC largePtr((TText*)largeRecord->Ptr(),(largeRecord->Length()-1));
+ textFile.Seek(ESeekStart);
+ r=textFile.Read(bigBuf);
+ test(r==KErrNone);
+ test(bigBuf==largePtr);
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==_L("12345\rxyz"));
+ r=textFile.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf==record[0]);
+ f.Close();
+
+ User::Free(largeRecord);
+ test(fs.Delete(_L("TEXTFILE.txt")) == KErrNone);
+ fs.Close();
+ }
+
+LOCAL_C void testTFileTextEndRecord()
+//
+// Test terminating record
+//
+ {
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ RFile f;
+ TInt r=f.Replace(fs,_L("TextFile"),0);
+ test(r==KErrNone);
+ TPtrC8 bufPtr;
+ TBuf<16>boundaryBuf=_L("Record1\n");
+ bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ boundaryBuf=_L("Record2\n");
+ bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+ boundaryBuf=_L("Record3\n");
+ bufPtr.Set((TUint8*)boundaryBuf.Ptr(),boundaryBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+
+ TFileText fText;
+ fText.Set(f);
+ r=fText.Seek(ESeekStart);
+ test(r==KErrNone);
+ TBuf<32> recBuf;
+ r=fText.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf.MatchF(_L("record1"))!=KErrNotFound);
+ r=fText.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf.MatchF(_L("record2"))!=KErrNotFound);
+ r=fText.Read(recBuf);
+ test(r==KErrNone);
+ test(recBuf.MatchF(_L("record3"))!=KErrNotFound);
+ r=fText.Read(recBuf);
+ test(r==KErrEof);
+ test(recBuf.Length()==0);
+ f.Close();
+
+ TBuf<0x100> bigBuf(0x100);
+ bigBuf.Fill('A');
+ r=f.Replace(fs,_L("TextFile"),0);
+ test(r==KErrNone);
+
+ bufPtr.Set((TUint8*)bigBuf.Ptr(),bigBuf.Size());
+ r=f.Write(bufPtr);
+ test(r==KErrNone);
+
+ fText.Set(f);
+ r=fText.Seek(ESeekStart);
+ test(r==KErrNone);
+ bigBuf.SetLength(0);
+ r=fText.Read(bigBuf);
+// test.Printf(_L("fText.Read returns %d\n"),r);
+ test(r==KErrNone);
+// test.Printf(_L("BigBuf.Length()==%d\n"),bigBuf.Length());
+ test(bigBuf.Length()==0x100);
+ r=fText.Read(bigBuf);
+ test(r==KErrEof);
+ test(bigBuf.Length()==0);
+ f.Close();
+
+ test(fs.Delete(_L("TextFile")) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileOpen()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_open");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ fs.SetAtt(KTestFile, 0, KEntryAttReadOnly);
+ fs.Delete(KTestFile);
+
+ // File doesn't exist
+ RFile file;
+ test(file.Open(fs, KTestFile, 0) == KErrNotFound);
+
+ // Create the file
+ test(file.Create(fs, KTestFile, 0) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+
+ // Should be okay to close a file twice
+ file.Close();
+ file.Close();
+
+ // Open the file for reading
+ TBuf8<26> buf;
+ test(file.Open(fs, KTestFile, EFileShareAny) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+
+ // Check you can't write to it
+ test(file.Write(KTestText) == KErrAccessDenied);
+
+ // Check another file can be opened at the same time
+ RFile file2;
+ test(file2.Open(fs, KTestFile, EFileShareAny) == KErrNone);
+ test(file2.Read(buf) == KErrNone && buf == KTestText);
+ file2.Close();
+ test(file2.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ file2.Close();
+ file.Close();
+
+ // Open the file for writing
+ test(file.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+
+ // Check you can write to it
+ test(file.Write(KTestText) == KErrNone);
+
+ // Check another file can be opened at the same time
+ test(file2.Open(fs, KTestFile, EFileShareAny|EFileRead) == KErrNone);
+ file2.Close();
+ test(file2.Open(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+ file2.Close();
+
+ // Read back what we just wrote
+ file.Close();
+ test(file.Open(fs, KTestFile, 0) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ file.Close();
+
+ // Check error on read only file
+ test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrAccessDenied);
+ test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ file.Close();
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileCreate()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_create");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ fs.Delete(KTestFile);
+
+ // Create should work when file doesn't exist
+ RFile file;
+ test(file.Create(fs, KTestFile, 0) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ file.Close();
+
+ // Create should fail when file does exist
+ test(file.Create(fs, KTestFile, 0) == KErrAlreadyExists);
+ test(fs.Delete(KTestFile) == KErrNone);
+
+ // Check you can read from the file
+ test(file.Create(fs, KTestFile, 0) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ TInt pos = 0;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ TBuf8<26> buf;
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ test(file.Write(KTestText) == KErrNone);
+ pos = 26;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ file.Close();
+
+ // Check error on read only file
+ test(fs.SetAtt(KTestFile, KEntryAttReadOnly, 0) == KErrNone);
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrAccessDenied);
+ test(fs.SetAtt(KTestFile, 0, KEntryAttReadOnly) == KErrNone);
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+ file.Close();
+
+ fs.Delete(KTestFile);
+ fs.Close();
+ }
+
+void testRFileReplace()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_replace");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ fs.Delete(KTestFile);
+
+ // Reaplce should work when file doesn't exist
+ RFile file;
+ test(file.Replace(fs, KTestFile, 0) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ file.Close();
+
+ // Replace should also work when file does exist
+ test(file.Replace(fs, KTestFile, 0) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+
+ // Check you can read from the file
+ TInt pos = 0;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ TBuf8<26> buf;
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ test(file.Write(KTestText) == KErrNone);
+ pos = 26;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ file.Close();
+
+ fs.Delete(KTestFile);
+ fs.Close();
+ }
+
+void testRFileTemp()
+ {
+ _LIT(KTestDir, "c:\\symport_test_rfile_temp\\");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ fs.MkDir(KTestDir);
+
+ TFileName f1;
+ RFile file;
+
+ // Use invalid path
+ test(file.Temp(fs, _L("invalid"), f1, 0) == KErrBadName);
+ test(file.Temp(fs, _L("invalid\\"), f1, 0) == KErrBadName);
+
+ // Try to use a file for the path
+ test(file.Replace(fs, _L("invalid"), 0) == KErrNone);
+ file.Close();
+ test(file.Temp(fs, _L("invalid"), f1, 0) == KErrBadName);
+ test(fs.Delete(_L("invalid")) == KErrNone);
+
+ test(file.Temp(fs, KTestDir, f1, 0) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ file.Close();
+
+ // Check it works a second time
+ TFileName f2;
+ test(file.Temp(fs, KTestDir, f2, 0) == KErrNone);
+
+ // Check you can read from the file
+ test(file.Write(KTestText) == KErrNone);
+ TInt pos = 0;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ TBuf8<26> buf;
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ test(file.Write(KTestText) == KErrNone);
+ pos = 26;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf == KTestText);
+ file.Close();
+
+ test(fs.Delete(f1) == KErrNone);
+ test(fs.Delete(f2) == KErrNone);
+
+ // See if you can create a temp on root
+ test(file.Temp(fs, _L("C:\\"), f1, 0) == KErrNone);
+ file.Close();
+ test(fs.Delete(f1) == KErrNone);
+
+ // See if empty path is okay
+ test(file.Temp(fs, KNullDesC, f1, 0) == KErrNone);
+ file.Close();
+ test(fs.Delete(f1) == KErrNone);
+
+ fs.RmDir(KTestDir);
+ fs.Close();
+ }
+
+void testRFileRead()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_read");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Create a test file
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ file.Close();
+
+ TBuf8<13> buf;
+ test(file.Open(fs, KTestFile, 0) == KErrNone);
+
+ // File position at the start
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 13 && buf == KTestText().Left(13));
+
+ // Check file position is updated
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 13);
+
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 13 && buf == KTestText().Right(13));
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 0);
+
+ pos = 13;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 13 && buf == KTestText().Right(13));
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 0);
+
+ // Move back to the start
+ pos = 0;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+
+ test(file.Read(buf, 6) == KErrNone);
+ test(buf.Length() == 6 && buf == KTestText().Left(6));
+ pos = 20;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(file.Read(buf, 6) == KErrNone);
+ test(buf.Length() == 6 && buf == KTestText().Right(6));
+ test(file.Read(buf, 1) == KErrNone);
+ test(buf.Length() == 0);
+
+ test(file.Read(0, buf) == KErrNone);
+ test(buf.Length() == 13 && buf == KTestText().Left(13));
+ test(file.Read(13, buf) == KErrNone);
+ test(buf.Length() == 13 && buf == KTestText().Right(13));
+ test(file.Read(23, buf) == KErrNone);
+ test(buf.Length() == 3 && buf == KTestText().Right(3));
+ test(file.Read(27, buf) == KErrNone);
+ test(buf.Length() == 0);
+
+ test(file.Read(0, buf, 6) == KErrNone);
+ test(buf.Length() == 6 && buf == KTestText().Left(6));
+ test(file.Read(20, buf, 6) == KErrNone);
+ test(buf.Length() == 6 && buf == KTestText().Right(6));
+ test(file.Read(23, buf, 6) == KErrNone);
+ test(buf.Length() == 3 && buf == KTestText().Right(3));
+ test(file.Read(27, buf, 6) == KErrNone);
+ test(buf.Length() == 0);
+
+ file.Close();
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileWrite()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_write");
+ _LIT8(KTestText, "abcdefghijklm");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ TBuf8<26> buf;
+ RFile file;
+ test(file.Replace(fs, KTestFile, 0) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 0);
+
+ // File position at the start
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Write(KTestText) == KErrNone); //13
+
+ // Check position updated
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 13);
+
+ test(file.Read(0, buf) == KErrNone && buf == KTestText);
+ test(file.Write(KTestText) == KErrNone); //26
+ test(file.Read(0, buf) == KErrNone && buf.Length() == 26 && buf.Left(13) == KTestText && buf.Right(13) == KTestText);
+ file.Close();
+
+ // Test read after write
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 13);
+ file.Close();
+
+ // Test write after read
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 26);
+ test(file.Write(KTestText) == KErrNone);
+ test(file.Read(26, buf) == KErrNone && buf.Length() == 13);
+ file.Close();
+
+ test(file.Replace(fs, KTestFile, 0) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 0);
+ test(file.Write(KTestText, 6) == KErrNone); //6
+ test(file.Read(0, buf) == KErrNone && buf == KTestText().Left(6));
+ test(file.Write(KTestText, 6) == KErrNone); //12
+ test(file.Read(0, buf) == KErrNone && buf.Length() == 12 && buf.Left(6) == KTestText().Left(6) && buf.Right(6) == KTestText().Left(6));
+ file.Close();
+
+ // Test read after write
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(KTestText, 6) == KErrNone); //6
+ test(file.Read(buf) == KErrNone && buf.Length() == 6);
+ file.Close();
+
+ // Test write after read
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 12);
+ test(file.Write(KTestText, 6) == KErrNone);
+ test(file.Read(12, buf) == KErrNone && buf.Length() == 6);
+ file.Close();
+
+ test(file.Replace(fs, KTestFile, 0) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 0);
+ test(file.Write(3, KTestText) == KErrNone); //0+13=13
+ test(file.Read(0, buf) == KErrNone);
+ test(buf.Length() == 13);
+ test(buf == KTestText);
+ test(file.Write(7, KTestText) == KErrNone); //7+13=20
+ test(file.Read(0, buf) == KErrNone && buf.Length() == 20 && buf.Mid(7,13) == KTestText());
+ file.Close();
+
+ // Test read after write
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(0, KTestText) == KErrNone); //13
+ test(file.Read(buf) == KErrNone && buf.Length() == 7);
+ file.Close();
+
+ // Test write after read
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 20);
+ test(file.Write(10, KTestText) == KErrNone); //10+13=23
+ test(file.Read(0, buf) == KErrNone && buf.Length() == 23);
+ file.Close();
+
+ test(file.Replace(fs, KTestFile, 0) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 0);
+ test(file.Write(3, KTestText, 10) == KErrNone); //0+10=10
+ test(file.Read(0, buf) == KErrNone);
+ test(buf.Length() == 10 && buf == KTestText().Left(10));
+ test(file.Write(0, KTestText, 3) == KErrNone); //10
+ test(file.Read(0, buf) == KErrNone );
+ test(buf.Length() == 10);
+ test(buf.Left(3) == KTestText().Left(3));
+ file.Close();
+
+ // Test read after write
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(0, KTestText, 3) == KErrNone); //3
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 7);
+ file.Close();
+
+ // Test write after read
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Read(buf) == KErrNone && buf.Length() == 10);
+ test(file.Write(13, KTestText, 6) == KErrNone); //10+6=16
+ test(file.Read(0, buf) == KErrNone && buf.Length() == 16);
+ file.Close();
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileSeek()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_seek");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ // Create the file
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(KTestText) == KErrNone);
+
+ // ESeekAddress is invalid
+ TInt pos = 0;
+ test(file.Seek(ESeekAddress, pos) == KErrNotSupported);
+
+ // Error on negative offset
+ pos = -999;
+ test(file.Seek(ESeekStart, pos) == KErrArgument);
+
+ // Test you can get the file position
+ pos = 12;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(pos == 12);
+ TBuf8<26> buf;
+ test(file.Read(buf, 1) == KErrNone);
+ test(buf == _L8("m")); //13
+
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 13);
+
+ // Move to the end of the file
+ pos = 30;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(pos == 30);
+ test(file.Size(pos) == KErrNone);
+ test(pos == 26);
+
+ // Move back from the end
+ pos = -1;
+ test(file.Seek(ESeekEnd, pos) == KErrNone);
+ test(pos == 25);
+ test(file.Read(buf) == KErrNone);
+ test(buf == _L8("z"));
+
+ // Move past the end
+ pos = 10;
+ test(file.Seek(ESeekEnd, pos) == KErrNone);
+ test(pos == 26);
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 0);
+
+ // Move before the start
+ pos = -30;
+ test(file.Seek(ESeekEnd, pos) == KErrNone);
+ test(pos == 0);
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 26);
+
+ // Check seek to current
+ pos = 13;
+ test(file.Seek(ESeekStart, pos) == KErrNone);
+ test(file.Read(buf, 1) == KErrNone); //14
+ test(buf == _L8("n"));
+ pos = -13;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 1);
+ test(file.Read(buf, 1) == KErrNone); //2
+ test(buf == _L8("b"));
+
+ // Before the start
+ pos = -10;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+ test(file.Read(buf, 1) == KErrNone); //1
+ test(buf == _L8("a"));
+
+ // After the end
+ pos = 26;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 26);
+ test(file.Read(buf, 1) == KErrNone);
+ test(buf.Length() == 0);
+
+ // Check current pos
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 26);
+
+ // And check you can go back
+ pos = -1;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(file.Read(buf, 1) == KErrNone);
+ test(buf == _L8("z"));
+
+ file.Close();
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileFlush()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_flush");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ fs.Delete(KTestFile);
+
+ // Create the file
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+
+ // Check file pos
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Write(KTestText) == KErrNone);
+
+ // Check file pos
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 26);
+
+ test(file.Flush() == KErrNone);
+
+ // Check file pos hasn't changed
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 26);
+
+ file.Close();
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileSize()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_flush");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ fs.Delete(KTestFile);
+
+ // Create the file
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+
+ TInt size = 0;
+ test(file.Size(size) == KErrNone);
+ test(size == 0);
+
+ // Check file pos
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Write(KTestText) == KErrNone);
+
+ size = 0;
+ test(file.Size(size) == KErrNone);
+ test(size == 26);
+
+ // Check file pos
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 26);
+
+ file.Close();
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileSetSize()
+ {
+ _LIT(KTestFile, "c:\\symport_test_rfile_flush");
+ _LIT8(KTestText, "abcdefghijklmnopqrstuvwxyz");
+
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+ fs.Delete(KTestFile);
+
+ // Create the file
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileWrite) == KErrNone);
+
+ // Check file pos
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Write(KTestText) == KErrNone); //26
+
+ // Set the size to bigger
+ test(file.SetSize(30) == KErrNone);
+
+ // Check file pos is unchanged
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 26);
+
+ // Set the size to smaller
+ test(file.SetSize(20) == KErrNone);
+
+ // Check file pos is at the end
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 20);
+
+ file.Close();
+
+ // Open for reading
+ test(file.Open(fs, KTestFile, 0) == KErrNone);
+
+ // Shouldn't be allowed to set the size
+ test(file.SetSize(10) == KErrAccessDenied);
+
+ file.Close();
+
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileAtt()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile, "c:\\symport_test_rile_att.txt");
+
+ // See if it works for normal files
+ TUint att;
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+
+ // Check file pos is at the start
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Write(_L8("test")) == KErrNone);
+ test(file.Att(att) == KErrNone);
+ test(!(att&KEntryAttDir));
+
+ // Check file pos is correct
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 4);
+
+ // Check readonly flag
+ test(!(att&KEntryAttReadOnly));
+ test(file.SetAtt(KEntryAttReadOnly, 0) == KErrNone);
+ test(file.Att(att) == KErrNone && att&KEntryAttReadOnly);
+
+ // Clear the flag
+ test(file.SetAtt(0, KEntryAttReadOnly) == KErrNone);
+ test(file.Att(att) == KErrNone);
+ test(!(att&KEntryAttReadOnly));
+ file.Close();
+
+ // Delete the file
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileModified()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile, "c:\\symport_test_rile_modified.txt");
+
+ // See if it works for normal files
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+
+ // Check file pos is at the start
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+
+ test(file.Write(_L8("test")) == KErrNone);
+ test(file.Flush() == KErrNone);
+
+ TTime then;
+ test(file.Modified(then) == KErrNone);
+ User::After(2000000);
+
+ // Check file pos is correct
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 4);
+
+ file.Close();
+
+ test(file.Open(fs, KTestFile, EFileWrite) == KErrNone);
+ test(file.Write(_L8("test")) == KErrNone);
+ test(file.Flush() == KErrNone);
+
+ TTime now;
+ test(file.Modified(now) == KErrNone);
+
+ TTimeIntervalSeconds sec;
+ test(now.SecondsFrom(then, sec) == KErrNone);
+ test(sec.Int() >= 1);
+
+ file.Close();
+
+ // Delete the file
+ test(fs.Delete(KTestFile) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileDrive()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile, "c:\\symport_test_rile_drive.txt");
+
+ // See if it works for normal files
+ RFile file;
+ test(file.Replace(fs, KTestFile, EFileShareAny|EFileWrite) == KErrNone);
+
+ TInt drive;
+ TDriveInfo info;
+
+ test(file.Drive(drive, info) == KErrNone);
+ test(drive == EDriveC);
+
+#ifdef __TOOLS2__
+ test(info.iType == EMediaHardDisk);
+ test(info.iBattery == EBatNotSupported);
+ test(info.iDriveAtt&(KDriveAttLocal|KDriveAttInternal));
+ test(info.iMediaAtt == 0);
+#endif
+
+ file.Close();
+
+ // Delete the file
+ test(fs.Delete(KTestFile) == KErrNone);
+ file.Close();
+ fs.Close();
+ }
+
+void testRFileRename()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile1, "c:\\symport_test_rile_rename_a.txt");
+ _LIT(KTestFile2, "c:\\symport_test_rile_rename_b.txt");
+ fs.Delete(KTestFile1);
+ fs.Delete(KTestFile2);
+
+ // See if it works for normal files
+ RFile file;
+ test(file.Replace(fs, KTestFile1, EFileShareExclusive|EFileWrite) == KErrNone);
+
+ // Check file pos is correct
+ TInt pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+ test(file.Write(_L8("test")) == KErrNone);
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 4);
+
+ test(file.Rename(KTestFile2) == KErrNone);
+
+ // Check file pos is correct
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 4);
+ test(file.Write(_L8("test")) == KErrNone);
+ file.Close();
+
+ test(file.Open(fs, KTestFile2, EFileShareExclusive) == KErrNone);
+
+ // Check file pos is correct
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 0);
+ TBuf8<16> buf;
+ test(file.Read(buf) == KErrNone);
+ test(buf.Length() == 8);
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 8);
+
+ // Should fail because not opened for write
+ test(file.Rename(KTestFile1) == KErrAccessDenied);
+
+ // Check file pos is correct
+ pos = 0;
+ test(file.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 8);
+
+ // Check you can't write to the file
+ test(file.Write(_L8("test")) == KErrAccessDenied);
+ file.Close();
+
+ // Recreate the first file
+ test(file.Replace(fs, KTestFile1, EFileShareExclusive|EFileWrite) == KErrNone);
+ file.Close();
+
+ // Check error if renaming to existing file
+ test(file.Open(fs, KTestFile2, EFileShareExclusive) == KErrNone);
+ test(file.Rename(KTestFile1) == KErrAccessDenied);
+ file.Close();
+
+ // Cleanup
+ test(fs.Delete(KTestFile1) == KErrNone);
+ test(fs.Delete(KTestFile2) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileDuplicate()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile1, "c:\\symport_test_rile_duplicate.txt");
+
+ RFile file1;
+ test(file1.Replace(fs, KTestFile1, EFileWrite) == KErrNone);
+ test(file1.Write(_L8("Test")) == KErrNone);
+ test(file1.Flush() == KErrNone);
+
+ // Test you can duplicate the handle and read from it
+ RFile file2;
+ test(file2.Duplicate(file1) == KErrNone);
+
+ // File position should match
+ TInt pos = 0;
+ test(file2.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 4);
+
+ // Move back to the start
+ pos = 0;
+ test(file2.Seek(ESeekStart, pos) == KErrNone);
+ test(pos == 0);
+
+ // Check you can read from the file
+ TBuf8<8> buf;
+ test(file2.Read(buf) == KErrNone);
+ test(buf.Length() == 4);
+
+ // Check you can write to the file
+ test(file2.Write(_L8("Test")) == KErrNone);
+
+ file1.Close();
+ file2.Close();
+
+ // Now open readonly
+ test(file1.Open(fs, KTestFile1, 0) == KErrNone);
+ pos = 4;
+ test(file1.Seek(ESeekStart, pos) == KErrNone);
+ test(pos == 4);
+
+ // Test you can duplicate the handle and read from it
+ test(file2.Duplicate(file1) == KErrNone);
+
+ // File position should match
+ pos = 0;
+ test(file2.Seek(ESeekCurrent, pos) == KErrNone);
+ test(pos == 4);
+
+ // Move back to the start
+ pos = 0;
+ test(file2.Seek(ESeekStart, pos) == KErrNone);
+ test(pos == 0);
+
+ // Check you can read from the file
+ test(file2.Read(buf) == KErrNone);
+ test(buf.Length() == 8);
+
+ // Check you can't write to the file
+ test(file2.Write(_L8("Test")) == KErrAccessDenied);
+
+ file1.Close();
+ file2.Close();
+
+ test(fs.Delete(KTestFile1) == KErrNone);
+ fs.Close();
+ }
+
+void testRFileName()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ _LIT(KTestFile1, "C:\\symport_test_rile_filename.txt");
+
+ RFile file1;
+ test(file1.Replace(fs, KTestFile1, 0) == KErrNone);
+
+ TFileName name;
+ test(file1.Name(name) == KErrNone);
+ test(name == KTestFile1().Mid(3));
+ test(file1.FullName(name) == KErrNone);
+ test(name == KTestFile1);
+ file1.Close();
+
+ test(fs.Delete(KTestFile1) == KErrNone);
+ fs.Close();
+ }
+
+void testRFs()
+ {
+ test.Start(_L("Att"));
+ testAtt();
+
+ test.Next(_L("SetAtt"));
+ testSetAtt();
+
+ test.Next(_L("Modified"));
+ testModified();
+
+ test.Next(_L("MkDir"));
+ testMkDir();
+
+ test.Next(_L("MkDirAll"));
+ testMkDirAll();
+
+ test.Next(_L("RmDir"));
+ testRmDir();
+
+ test.Next(_L("Parse"));
+ testParse();
+
+ test.Next(_L("SessionPath"));
+ testSessionPath();
+
+ test.Next(_L("SetSessionPath"));
+ testSetSessionPath();
+
+ test.Next(_L("Delete"));
+ testDelete();
+
+ test.Next(_L("VolumeIOParam"));
+#ifdef __TOOLS2__
+ testVolumeIOParam();
+#endif
+
+ test.Next(_L("Entry"));
+ testEntry();
+
+ test.Next(_L("SetEntry"));
+ testSetEntry();
+
+ test.Next(_L("SetErrorCondition"));
+#ifdef __TOOLS2__
+ testSetErrorCondition();
+#endif
+
+ test.Next(_L("CharToDrive"));
+ testCharToDrive();
+
+ test.Next(_L("DriveToChar"));
+ testDriveToChar();
+
+ test.Next(_L("IsValidDrive"));
+ testIsValidDrive();
+
+ test.Next(_L("Drive"));
+ testDrive();
+
+ test.Next(_L("GetSystemDrive"));
+ testGetSystemDrive();
+
+ test.Next(_L("Replace"));
+ testReplace();
+
+ test.Next(_L("Rename"));
+ testRename();
+
+ test.End();
+ }
+
+void testTParse()
+ {
+ test.Start(_L("Test all TParse methods"));
+ TestTParse1();
+
+ test.Next(_L("Test multiple PopDirs"));
+ TestTParse2();
+
+ test.Next(_L("Test conflicting default drive letters"));
+ TestTParse3();
+
+ test.Next(_L("Test conflicting relative drive letters"));
+ TestTParse4();
+
+ test.Next(_L("Test errors returned by illegal paths"));
+ TestTParse5();
+
+ test.Next(_L("Test AddDir"));
+ TestTParse6();
+
+ test.Next(_L("Test TParsePtr"));
+ TestTParse7();
+
+ test.Next(_L("Test TParsePtrC"));
+ TestTParse8();
+
+ test.Next(_L("Test names with leading spaces"));
+ TestTParse9();
+
+ test.Next(_L("Test a Path > 256 chars"));
+ TestTParse10();
+
+ test.End();
+ }
+
+void testTFileText()
+ {
+ test.Start(_L("Test file text"));
+ testTFileTextApi();
+
+ test.Next(_L("Test FileText last record has no terminator"));
+ testTFileTextEndRecord();
+
+ test.End();
+ }
+
+void testRFile()
+ {
+ test.Start(_L("Open"));
+ testRFileOpen();
+
+ test.Next(_L("Create"));
+ testRFileCreate();
+
+ test.Next(_L("Replace"));
+ testRFileReplace();
+
+ test.Next(_L("Temp"));
+ testRFileTemp();
+
+ test.Next(_L("Read"));
+ testRFileRead();
+
+ test.Next(_L("Write"));
+ testRFileWrite();
+
+ test.Next(_L("Seek"));
+ testRFileSeek();
+
+ test.Next(_L("Flush"));
+ testRFileFlush();
+
+ test.Next(_L("Size"));
+ testRFileSize();
+
+ test.Next(_L("SetSize"));
+ testRFileSetSize();
+
+ test.Next(_L("Att"));
+ testRFileAtt();
+
+ test.Next(_L("Modified"));
+ testRFileModified();
+
+ test.Next(_L("Drive"));
+ testRFileDrive();
+
+ test.Next(_L("Rename"));
+ testRFileRename();
+
+ test.Next(_L("Duplicate"));
+ testRFileDuplicate();
+
+ test.Next(_L("Name"));
+ testRFileName();
+
+ test.End();
+ }
+
+// This following isn't relevant to WINSCW
+#ifdef __TOOLS2__
+void testSpecialFilenameProcessing()
+ {
+ // Connect to the file system
+ RFs fs;
+ test(fs.Connect() == KErrNone);
+
+ fs.RmDir(_L("c:\\testMisc\\epoc32\\test1\\"));
+ fs.RmDir(_L("c:\\testMisc\\epoc32\\test2\\"));
+ fs.RmDir(_L("c:\\testMisc\\epoc32\\"));
+ fs.RmDir(_L("c:\\testMisc\\"));
+
+ TUint att;
+ _LIT(KCDriveTest1, "c:\\testMisc\\epoc32\\test1\\");
+ test(fs.MkDirAll(KCDriveTest1) == KErrNone);
+ test(fs.Att(KCDriveTest1, att) == KErrNone);
+
+ struct stat sb;
+#ifdef _WIN32
+ test(stat("c:\\testMisc\\epoc32\\test1", &sb) == 0);
+#else
+ // Get home
+ char* env = getenv("HOME");
+ test(env != NULL);
+ char home[0x100];
+ strcpy(home, env);
+
+ // Check it's replaced c: with HOME
+ char testpath[0x100];
+ strcpy(testpath, home);
+ strcat(testpath, "/testmisc/epoc32/test1");
+ test(stat(testpath, &sb) == 0);
+#endif
+
+#ifdef _WIN32
+ static char *env = "EPOCROOT=\\";
+ test(putenv(env) == 0);
+#else
+ test(setenv("EPOCROOT", home, 1) == 0);
+#endif
+
+ _LIT(KEpocRootTest, "\\epoc32\\winscw\\c\\testMisc\\test1\\");
+ test(fs.MkDirAll(KEpocRootTest) == KErrNone);
+ test(fs.Att(KEpocRootTest, att) == KErrNone);
+
+#ifdef _WIN32
+ test(stat("\\epoc32\\winscw\\c\\testMisc\\test1", &sb) == 0);
+#else
+ // Check it's replaced \epoc32 with $(EPOCROOT)epoc32
+ strcpy(testpath, home);
+ strcat(testpath, "/epoc32/winscw/c/testmisc/test1");
+ test(stat(testpath, &sb) == 0);
+#endif
+
+ test(fs.RmDir(KEpocRootTest) == KErrNone);
+ test(fs.RmDir(_L("\\epoc32\\winscw\\c\\testMisc\\")) == KErrNone);
+
+ // Now set EPOCROOT to something a bit more complicated
+#ifdef _WIN32
+ env = "EPOCROOT=c:\\testMisc";
+ test(putenv(env) == 0);
+#else
+ strcpy(testpath, home);
+ strcat(testpath, "/testmisc/");
+ test(setenv("EPOCROOT", testpath, 1) == 0);
+#endif
+
+ _LIT(KCDriveTest2, "\\epoc32\\test2\\");
+ test(fs.MkDirAll(KCDriveTest2) == KErrNone);
+ test(fs.Att(_L("\\epoc32\\test1\\"),att) == KErrNone);
+ test(fs.Att(_L("\\epoc32\\test2\\"),att) == KErrNone);
+
+#ifdef _WIN32
+ test(stat("c:\\testMisc\\epoc32\\test2", &sb) == 0);
+#else
+ strcpy(testpath, home);
+ strcat(testpath, "/testmisc/epoc32/test2");
+ test(stat(testpath, &sb) == 0);
+#endif
+
+#ifdef _WIN32
+ env = "EPOCROOT=\\";
+ test(putenv(env) == 0);
+#else
+ test(setenv("EPOCROOT", home, 1) == 0);
+#endif
+
+ test(fs.RmDir(_L("c:\\testMisc\\epoc32\\test1\\")) == KErrNone);
+ test(fs.RmDir(_L("c:\\testMisc\\epoc32\\test2\\")) == KErrNone);
+ test(fs.RmDir(_L("c:\\testMisc\\epoc32\\")) == KErrNone);
+ test(fs.RmDir(_L("c:\\testMisc\\")) == KErrNone);
+
+ fs.Close();
+ }
+
+#ifdef USING_SYMPORT_DLL
+IMPORT_C TVersion SymPortVersion();
+void testVersion()
+ {
+ TVersion ver(SymPortVersion());
+ test(ver.iMajor >= 1);
+
+ TPtrC name(ver.Name());
+ test.Printf(_L("Symport Version: %S\n"), &name);
+ }
+#endif
+#endif
+
+void doMainL()
+ {
+ test.Start(_L("RFs"));
+ testRFs();
+
+ test.Next(_L("TParse"));
+ testTParse();
+
+ test.Next(_L("TFileText"));
+ testTFileText();
+
+ test.Next(_L("RFile"));
+ testRFile();
+
+ test.Next(_L("Misc"));
+#ifdef __TOOLS2__
+ testSpecialFilenameProcessing();
+#ifdef USING_SYMPORT_DLL
+ testVersion();
+#endif
+#endif
+
+ test.End();
+ }
+int E32Main()
+ {
+ __UHEAP_MARK;
+ CTrapCleanup* theCleanup = CTrapCleanup::New();
+ TRAPD(ret, doMainL());
+ test(ret == KErrNone);
+ test.Close();
+ delete theCleanup;
+ __UHEAP_MARKEND;
+ return ret;
+ }