kerneltest/f32test/bench/t_fsrdirload.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:26:05 +0100
branchRCL_3
changeset 29 743008598095
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) 2006-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\bench\t_fsrdirload.cpp
// 
//

#include <f32file.h>
#include <e32test.h>
#include "t_select.h"
#include "..\server\t_server.h"
#include "t_benchmain.h"


GLDEF_D RTest test(_L("File Server Benchmarks, Dir Load"));

//----------------------------------------------------------------------------------------------
//! @SYMTestCaseID      PBASE-T_FSRDIRLOAD-0273
//! @SYMTestType        CIT
//! @SYMPREQ            PREQ000
//! @SYMTestCaseDesc    This test case is measuring performance of the FAT implementation.  
//! @SYMTestActions     0.  Expects the files to exist in order to successful execution
//!						1.	Time the listing of each directory sorted by name
//!						2.	Time the listing of each directory sorted by extension
//!						3.	Time the listing of each directory sorted by size
//!						4.	Time the listing of each directory sorted by date
//!						5.	Time the search of each file in a directory sorted by name
//!						6.	Time the search of each file in a directory sorted by extension
//!						7.	Time the search of each file in a directory sorted by size
//!						8.	Time the search of each file in a directory sorted by date
//!
//! @SYMTestExpectedResults Finishes if the system behaves as expected, panics otherwise
//! @SYMTestPriority        High
//! @SYMTestStatus          Implemented
//----------------------------------------------------------------------------------------------


LOCAL_D RSemaphore client;
LOCAL_D TRequestStatus stat;
LOCAL_D TBuf8<4096> buf;

LOCAL_D TDriveList gDriveList;


_LIT(KDirMultipleName2, "dir%d_%d\\");

/** Sort a directory with different criterias 

	@param aN 		Number of files in the directory
	@param aKey		Type of sorting to use
	@param aStep 	Test step
*/
LOCAL_C TInt SortFile(TInt aN, TEntryKey aKey, TInt aStep)
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> temp;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;

	if(aN <= gFilesLimit) 
		{	
		CDir* dirPtr;
			
		dir1 = gSessionPath;
		dir2 = gSessionPath;
		dir3 = gSessionPath;
		
		temp.Format(KDirMultipleName2, 1, aN);
		dir1.Append(temp);
		
		temp.Format(KDirMultipleName2, 2, aN);
		dir2.Append(temp);
		
		temp.Format(KDirMultipleName2, 3, aN);
		dir3.Append(temp);
		
		dir1.Append(_L("*.*"));
		dir2.Append(_L("*.*"));
		dir3.Append(_L("*.*"));
		
		if(gTypes >= 1) 
			{		
			startTime.HomeTime();
			r = TheFs.GetDir(dir1,KEntryAttMaskSupported,ESortNone,dirPtr);
			FailIfError(r);

			r = dirPtr->Sort(aKey);
			FailIfError(r);

			endTime.HomeTime();
			delete dirPtr;
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}

		if(gTypes >= 2) 
			{	
			startTime.HomeTime();
			r = TheFs.GetDir(dir2,KEntryAttMaskSupported,ESortNone,dirPtr);
			FailIfError(r);
			
			r = dirPtr->Sort(aKey);
			FailIfError(r);
			endTime.HomeTime();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			delete dirPtr;
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}
		
		if(gTypes >= 3) 
			{	
			startTime.HomeTime();
			r = TheFs.GetDir(dir3,KEntryAttMaskSupported,ESortNone,dirPtr);
			FailIfError(r);
			
			r = dirPtr->Sort(aKey);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken=endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit);
			delete dirPtr;
			}
		}
	
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);
		
	return KErrNone;
	}

