--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/server/t_rdsect.cpp Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,1053 @@
+// Copyright (c) 1998-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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// f32test\server\t_rdsect.cpp
+//
+//
+
+#define __E32TEST_EXTENSION__
+
+#include <f32file.h>
+#include <e32test.h>
+
+#include "t_server.h"
+#include "t_chlffs.h"
+
+#if defined(__WINS__)
+#define WIN32_LEAN_AND_MEAN
+#pragma warning (disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
+#pragma warning (default:4201) // warning C4201: nonstandard extension used : nameless struct/union
+#endif
+
+#if defined(_UNICODE)
+#if !defined(UNICODE)
+#define UNICODE
+#endif
+#endif
+
+GLDEF_D RTest test(_L("T_RDSECT"));
+
+
+TBuf<26> alphaBuffer=_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+TBuf<10> numberBuffer=_L("0123456789");
+TBuf<14> humptyBuffer=_L("Humpty-Dumpty!");
+TPtr8 alphaPtr((TText8*)alphaBuffer.Ptr(),alphaBuffer.Size(),alphaBuffer.Size());
+TPtr8 numberPtr((TText8*)numberBuffer.Ptr(),numberBuffer.Size(),numberBuffer.Size());
+TPtr8 humptyPtr((TText8*)humptyBuffer.Ptr(),humptyBuffer.Size(),humptyBuffer.Size());
+
+
+/*
+
+ What this test is for:
+
+ Tests the implementation of RFs::ReadFileSection() which has been designed
+ to allow reading from a file regardless of its lock state.
+ Under the EPOC FAT filesystem, the function accesses the raw file data without
+ opening the file using a share mode. This is obviously a dangerous activity
+ should the file be currently open for writing by another user - but the file
+ server makes no guarantees as to the data it returns! The function allows the
+ caller to specify the starting position in the file from which to read the data
+ and the length of data required.
+
+ This test creates a number of files and tests the use of the function when the
+ files are closed and when they are open in a number of access modes.
+ It also tests reading a UID from the files using this new function.
+
+*/
+
+LOCAL_C void CreateTestFiles()
+//
+// Create files with uids for testing
+//
+ {
+
+ test.Next(_L("Create test files"));
+ TInt r=TheFs.MkDir(_L("\\F32-TST\\"));
+ test(r==KErrNone || r==KErrAlreadyExists);
+
+ RFile file;
+
+// Create \\gSessionPath\\UIDCHK.BLG - with uid no data
+ r=file.Replace(TheFs,_L("\\F32-TST\\UIDCHK.BLG"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ TUidType uidType(TUid::Uid('U'),TUid::Uid('I'),TUid::Uid('D'));
+ TCheckedUid checkedUid(uidType);
+ TPtrC8 buf((TUint8*)&checkedUid,sizeof(TCheckedUid));
+ r=file.Write(buf);
+ test_KErrNone(r);
+ file.Close();
+
+// Create \\gSessionPath\\UIDCHK.MSG - with uid and data
+ r=file.Replace(TheFs,_L("\\F32-TST\\UIDCHK.MSG"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ TUidType uidType2(TUid::Uid('X'),TUid::Uid('Y'),TUid::Uid('Z'));
+ checkedUid.Set(uidType2);
+ buf.Set((TUint8*)&checkedUid,sizeof(TCheckedUid));
+ r=file.Write(buf);
+ test_KErrNone(r);
+ r=file.Write(_L8("More file data"));
+ test_KErrNone(r);
+ file.Close();
+
+// Create \\gSessionPath\\UIDCHK.DAT - uid stored only in the file
+ r=file.Replace(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ TUidType uidType3(TUid::Uid('D'),TUid::Uid('A'),TUid::Uid('T'));
+ checkedUid.Set(uidType3);
+ buf.Set((TUint8*)&checkedUid,sizeof(TCheckedUid));
+ r=file.Write(buf);
+ test_KErrNone(r);
+ r=file.Write(_L8("More file data"));
+ test_KErrNone(r);
+ file.Close();
+
+// Make a few random files - these will be deleted before the test begins
+// but are necessary to try to split file ReadFileSection into non-contiguous clusters
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp1.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(550);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp2.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp3.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp4.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(550);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp5.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp6.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp7.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp8.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp9.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\Temp10.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+ file.SetSize(256);
+ file.Close();
+
+ TheFs.Delete(_L("\\F32-TST\\Temp2.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp4.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp6.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp8.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp10.txt"));
+
+ r=file.Replace(TheFs,_L("\\F32-TST\\ReadFileSection1.txt"),EFileRead|EFileWrite);
+ test_KErrNone(r);
+
+// Write 5000 bytes of nonsense
+
+ TInt i=0;
+ for ( ; i<100; i++)
+ {
+ r=file.Write(alphaPtr);
+ test_KErrNone(r);
+ r=file.Write(numberPtr);
+ test_KErrNone(r);
+ r=file.Write(humptyPtr);
+ test_KErrNone(r);
+ }
+
+ file.Close();
+
+ TheFs.Delete(_L("\\F32-TST\\Temp1.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp3.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp5.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp7.txt"));
+ TheFs.Delete(_L("\\F32-TST\\Temp9.txt"));
+ }
+
+#if !defined(_UNICODE)
+
+LOCAL_C void Test1()
+//
+// Test RFs::ReadFileSection()
+//
+ {
+
+ test.Next(_L("Use RFs::ReadFileSection() to read from a file"));
+
+// First, test for non-existant file
+ TBuf<256> testDes;
+ TInt r=TheFs.ReadFileSection(_L("\\F32-tst\\NonExistantFile.txt"),0,testDes,52);
+ test(r==KErrNotFound);
+ test(testDes.Length()==0);
+
+// Test with file closed
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,testDes,26);
+ test_KErrNone(r);
+ test(testDes.Length()==26);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),26,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),36,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+// Test with file open EFileShareAny|EFileRead
+ RFile file;
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),50,testDes,26);
+ test_KErrNone(r);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+ test(testDes.Length()==26);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),76,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),86,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+ file.Close();
+
+// Test with file open EFileShareExclusive|EFileRead
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareExclusive|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),100,testDes,26);
+ test_KErrNone(r);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+ test(testDes.Length()==26);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),126,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),136,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+ file.Close();
+
+// Test with file open EFileShareExclusive|EFileWrite
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareExclusive|EFileWrite);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),150,testDes,26);
+ test_KErrNone(r);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+ test(testDes.Length()==26);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),176,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),186,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+ file.Close();
+
+
+// Test with file open EFileShareReadersOnly|EFileRead
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareReadersOnly|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),200,testDes,26);
+ test_KErrNone(r);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+ test(testDes.Length()==26);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),226,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),236,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+ file.Close();
+
+// Test with several accesses to a file EFileShareAny|EFileWrite
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ RFile secondFile;
+ r=secondFile.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ RFile thirdFile;
+ r=thirdFile.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),250,testDes,26);
+ test_KErrNone(r);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+ test(testDes.Length()==26);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),276,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),286,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+// Test across potential cluster boundaries
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),500,testDes,100);
+ test_KErrNone(r);
+ test(testDes.Length()==100);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!"));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),1000,testDes,100);
+ test_KErrNone(r);
+ test(testDes.Length()==100);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!"));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),1500,testDes,100);
+ test_KErrNone(r);
+ test(testDes.Length()==100);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!"));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),2000,testDes,100);
+ test_KErrNone(r);
+ test(testDes.Length()==100);
+ test(testDes==_L("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789Humpty-Dumpty!"));
+
+ file.Close();
+ secondFile.Close();
+ thirdFile.Close();
+ }
+
+
+LOCAL_C void Test2()
+//
+// Test RFs::ReadFileSection() on UID reads
+//
+ {
+
+
+ test.Next(_L("Use RFs::ReadFileSection() to read UIDs from files"));
+
+ TBuf8<sizeof(TCheckedUid)> uidBuf(sizeof(TCheckedUid));
+ TPtr uidPtr((TText*)uidBuf.Ptr(),sizeof(TCheckedUid),sizeof(TCheckedUid));
+
+ TInt r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.BLG"),0,uidPtr,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ TCheckedUid uid(uidBuf);
+ TUidType uidType=uid.UidType();
+ test(uidType.IsValid());
+
+ test(uidType[0]==TUid::Uid('U') && uidType[1]==TUid::Uid('I') && uidType[2]==TUid::Uid('D'));
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.MSG"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ uid.Set(uidBuf);
+ uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('X') && uidType[1]==TUid::Uid('Y') && uidType[2]==TUid::Uid('Z'));
+
+
+ // Test for Null File length
+ TBuf8<256> testDesN;
+ test.Next(_L("Check for null file name"));
+ r=TheFs.ReadFileSection(_L(""),0,testDesN,26);
+ test(r==KErrBadName);
+
+ // Check the lentgh of descriptor.
+ TInt x = testDesN.Length();
+ test ( x == 0);
+
+ test.Next(_L("Check for non existing file"));
+ r=TheFs.ReadFileSection(_L("sdfsd.dfg"),0,testDesN,26);
+ test.Printf(_L("Return %d"),r);
+ test((r==KErrNotFound) || (r == KErrPathNotFound));
+
+ // Check the lentgh of descriptor.
+ x = testDesN.Length();
+ test ( x == 0);
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.DAT"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ uid.Set(uidBuf);
+ uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('D') && uidType[1]==TUid::Uid('A') && uidType[2]==TUid::Uid('T'));
+
+
+ }
+
+LOCAL_C void Test3()
+//
+// Test uid's can be read when the file is open
+//
+// EFileShareExclusive,EFileShareReadersOnly,EFileShareAny,
+// EFileStream=0,EFileStreamText=0x100,
+// EFileRead=0,EFileWrite=0x200
+//
+ {
+
+ test.Next(_L("Test that UIDs can be read from open files"));
+ RFile file;
+
+// Test with file open EFileShareExclusive|EFileRead
+ TInt r=file.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareExclusive|EFileRead);
+ test_KErrNone(r);
+
+ TBuf8<sizeof(TCheckedUid)> uidBuf;
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.DAT"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+
+ TCheckedUid uid(uidBuf);
+ TUidType uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('D') && uidType[1]==TUid::Uid('A') && uidType[2]==TUid::Uid('T'));
+
+ file.Close();
+
+// Test with file open EFileShareExclusive|EFileWrite
+ r=file.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareExclusive|EFileWrite);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.DAT"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ uid.Set(uidBuf);
+ uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('D') && uidType[1]==TUid::Uid('A') && uidType[2]==TUid::Uid('T'));
+
+ file.Close();
+
+// Test with file open EFileShareReadersOnly|EFileRead
+ r=file.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareReadersOnly|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.DAT"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ uid.Set(uidBuf);
+ uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('D') && uidType[1]==TUid::Uid('A') && uidType[2]==TUid::Uid('T'));
+
+ file.Close();
+
+
+// Test with file open EFileShareAny|EFileRead
+ r=file.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareAny|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.DAT"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ uid.Set(uidBuf);
+ uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('D') && uidType[1]==TUid::Uid('A') && uidType[2]==TUid::Uid('T'));
+
+ file.Close();
+
+// Test with several accesses to file open EFileShareAny|EFileWrite
+ r=file.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ RFile secondFile;
+ r=secondFile.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ RFile thirdFile;
+ r=thirdFile.Open(TheFs,_L("\\F32-TST\\UIDCHK.DAT"),EFileShareAny|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-TST\\UIDCHK.DAT"),0,uidBuf,sizeof(TCheckedUid));
+ test_KErrNone(r);
+ uid.Set(uidBuf);
+ uidType=uid.UidType();
+ test(uidType.IsValid());
+ test(uidType[0]==TUid::Uid('D') && uidType[1]==TUid::Uid('A') && uidType[2]==TUid::Uid('T'));
+
+ file.Close();
+ secondFile.Close();
+ thirdFile.Close();
+
+ }
+
+
+LOCAL_C void TestErrors()
+//
+// Test errors and boundary conditions
+//
+ {
+
+ test.Next(_L("Test Error handling"));
+
+// Test that specifying a zero length section returns a zero length descriptor
+ TBuf<30> testDes;
+ TInt r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),25,testDes,0);
+ test_KErrNone(r);
+ test(testDes.Length()==0);
+
+// Test that specifying a negative starting position causes a panic
+// r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),-1,testDes,10);
+// This will panic: See RFs::ReadFileSection() code - relevant lines are
+// __ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
+
+// Test that specifying a section of greater length than the descriptor to
+// hold the data will cause a panic
+// r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,testDes,45);
+// This will panic: See RFs::ReadFileSection() code - relevant lines are
+// __ASSERT_ALWAYS(aDes.MaxLength()>=aLength,Panic(EBadLength));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),2000,testDes,-20);
+ test(r==KErrArgument);
+
+// Test that specifying a position and length which extends beyond the end of
+// the file returns a zero length descriptor and KErrNone
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),4993,testDes,20);
+ test_KErrNone(r);
+ test(testDes.Length()==7);
+ test(testDes==_L("Dumpty!"));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),4999,testDes,1);
+ test_KErrNone(r);
+ test(testDes.Length()==1);
+ test(testDes==_L("!"));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),5000,testDes,1);
+ test_KErrNone(r);
+ test(testDes.Length()==0);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),5550,testDes,20);
+ test_KErrNone(r);
+ test(testDes.Length()==0);
+
+// Test reading the whole file
+ HBufC* hDes=HBufC::New(5002);
+ if (!hDes)
+ User::Leave(KErrNoMemory);
+ TPtr pDes=hDes->Des();
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,pDes,5000);
+ test_KErrNone(r);
+ test(pDes.Length()==5000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,pDes,5000);
+ test_KErrNone(r);
+ test(pDes.Length()==5000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,pDes,5002);
+ test_KErrNone(r);
+ test(pDes.Length()==5000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),2000,pDes,3000);
+ test_KErrNone(r);
+ test(pDes.Length()==3000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),2000,pDes,4002);
+ test_KErrNone(r);
+ test(pDes.Length()==3000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),5000,pDes,5002);
+ test_KErrNone(r);
+ test(pDes.Length()==0);
+
+ delete hDes;
+ }
+
+#else
+
+
+// BEGINNING OF UNICODE TESTS
+
+LOCAL_C void TestUnicode()
+//
+// Test RFs::ReadFileSection()
+//
+ {
+ test.Next(_L("Use RFs::ReadFileSection() to read from a file"));
+
+ // First, test for non-existant file
+ TBuf8<256> testDes;
+ TInt r=TheFs.ReadFileSection(_L("\\F32-tst\\NonExistantFile.txt"),0,testDes,52);
+ test(r==KErrNotFound);
+ test(testDes.Length()==0);
+
+ // Test with file closed
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,testDes,52);
+ test_KErrNone(r);
+ test(testDes.Length()==52);
+ test(testDes==alphaPtr);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),52,testDes,20);
+ test_KErrNone(r);
+ test(testDes==numberPtr);
+ test(testDes.Length()==20);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),72,testDes,28);
+ test_KErrNone(r);
+ test(testDes==humptyPtr);
+ test(testDes.Length()==28);
+
+ // Test for Null File length
+ TBuf8<256> testDesN;
+ test.Next(_L("Check for null file name"));
+ r=TheFs.ReadFileSection(_L(""),0,testDesN,26);
+ test(r==KErrBadName);
+
+ // Check the lentgh of descriptor.
+ TInt x = testDesN.Length();
+ test ( x == 0);
+
+ test.Next(_L("Check for non existing file"));
+ r=TheFs.ReadFileSection(_L("sdfsd.dfg"),0,testDesN,26);
+ test.Printf(_L("Return %d"),r);
+ test((r==KErrNotFound) || (r == KErrPathNotFound));
+
+ // Check the lentgh of descriptor.
+ x = testDesN.Length();
+ test ( x == 0);
+
+ // Test for Empty directory
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\"),0,testDesN,52);
+ test(r==KErrBadName);
+ test(testDesN.Length()==0);
+
+ // Test for File with wildcard name
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\*.txt"),0,testDesN,52);
+ test(r==KErrBadName);
+ test(testDesN.Length()==0);
+
+ // Test for Folder with wildcard name
+ r=TheFs.ReadFileSection(_L("\\F32-tst*\\ReadFileSection1.txt"),0,testDesN,52);
+ test(r==KErrBadName);
+ test(testDesN.Length()==0);
+
+ // Test for Root directory
+ r=TheFs.ReadFileSection(_L("\\"),0,testDesN,52);
+ test(r==KErrBadName);
+ test(testDesN.Length()==0);
+
+ // Test for no file being specified.
+ r=TheFs.ReadFileSection(_L(""),0,testDesN,26);
+ test(r==KErrBadName);
+ test(testDesN.Length()==0);
+
+
+ // Test with file open EFileShareAny|EFileRead
+ RFile file;
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),100,testDes,52);
+ test_KErrNone(r);
+ test(testDes==alphaPtr);
+ test(testDes.Length()==52);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),152,testDes,20);
+ test_KErrNone(r);
+ test(testDes==numberPtr);
+ test(testDes.Length()==20);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),172,testDes,28);
+ test_KErrNone(r);
+ test(testDes==humptyPtr);
+ test(testDes.Length()==28);
+
+ file.Close();
+
+// Test with file open EFileShareExclusive|EFileRead
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareExclusive|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),200,testDes,52);
+ test_KErrNone(r);
+ test(testDes==alphaPtr);
+ test(testDes.Length()==52);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),252,testDes,20);
+ test_KErrNone(r);
+ test(testDes==numberPtr);
+ test(testDes.Length()==20);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),272,testDes,28);
+ test_KErrNone(r);
+ test(testDes==humptyPtr);
+ test(testDes.Length()==28);
+
+ file.Close();
+
+// Test with file open EFileShareExclusive|EFileWrite
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareExclusive|EFileWrite);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),300,testDes,52);
+ test_KErrNone(r);
+ test(testDes==alphaPtr);
+ test(testDes.Length()==52);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),352,testDes,20);
+ test_KErrNone(r);
+ test(testDes==numberPtr);
+ test(testDes.Length()==20);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),372,testDes,28);
+ test_KErrNone(r);
+ test(testDes==humptyPtr);
+ test(testDes.Length()==28);
+
+ file.Close();
+
+
+// Test with file open EFileShareReadersOnly|EFileRead
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareReadersOnly|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),400,testDes,52);
+ test_KErrNone(r);
+ test(testDes==alphaPtr);
+ test(testDes.Length()==52);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),452,testDes,20);
+ test_KErrNone(r);
+ test(testDes==numberPtr);
+ test(testDes.Length()==20);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),472,testDes,28);
+ test_KErrNone(r);
+ test(testDes==humptyPtr);
+ test(testDes.Length()==28);
+
+ file.Close();
+
+// Test with several accesses to a file EFileShareAny|EFileWrite
+ r=file.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ RFile secondFile;
+ r=secondFile.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ RFile thirdFile;
+ r=thirdFile.Open(TheFs,_L("\\F32-tst\\ReadFileSection1.txt"),EFileShareAny|EFileWrite);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),500,testDes,52);
+ test_KErrNone(r);
+
+#if defined(__WINS__)
+#if defined(_DEBUG)
+ test(testDes==alphaPtr);
+ test(testDes.Length()==52);
+#endif
+#else
+ test(testDes==alphaPtr);
+ test(testDes.Length()==52);
+#endif
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),552,testDes,20);
+ test_KErrNone(r);
+ test(testDes==numberPtr);
+ test(testDes.Length()==20);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),572,testDes,28);
+ test_KErrNone(r);
+ test(testDes==humptyPtr);
+ test(testDes.Length()==28);
+
+// Test across potential cluster boundaries
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),1000,testDes,200);
+ test_KErrNone(r);
+ test(testDes.Length()==200);
+ TBuf8<200> amalgam;
+ TInt i=0;
+ for (; i<2; i++)
+ {
+ amalgam.Append(alphaPtr);
+ amalgam.Append(numberPtr);
+ amalgam.Append(humptyPtr);
+ }
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),1000,testDes,200);
+ test_KErrNone(r);
+ test(testDes.Length()==200);
+ test(testDes==amalgam);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),3000,testDes,200);
+ test_KErrNone(r);
+ test(testDes.Length()==200);
+ test(testDes==amalgam);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),4000,testDes,200);
+ test_KErrNone(r);
+ test(testDes.Length()==200);
+ test(testDes==amalgam);
+
+ file.Close();
+ secondFile.Close();
+ thirdFile.Close();
+
+// Test errors and boundary conditions
+ test.Next(_L("Test Error handling"));
+
+// Test that specifying a zero length section returns a zero length descriptor
+ TBuf8<30> testDes2;
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),50,testDes2,0);
+ test_KErrNone(r);
+ test(testDes2.Length()==0);
+
+// Test that specifying a negative starting position causes a panic
+// r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),-1,testDes2,10);
+// This will panic: See RFs::ReadFileSection() code - relevant lines are
+// __ASSERT_ALWAYS(aPos>=0,Panic(EPosNegative));
+
+// Test that specifying a section of greater length than the descriptor to
+// hold the data will cause a panic
+// r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,testDes2,45);
+// This will panic: See RFs::ReadFileSection() code - relevant lines are
+// __ASSERT_ALWAYS(aDes.MaxLength()>=aLength,Panic(EBadLength));
+
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),2000,testDes2,-20);
+ test(r==KErrArgument);
+
+// Test that specifying a position and length which extends beyond the end of
+// the file returns a zero length descriptor and KErrNone
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),9993,testDes2,30);
+ test_KErrNone(r);
+ test(testDes2.Length()==7);
+ test(testDes2==humptyPtr.Right(7));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),9999,testDes2,1);
+ test_KErrNone(r);
+ test(testDes2.Length()==1);
+ test(testDes2==humptyPtr.Right(1));
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),10000,testDes2,1);
+ test_KErrNone(r);
+ test(testDes2.Length()==0);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),10550,testDes2,20);
+ test_KErrNone(r);
+ test(testDes2.Length()==0);
+
+// Test reading the whole file
+ HBufC8* hDes=HBufC8::New(10002);
+ if (!hDes)
+ User::Leave(KErrNoMemory);
+ TPtr8 pDes=hDes->Des();
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,pDes,10000);
+ test_KErrNone(r);
+ test(pDes.Length()==10000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,pDes,10000);
+ test_KErrNone(r);
+ test(pDes.Length()==10000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),0,pDes,10002);
+ test_KErrNone(r);
+ test(pDes.Length()==10000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),4000,pDes,6000);
+ test_KErrNone(r);
+ test(pDes.Length()==6000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),4000,pDes,8002);
+ test_KErrNone(r);
+ test(pDes.Length()==6000);
+
+ r=TheFs.ReadFileSection(_L("\\F32-tst\\ReadFileSection1.txt"),10000,pDes,10002);
+ test_KErrNone(r);
+ test(pDes.Length()==0);
+
+ delete hDes;
+ }
+
+#endif
+
+
+LOCAL_C void TestZ()
+//
+// Test Rom filesystem
+//
+ {
+ test.Next(_L("Use RFs::ReadFileSection() to read from a file on the ROM"));
+#if defined (__WINS__)
+// Requires a copy of t_rdsect.txt in z directory (\EPOC32\RELEASE\WINS\BUILD\Z\TEST)
+// Initially, test with file closed
+ TBuf8<256> testDes;
+ TBuf8<27> temp1;
+ TInt r=TheFs.ReadFileSection(_L("Z:\\test\\t_rdsect.txt"),0,temp1,26);
+ test_KErrNone(r);
+ test(temp1.Length()==26);
+ test(temp1==_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+
+ TBuf8<11> temp2;
+ r=TheFs.ReadFileSection(_L("Z:\\test\\t_rdsect.txt"),26,temp2,10);
+ test_KErrNone(r);
+ test(temp2==_L8("0123456789"));
+ test(temp2.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("Z:\\test\\t_rdsect.txt"),36,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L8("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+// Test with file open EFileShareAny|EFileRead
+ RFile file;
+ r=file.Open(TheFs,_L("Z:\\test\\t_rdsect.txt"),EFileShareAny|EFileRead);
+ test_KErrNone(r);
+
+ r=TheFs.ReadFileSection(_L("Z:\\test\\t_rdsect.txt"),50,testDes,26);
+ test_KErrNone(r);
+ test(testDes==_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+ test(testDes.Length()==26);
+
+ r=TheFs.ReadFileSection(_L("Z:\\test\\t_rdsect.txt"),76,testDes,10);
+ test_KErrNone(r);
+ test(testDes==_L8("0123456789"));
+ test(testDes.Length()==10);
+
+ r=TheFs.ReadFileSection(_L("Z:\\test\\t_rdsect.txt"),86,testDes,14);
+ test_KErrNone(r);
+ test(testDes==_L8("Humpty-Dumpty!"));
+ test(testDes.Length()==14);
+
+ file.Close();
+#else
+// Test for MARM builds - oby file puts file in ROM (z:\test\)
+// The file is the ASCII version
+
+ test.Next(_L("read small descriptor\n"));
+ TBuf8<256> testDes;
+ TBuf8<27> temp1;
+ TInt r=TheFs.ReadFileSection(_L("Z:\\test\\T_RDSECT.txt"),0,temp1,26);
+ test_KErrNone(r);
+ test(temp1.Length()==26);
+ test(temp1==_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+
+ TBuf8<11> temp2;
+ r=TheFs.ReadFileSection(_L("Z:\\test\\T_RDSECT.txt"),26,temp2,10);
+ test_KErrNone(r);
+ test(temp2.Length()==10);
+#if !defined (UNICODE)
+ test(testDes==_L8("0123456789"));
+#endif
+ r=TheFs.ReadFileSection(_L("Z:\\test\\T_RDSECT.txt"),36,testDes,14);
+ test_KErrNone(r);
+ test(testDes.Length()==14);
+#if !defined (UNICODE)
+ test(testDes==_L8("Humpty-Dumpty!"));
+#endif
+ r=TheFs.ReadFileSection(_L("Z:\\test\\T_RDSECT.txt"),50,testDes,26);
+ test_KErrNone(r);
+ test(testDes.Length()==26);
+#if !defined (UNICODE)
+ test(testDes==_L8("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
+#endif
+ r=TheFs.ReadFileSection(_L("Z:\\test\\T_RDSECT.txt"),76,testDes,10);
+ test_KErrNone(r);
+ test(testDes.Length()==10);
+#if !defined (UNICODE)
+ test(testDes==_L8("0123456789"));
+#endif
+ r=TheFs.ReadFileSection(_L("Z:\\test\\T_RDSECT.txt"),86,testDes,14);
+ test_KErrNone(r);
+ test(testDes.Length()==14);
+#if !defined (UNICODE)
+ test(testDes==_L8("Humpty-Dumpty!"));
+#endif
+#endif
+ }
+
+LOCAL_C void DoTestsL()
+//
+// Do all tests
+//
+ {
+ CreateTestFiles();
+#if !defined (_UNICODE)
+ Test1();
+ Test2();
+ Test3();
+ TestErrors();
+#else
+ TestUnicode();
+#endif
+ TestZ();
+ }
+
+GLDEF_C void CallTestsL(void)
+//
+// Test formatting
+//
+ {
+
+ test.Title();
+ test.Start(_L("Testing filesystem on default drive"));
+
+ TChar driveLetter;
+ if (IsSessionDriveLFFS(TheFs,driveLetter))
+ {
+ test.Printf(_L("CallTestsL: Skipped: test does not run on LFFS.\n"));
+ return;
+ }
+
+ DoTestsL();
+ CheckDisk();
+
+ test.End();
+ test.Close();
+ return;
+ }
+