diff -r 000000000000 -r bde4ae8d615e os/ossrv/genericservices/taskscheduler/Test/bootupperformance/bootupperformance.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/os/ossrv/genericservices/taskscheduler/Test/bootupperformance/bootupperformance.cpp	Fri Jun 15 03:10:57 2012 +0200
@@ -0,0 +1,278 @@
+//
+// bootupperformance.cpp
+
+// Copyright (c) 2007-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:
+// For testing Boot-up Performance Task Scheduler
+// 
+//
+
+/**
+ @file
+ @internalComponent
+ @test
+*/
+//
+#include <e32base.h>
+#include "e32debug.h"
+#include <hal.h>
+#include <csch_cli.h>
+#include <bautils.h>
+#include <f32file.h>
+#include <e32test.h>
+
+_LIT(KTestName,	"Boot-up Performance Task Scheduler");
+RTest	TheTest(KTestName);
+
+//For time counter
+TInt fastTimerFreq;
+TReal ticksPerMicroSec; 
+TReal64 fsSessionMicroSecs;
+TUint prevTime;
+TUint timeDiff;
+
+//file server session
+RFs TheFs;
+
+//Client side interface to the Task Scheduler
+static RScheduler	TheScheduler;
+
+//Backup file name of ask Scheduler
+_LIT(KBackupFileName, "_:\\Private\\10005399\\SchedulesBackup.dat");
+_LIT(KBackupDir, "_:\\Private\\10005399\\");
+
+static TBuf<64> backupFileName;
+static TBuf<32> backupDir;
+
+/**
+ * This function will create a dummy new task
+ * It is used for test performance of Task Scheduler
+ */ 
+void CreateNewTask()
+{
+	TScheduleEntryInfo aScheduleInfo;
+	aScheduleInfo.iIntervalType = EHourly;
+	aScheduleInfo.iInterval = 1;			//every Hour
+	aScheduleInfo.iStartTime = TTime(TDateTime(2020,EJuly,3,13,36,0,0));
+	aScheduleInfo.iValidityPeriod = KMaxTInt;
+
+	TInt err;
+	err = TheScheduler.Connect();
+	TheTest(err == KErrNone);
+	
+	TBuf<255>aFileName = _L("bootupperformance");
+
+	TName  aName = _L("Performance Test");
+	TTaskInfo aTaskInfo(0, aName, 1, -1);
+	err = TheScheduler.Register( aFileName, 1 );
+	TheTest(err == KErrNone);
+	
+	//only one event to add
+	CArrayFixFlat<TScheduleEntryInfo>* array = new (ELeave) CArrayFixFlat<TScheduleEntryInfo>(1);
+	CleanupStack::PushL( array );
+	array->AppendL( aScheduleInfo );
+
+	TSchedulerItemRef aItemRef;
+	TheScheduler.CreatePersistentSchedule( aItemRef, *array );
+
+	HBufC* aBuf = HBufC::NewLC(1);      
+	TheScheduler.ScheduleTask( aTaskInfo, *aBuf, aItemRef, *array );
+	
+	CleanupStack::PopAndDestroy( 2 );
+	TheScheduler.Close();
+}
+
+/**
+ * This function Kill Task Scheduler if it is running
+ * It is used for test performance of Task Scheduler
+ */ 
+void KillTaskScheduler()
+	{
+	TFindProcess findProcess (_L("Schexe.*"));
+	TFullName result;
+	while(findProcess.Next(result) == KErrNone )
+		{
+		TRequestStatus stat;
+		RProcess processHandle;
+		processHandle.Open (findProcess);
+		processHandle.Kill(0);
+		processHandle.Logon(stat);
+		User::WaitForRequest(stat);
+		processHandle.Close();
+		User::After(1000000);
+		}
+	}
+
+/**
+ * This function will Start Task Scheduler directly calling Schexe.exe
+ * It is used for test performance of Task Scheduler
+ */ 	
+void StartTaskScheduler()
+	{
+	TRequestStatus stat;
+	RProcess server;
+	_LIT(KScheduleServerExe, "Schexe");
+	User::LeaveIfError(server.Create(KScheduleServerExe, _L("sysstartschexe")));
+	server.Rendezvous(stat);
+	if (stat!=KRequestPending)
+		server.Kill(0);		// abort startup
+	else
+		server.Resume();	// logon OK - start the server
+	User::WaitForRequest(stat);		// wait for start or death
+	}
+
+//Tests
+//===================================================================
+
+/**
+@SYMTestCaseID          SYSLIB-SCHSVR-PT-1865
+@SYMTestCaseDesc        Measure the overhead to Start Task Scheduler from client
+@SYMTestPriority        High
+@SYMTestActions         Start Task Scheduler by calling Connect & Close
+@SYMTestExpectedResults Tests must not fail
+@SYMDEF                 DEF074891: Task Scheduler: Persistent Schedules not ReScheduled on Device Bootup
+*/
+void PerformanceTestTS1()
+	{
+	
+	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-PT-1865 Start Task Scheduler from client "));	
+	
+	//Kill the Task Scheduler if running 
+	KillTaskScheduler();
+
+//Test Case 1
+	//Delete SchedulesBackup.dat file
+	BaflUtils::DeleteFile(TheFs, backupFileName);
+	TheFs.RmDir(backupDir);
+
+	//Performance Test to start Task Scheduler first run
+	prevTime = User::FastCounter();
+
+	TheScheduler.Connect();
+	TheScheduler.Close();
+	
+	timeDiff = User::FastCounter() - prevTime;
+	fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
+	TheTest.Printf(_L("\nTime to start Task Scheduler from client first run (no file)= %10.2lf microseconds\n"), fsSessionMicroSecs);
+
+//Test Case 2
+	//Performance Test to start Task Scheduler second run
+
+	prevTime = User::FastCounter();
+
+	TheScheduler.Connect();
+	TheScheduler.Close();
+	
+	timeDiff = User::FastCounter() - prevTime;
+	fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
+	TheTest.Printf(_L("\nTime to start Task Scheduler from client second run (with file) = %10.2lf microseconds\n"), fsSessionMicroSecs);
+	
+	}
+	
+/**
+@SYMTestCaseID          SYSLIB-SCHSVR-PT-1866
+@SYMTestCaseDesc        Measure the overhead to Start Task Scheduler directly
+@SYMTestPriority        High
+@SYMTestActions         Start Task Scheduler exe directly and measure the performance
+@SYMTestExpectedResults Tests must not fail
+@SYMDEF                 DEF074891: Task Scheduler: Persistent Schedules not ReScheduled on Device Bootup
+*/
+void PerformanceTestTS2()
+	{
+	
+	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-PT-1866 Start Task Scheduler exe directly "));	
+	
+//Test Case 1	
+	KillTaskScheduler();
+	
+	//Delete SchedulesBackup.dat file
+	BaflUtils::DeleteFile(TheFs, backupFileName);
+	TheFs.RmDir(backupDir);
+	
+	//Performance Test to start Task Scheduler first run
+	prevTime = User::FastCounter();
+
+	StartTaskScheduler();
+	
+	timeDiff = User::FastCounter() - prevTime;
+	fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
+	TheTest.Printf(_L("\nTime to start Task Schedular directly first run (no file) = %10.2lf microseconds\n"), fsSessionMicroSecs);
+
+//Test Case 2
+	//Performance Test to start Task Scheduler first run
+	prevTime = User::FastCounter();
+
+	StartTaskScheduler();
+	
+	timeDiff = User::FastCounter() - prevTime;
+	fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
+	TheTest.Printf(_L("\nTime to start Task Schedular directly second run (with file) = %10.2lf microseconds\n"), fsSessionMicroSecs);
+	
+//Test Case 3
+	CreateNewTask();
+	
+	KillTaskScheduler();
+	//Performance Test to start Task Scheduler first run
+	prevTime = User::FastCounter();
+
+	StartTaskScheduler();
+	
+	timeDiff = User::FastCounter() - prevTime;
+	fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
+	TheTest.Printf(_L("\nTime to Start Task Schedular with Schedule = %10.2lf microseconds\n"), fsSessionMicroSecs);
+
+	}
+
+/**
+Runs all the tests.
+*/
+void RunTestsL()
+	{
+	PerformanceTestTS1();
+	PerformanceTestTS2();
+	}
+
+GLDEF_C TInt E32Main() // main function called by E32
+    {
+    
+  	CTrapCleanup* tc = CTrapCleanup::New();
+  	__UHEAP_MARK;
+
+	backupFileName.Copy(KBackupFileName);
+	backupFileName[0] = RFs::GetSystemDriveChar();
+	
+	backupDir.Copy(KBackupDir);
+	backupDir[0] = RFs::GetSystemDriveChar();
+  	
+  	TheTest.Start(_L("=== Start Task Scheduler tests \n"));
+	TheTest.Title();
+	HAL::Get(HALData::EFastCounterFrequency, fastTimerFreq);
+	ticksPerMicroSec = 1.0E-6 * fastTimerFreq;
+	
+	User::LeaveIfError(TheFs.Connect());
+
+	TRAPD(err,RunTestsL());
+	TheTest(err == KErrNone);
+	
+	//Clean up 	Backup File
+	BaflUtils::DeleteFile(TheFs, backupFileName);
+	TheFs.RmDir(backupDir);
+	TheFs.Close();
+	TheTest.End();
+	TheTest.Close();
+	
+	__UHEAP_MARKEND;
+	delete tc;
+	return 0; // and return
+    }