phonebookengines/contactsmodel/tsrc/performance/T_SampProf.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/performance/T_SampProf.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,675 @@
+// Copyright (c) 1997-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:
+//
+
+//************************************************************************************************************
+#include "T_SampProf.h"
+#include <bautils.h>
+#include <profiler.h>
+
+
+//************************************************************************************************************
+_LIT(KTestName,    "T_SampProf");
+
+
+TPtrC commandLineHelp[]=
+	{
+	_L("\n\nCommand Line Syntax:\n"),
+	_L("T_SampProf.exe [del | gen=XX] | count=XX test=XX [batch] [prof] [lfp] [help] \n"),
+	_L("  help     - Prints this help and list of databases \n"),
+	_L("  del      - delete all db's \n"),
+	_L("  gen=99   - gen all db's \n"),
+	_L("  gen=XX   - gen db number XX \n"),
+	_L("  count=XX - XX specifies number of test loops to run \n"),
+	_L("  test=XX  - XX specifies the test number \n"),
+	_L("  prof     - do profiling (otherwise just timings) \n"),
+ 	_L("  batch    - batch mode \n"),
+	_L("  lfp      - Last Name, First Name, Phone Number sort order (lfc otherwise) \n\n\n")
+	};
+TInt KCommandLineHelpCount = sizeof(commandLineHelp)/sizeof(TPtrC);
+
+
+LOCAL_D RTest test(KTestName);
+TPerfTimer perfTimer;
+
+
+#ifdef __SECURE_API__
+
+TPtrC dbNames[]=
+	{
+   _L("c:level1-100-ATS.cdb"),		//0
+   _L("c:simple-100-0.cdb"),			//1
+   _L("c:simple-1000-0.cdb"),			//2
+   _L("c:simple-100-8.cdb"),			//3
+   _L("c:power-100-0.cdb"),			//4
+   _L("c:power-1000-0.cdb"),			//5
+   _L("c:corporate-100-0.cdb"),		//6
+   _L("c:corporate-1000-0.cdb"),		//7
+   _L("c:corporate-500-0.cdb"),		//8
+   _L("c:simple-500-0.cdb"),			//9
+   _L("c:level1-1000-0.cdb"),			//10
+   _L("c:level2-1000-0.cdb"),			//11
+   _L("c:level3-1000-0.cdb"),			//12
+   _L("c:level4-1000-0.cdb")			//13
+	};
+	
+#else
+
+TPtrC dbNames[]=
+	{
+   _L("c:\\system\\data\\level1-100-ATS.cdb"),		//0
+   _L("c:\\system\\data\\simple-100-0.cdb"),			//1
+   _L("c:\\system\\data\\simple-1000-0.cdb"),		//2
+   _L("c:\\system\\data\\simple-100-8.cdb"),			//3
+   _L("c:\\system\\data\\power-100-0.cdb"),			//4
+   _L("c:\\system\\data\\power-1000-0.cdb"),			//5
+   _L("c:\\system\\data\\corporate-100-0.cdb"),		//6
+   _L("c:\\system\\data\\corporate-1000-0.cdb"),	//7
+   _L("c:\\system\\data\\corporate-500-0.cdb"),		//8
+   _L("c:\\system\\data\\simple-500-0.cdb"),			//9
+   _L("c:\\system\\data\\level1-1000-0.cdb"),		//10
+   _L("c:\\system\\data\\level2-1000-0.cdb"),		//11
+   _L("c:\\system\\data\\level3-1000-0.cdb"),		//12
+   _L("c:\\system\\data\\level4-1000-0.cdb")			//13
+	};
+
+#endif
+
+TInt KDbNamesCount = sizeof(dbNames)/sizeof(TPtrC);
+	
+	
+
+//************************************************************************************************************
+//   CTestLoop
+//************************************************************************************************************
+CTestLoop* CTestLoop::NewL(TInt aTest, TInt aCount, TSortOrder aSortOrder, TBool aProf)
+   {
+	CTestLoop* self = new(ELeave)CTestLoop(aTest, aCount, aSortOrder, aProf);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+   }
+
+
+//------------------------------------------------------------------------------------------------------------
+CTestLoop::CTestLoop(TInt aTest, TInt aCount, TSortOrder aSortOrder, TBool aProf)
+:	CActive(CActive::EPriorityStandard),
+   iTest(aTest),
+   iCount(aCount),
+	iLoopCounter(aCount),
+	iSortOrder(aSortOrder),
+	iProf(aProf)
+   {
+   CActiveScheduler::Add(this);
+   }
+
+
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::ConstructL()
+   {
+	_LIT(KParam,"");
+	RProcess p;
+	TInt err;   
+	
+	// Run the Sampling Profiler
+	if (iProf)
+		{
+		err=p.Create(KProfilerName,KParam);
+		if (err == KErrNone)
+			{
+			p.Resume();
+			p.Close();
+			User::After(1000000);
+			}
+		else
+			{
+			test.Printf(_L("ERROR %d: Unable to execute Sampling Profiler\n"), err);
+			}
+		}
+
+	CompleteSelf();
+	}
+
+
+//------------------------------------------------------------------------------------------------------------
+TInt CTestLoop::RunError(TInt /*aError*/)
+   {
+   CActiveScheduler::Stop();
+   return KErrNone;
+   }
+   
+
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::CloseDb()
+   {
+	Cancel();
+	if (iContactRemoteView) 
+	   {
+	   iContactRemoteView->Close(*this);
+	   iContactRemoteView=NULL;
+	   }
+
+   if (iContactsDb) 
+	   {
+	   delete iContactsDb;
+	   iContactsDb=NULL;
+	   }   
+   }
+
+
+//------------------------------------------------------------------------------------------------------------
+CTestLoop::~CTestLoop()
+   {
+   CloseDb();
+   
+	if (iProf) Profiler::Unload();
+   }
+  
+
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::RunL()
+   {
+	TBuf<100>    buf;
+	TInt        ret;      	
+
+   if (iLoopCounter == iCount)
+      {
+		if (iProf)
+			{
+			ret=Profiler::Start();
+			if (ret != KErrNone)
+				{
+				test.Printf(_L("ERROR %d : Unable to start Sampling Profiler.\n"),ret);
+				User::Leave(ret);
+				}
+			}
+      }
+   else
+      {
+      CloseDb();
+      
+      perfTimer.GetTime(buf);
+      test.Printf(_L("%S Database Closed. Loops left: %d \n\n"),&buf, iLoopCounter);
+      }
+   
+  
+   if (iLoopCounter <= 0)  // End of test
+      {
+		if (iProf)
+			{
+			ret=Profiler::Stop();
+			User::After(300000);
+			ret=ret | Profiler::Close();
+			User::After(300000);
+			ret=ret | Profiler::Unload();
+			User::After(300000);         
+			if (ret != KErrNone)
+				{
+				test.Printf(_L("ERROR %d : Unable to Stop/Close/Unload Sampling Profiler\n"),ret);
+				User::Leave(ret);            
+				}
+			}
+      CActiveScheduler::Stop();
+      }
+   else // Next Loop
+      {
+		perfTimer.Reset();      
+      OpenDatabaseL(dbNames[iTest]);
+      CreateRemoteViewL();
+      }
+      
+   iLoopCounter--;         
+   }
+
+
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::HandleContactViewEvent(const CContactViewBase& /*aView*/, const TContactViewEvent& /*aEvent*/)
+   {
+	TBuf<100> buf;
+	
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Remote view Callback received.\n"),&buf);
+   CompleteSelf();
+   }
+
+
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::DoCancel()
+	{
+	}
+
+
+//------------------------------------------------------------------------------------------------------------	
+void CTestLoop::CompleteSelf(TInt aReason)
+   {
+   TRequestStatus* pStat = &iStatus;
+	   
+  	User::RequestComplete(pStat, aReason);
+   SetActive();
+   }
+   
+   
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::CreateRemoteViewL()
+   {
+   RContactViewSortOrder   viewSortOrder;
+	TBuf<100> buf;
+	
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Creating remote view (sync)."),&buf);
+   
+   viewSortOrder.AppendL(KUidContactFieldFamilyName);
+   viewSortOrder.AppendL(KUidContactFieldGivenName);
+   if (iSortOrder==ELFC)
+   	{
+   	viewSortOrder.AppendL(KUidContactFieldCompanyName);
+		test.Printf(_L(" Sort order: LFC.\n"));   	
+   	}
+   else
+   	{
+   	viewSortOrder.AppendL(KUidContactFieldPhoneNumber);   
+		test.Printf(_L(" Sort order: LFP.\n"));
+   	}
+   
+   iContactRemoteView = CContactRemoteView::NewL(*this, *iContactsDb, viewSortOrder, EContactsOnly);
+   viewSortOrder.Close();
+   
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Remote view created (sync).\n"),&buf);
+   }
+
+
+//------------------------------------------------------------------------------------------------------------
+void CTestLoop::OpenDatabaseL(const TDesC& aDbName)
+   {
+	TBuf<100> buf;
+	
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Opening Database: %S\n"),&buf, &aDbName);
+   
+   iContactsDb = CContactDatabase::OpenL(aDbName);
+   
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Database Opened.\n"),&buf);   
+   }
+   
+   
+
+
+//************************************************************************************************************
+//  GENERATE DATABASES
+//************************************************************************************************************
+   
+//@SYMTestCaseID PIM-TSAMPPROF-0001
+   
+void genDatabasesL(TInt aDbNumber)
+	{
+	TBuf<100> buf;
+	bool genAllDbs = false;
+	
+	// 99 means generate all databases
+	if (aDbNumber == 99) genAllDbs = true;
+	
+   test.Start(_L("@SYMTestCaseID PIM-TSAMPPROF-0001 Generate Database  - with timings"));
+   perfTimer.Reset();
+	   
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Creating the CPerfDbCreator\n"),&buf);
+   
+   CPerfDbCreator* dbCreator = CPerfDbCreator::NewL();
+	CleanupStack::PushL(dbCreator);
+
+
+	if ((aDbNumber == 0) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+   	test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[0]);
+   	dbCreator->GenAllTheSameDbL(ELevel1, 100, true, dbNames[0]);
+		}
+
+	if ((aDbNumber == 1) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[1]); 
+	   dbCreator->GenDbL(ESimple, 100,  0, true, dbNames[1]);
+		}
+		
+	if ((aDbNumber == 2) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[2]);
+	   dbCreator->GenDbL(ESimple, 1000, 0, true, dbNames[2]);
+		}
+		
+	if ((aDbNumber == 3) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[3]);
+	   dbCreator->GenDbL(ESimple, 100,  8, true, dbNames[3]);
+		}
+		
+	if ((aDbNumber == 4) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[4]);
+	   dbCreator->GenDbL(EPower, 100,  0, true, dbNames[4]);
+		}
+		
+	if ((aDbNumber == 5) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[5]);
+	   dbCreator->GenDbL(EPower, 1000, 0, true, dbNames[5]);
+		}
+		
+	if ((aDbNumber == 6) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[6]);
+	   dbCreator->GenDbL(ECorporate, 100,  0, true, dbNames[6]);
+		}
+
+	if ((aDbNumber == 7) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[7]);   
+	   dbCreator->GenDbL(ECorporate, 1000, 0, true, dbNames[7]);
+		}
+				
+	if ((aDbNumber == 8) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[8]);   
+	   dbCreator->GenDbL(ECorporate, 500, 0, true, dbNames[8]);
+		}
+		
+	if ((aDbNumber == 9) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[9]);   
+	   dbCreator->GenDbL(ESimple, 500, 0, true, dbNames[9]);
+		}		
+		
+	if ((aDbNumber == 10) || (genAllDbs == true))
+		{
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[10]);
+	   dbCreator->GenDbL(EL1Only, 1000,  0, true, dbNames[10]);
+		}
+		
+	if ((aDbNumber == 11) || (genAllDbs == true))
+		{	   
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[11]);
+	   dbCreator->GenDbL(EL2Only, 1000,  0, true, dbNames[11]);
+		}
+		
+	if ((aDbNumber == 12) || (genAllDbs == true))
+		{	   
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[12]);
+	   dbCreator->GenDbL(EL3Only, 1000,  0, true, dbNames[12]);
+		}
+		
+	if ((aDbNumber == 13) || (genAllDbs == true))
+		{	   
+	   perfTimer.GetTime(buf);
+	   test.Printf(_L("%S Generating:%S\n"), &buf, &dbNames[13]);
+	   dbCreator->GenDbL(EL4Only, 1000,  0, true, dbNames[13]);         
+		}
+		
+   
+   perfTimer.GetTime(buf);
+   test.Printf(_L("%S Destroying the CPerfDbCreator\n"),&buf);   
+
+	CleanupStack::PopAndDestroy(dbCreator);
+	
+	test.End();
+	}
+
+
+
+//************************************************************************************************************
+//  DEL DATABASES
+//************************************************************************************************************
+	
+//@SYMTestCaseID PIM-TSAMPPROF-0002
+	
+void delDatabasesL()
+	{
+	TBuf<100> buf;
+	
+   test.Start(_L("@SYMTestCaseID PIM-TSAMPPROF-0002 Delete Database  - with timings"));
+   perfTimer.Reset();   
+   
+   for (TInt i = 0; i < KDbNamesCount; i++)
+	   if (CContactDatabase::ContactDatabaseExistsL(dbNames[i]))
+	      {
+	      perfTimer.GetTime(buf);      
+	      test.Printf(_L("%S Deleting:%S\n"), &buf, &dbNames[i]);
+	      CContactDatabase::DeleteDatabaseL(dbNames[i]);
+	      }
+	      
+	test.End();
+	}	
+
+
+//************************************************************************************************************
+//  DO TEST
+//************************************************************************************************************
+	
+//@SYMTestCaseID PIM-TSAMPPROF-0003
+	
+void doTestL(TInt aTest, TInt aCount, TSortOrder aSortOrder, TBool aProf)
+	{
+   test.Start(_L("@SYMTestCaseID PIM-TSAMPPROF-0003 API Open with View - timings"));
+
+   CTestLoop* testLoop=CTestLoop::NewL(aTest, aCount, aSortOrder, aProf);
+   CleanupStack::PushL(testLoop);
+   
+   CActiveScheduler::Start();
+   
+	CleanupStack::PopAndDestroy(testLoop);
+	
+	test.End();
+	}
+
+
+//************************************************************************************************************
+// PARSE PARAMETER
+//************************************************************************************************************
+TInt parseNumberL(TDes &aArgs, const TDesC &aParam)
+   {
+   TInt     pos, num, ret;
+	TBuf<100> argsTmp;
+   TLex     lexArgs;	   
+   
+   pos = aArgs.Find(aParam);
+   if (pos == KErrNotFound)
+      User::Leave(KErrArgument);
+
+   argsTmp.Insert(0,aArgs);
+   argsTmp.Delete(0,pos + aParam.Length());
+   lexArgs=argsTmp;
+   ret=lexArgs.Val(num);
+   
+   if (ret != KErrNone)
+      User::Leave(KErrArgument);
+   
+   return num;
+   }
+
+
+//************************************************************************************************************
+// PRINT HELP
+//************************************************************************************************************
+void printHelp()
+	{
+	TInt i;
+	for (i = 0; i < KCommandLineHelpCount; i++) 	
+		{
+		test.Printf(_L("%S"), &commandLineHelp[i]);
+		}
+	
+	test.Printf(_L("DATABASES:\n"));	
+	for (i = 0; i < KDbNamesCount; i++) 	
+		{
+		test.Printf(_L(" %2d - %S \n"), i, &dbNames[i]);
+		}
+	}
+
+
+
+//************************************************************************************************************
+// PRINT BUILD DATE
+//************************************************************************************************************
+void printBuildDate()
+	{
+	TBuf<100>         buf;
+	TPtrC8           ptrDate8 = (TText8*)__DATE__;
+	TPtrC8           ptrTime8 = (TText8*)__TIME__;	
+	TBuf16<50>       bufDate16;
+	TBuf16<50>       bufTime16;	
+
+	test.Printf(_L("\n\n\n"));
+	bufDate16.Copy(ptrDate8);	
+	bufTime16.Copy(ptrTime8);
+	buf.Append(bufDate16);
+	buf.Append(_L("  "));   
+	buf.Append(bufTime16);
+
+	test.Printf(_L("*** Build: %S ***\n"), &buf);   
+	test.Title();
+	}
+
+   
+//************************************************************************************************************
+//************************************************************************************************************
+//  MAIN
+//************************************************************************************************************
+//************************************************************************************************************
+void doMainL()
+	{
+	TBuf<100>       buf, args;
+	TInt            count,testNo;
+	TBool			prof=EFalse;
+	RFs             fs;
+	TSortOrder		sortOrder;
+
+   _LIT(KParamGen,	"gen=");
+   _LIT(KParamDel,	"del");
+   _LIT(KParamCount,	"count=");
+   _LIT(KParamTest,	"test=");
+   _LIT(KParamSort,	"lfp");      
+	_LIT(KParamBatch,	"batch");   
+	_LIT(KParamProf,	"prof");
+	_LIT(KParamHelp,	"help");
+
+	
+	printBuildDate();
+		
+   // Get and prepare Command Line
+#ifndef __SECURE_API__
+   RProcess().CommandLine(args);
+#else
+   User::CommandLine(args);   
+#endif
+   args.LowerCase();
+   
+
+   // Parse param and decide what to do
+   if (args.Find(KParamHelp) != KErrNotFound)
+		printHelp();   
+   else if (args.Find(KParamDel) != KErrNotFound)
+      delDatabasesL();
+   else if (args.Find(KParamGen) != KErrNotFound)
+      genDatabasesL(parseNumberL(args, KParamGen));
+   else
+      {
+		// ECOM should be already running on a real phone. Does not in testshell mode
+		REComSession ecom;
+		ecom.OpenL();
+		User::After(2000000);	      
+      
+      // Parse test number and number of test loops
+      count  = parseNumberL(args, KParamCount);
+      testNo = parseNumberL(args, KParamTest);
+      
+      // Do profiling?
+      if (args.Find(KParamProf) != KErrNotFound)	prof = true;
+      
+		// Check the sort order
+		if (args.Find(KParamSort) != KErrNotFound)
+			{
+			sortOrder=ELFP;
+   		test.Printf(_L("\n\nSORT ORDER: LFP\n\n"));
+			}
+		else
+			{
+			sortOrder=ELFC;
+   		test.Printf(_L("\n\nSORT ORDER: LFC\n\n"));
+			}
+				
+		// Perform the test
+      doTestL(testNo, count, sortOrder, prof);
+      
+		// Copy the profiler.dat file from drive C: to drive E:
+		if (prof)
+			{
+			User::After(10000000);
+			buf.Zero();
+			buf.Format(_L("e:\\sp_test%d_count%d.dat"),testNo, count);
+			fs.Connect();
+			TInt ret=BaflUtils::CopyFile(fs, _L("c:\\PROFILER.DAT"), buf);
+			test.Printf(_L("Copy PROFILER.DAT. Code: %d\n"),ret);
+			fs.Close();
+			}
+			
+	   ecom.Close();
+	   ecom.FinalClose();   
+      }
+   
+   
+   if (args.Find(KParamBatch) == KErrNotFound)
+      {
+      test.Printf(_L("\n\nPress any key.\n"));
+      test.Getch();   
+      }
+      
+	test.Close();      
+	}
+
+
+
+//************************************************************************************************************
+//************************************************************************************************************
+// Program Entry
+//************************************************************************************************************
+//************************************************************************************************************
+GLDEF_C TInt E32Main()
+	{	
+	__UHEAP_MARK;
+	CActiveScheduler* rootScheduler = new CActiveScheduler;
+	CActiveScheduler::Install(rootScheduler);
+	CTrapCleanup* theCleanup=CTrapCleanup::New();
+
+	TRAPD(ret,doMainL());	
+	
+	test(ret==KErrNone);
+	delete theCleanup;	
+	delete rootScheduler;
+	__UHEAP_MARKEND;
+	return(KErrNone);
+	}