diff -r 000000000000 -r a41df078684a kerneltest/f32test/bench/t_fat_perf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/f32test/bench/t_fat_perf.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,724 @@ +// Copyright (c) 1996-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: +// File Name: f32test/bench/t_fat_perf.cpp +// This file contains implementation for the functions called +// by test cases from the command line to test FAT Performance on +// large number of files (PREQ 1885). +// +// + +//Include files +#include +#include +#include +#include "t_server.h" +#include "t_fat_perf.h" + + + +LOCAL_C void ClearCache(TInt); + +RTest test(_L("T_FAT_PERF")); + +TFileName gPath; +TFileName gFileNameBase; +TInt gFileNo = 0; +TInt gTestCase = -1; +TInt gCacheClear = 0; +TInt gZeroPadFileNumberForFixedLengthFileNames = 0; + + +//----------------------------------------------------------------------------- + +TNamingSchemeParam::TNamingSchemeParam() + : iConOrRan(EConsecutive), iUniOrAsc(EAscii), iZeroPadFileNumber(EFalse), iMaxFileNameLength(0), iMinStringLength(0) + { + iFileNameBase = _L(""); + } + +//----------------------------------------------------------------------------- +/** + This function creates the files in the following directories + INITIAL CONDITION: FILL FOLLOWING SUB-DIRS WITH 1600 FILES + "\\DIR1\\"...2000 files ("ABCD1ABCD2ABCD3ABCD4ABCD5ABCD_1 ~ 2000.TXT") + "\\DIR1\\DIR11\\"...1600 files ("ABCD1ABCD2ABCD3ABCD4ABCD5ABCD_1 ~ 1600.TXT") + "\\DIR1\\DIR11\\DIR111\\"...1610 files ("ABCD1ABCD2ABCD3ABCD4ABCD5ABCD_1 ~ 1600.TXT") + "ANOTHERLONGFILENAME_1~10.TXT" + "\\DIR1\\DIR12RAN\\"...1600 files ("...random string (31~34)....TXT") + "\\DIR2\\"...1600 files ("ABCD1ABCD2ABCD3ABCD4ABCD5ABCD_1 ~ 1600.TXT") + */ +//----------------------------------------------------------------------------- + +LOCAL_C void DoTestCaseSetup() + { + test.Next(_L(" 'Test Setup' - 00")); + + TMLUnitParam mlParam = + { + 12345 // iID + }; + CMeasureAndLogUnit* measureAndLogUnit = CMeasureAndLogUnit::NewLC(mlParam); + CExecutionUnit* execUnit = CExecutionUnit::NewLC(measureAndLogUnit, gDriveToTest); + + TInt curDriveNum; + TInt err = TheFs.CharToDrive(gDriveToTest, curDriveNum); + test(KErrNone == err); + FormatFatDrive(TheFs,curDriveNum, EQuickFormat, NULL, EFalse); + +/*----------------------------------------------------------------------------- + * Setup for "\\DIR1\\" + *-----------------------------------------------------------------------------*/ + + TNamingSchemeParam namingScheme; + namingScheme.iConOrRan = EConsecutive; + namingScheme.iUniOrAsc = EAscii; + namingScheme.iZeroPadFileNumber = EFalse; + namingScheme.iFileNameBase = _L("ABCD1ABCD2ABCD3ABCD4ABCD5ABCD_"); + namingScheme.iMaxFileNameLength = 0; + namingScheme.iMinStringLength = 0; + + TDirUnitParam dirParam1; + dirParam1.iPriority = 1; + dirParam1.iDirName = _L("?:\\DIR1\\"); + dirParam1.iRuns = 1; + dirParam1.iFilesPerRun = 2000; + dirParam1.iSampleInterval = 0; + dirParam1.iNamingScheme = namingScheme; + dirParam1.iFileOpMode = EFATPerfFileCreate; + + execUnit->AddDirUnitL(dirParam1); + +/*----------------------------------------------------------------------------- + * Setup for "\\DIR1\\DIR11\\" + *-----------------------------------------------------------------------------*/ + + TDirUnitParam dirParam11 = dirParam1; + dirParam11.iDirName = _L("?:\\DIR1\\DIR11\\"); + dirParam11.iFilesPerRun = 1600; + dirParam11.iSampleInterval = 0; + + execUnit->AddDirUnitL(dirParam11); + +/*----------------------------------------------------------------------------- + * Setup for "\\DIR1\\DIR11\\DIR111\\" + *-----------------------------------------------------------------------------*/ + + TDirUnitParam dirParam111 = dirParam1; + dirParam111.iDirName = _L("?:\\DIR1\\DIR11\\DIR111\\"); + dirParam111.iFilesPerRun = 1600; + dirParam111.iSampleInterval = 0; + + execUnit->AddDirUnitL(dirParam111); + +/*----------------------------------------------------------------------------- + * Test setup for "\\DIR1\\DIR11\\DIR111\\" with "ANOTHERLONGFILENAME_" file + *-----------------------------------------------------------------------------*/ + + TNamingSchemeParam namingScheme111A = namingScheme; + namingScheme111A.iFileNameBase = _L("ANOTHERLONGFILENAME_"); + + TDirUnitParam dirParam111A = dirParam1; + dirParam111A.iDirName = _L("?:\\DIR1\\DIR11\\DIR111\\"); + dirParam111A.iFilesPerRun = 10; + dirParam111A.iSampleInterval = 0; + dirParam111A.iNamingScheme = namingScheme111A; + + execUnit->AddDirUnitL(dirParam111A); + +/*----------------------------------------------------------------------------- + * Setup for "\\DIR1\\DIR12RAN\\" + *-----------------------------------------------------------------------------*/ + + TNamingSchemeParam namingScheme12 = namingScheme; + namingScheme12.iConOrRan = ERandom; + namingScheme12.iZeroPadFileNumber = EFalse; + namingScheme12.iFileNameBase = _L(""); + namingScheme12.iMaxFileNameLength = 34; + namingScheme12.iMinStringLength = 31; + + TDirUnitParam dirParam12 = dirParam1; + dirParam12.iDirName = _L("?:\\DIR1\\DIR12RAN\\"); + dirParam12.iFilesPerRun = 1600; + dirParam12.iSampleInterval = 0; + dirParam12.iNamingScheme = namingScheme12; + + execUnit->AddDirUnitL(dirParam12); + +/*----------------------------------------------------------------------------- + * Setup for "\\DIR2\\" + *-----------------------------------------------------------------------------*/ + + TDirUnitParam dirParam2 = dirParam1; + dirParam2.iDirName = _L("?:\\DIR2\\"); + dirParam2.iFilesPerRun = 1600; + dirParam2.iSampleInterval = 0; + dirParam2.iNamingScheme = namingScheme; + + execUnit->AddDirUnitL(dirParam2); + + execUnit->Run(); + CleanupStack::PopAndDestroy(2); + } + +//----------------------------------------------------------------------------- +/** +This function creates a files in the valid directory path +*/ +//----------------------------------------------------------------------------- +LOCAL_C void DoTestCaseCreateFile() + { + test.Next(_L(" 'Create File' - 01")); + + TMLUnitParam mlParam = + { + 12345 // iID + }; + CMeasureAndLogUnit* measureAndLogUnit = CMeasureAndLogUnit::NewLC(mlParam); + CExecutionUnit* execUnit = CExecutionUnit::NewLC(measureAndLogUnit, gDriveToTest); + + ClearCache(gCacheClear); + + TNamingSchemeParam namingScheme; + namingScheme.iZeroPadFileNumber = gZeroPadFileNumberForFixedLengthFileNames; + + TDirUnitParam dirParam1; + dirParam1.iPriority = 1; + dirParam1.iDirName = _L(""); + dirParam1.iRuns = 1; + dirParam1.iFilesPerRun = 0; + dirParam1.iSampleInterval = 1; + dirParam1.iNamingScheme = namingScheme; + dirParam1.iFileOpMode = EFATPerfFileCreate; + + + TFileName path = _L("?:\\"); + path.Append(gPath); + if (path[path.Length() - 1] != '\\') + { + path.Append('\\'); + } + + dirParam1.iDirName = path; + dirParam1.iFilesPerRun = gFileNo; + dirParam1.iNamingScheme.iFileNameBase = gFileNameBase; + + execUnit->AddDirUnitL(dirParam1); + execUnit->Run(); + + CleanupStack::PopAndDestroy(2); + + } + +//----------------------------------------------------------------------------- +/** +This function opens file in the valid directoy path +*/ +//----------------------------------------------------------------------------- + +LOCAL_C void DoTestCaseOpenFile() + { + test.Next(_L(" 'Open File' - 02")); + + TMLUnitParam mlParam = + { + 12345 // iID + }; + CMeasureAndLogUnit* measureAndLogUnit = CMeasureAndLogUnit::NewLC(mlParam); + CExecutionUnit* execUnit = CExecutionUnit::NewLC(measureAndLogUnit, gDriveToTest); + + ClearCache(gCacheClear); + + TNamingSchemeParam namingScheme; + namingScheme.iZeroPadFileNumber = gZeroPadFileNumberForFixedLengthFileNames; + + TDirUnitParam dirParam1; + dirParam1.iPriority = 1; + dirParam1.iDirName = _L(""); + dirParam1.iRuns = 1; + dirParam1.iFilesPerRun = 0; + dirParam1.iSampleInterval = 1; + dirParam1.iNamingScheme = namingScheme; + dirParam1.iFileOpMode = EFATPerfFileOpen; + + + TFileName path = _L("?:\\"); + path.Append(gPath); + if (path[path.Length() - 1] != '\\') + { + path.Append('\\'); + } + + dirParam1.iDirName = path; + dirParam1.iFilesPerRun = gFileNo; + dirParam1.iNamingScheme.iFileNameBase = gFileNameBase; + + execUnit->AddDirUnitL(dirParam1); + execUnit->Run(); + + CleanupStack::PopAndDestroy(2); + + } + +//----------------------------------------------------------------------------- +/** +This function deletes the files in the valid directory path +*/ +//----------------------------------------------------------------------------- + +LOCAL_C void DoTestCaseDeleteFile() + { + test.Next(_L(" 'Delete File' - 03")); + + TMLUnitParam mlParam = + { + 12345 // iID + }; + CMeasureAndLogUnit* measureAndLogUnit = CMeasureAndLogUnit::NewLC(mlParam); + CExecutionUnit* execUnit = CExecutionUnit::NewLC(measureAndLogUnit, gDriveToTest); + + ClearCache(gCacheClear); + + TNamingSchemeParam namingScheme; + namingScheme.iZeroPadFileNumber = gZeroPadFileNumberForFixedLengthFileNames; + + TDirUnitParam dirParam1; + dirParam1.iPriority = 1; + dirParam1.iDirName = _L(""); + dirParam1.iRuns = 1; + dirParam1.iFilesPerRun = 0; + dirParam1.iSampleInterval = 1; + dirParam1.iNamingScheme = namingScheme; + dirParam1.iFileOpMode = EFATPerfFileDelete; + + TFileName path = _L("?:\\"); + path.Append(gPath); + if (path[path.Length() - 1] != '\\') + { + path.Append('\\'); + } + + dirParam1.iDirName = path; + dirParam1.iFilesPerRun = gFileNo; + dirParam1.iNamingScheme.iFileNameBase = gFileNameBase; + + execUnit->AddDirUnitL(dirParam1); + execUnit->Run(); + + CleanupStack::PopAndDestroy(2); + + } + +//----------------------------------------------------------------------------- +/** +PREQ1885 - optional test case +This function writes data into the files in the valid directory path +*/ +//----------------------------------------------------------------------------- + +LOCAL_C void DoTestCaseWriteFile() + { + test.Next(_L(" 'Write File' - 04 - Write 4KB of Data")); + + TMLUnitParam mlParam = + { + 12345 // iID + }; + CMeasureAndLogUnit* measureAndLogUnit = CMeasureAndLogUnit::NewLC(mlParam); + CExecutionUnit* execUnit = CExecutionUnit::NewLC(measureAndLogUnit, gDriveToTest); + + ClearCache(gCacheClear); + + TNamingSchemeParam namingScheme; + namingScheme.iZeroPadFileNumber = gZeroPadFileNumberForFixedLengthFileNames; + + TDirUnitParam dirParam1; + dirParam1.iPriority = 1; + dirParam1.iDirName = _L(""); + dirParam1.iRuns = 1; + dirParam1.iFilesPerRun = 0; + dirParam1.iSampleInterval = 1; + dirParam1.iNamingScheme = namingScheme; + dirParam1.iFileOpMode = EFATPerfFileWrite; + + TFileName path = _L("?:\\"); + path.Append(gPath); + if (path[path.Length() - 1] != '\\') + { + path.Append('\\'); + } + + dirParam1.iDirName = path; + dirParam1.iFilesPerRun = gFileNo; + dirParam1.iNamingScheme.iFileNameBase = gFileNameBase; + + execUnit->AddDirUnitL(dirParam1); + execUnit->Run(); + + CleanupStack::PopAndDestroy(2); + + } + +//----------------------------------------------------------------------------- +/** +PREQ1885 - optional test case +This function Reads data from the files in the valid directory path +*/ +//----------------------------------------------------------------------------- + +LOCAL_C void DoTestCaseReadFile() + { + test.Next(_L(" 'Read File' - 05 Read 4KB of data")); + + TMLUnitParam mlParam = + { + 12345 // iID + }; + CMeasureAndLogUnit* measureAndLogUnit = CMeasureAndLogUnit::NewLC(mlParam); + CExecutionUnit* execUnit = CExecutionUnit::NewLC(measureAndLogUnit, gDriveToTest); + + ClearCache(gCacheClear); + + TNamingSchemeParam namingScheme; + namingScheme.iZeroPadFileNumber = gZeroPadFileNumberForFixedLengthFileNames; + + TDirUnitParam dirParam1; + dirParam1.iPriority = 1; + dirParam1.iDirName = _L(""); + dirParam1.iRuns = 1; + dirParam1.iFilesPerRun = 0; + dirParam1.iSampleInterval = 1; + dirParam1.iNamingScheme = namingScheme; + dirParam1.iFileOpMode = EFATPerfFileRead; + + + TFileName path = _L("?:\\"); + path.Append(gPath); + if (path[path.Length() - 1] != '\\') + { + path.Append('\\'); + } + + dirParam1.iDirName = path; + dirParam1.iFilesPerRun = gFileNo; + dirParam1.iNamingScheme.iFileNameBase = gFileNameBase; + + execUnit->AddDirUnitL(dirParam1); + execUnit->Run(); + + CleanupStack::PopAndDestroy(2); + + } + +//----------------------------------------------------------------------------- +/** +This function Dumps the information about Directory Cache +*/ +// +LOCAL_C void DoTestCaseDirCacheInfo() + { + ClearCache(gCacheClear); + RDebug::Print(_L("Dumping DirCache Info - Only for DEBUG Mode \n")); + #if defined(_DEBUG) || defined(_DEBUG_RELEASE) + TInt ret = TheFs.ControlIo(CurrentDrive(), ETestFATDirCacheInfo); // For DirCache info + if (ret != KErrNone) + { + RDebug::Print(_L("RFs::ControlIo() returned %d when attempting to dump cache info"), ret); + } + ret = TheFs.ControlIo(CurrentDrive(), ETestDumpFATDirCache); // For Dumping DirCache contents + if (ret != KErrNone) + { + RDebug::Print(_L("RFs::ControlIo() returned %d when attempting to dump cache contents"), ret); + } + #endif + } + +/* To clear the cache - remount drive */ + +LOCAL_C void ClearCache(TInt gCacheClear) + { + TInt rel = KErrNone; + if (gCacheClear == 1) + { + // Remount the drive to clear the cache + rel = RemountFS (TheFs, CurrentDrive(), NULL); + if (rel != KErrNone) + { + RDebug::Print(_L("<>: Remounting: %d\n"), rel); + User::Leave(rel); + } + } + + } + + +/* Function for command line arguments for the tests */ +LOCAL_C void ParseMyCommandArguments() + { + TBuf<0x100> cmd; + User::CommandLine(cmd); + TLex lex(cmd); + TPtrC token=lex.NextToken(); + TFileName thisfile=RProcess().FileName(); + if (token.MatchF(thisfile)==0) + { + token.Set(lex.NextToken()); + } + test.Printf(_L("CLP=%S"),&token); + + if(token.Length()!=0) + { + gDriveToTest=token[0]; + gDriveToTest.UpperCase(); + } + else + { + gDriveToTest='C'; + return; + } + + while (!lex.Eos()) + { + token.Set(lex.NextToken()); + if (token.Compare(_L("-c")) == 0 || token.Compare(_L("-C")) == 0) + { + token.Set(lex.NextToken()); + if (token.MatchF(_L("Setup"))==0) + { + + gTestCase = EFATPerfSetup; + + } + else if (token.MatchF(_L("Create"))==0) + { + + gTestCase = EFATPerfCreate; + + } + + else if (token.MatchF(_L("Open"))==0) + { + + gTestCase = EFATPerfOpen; + + } + + else if (token.MatchF(_L("Delete"))==0) + + { + + gTestCase = EFATPerfDelete; + + } + + else if (token.MatchF(_L("Write"))==0) + { + + gTestCase = EFATPerfWrite; + + } + + else if (token.MatchF(_L("Read"))==0) + + { + + gTestCase = EFATPerfRead; + + } + else if (token.MatchF(_L("Dumpinfo"))==0) + { + gTestCase = EFATPerfDirCacheInfo; + } + else + { + test.Printf(_L("Bad command syntax")); + test(EFalse); + } + } + + if (token.Compare(_L("-p")) == 0 || token.Compare(_L("-P")) == 0) + { + token.Set(lex.NextToken()); + if (token.Length() != 0) + { + gPath = token; + } + else + { + test.Printf(_L("Bad command syntax")); + test(EFalse); + } + } + + if (token.Compare(_L("-b")) == 0 || token.Compare(_L("-B")) == 0) + { + token.Set(lex.NextToken()); + if (token.Length() != 0) + { + gFileNameBase = token; + } + else + { + test.Printf(_L("Bad command syntax")); + test(EFalse); + } + } + + if (token.Compare(_L("-n")) == 0 || token.Compare(_L("-N")) == 0) + { + token.Set(lex.NextToken()); + if (token.Length() != 0) + { + TLex tokenLex; + tokenLex.Assign(token); + TInt value; + tokenLex.Val(value); + gFileNo = value; + } + else + { + test.Printf(_L("Bad command syntax")); + test(EFalse); + } + } + + if (token.Compare(_L("-m")) == 0 || token.Compare(_L("-M")) == 0) + { + token.Set(lex.NextToken()); + if (token.Length() != 0) + { + TLex tokenLex; + tokenLex.Assign(token); + TInt value; + tokenLex.Val(value); + gCacheClear = value; + } + else + { + test.Printf(_L("Bad command syntax")); + test(EFalse); + } + } + + if (token.Compare(_L("-f")) == 0 || token.Compare(_L("-F")) == 0) + { + token.Set(lex.NextToken()); + if (token.Length() != 0) + { + TLex tokenLex; + tokenLex.Assign(token); + TInt value; + tokenLex.Val(value); + gZeroPadFileNumberForFixedLengthFileNames = value; + } + else + { + test.Printf(_L("Bad command syntax")); + test(EFalse); + } + } + } + } + + +/* System Info */ +LOCAL_C void GetSystemInfo() + { + test.Next(_L("Get System Info")); + TFSName fsName; + TInt drvNo = -1; + TInt err = TheFs.CharToDrive(gDriveToTest, drvNo); + test(err == KErrNone); + err = TheFs.FileSystemSubType(drvNo, fsName); + test(err == KErrNone); + test.Printf(_L("File System: [%S]\n"), &fsName); + TVolumeIOParamInfo ioParam; + err = TheFs.VolumeIOParam(drvNo, ioParam); + test(err == KErrNone); + test.Printf(_L("Sector Size: [%d Bytes]\n"), ioParam.iBlockSize); + test.Printf(_L("Cluster Size: [%d Bytes]\n"), ioParam.iClusterSize); + } + +//----------------------------------------------------------------------------- +/** +Main Function to call specific test features +*/ +//----------------------------------------------------------------------------- +void CallTestsL() + { + + //Interpreting Command Line Arguments + ParseMyCommandArguments(); + + + // Get Drive Information + GetSystemInfo(); + + + // Switch Case for Test Functions + switch(gTestCase) + { + + //Test Setup + case EFATPerfSetup: + { + DoTestCaseSetup(); + break; + } + + //File Create + case EFATPerfCreate: + { + DoTestCaseCreateFile(); + break; + } + + // File Open + case EFATPerfOpen: + { + DoTestCaseOpenFile(); + break; + } + + // File Delete + case EFATPerfDelete: + { + DoTestCaseDeleteFile(); + break; + } + // File Write + case EFATPerfWrite: + { + DoTestCaseWriteFile(); + break; + } + + // File Read + case EFATPerfRead: + { + DoTestCaseReadFile(); + break; + } + // Print / Dump DirCache Info + case EFATPerfDirCacheInfo: + { + DoTestCaseDirCacheInfo(); + break; + } + + default: + break; + } + + } + +/*-- EOF--*/