/** Sort a directory with different type of files and find a particular one

	@param aN 		Number of files in the directory
	@param aKey		Type of sorting to use
	@param aStep 	Test step
*/
LOCAL_C TInt SortFindFile(TInt aN, TEntryKey aKey, TInt aStep )
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> temp;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;
	
	if(aN <= gFilesLimit) 
		{	
		CDir* dirPtr;
		TInt i = 0;
		TBool found = EFalse;
			
		dir1 = gSessionPath;
		dir2 = gSessionPath;
		dir3 = gSessionPath;
		
		temp.Format(KDirMultipleName2, 1, aN);
		dir1.Append(temp);
		
		temp.Format(KDirMultipleName2, 2, aN);
		dir2.Append(temp);
		
		temp.Format(KDirMultipleName2, 3, aN);
		dir3.Append(temp);
		
		dir1.Append(_L("*.*"));
		dir2.Append(_L("*.*"));
		dir3.Append(_L("*.*"));
		
		if(gTypes >= 1) 
			{	
			startTime.HomeTime();
			r = TheFs.GetDir(dir1, KEntryAttMaskSupported, aKey, dirPtr);
			FailIfError(r);
			
			found = EFalse; 
			i = 0;
			while((i < dirPtr->Count()) && (!found))
				{
				TEntry e = (*dirPtr)[i];
				if(e.iName == _L("last.txt")) found = ETrue;		
				i++;	
				}
			
			endTime.HomeTime();
			delete dirPtr;
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}
		
		if(gTypes >= 2) 
			{	
			startTime.HomeTime();
			r = TheFs.GetDir(dir2, KEntryAttMaskSupported, aKey, dirPtr);
			FailIfError(r);
			
			found = EFalse; 
			i = 0;
			while((i < dirPtr->Count()) && (!found))
				{
				TEntry e = (*dirPtr)[i];
				if(e.iName == _L("last.txt")) found = ETrue;
				i++;	
				}

			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			delete dirPtr;
			
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}
		
		if(gTypes >= 3) 
			{		
			startTime.HomeTime();
			r = TheFs.GetDir(dir3, KEntryAttMaskSupported, aKey, dirPtr);
			FailIfError(r);
			
			found = EFalse; 
			i = 0;
			while((i<dirPtr->Count()) && (!found))
				{
				TEntry e = (*dirPtr)[i];
				if(e.iName == _L("last.txt")) found = ETrue;
				i++;	
				}
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit);
			delete dirPtr;
			}
		}
	
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);

	return KErrNone;
	}
	
	
