diff -r 000000000000 -r e35f40988205 xml/xmlfw/test/rtest/tsrc/tp_perftestbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xml/xmlfw/test/rtest/tsrc/tp_perftestbase.cpp Thu Dec 17 09:29:21 2009 +0200 @@ -0,0 +1,321 @@ +// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// Generic performance test framework implementation. +// +// + +/** + @file + @internalComponent +*/ + +#include +#include +#include +#include +#include + +#include "tp_perftestbase.h" + +/** +The log directory. +*/ +_LIT(KPTestOutput, "c:\\logs\\"); + +/** +Global test object +*/ +RTest test(_L("Perfomance Testing")); + +/** +Class constructor. + +@param aAPIName Name of the API method to test +@param aAPIPtr Pointer to the API method +@param aMaxDuration The maximum duration of the performance test for that API method +*/ +TApiRecord::TApiRecord(const TDesC8& aAPIName, TFuncPtr aAPIPtr, TUint64 aMaxDuration) + { + iAPIName = aAPIName; + iAPIPtr = aAPIPtr; + iMaxDuration = aMaxDuration; + } + +/** +Set method for API pointer attribute + +@param aAPIPtr Pointer to API method +*/ +void TApiRecord::SetAPIPtr(TFuncPtr aAPIPtr) + { + iAPIPtr = aAPIPtr; + } + +/** +Set method for API name attribute + +@param aAPIName Function name +*/ +void TApiRecord::SetAPIName(TDesC8& aAPIName) + { + iAPIName = aAPIName; + } + +/** +Get method for API name attribute + +@return API name string +*/ +const TDesC8& TApiRecord::APIName() + { + return iAPIName; + } + +/** +Get method for API method pointer + +@return API method pointer +*/ +TFuncPtr TApiRecord::APIPtr() + { + return iAPIPtr; + } + +/** +Set method for max duration attribute + +@param aMaxDuration The maximum duration of the performance test for that API method +*/ +void TApiRecord::SetMaxDuration(TUint64 aMaxDuration) + { + iMaxDuration = aMaxDuration; + } + +/** +Get method for max duration attribute + +@return The maximum duration of the performance test for that API method +*/ +TUint64 TApiRecord::MaxDuration() + { + return iMaxDuration; + } + +/** +Class consturctor. +*/ +CPerformanceTests::CPerformanceTests(): iOutputFile(NULL) + { + + } + +/** +Second phase constructor. +Creates adequate directory and output file for logging purposes. + +@param aTestName Test name string +*/ +void CPerformanceTests::ConstructL(const TDesC& aTestName) + { + ParserComandLineL(); + if (iOutputFile != NULL) + { + HBufC* fileName = HBufC::NewLC(KPTestOutput().Length() + iOutputFile->Length()); + TPtr ptr(fileName->Des()); + + User::LeaveIfError(session.Connect()); + + // create the directory if not existing + if (!session.IsValidName(KPTestOutput())) + { + session.MkDirAll(KPTestOutput()); + } + + ptr = KPTestOutput; + ptr.Append(*iOutputFile); + + //create the file + User::LeaveIfError(output.Replace(session, *fileName, EFileWrite )); + CleanupStack::PopAndDestroy(fileName); + } + else + { + test.Start(aTestName); + test.Title(); + } + } + +/** +Destructor. +*/ +CPerformanceTests::~CPerformanceTests() + { + while (list.Count() > 0) + { + delete list[list.Count()-1]; + list.Remove(list.Count()-1); + } + if (iOutputFile != NULL) + { + delete iOutputFile; + } + list.Reset(); + if (iOutputFile) + { + output.Flush(); + output.Close(); + session.Close(); + } + else + { + test.End(); + test.Close(); + } + + } + +/** +Runs all the required tests. +*/ +void CPerformanceTests::RunTestsL() + { + GetMethodListL(list); + iRepNum = GetNumberOfRepetition(); + PrepareTestsL(); + + for (TInt i = 0 ; i < list.Count();i++) + { + TApiRecord* apiRecord = list[i]; + TestApi(*apiRecord); + } + } + +/** +Tests particular API method. +Logs the perfomance benchmarks to the output file. + +@param aApi The API record +*/ +void CPerformanceTests::TestApi(TApiRecord& aApi) + { + TUint64 total = 0; + TUint64 average = 0; + TUint64 firstCall = 0; + TBuf8<255> string; + TInt freq; + + if (iOutputFile) + { + output.Write(aApi.APIName()); + } + + HAL::Get(HAL::EFastCounterFrequency, freq); + + //first call time verification + iEndTime = 0; + iStartTime = 0; + aApi.APIPtr()(); + + //error checking + if (iEndTime == 0 || iStartTime == 0) + { + // user test method did not call either ApiTestStart or ApiTestEnd method + User::Panic(_L("Xml Framework Error"), KErrGeneral); + } + + // calculate and convert to miliseconds + firstCall = (1000000*(iEndTime - iStartTime))/freq; + + for (TInt i = 0; i < iRepNum; i++) + { + // initialize members + iEndTime = 0; + iStartTime = 0; + + //method call + aApi.APIPtr()(); + + //error checking + if (iEndTime == 0 || iStartTime == 0) + { + // user test method did not call either ApiTestStart or ApiTestEnd method + User::Panic(_L("Xml Framework Error"), KErrGeneral); + } + // time counting + total += iEndTime - iStartTime; + } + // calculate and convert to miliseconds + // Fast counter frequency already in MHz + total = (1000000*total)/freq; + average = total/iRepNum; + if (iOutputFile) + { + string.Format(_L8("\n First call time: %Ld ms\n Number of repetitions: %d\n Time: %Ld ms\n Average: %Ld ms\n Max duration: %Ld ms\n\n"), + firstCall, + iRepNum, + total, + average, + aApi.MaxDuration()); + TPtrC8 des(string); + output.Write(des); + } + else + { +#ifdef EABI + test(total < aApi.MaxDuration()); +#else + test(ETrue); +#endif // EABI + TBuf<100> temp; + temp.Copy(aApi.APIName()); + test.Printf(_L("\n %S - Performance testing results\n\t First call time: %Ld ms\n\t Number of repetitions: %d\n\t Time: %Ld ms \n\t Average: %Ld ms\n\t Max duration: %Ld ms \n"), + &temp, firstCall, iRepNum, total, average, aApi.MaxDuration()); + } + } +/** +Stores the start time of Api call. +ApiTestStart and ApiTestEnd should enlosed to particular API call. +*/ +void CPerformanceTests::ApiTestStart() + { + iStartTime = User::FastCounter(); + } + +/** +Stores the end time of Api call. +ApiTestStart and ApiTestEnd should enlosed to particular API call. +*/ +void CPerformanceTests::ApiTestEnd() + { + iEndTime = User::FastCounter(); + } + +/** +Parses the command line +*/ +void CPerformanceTests::ParserComandLineL() + { + CCommandLineArguments* pCmd = CCommandLineArguments::NewLC(); + if (pCmd->Count() == 3) + { + if (pCmd->Arg(1).CompareF(_L("-l")) == 0) + { + iOutputFile = pCmd->Arg(2).AllocL(); + } + } + + CleanupStack::PopAndDestroy(pCmd); + } + +