xml/xmlfw/test/rtest/tsrc/tp_perftestbase.cpp
changeset 0 e35f40988205
--- /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 <e32base.h>
+#include <f32file.h>
+#include <hal.h>
+#include <e32test.h>
+#include <bacline.h>
+
+#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);
+	}
+
+