/** Sort a directory and find a file opens it and reads first 4Kb and last 4Kb

	@param aN 		Number of files in the directory
	@param aKey		Type of sorting to use
	@param aStep 	Test step
*/
LOCAL_C TInt SortFindFileAndOpen(TInt aN, TEntryKey aKey, TInt aStep )
	{
	TBuf16<100> dir1;
	TBuf16<100> dir2;
	TBuf16<100> dir3;
    TBuf16<100> temp;
	
	TInt r = 0;
	TTime startTime;
	TTime endTime;
	TTimeIntervalMicroSeconds timeTaken(0);
	TInt timeTaken1 = -1, timeTaken2 = -1, timeTaken3 = -1;
		
	CDir* dirPtr;
	TInt i = 0, pos = 0;
	TBool found = EFalse;
	RFile file;

	if(aN <= gFilesLimit) 
		{		
		dir1 = gSessionPath;
		dir2 = gSessionPath;
		dir3 = gSessionPath;
		
		temp.Format(KDirMultipleName2, 1, aN);
		dir1.Append(temp);
		
		temp.Format(KDirMultipleName2, 2, aN);
		dir2.Append(temp);
		
		temp.Format(KDirMultipleName2, 3, aN);
		dir3.Append(temp);
		
		dir1.Append(_L("*.*"));
		dir2.Append(_L("*.*"));
		dir3.Append(_L("*.*"));

	
		if(gTypes >= 1) 
			{	
			startTime.HomeTime();
			r = TheFs.GetDir(dir1, KEntryAttMaskSupported, aKey, dirPtr);
			FailIfError(r);
			
			dir1 = gSessionPath;
			temp.Format(KDirMultipleName2, 1, aN);
			dir1.Append(temp);
			dir1.Append(_L("LAST.TXT"));
				
			found = EFalse; 
			i = 0;
			while((i < dirPtr->Count()) && (!found))
				{
				TEntry e = (*dirPtr)[i];
				if(e.iName == _L("LAST.TXT")) 
					{
					found = ETrue;		
					}
				else 
					{
					i++;	
					}
				}
			
			test(found);
			
			file.Open(TheFs, dir1, EFileShareAny|EFileRead);
			pos = 0;
			file.Seek(ESeekStart, pos);
			r = file.Read(buf);
			FailIfError(r);
			pos = -4 * KOneK; // 4 KB before the end of the file
			file.Seek(ESeekEnd, pos);
			r = file.Read(buf);
			FailIfError(r);
			
			endTime.HomeTime();
			delete dirPtr;
			file.Close();
			
			timeTaken = endTime.MicroSecondsFrom(startTime);
			timeTaken1 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}
		
		if(gTypes >= 2) 
			{		
			startTime.HomeTime();
			r = TheFs.GetDir(dir2, KEntryAttMaskSupported, aKey, dirPtr);
			FailIfError(r);
			
			dir2 = gSessionPath;
			temp.Format(KDirMultipleName2, 2, aN); 
			dir2.Append(temp);
			dir2.Append(_L("LAST.TXT"));

			found = EFalse; 
			i = 0;
			while((i < dirPtr->Count()) && (!found))
				{
				TEntry e = (*dirPtr)[i];
				if(e.iName == _L("LAST.TXT")) 
					{
					found = ETrue;
					}
				else 
					{
					i++;	
					}
				}
			
			test(found);
						
			file.Open(TheFs, dir2, EFileShareAny|EFileRead);
			pos = 0;
			file.Seek(ESeekStart, pos);
			r = file.Read(buf);
			FailIfError(r);
			pos = -4 * KOneK;  // 4 KB before the end of the file
			file.Seek(ESeekEnd, pos);
			r = file.Read(buf);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			delete dirPtr;
			file.Close();
			
			timeTaken2 = I64LOW(timeTaken.Int64() / gTimeUnit);
			}
		
		if(gTypes >= 3) 
			{	
			startTime.HomeTime();
			r = TheFs.GetDir(dir3, KEntryAttMaskSupported, aKey, dirPtr);
			FailIfError(r);
			
			dir3 = gSessionPath;
			temp.Format(KDirMultipleName2, 3, aN);
			dir3.Append(temp);
			dir3.Append(_L("LAST.TXT"));

			found = EFalse; 
			i = 0;
			while((i < dirPtr->Count()) && (!found))
				{
				TEntry e = (*dirPtr)[i];
				if(e.iName == _L("LAST.TXT")) 
					{
					found = ETrue;
					}
				else 
					{
					i++;	
					}
				}
			
			file.Open(TheFs, dir3, EFileShareAny|EFileRead);
			pos = 0;
			file.Seek(ESeekStart, pos);
			r = file.Read(buf);
			FailIfError(r);
			pos = -4 * KOneK;  // 4 KB before the end of the file
			file.Seek(ESeekEnd, pos);
			r = file.Read(buf);
			FailIfError(r);
			
			endTime.HomeTime();
			timeTaken = endTime.MicroSecondsFrom(startTime);
			file.Close();
			
			timeTaken3 = I64LOW(timeTaken.Int64() / gTimeUnit);
			delete dirPtr;
			}
		}
	
	PrintResult(aStep, 1, aN);
	PrintResultTime(aStep, 2, timeTaken1);
	PrintResultTime(aStep, 3, timeTaken2);
	PrintResultTime(aStep, 4, timeTaken3);

	return KErrNone;
	}

