os/ossrv/genericservices/taskscheduler/Test/bootupperformance/bootupperformance.cpp
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/genericservices/taskscheduler/Test/bootupperformance/bootupperformance.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,278 @@
1.4 +//
1.5 +// bootupperformance.cpp
1.6 +
1.7 +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
1.8 +// All rights reserved.
1.9 +// This component and the accompanying materials are made available
1.10 +// under the terms of "Eclipse Public License v1.0"
1.11 +// which accompanies this distribution, and is available
1.12 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.13 +//
1.14 +// Initial Contributors:
1.15 +// Nokia Corporation - initial contribution.
1.16 +//
1.17 +// Contributors:
1.18 +//
1.19 +// Description:
1.20 +// For testing Boot-up Performance Task Scheduler
1.21 +//
1.22 +//
1.23 +
1.24 +/**
1.25 + @file
1.26 + @internalComponent
1.27 + @test
1.28 +*/
1.29 +//
1.30 +#include <e32base.h>
1.31 +#include "e32debug.h"
1.32 +#include <hal.h>
1.33 +#include <csch_cli.h>
1.34 +#include <bautils.h>
1.35 +#include <f32file.h>
1.36 +#include <e32test.h>
1.37 +
1.38 +_LIT(KTestName, "Boot-up Performance Task Scheduler");
1.39 +RTest TheTest(KTestName);
1.40 +
1.41 +//For time counter
1.42 +TInt fastTimerFreq;
1.43 +TReal ticksPerMicroSec;
1.44 +TReal64 fsSessionMicroSecs;
1.45 +TUint prevTime;
1.46 +TUint timeDiff;
1.47 +
1.48 +//file server session
1.49 +RFs TheFs;
1.50 +
1.51 +//Client side interface to the Task Scheduler
1.52 +static RScheduler TheScheduler;
1.53 +
1.54 +//Backup file name of ask Scheduler
1.55 +_LIT(KBackupFileName, "_:\\Private\\10005399\\SchedulesBackup.dat");
1.56 +_LIT(KBackupDir, "_:\\Private\\10005399\\");
1.57 +
1.58 +static TBuf<64> backupFileName;
1.59 +static TBuf<32> backupDir;
1.60 +
1.61 +/**
1.62 + * This function will create a dummy new task
1.63 + * It is used for test performance of Task Scheduler
1.64 + */
1.65 +void CreateNewTask()
1.66 +{
1.67 + TScheduleEntryInfo aScheduleInfo;
1.68 + aScheduleInfo.iIntervalType = EHourly;
1.69 + aScheduleInfo.iInterval = 1; //every Hour
1.70 + aScheduleInfo.iStartTime = TTime(TDateTime(2020,EJuly,3,13,36,0,0));
1.71 + aScheduleInfo.iValidityPeriod = KMaxTInt;
1.72 +
1.73 + TInt err;
1.74 + err = TheScheduler.Connect();
1.75 + TheTest(err == KErrNone);
1.76 +
1.77 + TBuf<255>aFileName = _L("bootupperformance");
1.78 +
1.79 + TName aName = _L("Performance Test");
1.80 + TTaskInfo aTaskInfo(0, aName, 1, -1);
1.81 + err = TheScheduler.Register( aFileName, 1 );
1.82 + TheTest(err == KErrNone);
1.83 +
1.84 + //only one event to add
1.85 + CArrayFixFlat<TScheduleEntryInfo>* array = new (ELeave) CArrayFixFlat<TScheduleEntryInfo>(1);
1.86 + CleanupStack::PushL( array );
1.87 + array->AppendL( aScheduleInfo );
1.88 +
1.89 + TSchedulerItemRef aItemRef;
1.90 + TheScheduler.CreatePersistentSchedule( aItemRef, *array );
1.91 +
1.92 + HBufC* aBuf = HBufC::NewLC(1);
1.93 + TheScheduler.ScheduleTask( aTaskInfo, *aBuf, aItemRef, *array );
1.94 +
1.95 + CleanupStack::PopAndDestroy( 2 );
1.96 + TheScheduler.Close();
1.97 +}
1.98 +
1.99 +/**
1.100 + * This function Kill Task Scheduler if it is running
1.101 + * It is used for test performance of Task Scheduler
1.102 + */
1.103 +void KillTaskScheduler()
1.104 + {
1.105 + TFindProcess findProcess (_L("Schexe.*"));
1.106 + TFullName result;
1.107 + while(findProcess.Next(result) == KErrNone )
1.108 + {
1.109 + TRequestStatus stat;
1.110 + RProcess processHandle;
1.111 + processHandle.Open (findProcess);
1.112 + processHandle.Kill(0);
1.113 + processHandle.Logon(stat);
1.114 + User::WaitForRequest(stat);
1.115 + processHandle.Close();
1.116 + User::After(1000000);
1.117 + }
1.118 + }
1.119 +
1.120 +/**
1.121 + * This function will Start Task Scheduler directly calling Schexe.exe
1.122 + * It is used for test performance of Task Scheduler
1.123 + */
1.124 +void StartTaskScheduler()
1.125 + {
1.126 + TRequestStatus stat;
1.127 + RProcess server;
1.128 + _LIT(KScheduleServerExe, "Schexe");
1.129 + User::LeaveIfError(server.Create(KScheduleServerExe, _L("sysstartschexe")));
1.130 + server.Rendezvous(stat);
1.131 + if (stat!=KRequestPending)
1.132 + server.Kill(0); // abort startup
1.133 + else
1.134 + server.Resume(); // logon OK - start the server
1.135 + User::WaitForRequest(stat); // wait for start or death
1.136 + }
1.137 +
1.138 +//Tests
1.139 +//===================================================================
1.140 +
1.141 +/**
1.142 +@SYMTestCaseID SYSLIB-SCHSVR-PT-1865
1.143 +@SYMTestCaseDesc Measure the overhead to Start Task Scheduler from client
1.144 +@SYMTestPriority High
1.145 +@SYMTestActions Start Task Scheduler by calling Connect & Close
1.146 +@SYMTestExpectedResults Tests must not fail
1.147 +@SYMDEF DEF074891: Task Scheduler: Persistent Schedules not ReScheduled on Device Bootup
1.148 +*/
1.149 +void PerformanceTestTS1()
1.150 + {
1.151 +
1.152 + TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-PT-1865 Start Task Scheduler from client "));
1.153 +
1.154 + //Kill the Task Scheduler if running
1.155 + KillTaskScheduler();
1.156 +
1.157 +//Test Case 1
1.158 + //Delete SchedulesBackup.dat file
1.159 + BaflUtils::DeleteFile(TheFs, backupFileName);
1.160 + TheFs.RmDir(backupDir);
1.161 +
1.162 + //Performance Test to start Task Scheduler first run
1.163 + prevTime = User::FastCounter();
1.164 +
1.165 + TheScheduler.Connect();
1.166 + TheScheduler.Close();
1.167 +
1.168 + timeDiff = User::FastCounter() - prevTime;
1.169 + fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
1.170 + TheTest.Printf(_L("\nTime to start Task Scheduler from client first run (no file)= %10.2lf microseconds\n"), fsSessionMicroSecs);
1.171 +
1.172 +//Test Case 2
1.173 + //Performance Test to start Task Scheduler second run
1.174 +
1.175 + prevTime = User::FastCounter();
1.176 +
1.177 + TheScheduler.Connect();
1.178 + TheScheduler.Close();
1.179 +
1.180 + timeDiff = User::FastCounter() - prevTime;
1.181 + fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
1.182 + TheTest.Printf(_L("\nTime to start Task Scheduler from client second run (with file) = %10.2lf microseconds\n"), fsSessionMicroSecs);
1.183 +
1.184 + }
1.185 +
1.186 +/**
1.187 +@SYMTestCaseID SYSLIB-SCHSVR-PT-1866
1.188 +@SYMTestCaseDesc Measure the overhead to Start Task Scheduler directly
1.189 +@SYMTestPriority High
1.190 +@SYMTestActions Start Task Scheduler exe directly and measure the performance
1.191 +@SYMTestExpectedResults Tests must not fail
1.192 +@SYMDEF DEF074891: Task Scheduler: Persistent Schedules not ReScheduled on Device Bootup
1.193 +*/
1.194 +void PerformanceTestTS2()
1.195 + {
1.196 +
1.197 + TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-PT-1866 Start Task Scheduler exe directly "));
1.198 +
1.199 +//Test Case 1
1.200 + KillTaskScheduler();
1.201 +
1.202 + //Delete SchedulesBackup.dat file
1.203 + BaflUtils::DeleteFile(TheFs, backupFileName);
1.204 + TheFs.RmDir(backupDir);
1.205 +
1.206 + //Performance Test to start Task Scheduler first run
1.207 + prevTime = User::FastCounter();
1.208 +
1.209 + StartTaskScheduler();
1.210 +
1.211 + timeDiff = User::FastCounter() - prevTime;
1.212 + fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
1.213 + TheTest.Printf(_L("\nTime to start Task Schedular directly first run (no file) = %10.2lf microseconds\n"), fsSessionMicroSecs);
1.214 +
1.215 +//Test Case 2
1.216 + //Performance Test to start Task Scheduler first run
1.217 + prevTime = User::FastCounter();
1.218 +
1.219 + StartTaskScheduler();
1.220 +
1.221 + timeDiff = User::FastCounter() - prevTime;
1.222 + fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
1.223 + TheTest.Printf(_L("\nTime to start Task Schedular directly second run (with file) = %10.2lf microseconds\n"), fsSessionMicroSecs);
1.224 +
1.225 +//Test Case 3
1.226 + CreateNewTask();
1.227 +
1.228 + KillTaskScheduler();
1.229 + //Performance Test to start Task Scheduler first run
1.230 + prevTime = User::FastCounter();
1.231 +
1.232 + StartTaskScheduler();
1.233 +
1.234 + timeDiff = User::FastCounter() - prevTime;
1.235 + fsSessionMicroSecs = timeDiff / (ticksPerMicroSec);
1.236 + TheTest.Printf(_L("\nTime to Start Task Schedular with Schedule = %10.2lf microseconds\n"), fsSessionMicroSecs);
1.237 +
1.238 + }
1.239 +
1.240 +/**
1.241 +Runs all the tests.
1.242 +*/
1.243 +void RunTestsL()
1.244 + {
1.245 + PerformanceTestTS1();
1.246 + PerformanceTestTS2();
1.247 + }
1.248 +
1.249 +GLDEF_C TInt E32Main() // main function called by E32
1.250 + {
1.251 +
1.252 + CTrapCleanup* tc = CTrapCleanup::New();
1.253 + __UHEAP_MARK;
1.254 +
1.255 + backupFileName.Copy(KBackupFileName);
1.256 + backupFileName[0] = RFs::GetSystemDriveChar();
1.257 +
1.258 + backupDir.Copy(KBackupDir);
1.259 + backupDir[0] = RFs::GetSystemDriveChar();
1.260 +
1.261 + TheTest.Start(_L("=== Start Task Scheduler tests \n"));
1.262 + TheTest.Title();
1.263 + HAL::Get(HALData::EFastCounterFrequency, fastTimerFreq);
1.264 + ticksPerMicroSec = 1.0E-6 * fastTimerFreq;
1.265 +
1.266 + User::LeaveIfError(TheFs.Connect());
1.267 +
1.268 + TRAPD(err,RunTestsL());
1.269 + TheTest(err == KErrNone);
1.270 +
1.271 + //Clean up Backup File
1.272 + BaflUtils::DeleteFile(TheFs, backupFileName);
1.273 + TheFs.RmDir(backupDir);
1.274 + TheFs.Close();
1.275 + TheTest.End();
1.276 + TheTest.Close();
1.277 +
1.278 + __UHEAP_MARKEND;
1.279 + delete tc;
1.280 + return 0; // and return
1.281 + }