kerneltest/f32test/rofs/src/t_rofsfile.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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 <e32std.h>
#include <e32std_private.h>
#include <e32test.h>
#include <f32file.h>
#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<KReadLen> readBuf;
	TBuf8<KReadLen> 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<KReadLen> readBuf;
	TBuf8<KReadLen> 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<KMaxRead> 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();
	}