/** Times the directory listing sorted by name, extension, size and date

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestDirListing(TAny* aSelector)
	{
	TInt i = 100;
	TInt testStep;
	
	Validate(aSelector);
	
	test.Printf(_L("#~TS_Title_%d,%d: Directory listing sorted by name \n"), gTestHarness, gTestCase);
	
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFile(i, ESortByName, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Directory listing sorted by extension\n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFile(i, ESortByExt, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Directory listing sorted by size \n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFile(i, ESortBySize, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Directory listing sorted by date \n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFile(i, ESortByDate, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	return KErrNone;
	}

/** Times the operations required to find a file ordering the list of files by orted by name,
	extension, size and date
	
	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestFindFile(TAny* aSelector)
	{
	TInt i = 100;
	TInt testStep;
	
	Validate(aSelector);
	
	test.Printf(_L("#~TS_Title_%d,%d: Find file when sorted by name \n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFile(i, ESortByName, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Find file when sorted by extension\n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFile(i, ESortByExt, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Find file when sorted by size \n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFile(i, ESortBySize, testStep++);
			}
		i += 100;
		}
	
	gTestCase++;	
	test.Printf(_L("#~TS_Title_%d,%d: Find file when sorted by date \n"), gTestHarness, gTestCase);
	
	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFile(i, ESortByDate, testStep++);
			}
		i += 100;
		}
	
	gTestCase++;
	
	return KErrNone;
	}

/** Times the opening of a file and read of the first 4 Kb when sorted by name, 
	extension, size and date

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestOpenReadFile(TAny* aSelector)
	{
	TInt i = 100;
	TInt testStep;
	
	Validate(aSelector);
	
	test.Printf(_L("#~TS_Title_%d,%d: Open and read file when sorted by name \n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFileAndOpen(i, ESortByName, testStep++);
			}
		i += 100;
		}
	
	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Open and read file when sorted by extension\n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFileAndOpen(i, ESortByExt, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Open and read when sorted by size \n"), gTestHarness, gTestCase);

	i=100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFileAndOpen(i, ESortBySize, testStep++);
			}
		i += 100;
		}

	gTestCase++;
	test.Printf(_L("#~TS_Title_%d,%d: Open and read file when sorted by date \n"), gTestHarness, gTestCase);

	i = 100;
	testStep = 1;
	while(i <= KMaxFiles)
		{
		if(i == 100 || i == 1000 || i == 5000 || i == 10000)
			{
			SortFindFileAndOpen(i, ESortByDate, testStep++);
			}
		i += 100;
		}
	
	gTestCase++;
	return KErrNone;
	}

/** It goes automatically through all the options

	@param aSelector Configuration in case of manual execution
*/
LOCAL_C TInt TestAll(TAny* aSelector)
	{
	Validate(aSelector);
	
	TestDirListing(aSelector);
	TestFindFile(aSelector);
	TestOpenReadFile(aSelector);
	
	return KErrNone;
	}

/** Call all tests

*/
GLDEF_C void CallTestsL()
	{
	TInt r = client.CreateLocal(0);
	FailIfError(r);
	
	CSelectionBox* TheSelector = CSelectionBox::NewL(test.Console());
	
	gFileSize = 8;
	
	// Each test case of the suite has an identifyer for parsing purposes of the results
	gTestHarness = 2; 	
	gTestCase = 1;
	
	PrintHeaders(1, _L("t_fsrdirload. Directory loading"));
		
	if(gMode==0) 
		{ // Manual	
		gSessionPath = _L("?:\\");
		TCallBack createFiles(TestFileCreate,TheSelector);
		TCallBack dirListFile(TestDirListing,TheSelector);
		TCallBack findFile(TestFindFile,TheSelector);
		TCallBack openReadFile(TestOpenReadFile,TheSelector);
		TCallBack allFile(TestAll,TheSelector);
		TheSelector->AddDriveSelectorL(TheFs);
		TheSelector->AddLineL(_L("Create all files"),createFiles);
		TheSelector->AddLineL(_L("Directory listings"),dirListFile);
		TheSelector->AddLineL(_L("Find file in the listing"),findFile);
		TheSelector->AddLineL(_L("Open and read first and last 4KB "),openReadFile);
		TheSelector->AddLineL(_L("Three last options together"),allFile);
		TheSelector->Run();
		}
	else 
		{ // Automatic
		TestAll(TheSelector);
		}
	
	client.Close();
	test.Printf(_L("#~TestEnd_%d\n"), gTestHarness);
	delete TheSelector;
	}