diff -r 000000000000 -r 96e5fb8b040d kerneltest/f32test/rofs/src/t_rofsfile.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/rofs/src/t_rofsfile.cpp Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,522 @@ +// Copyright (c) 2002-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: +// Tests reading from files +// +// + +#include +#include +#include +#include +#include "utl.h" +#include "randgen.h" + +GLREF_D RFs TheFs; + +RTest test( _L("T_ROFSFILE") ); + + +_LIT( KSpotFile1, "root.txt" ); +_LIT( KSpotFile2, "Dir1\\level1.txt" ); +_LIT( KSpotFile3, "Dir1\\Dir2\\level2.txt" ); +_LIT( KSpotFile4, "Dir1\\Dir2\\Dir3\\level3.txt" ); +_LIT( KSpotFile5, "Dir1\\Dir2\\Dir3\\Dir4\\level4.txt" ); +_LIT( KSpotFile6, "Dir1\\Dir2\\Dir3\\Dir4\\Dir5\\level5.txt" ); +_LIT( KSpotFile7, "Dir1\\Dir2\\Dir3\\Dir4\\Dir5\\Dir6\\level6.txt" ); +_LIT( KSpotFile8, "Dir1\\Dir2\\Dir3\\Dir4\\Dir5\\Dir6\\Dir7\\level7.txt" ); +_LIT( KSpotFile9, "DeepDir1\\DeepDir2\\DeepDir3\\DeepDir4\\DeepDir5\\DeepDir6\\DeepDir7\\DeepDir8\\DeepDir9\\DeepDir10\\DeepDir11\\DeepDir12\\DeepDir13\\DeepDir14\\file.txt" ); +_LIT( KSpotFile10, "Parent\\parfile.txt" ); +_LIT( KSpotFile11, "Parent\\SubDir1A\\subfileA.txt" ); +_LIT( KSpotFile12, "Mixed\\par1.txt" ); +_LIT( KSpotFile13, "Mixed\\SubDir1\\sub1.txt" ); +_LIT( KSpotFile14, "Mixed\\SubDir2\\sub2.txt" ); +_LIT( KSpotFile15, "Dir1\\level1_ext.txt" ); + + +_LIT( KSameDirFile1, "ReadTest\\A\\file1" ); +_LIT( KSameDirFile2, "ReadTest\\A\\file2" ); +_LIT( KSameDirFile3, "ReadTest\\A\\file3" ); +_LIT( KSameDirFile4, "ReadTest\\A\\file4" ); +const TInt KSameDirFileLength = 256; +const TUint KSameDirFile1Seed = 0xEF1113BC; +const TUint KSameDirFile2Seed = 0x04082195; +const TUint KSameDirFile3Seed = 0xEC36D359; +const TUint KSameDirFile4Seed = 0x07D4DAC2; + +_LIT( KSameNameFile1, "ReadTest\\B\\B1\\testfile" ); +_LIT( KSameNameFile2, "ReadTest\\B\\B2\\testfile" ); +_LIT( KSameNameFile3, "ReadTest\\B\\B3\\testfile" ); +_LIT( KSameNameFile4, "ReadTest\\B\\B4\\testfile" ); +const TInt KSameNameFileLength = 256; // we will read this much of the file +const TUint KSameNameFile1Seed = 0x8DA9AA5A; +const TUint KSameNameFile2Seed = 0x735AA240; +const TUint KSameNameFile3Seed = 0x42D4BF02; +const TUint KSameNameFile4Seed = 0x47C728FB; + +_LIT( KRandomReadFile, "ReadTest\\C\\seektest" ); +const TInt KRandomReadFileSize = 17466; +const TUint KRandomReadFileSeed = 0x8DA9AA5A; + +_LIT( KEofFile1, "ReadTest\\D\\eoftest1" ); +_LIT( KEofFile2, "ReadTest\\D\\eoftest2" ); +_LIT( KEofFile3, "ReadTest\\D\\eoftest3" ); +_LIT( KEofFile4, "ReadTest\\D\\eoftest4" ); +_LIT( KEofFile5, "ReadTest\\D\\eoftest5" ); +_LIT( KEofFile6, "ReadTest\\D\\eoftest6" ); + + +_LIT( KStreamFile1, "ReadTest\\E\\stream1" ); +_LIT( KStreamFile2, "ReadTest\\E\\stream2" ); +_LIT( KStreamFile3, "ReadTest\\E\\stream3" ); +_LIT( KStreamFile4, "ReadTest\\E\\stream4" ); + +_LIT( KTestFileExt, "ext.txt" ); + +const TUint KStreamReadSeed = 0x8DA9AA5A; + +_LIT( KDriveBase, " :\\" ); + + +const TInt KHello8FileSize = 5; +_LIT8( KHello8FileContent, "hello" ); + + +// A large buffer for file reads +LOCAL_D TBuf8<18000> gFileBuffer; + + +LOCAL_C void SpotCheckFilesL(TInt aDriveToTest, TBool aExtension) +// +// Tests a few files for size & content. These are all the hello8.txt test file +// + { + const TDesC* const fileArray[15] = + { + &KSpotFile1, &KSpotFile2, &KSpotFile3, &KSpotFile4, &KSpotFile5, + &KSpotFile6, &KSpotFile7, &KSpotFile8, &KSpotFile9, &KSpotFile10, + &KSpotFile11, &KSpotFile12, &KSpotFile13, &KSpotFile14, &KSpotFile15 + }; + + test.Next( _L("Spot-check some files") ); + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + TInt index =0; + if(aExtension) index =1; + for( TInt i = index; i < 14; i++ ) + { + name.SetLength( 3 ); // trim back to drive specifier + if(aExtension &&(i==1)) + name.Append( *fileArray[i+13] ); + else + name.Append( *fileArray[i] ); + + test.Printf( _L("Opening file %S"), &name ); + RFile file; + TInt r = file.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + TInt fileSize; + r = file.Size( fileSize ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( fileSize, KHello8FileSize ); + + TBuf8<5> buf; + r = file.Read( buf ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( buf.Length(), KHello8FileSize ); + test(buf == KHello8FileContent); + file.Close(); + } + } + + +LOCAL_C void FillRandomBuffer( TDes8& aDes, TRandomGenerator& aRand, TInt aLength ) + { + aDes.SetLength( aLength ); + TUint* ptr = (TUint*)aDes.Ptr(); + while( aLength >= 4 ) + { + TUint v = aRand.Next(); + *ptr++ = v; + aLength -= 4; + } + if( aLength ) + { + TUint v = aRand.Next(); + TUint8* p8 = (TUint8*)ptr; + while( aLength ) + { + *p8++ = (TUint8)(v & 0xFF); + v >>= 8; + --aLength; + } + } + } + +LOCAL_C TBool ValidateRandomBuffer( const TDes8& aDes, TUint aSeed ) + { + const TUint* ptr = (const TUint*)aDes.Ptr(); + TInt length = aDes.Length(); + + TRandomGenerator rand; + rand.SetSeed( aSeed ); + while( length >= 4 ) + { + TUint v = rand.Next(); + if( *ptr++ != v ) + { + return EFalse; + } + length -= 4; + } + if( length ) + { + TUint v = rand.Next(); + TUint8* p8 = (TUint8*)ptr; + while( length ) + { + if( *p8++ != (TUint8)(v & 0xFF) ) + { + return EFalse; + } + v >>= 8; + --length; + } + } + return ETrue; + } + + + +LOCAL_C void TestFilesInSameDirectoryL(TInt aDriveToTest) + // + // Tests opening different files in the same directory + // + { + test.Next( _L("Testing files in same directory") ); + + struct TTheFiles + { + RFile iFile; + TRandomGenerator iRand; + }; + TTheFiles files[4]; + + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + name.Append( KSameDirFile1 ); + TInt r = files[0].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + name.SetLength( 3 ); + name.Append( KSameDirFile2 ); + r = files[1].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + name.SetLength( 3 ); + name.Append( KSameDirFile3 ); + r = files[2].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + name.SetLength( 3 ); + name.Append( KSameDirFile4 ); + r = files[3].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + const TInt KReadLen = KSameDirFileLength / 16; + TBuf8 readBuf; + TBuf8 randomBuf; + + files[0].iRand.SetSeed( KSameDirFile1Seed ); + files[1].iRand.SetSeed( KSameDirFile2Seed ); + files[2].iRand.SetSeed( KSameDirFile3Seed ); + files[3].iRand.SetSeed( KSameDirFile4Seed ); + + for( TInt fragment = 0; fragment < (KSameDirFileLength / KReadLen); ++fragment ) + { + // read next fragment from each file and compare + for( TInt j = 0; j < 4; ++j ) + { + FillRandomBuffer( randomBuf, files[j].iRand, KReadLen ); + r = files[j].iFile.Read( readBuf ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( readBuf.Length(), KReadLen ); + test( readBuf == randomBuf ); + } + } + files[0].iFile.Close(); + files[1].iFile.Close(); + files[2].iFile.Close(); + files[3].iFile.Close(); + } + + +LOCAL_C void TestFilesSameNameDifferentDirectoryL(TInt aDriveToTest) + // + // Tests opening files with the same name but in different directories + // + { + test.Next( _L("Testing files with same name in different directories") ); + + struct TTheFiles + { + RFile iFile; + TRandomGenerator iRand; + }; + TTheFiles files[4]; + + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + name.Append( KSameNameFile1 ); + TInt r = files[0].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + name.SetLength( 3 ); + name.Append( KSameNameFile2 ); + r = files[1].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + name.SetLength( 3 ); + name.Append( KSameNameFile3 ); + r = files[2].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + name.SetLength( 3 ); + name.Append( KSameNameFile4 ); + r = files[3].iFile.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + const TInt KReadLen = KSameNameFileLength / 16; + TBuf8 readBuf; + TBuf8 randomBuf; + + files[0].iRand.SetSeed( KSameNameFile1Seed ); + files[1].iRand.SetSeed( KSameNameFile2Seed ); + files[2].iRand.SetSeed( KSameNameFile3Seed ); + files[3].iRand.SetSeed( KSameNameFile4Seed ); + + for( TInt fragment = 0; fragment < (KSameDirFileLength / KReadLen); ++fragment ) + { + // read next fragment from each file and compare + for( TInt j = 0; j < 4; ++j ) + { + FillRandomBuffer( randomBuf, files[j].iRand, KReadLen ); + r = files[j].iFile.Read( readBuf ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( readBuf.Length(), KReadLen ); + test( readBuf == randomBuf ); + } + } + files[0].iFile.Close(); + files[1].iFile.Close(); + files[2].iFile.Close(); + files[3].iFile.Close(); + } + + + + +LOCAL_C void TestRandomSeekL(TInt aDriveToTest) + // + // Tests reading from random positions in a file + // + { + test.Next( _L("Testing random read position") ); + + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + name.Append( KRandomReadFile ); + RFile file; + TInt r = file.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + // Check file size + TInt fileSize; + r = file.Size( fileSize ), + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( fileSize, KRandomReadFileSize ); + + // Fill buffer with expected file contents + TRandomGenerator rand; + rand.SetSeed( KRandomReadFileSeed ); + FillRandomBuffer( gFileBuffer, rand, KRandomReadFileSize ); + + + // Read from random positions within the file + rand.SetSeed( 0xA6E320F1 ); + const TInt KMaxRead = 256; + TBuf8 buf; + const TInt maxRead = Min( fileSize, buf.MaxLength() ); + for( TInt readCount = 0; readCount < 100; ++readCount ) + { + TInt readLen = rand.Next() % (maxRead+1); + if( readLen > buf.MaxLength() ) + { + readLen = buf.MaxLength(); + } + TInt readPos = rand.Next() % (fileSize - readLen); + + _LIT( KMessage, "Reading %d bytes from 0x%x" ); + test.Printf( KMessage, readLen, readPos ); + + const TUint8* pExpected = gFileBuffer.Ptr() + readPos; + r = file.Seek( ESeekStart, readPos ); + TEST_FOR_ERROR( r ); + + r = file.Read( buf, readLen ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( buf.Length(), readLen ); + + const TUint8* pRead = buf.Ptr(); + test( 0 == Mem::Compare( pExpected, readLen, pRead, readLen ) ); + } + } + + +LOCAL_C void TestEofReadL(TInt aDriveToTest) + // + // Test reading off the end of a file + // + { + test.Next( _L("Testing reading past EOF") ); + + + const TDesC* const fileArray[6] = + { + &KEofFile1, &KEofFile2, &KEofFile3, &KEofFile4, &KEofFile5, &KEofFile6 + }; + + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + TRandomGenerator rand; + rand.SetSeed( 0x1001A005 ); + for( TInt i = 0; i < 6; i++ ) + { + name.SetLength( 3 ); // trim back to drive specifier + name.Append( *fileArray[i] ); + test.Printf( _L("Opening file %S"), &name ); + RFile file; + TInt r = file.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + TInt fileSize; + r = file.Size( fileSize ), + TEST_FOR_ERROR( r ); + test( fileSize > 0 ); + + TInt readPos = fileSize - ( rand.Next() % 12); + if( readPos < 0 ) + { + readPos = 0; + } + r = file.Seek( ESeekStart, readPos ); + TEST_FOR_ERROR( r ); + + TBuf8<32> buf; + r = file.Read( buf ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( buf.Length(), fileSize - readPos ); + file.Close(); + } + + } + + + +LOCAL_C void TestStreamReadL(TInt aDriveToTest) + // + // Reads the whole file into a buffer in a single read + // and validates the data + // + { + test.Next( _L("Testing whole file read") ); + + const TDesC* const fileArray[4] = + { + &KStreamFile1, &KStreamFile2, &KStreamFile3, &KStreamFile4 + }; + + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + for( TInt i = 0; i < 4; ++i ) + { + name.SetLength(3); + name.Append( *fileArray[i] ); + + test.Printf( _L("... file %S"), &name ); + + RFile file; + TInt r = file.Open( TheFs, name, EFileRead ); + TEST_FOR_ERROR( r ); + + TInt fileSize; + r = file.Size( fileSize ), + TEST_FOR_ERROR( r ); + test( fileSize > 0 ); + + r = file.Read( gFileBuffer ); + TEST_FOR_ERROR( r ); + TEST_FOR_MATCH( fileSize, gFileBuffer.Length() ); + + test( ValidateRandomBuffer( gFileBuffer, KStreamReadSeed ) ); + + file.Close(); + } + } + +//************************ +// Entry point + +void DoTestL(TInt aDriveToTest) + { + test.Title(); + test.Start( _L("Testing ROFS file reading") ); + + test.Printf( _L("Looking for ROFS extension\n")); + TBool extension = EFalse; + TFileName name(KDriveBase); + name[0] = TText('A' + aDriveToTest); + + name.SetLength( 3 ); // trim back to drive specifier + name.Append( KTestFileExt ); + + RFile file; + test.Printf( _L("Opening file %S"), &name ); + TInt r = file.Open( TheFs, name, EFileRead ); + if(r==KErrNone) + { + extension=ETrue; + file.Close(); + test.Printf( _L("ROFS extension found\n")); + } + else if(r==KErrNotFound) + { + test.Printf( _L("Not found, ROFS extension not present\n")); + } + + SpotCheckFilesL(aDriveToTest, extension); + TestFilesInSameDirectoryL(aDriveToTest); + TestFilesSameNameDifferentDirectoryL(aDriveToTest); + TestRandomSeekL(aDriveToTest); + TestEofReadL(aDriveToTest); + TestStreamReadL(aDriveToTest); + + test.End(); + }