os/ossrv/genericservices/taskscheduler/Test/OOM/TC_TSCH_SCHSVR_OOM.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include <csch_cli.h>
    17 #include "Thelpers.h"
    18 
    19 #include <e32base.h>
    20 #include <e32test.h>
    21 #include <f32file.h>
    22 #include <s32file.h>
    23 #include <e32property.h>
    24 #include <schinfointernal.h>
    25 #include "TestUtils.h"
    26 
    27 //
    28 // Literal constants
    29 //
    30 _LIT(KTestName,								"TC_TSCH_SCHSVR_OOM");
    31 
    32 
    33 //
    34 // Type definitions
    35 //
    36 typedef CArrayFixFlat<TScheduleEntryInfo>	CSchEntryInfoArray;
    37 typedef CArrayFixFlat<TTaskInfo>			CTaskInfoArray;
    38 typedef CArrayFixFlat<TSchedulerItemRef>    CSchItemRefArray;
    39 typedef CArrayFixFlat<TTaskSchedulerCondition> CSchConditionArray;
    40 
    41 //
    42 // Global data
    43 //
    44 RTest										TheTest(KTestName);
    45 static RScheduler							TheScheduler;
    46 static CTrapCleanup*						TheCleanup;
    47 static RFs									TheFsSession;
    48 
    49 const TUid KTestUid = TUid::Uid(0x12345678);
    50 const TInt KTestKey1 = 1;
    51 
    52 
    53 //***********************************************************************************
    54 static void GetTaskInfoL(CTaskInfoArray& aTaskInfoArray,
    55 						TInt aScheduleId)
    56 	// Extract schedule references from the schedule server based on a filter. If
    57 	{
    58 	aTaskInfoArray.Reset();
    59 	TTime nextTimeScheduleIsDue;
    60 	TScheduleState state;
    61 	CSchEntryInfoArray* entries 
    62 		= new (ELeave) CSchEntryInfoArray(3);
    63 	CleanupStack::PushL(entries);
    64 	TInt res = TheScheduler.GetScheduleL(aScheduleId, 
    65 										state, 
    66 										*entries, 
    67 										aTaskInfoArray, 
    68 										nextTimeScheduleIsDue);
    69 	TEST2(res, KErrNone);
    70 	CleanupStack::PopAndDestroy(entries);
    71 	}
    72 
    73 //***********************************************************************************
    74 static TInt CountTasksL(TInt aScheduleId)	
    75 	{
    76 	CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3);
    77 	CleanupStack::PushL(tasks);
    78 	GetTaskInfoL(*tasks, aScheduleId);
    79 	TInt ret = tasks->Count();
    80 	CleanupStack::PopAndDestroy(tasks);
    81 	return ret;
    82 	}
    83 
    84 //***********************************************************************************
    85 static TInt CountScheduledItemsL(TScheduleFilter aFilter, 
    86 								RScheduler& aScheduler)
    87 	// Extract schedule references from the schedule server based on a filter. If
    88 	{
    89 	CSchItemRefArray* refs = new (ELeave) CSchItemRefArray(3);
    90 	CleanupStack::PushL(refs);
    91 
    92 	TInt res = aScheduler.GetScheduleRefsL(*refs, aFilter);
    93 	TEST2(res, KErrNone);
    94 
    95 	TInt count = refs->Count();
    96 	CleanupStack::PopAndDestroy(); // refs
    97 	return count;
    98 	}
    99 
   100 
   101 //***********************************************************************************
   102 static CSchEntryInfoArray* CreateScheduleArrayLC()
   103 	{
   104 	CSchEntryInfoArray* entryList = new (ELeave) CSchEntryInfoArray(3);
   105 	CleanupStack::PushL(entryList);
   106 
   107 	TScheduleEntryInfo entry1;
   108 	entry1.iStartTime		= SchSvrHelpers::TimeBasedOnOffset(0, 20); // 20m from "now"
   109 	entry1.iInterval		= 1;
   110 	entry1.iIntervalType	= EDaily;
   111 	entry1.iValidityPeriod	= 20;
   112 	entryList->AppendL(entry1);
   113 	
   114 	return entryList;
   115 	}
   116 
   117 //***********************************************************************************
   118 static CSchConditionArray* CreateConditionArrayLC()
   119 	{
   120 	CSchConditionArray* conditionList = new (ELeave) CSchConditionArray(3);
   121 	CleanupStack::PushL(conditionList);
   122 
   123 	TTaskSchedulerCondition condition1;
   124 	condition1.iCategory = KTestUid;
   125 	condition1.iKey		= KTestKey1;
   126 	condition1.iState	= 10;
   127 	condition1.iType	= TTaskSchedulerCondition::EEquals;
   128 	conditionList->AppendL(condition1);
   129 	
   130 	return conditionList;
   131 	}
   132 
   133 /**
   134 @SYMTestCaseID          SYSLIB-SCHSVR-CT-1027
   135 @SYMTestCaseDesc	    Tests out of memory errors for time based API's
   136 @SYMTestPriority 	    High
   137 @SYMTestActions  	    Test for memory errors,while creating,enabling,disabling,editing and other operations on schedule task 
   138 @SYMTestExpectedResults Test must not fail
   139 @SYMREQ                 REQ0000
   140 */		
   141 static void DoTest1L()
   142 // Time based API's
   143 	{     
   144 	TInt err = KErrNone;
   145 	TInt tryCount = 0;
   146 	
   147 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1027 ===== Starting OOM test ===== "));
   148 	
   149 	CSchEntryInfoArray* scheduleArray = CreateScheduleArrayLC();
   150 	TSchedulerItemRef ref1;
   151 
   152 	TheTest.Next(_L("===== Testing create persistent schedule ====="));
   153 	for (tryCount = 0; ;++tryCount)
   154 		{
   155 		// These allocations are ignored because they cause corruptness
   156 		// of the persistent store.  Its a bit rubbish.
   157 		if(tryCount < 7 || tryCount >8 )
   158 			{
   159 			TheScheduler.__DbgFailNext(tryCount);
   160 			TheScheduler.__DbgMarkHeap();
   161 			err = TheScheduler.CreatePersistentSchedule(ref1, *scheduleArray);
   162 			if (err==KErrNone)
   163 				{
   164 				TheScheduler.__DbgResetHeap();
   165 				break;
   166 				}
   167 			TEST2(err, KErrNoMemory);		
   168 			// reset server side heap for next iteration.
   169 			TheScheduler.__DbgMarkEnd(0);			
   170 			}
   171 		}
   172 	// Check schedule count
   173 	TInt scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   174 	TEST(scheduleCount == 1); 
   175 
   176 	// OK, now we have a persistent schedule
   177 	TheTest.Next(_L("===== Testing disable schedule ====="));
   178 	for (tryCount = 0; ;++tryCount)
   179 		{
   180 		TheScheduler.__DbgFailNext(tryCount);
   181 		TheScheduler.__DbgMarkHeap();
   182 		err = TheScheduler.DisableSchedule(ref1.iHandle);
   183 		if (err==KErrNone)
   184 			{
   185 			TheScheduler.__DbgResetHeap();
   186 			break;
   187 			}
   188 		TEST2(err, KErrNoMemory);		
   189 		// reset server side heap for next iteration.
   190 		TheScheduler.__DbgMarkEnd(0);
   191 		}
   192 	// Check schedule count
   193 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   194 	TEST(scheduleCount == 1); 
   195 
   196 	TheTest.Next(_L("===== Testing enable schedule ====="));
   197 	for (tryCount = 0; ;++tryCount)
   198 		{
   199 		TheScheduler.__DbgFailNext(tryCount);
   200 		TheScheduler.__DbgMarkHeap();
   201 		err = TheScheduler.EnableSchedule(ref1.iHandle);
   202 		if (err==KErrNone)
   203 			{
   204 			TheScheduler.__DbgResetHeap();
   205 			break;
   206 			}
   207 		TEST2(err, KErrNoMemory);		
   208 		// reset server side heap for next iteration.
   209 		TheScheduler.__DbgMarkEnd(0);
   210 		}
   211 	// Check schedule count
   212 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   213 	TEST(scheduleCount == 1); 
   214 
   215 	TheTest.Next(_L("===== Testing edit schedule ====="));
   216 	for (tryCount = 0; ;++tryCount)
   217 		{
   218 		TheScheduler.__DbgFailNext(tryCount);
   219 		TheScheduler.__DbgMarkHeap();
   220 		// Even though we use the same array as before, the task scheduler
   221 		// code is not smart enough to just return but actually replaces
   222 		// the existing one, hence we are actually testing this method fully.
   223 		err = TheScheduler.EditSchedule(ref1.iHandle, *scheduleArray);
   224 		if (err==KErrNone)
   225 			{
   226 			TheScheduler.__DbgResetHeap();
   227 			break;
   228 			}
   229 		TEST2(err, KErrNoMemory);		
   230 		// reset server side heap for next iteration.
   231 		TheScheduler.__DbgMarkEnd(0);
   232 		}
   233 	// Check schedule count
   234 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   235 	TEST(scheduleCount == 1); 
   236 
   237 	TheTest.Next(_L("===== Testing delete schedule ====="));
   238 	for (tryCount = 0; ;++tryCount)
   239 		{
   240 		TheScheduler.__DbgFailNext(tryCount);
   241 		TheScheduler.__DbgMarkHeap();
   242 		err = TheScheduler.DeleteSchedule(ref1.iHandle);
   243 		if (err==KErrNone)
   244 			{
   245 			TheScheduler.__DbgResetHeap();
   246 			break;
   247 			}
   248 		TEST2(err, KErrNoMemory);		
   249 		// reset server side heap for next iteration.
   250 		TheScheduler.__DbgMarkEnd(0);
   251 		}
   252 	// Check schedule count
   253 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   254 	TEST(scheduleCount == 0); 
   255 
   256 	// delete old files.
   257 	// We need to do this because we have actually corrupted the store, 
   258 	// even though its empty.  Without deleting it we get problems below.
   259 	// This is a bit rubbish having to do this but what else can be done??
   260 	TheTest.Next(_L("Delete old files"));
   261 	SchSvrHelpers::DeleteScheduleFilesL();
   262 	
   263 	// OK now add back schedule in preparation for adding tasks.
   264 	err = TheScheduler.CreatePersistentSchedule(ref1, *scheduleArray);
   265 	TEST2(err, KErrNone);
   266 
   267 	TheTest.Next(_L("===== Testing ScheduleTask ====="));
   268 	
   269 	_LIT(KTaskName, "TheTaskName");
   270 	TName name = KTaskName();
   271 	TTaskInfo taskInfo(0, name, 2, 0);
   272 
   273 	HBufC* data = _L("the data").AllocLC();
   274 	// cant test ScheduleTask API using OOM loop as it does dodgy things to 
   275 	// the store which cause allocation problems.  Need to investigate this 
   276 	// later at some stage.
   277 	TEST2(TheScheduler.ScheduleTask(taskInfo, *data, ref1.iHandle), KErrNone);
   278 	
   279 	// Check schedule and task count
   280 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   281 	TEST(scheduleCount == 1); 
   282 	TInt taskCount = CountTasksL(ref1.iHandle);
   283 	TEST(taskCount = 1);	
   284 
   285 	TheTest.Next(_L("===== Testing GetScheduleRefsL ====="));
   286 
   287 	CSchItemRefArray* refs = new (ELeave) CSchItemRefArray(3);
   288 	CleanupStack::PushL(refs);
   289 	for (tryCount = 0; ;++tryCount)
   290 		{
   291 		TheScheduler.__DbgFailNext(tryCount);
   292 		TheScheduler.__DbgMarkHeap();
   293 		err = TheScheduler.GetScheduleRefsL(*refs, EPendingSchedules);
   294 		if (err==KErrNone)
   295 			{
   296 			TheScheduler.__DbgResetHeap();
   297 			break;
   298 			}
   299 		TEST2(err, KErrNoMemory);		
   300 		// reset server side heap for next iteration.
   301 		TheScheduler.__DbgMarkEnd(0);
   302 		}
   303 	// Check schedule and task count
   304 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   305 	TEST(scheduleCount == 1); 
   306 	taskCount = CountTasksL(ref1.iHandle);
   307 	TEST(taskCount = 1);	
   308 
   309 	TheTest.Next(_L("===== Testing GetScheduleL ====="));
   310 
   311 	CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3);
   312 	CleanupStack::PushL(tasks);
   313 	TScheduleState state;
   314 	TTime time;
   315 	CSchEntryInfoArray* entryList = new (ELeave) CSchEntryInfoArray(3);
   316 	CleanupStack::PushL(entryList);
   317 	for (tryCount = 0; ;++tryCount)
   318 		{
   319 		TheScheduler.__DbgFailNext(tryCount);
   320 		TheScheduler.__DbgMarkHeap();
   321 		err = TheScheduler.GetScheduleL(ref1.iHandle,
   322 										state,
   323 										*entryList,
   324 										*tasks, time);
   325 		if (err==KErrNone)
   326 			{
   327 			TheScheduler.__DbgResetHeap();
   328 			break;
   329 			}
   330 		TEST2(err, KErrNoMemory);		
   331 		// reset server side heap for next iteration.
   332 		TheScheduler.__DbgMarkEnd(0);
   333 		}
   334 	// Check schedule and task count
   335 	TEST(entryList->Count() == 1);
   336 	TEST(tasks->Count() == 1);
   337 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   338 	TEST(scheduleCount == 1); 
   339 	taskCount = CountTasksL(ref1.iHandle);
   340 	TEST(taskCount = 1);	
   341 
   342 	CleanupStack::PopAndDestroy(entryList);
   343 	CleanupStack::PopAndDestroy(tasks);
   344 
   345 	TheTest.Next(_L("===== Testing GetTaskRefsL ====="));
   346 
   347 	for (tryCount = 0; ;++tryCount)
   348 		{
   349 		TheScheduler.__DbgFailNext(tryCount);
   350 		TheScheduler.__DbgMarkHeap();
   351 		err = TheScheduler.GetTaskRefsL(*refs,
   352 										EAllSchedules,
   353 										EAllTasks);
   354 		if (err==KErrNone)
   355 			{
   356 			TheScheduler.__DbgResetHeap();
   357 			break;
   358 			}
   359 		TEST2(err, KErrNoMemory);		
   360 		// reset server side heap for next iteration.
   361 		TheScheduler.__DbgMarkEnd(0);
   362 		}
   363 	CleanupStack::PopAndDestroy(refs);
   364 
   365 	TheTest.Next(_L("===== Testing GetTaskDataSize ====="));
   366 
   367 	TInt size;
   368 	for (tryCount = 0; ;++tryCount)
   369 		{
   370 		TheScheduler.__DbgFailNext(tryCount);
   371 		TheScheduler.__DbgMarkHeap();
   372 		err = TheScheduler.GetTaskDataSize(ref1.iHandle,
   373 										size);
   374 		if (err==KErrNone)
   375 			{
   376 			TheScheduler.__DbgResetHeap();
   377 			break;
   378 			}
   379 		TEST2(err, KErrNoMemory);		
   380 		// reset server side heap for next iteration.
   381 		TheScheduler.__DbgMarkEnd(0);
   382 		}
   383 
   384 	TheTest.Next(_L("===== Testing GetTaskInfoL ====="));
   385 
   386 	HBufC* newData = HBufC::NewLC(size);
   387 	TPtr pTaskData = newData->Des();
   388 
   389 	TTaskInfo newTaskInfo;
   390 	for (tryCount = 0; ;++tryCount)
   391 		{
   392 		TheScheduler.__DbgFailNext(tryCount);
   393 		TheScheduler.__DbgMarkHeap();
   394 		err = TheScheduler.GetTaskInfoL(taskInfo.iTaskId,
   395 										newTaskInfo,
   396 										pTaskData,
   397 										ref1,
   398 										time);
   399 		if (err==KErrNone)
   400 			{
   401 			TheScheduler.__DbgResetHeap();
   402 			break;
   403 			}
   404 		TEST2(err, KErrNoMemory);		
   405 		// reset server side heap for next iteration.
   406 		TheScheduler.__DbgMarkEnd(0);
   407 		}
   408 	TEST(newData->MatchF(*data) == 0);
   409 	
   410 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   411 	TEST(scheduleCount == 1); 
   412 	taskCount = CountTasksL(ref1.iHandle);
   413 	TEST(taskCount = 1);	
   414 
   415 	CleanupStack::PopAndDestroy(newData);
   416 	CleanupStack::PopAndDestroy(data);
   417 
   418 	TheTest.Next(_L("===== Testing GetScheduleTypeL ====="));
   419 
   420 	TScheduleType type;
   421 	for (tryCount = 0; ;++tryCount)
   422 		{
   423 		TheScheduler.__DbgFailNext(tryCount);
   424 		TheScheduler.__DbgMarkHeap();
   425 		err = TheScheduler.GetScheduleTypeL(ref1.iHandle, type);
   426 		if (err==KErrNone)
   427 			{
   428 			TheScheduler.__DbgResetHeap();
   429 			break;
   430 			}
   431 		TEST2(err, KErrNoMemory);		
   432 		// reset server side heap for next iteration.
   433 		TheScheduler.__DbgMarkEnd(0);
   434 		}
   435 	TEST(type == ETimeSchedule);
   436 
   437 	CleanupStack::PopAndDestroy(scheduleArray);
   438 
   439 	TheTest.Next(_L("===== Testing DeleteTask ====="));
   440 
   441 	for (tryCount = 0; ;++tryCount)
   442 		{
   443 		TheScheduler.__DbgFailNext(tryCount);
   444 		TheScheduler.__DbgMarkHeap();
   445 		err = TheScheduler.DeleteTask(taskInfo.iTaskId);
   446 		//include test for KErrNotFound here as task is actually deleted and
   447 		// then store is updated (which causes mem failure).  Problems
   448 		// will still occur if you add a new task again and try and access store
   449 		// as store is likely to still be corrupt. Investigate this??
   450 		if (err==KErrNone || err==KErrNotFound) 
   451 			{
   452 			TheScheduler.__DbgResetHeap();
   453 			break;
   454 			}
   455 		TEST2(err, KErrNoMemory);		
   456 		// reset server side heap for next iteration.
   457 		TheScheduler.__DbgMarkEnd(0);
   458 		}
   459 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   460 	TEST(scheduleCount == 1); 
   461 	taskCount = CountTasksL(ref1.iHandle);
   462 	TEST(taskCount == 0);
   463 	
   464 	//Now delete schedule to setup for next test
   465 	TEST2(TheScheduler.DeleteSchedule(ref1.iHandle), KErrNone);
   466 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   467 	TEST(scheduleCount == 0); 
   468 
   469 	SchSvrHelpers::Pause(TheTest);
   470 	}
   471 
   472 /**
   473 @SYMTestCaseID          SYSLIB-SCHSVR-CT-1028
   474 @SYMTestCaseDesc	    Tests out of memory errors for Condition based API's
   475 @SYMTestPriority 	    High
   476 @SYMTestActions  	    Create a persistent schedule,get and delete schedule.
   477                         Check for memory and no errors.
   478 @SYMTestExpectedResults Test must not fail
   479 @SYMREQ                 REQ0000
   480 */		
   481 static void DoTest2L()
   482 // Condition based API's
   483 	{	
   484 	TInt err = KErrNone;
   485 	TInt tryCount = 0;
   486 	
   487 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1028 ===== Starting Condition OOM test ===== "));
   488 	
   489 	// delete old files.
   490 	// We need to do this because we have actually corrupted the store, 
   491 	// with the DeleteTask call.  Without deleting it we get problems below.
   492 	// This is a bit rubbish having to do this but what else can be done??
   493 	TheTest.Next(_L("Delete old files"));
   494 	SchSvrHelpers::DeleteScheduleFilesL();
   495 
   496 	//Ensure P&S variables are defined.
   497 	err = RProperty::Define(KTestUid, KTestKey1, RProperty::EInt);
   498 	TEST(err == KErrNone || err == KErrAlreadyExists);
   499 	TEST2(RProperty::Set(KTestUid, KTestKey1,1), KErrNone);
   500 	
   501 	CSchConditionArray* conditionArray = CreateConditionArrayLC();
   502 	TSchedulerItemRef ref1;
   503 
   504 	TheTest.Next(_L("===== Testing create persistent schedule ====="));
   505 	for (tryCount = 0; ;++tryCount)
   506 		{
   507 		TheScheduler.__DbgFailNext(tryCount);
   508 		TheScheduler.__DbgMarkHeap();
   509 		err = TheScheduler.CreatePersistentSchedule(ref1, *conditionArray, Time::MaxTTime());
   510 		if (err==KErrNone)
   511 			{
   512 			TheScheduler.__DbgResetHeap();
   513 			break;
   514 			}
   515 		TEST2(err, KErrNoMemory);		
   516 		// reset server side heap for next iteration.
   517 		TheScheduler.__DbgMarkEnd(0);			
   518 		}
   519 	// Check schedule count
   520 	TInt scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   521 	TEST(scheduleCount == 1); 
   522 
   523 // This test code causes problems when EditSchedule fails, it deletes the entries 
   524 // but doenst delete the actual CSchedule object.  We can't do this really as the 
   525 // schedule may have oustanding tasks.  Need to clean up data in a consistent manner.
   526 // Fix this! Same applied for time based EditSchedule
   527 /*	TheTest.Next(_L("===== Testing edit schedule ====="));
   528 	for (tryCount = 0; ;++tryCount)
   529 		{
   530 		TheScheduler.__DbgFailNext(tryCount);
   531 		TheScheduler.__DbgMarkHeap();
   532 		// Even though we use the same array as before, the task scheduler
   533 		// code is not smart enough to just return but actually replaces
   534 		// the existing one, hence we are actually testing this method fully.
   535 		err = TheScheduler.EditSchedule(ref1.iHandle, *conditionArray,
   536 										SchSvrHelpers::TimeBasedOnOffset(0, 20));
   537 		if (err==KErrNone)
   538 			{
   539 			TheScheduler.__DbgResetHeap();
   540 			break;
   541 			}
   542 		TEST2(err, KErrNoMemory);		
   543 		// reset server side heap for next iteration.
   544 		TheScheduler.__DbgMarkEnd(0);
   545 		}
   546 	// Check schedule count
   547 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   548 	TEST(scheduleCount == 1); 
   549 */
   550 	TheTest.Next(_L("===== Testing GetScheduleL ====="));
   551 
   552 	CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3);
   553 	CleanupStack::PushL(tasks);
   554 	TScheduleState state;
   555 	TTime time;
   556 	CSchConditionArray* entryList = new (ELeave) CSchConditionArray(3);
   557 	CleanupStack::PushL(entryList);
   558 	for (tryCount = 0; ;++tryCount)
   559 		{
   560 		TheScheduler.__DbgFailNext(tryCount);
   561 		TheScheduler.__DbgMarkHeap();
   562 		err = TheScheduler.GetScheduleL(ref1.iHandle,
   563 										state,
   564 										*entryList,
   565 										time, *tasks);
   566 		if (err==KErrNone)
   567 			{
   568 			TheScheduler.__DbgResetHeap();
   569 			break;
   570 			}
   571 		TEST2(err, KErrNoMemory);		
   572 		// reset server side heap for next iteration.
   573 		TheScheduler.__DbgMarkEnd(0);
   574 		}
   575 	CleanupStack::PopAndDestroy(entryList);
   576 	CleanupStack::PopAndDestroy(tasks);
   577 
   578 	TheTest.Next(_L("===== Testing delete schedule ====="));
   579 	for (tryCount = 0; ;++tryCount)
   580 		{
   581 		TheScheduler.__DbgFailNext(tryCount);
   582 		TheScheduler.__DbgMarkHeap();
   583 		err = TheScheduler.DeleteSchedule(ref1.iHandle);
   584 		if (err==KErrNone)
   585 			{
   586 			TheScheduler.__DbgResetHeap();
   587 			break;
   588 			}
   589 		TEST2(err, KErrNoMemory);		
   590 		// reset server side heap for next iteration.
   591 		TheScheduler.__DbgMarkEnd(0);
   592 		}
   593 	// Check schedule count
   594 	scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
   595 	TEST(scheduleCount == 0); 
   596 
   597 	CleanupStack::PopAndDestroy(conditionArray);
   598 
   599 	SchSvrHelpers::Pause(TheTest);
   600 	}
   601 	
   602 //***********************************************************************************
   603 static TInt RunTestsL()
   604 	{
   605 	TheTest.Next(_L("Delete old files"));
   606 	SchSvrHelpers::DeleteScheduleFilesL();
   607 	
   608 	TheTest.Next(_L("Create Task notification semaphore"));
   609 	//initialise task notification semaphore
   610 	STaskSemaphore sem;
   611 	sem.CreateL();
   612 
   613 	// Connect to the server
   614 	TheTest.Next(_L("===== Connect to Scheduler ====="));
   615 	TInt res = TheScheduler.Connect();
   616 	TEST2(res, KErrNone);
   617 	// Register a client with the server
   618 	TheTest.Next(_L("===== Registering Client ====="));
   619 	res = SchSvrHelpers::RegisterClientL(TheScheduler);
   620 	TEST2(res, KErrNone);
   621 
   622 	TheTest.Next(_L("Start tests"));
   623 	DoTest1L();
   624 	DoTest2L();
   625 	
   626 	// Need to add OOM tests for when a task is executed
   627 	// to clarify behaviour.  This will be tricky!!!
   628 	
   629 	TheTest.Next(_L("Tidying up"));
   630 	//Tidying up so next test will be clear.
   631 	TheTest.Next(_L("Delete all schedules"));
   632 	SchSvrHelpers::DeleteAllSchedulesL(TheScheduler);
   633 	SchSvrHelpers::Pause(TheTest, 2);
   634 	TheTest.Next(_L("Delete old files\n"));
   635 	SchSvrHelpers::DeleteScheduleFilesL();
   636 
   637 	TheScheduler.Close();
   638 	
   639 	//close handle to semaphore
   640 	sem.Close();
   641 
   642 	return KErrNone;
   643 	}
   644 
   645 //***********************************************************************************
   646 GLDEF_C TInt E32Main()
   647 //	
   648 // TheTest the scheduler
   649 //
   650     {
   651 	__UHEAP_MARK;
   652 	TheTest.Start(_L("OOM testing"));
   653 	TheTest.Title();
   654 	TheCleanup = CTrapCleanup::New();
   655 	
   656 	//If the previous test fails, SCHSVR.exe may stay in memory.
   657 	TRAPD(error,CleanupHelpers::TestCleanupL());
   658 	TEST2(error, KErrNone);
   659 
   660 	TheTest(TheFsSession.Connect() == KErrNone);;
   661 	TRAP(error, RunTestsL());	
   662 	TEST2(error,KErrNone);
   663 	TRAP(error,CleanupHelpers::TestCleanupL());
   664 	TEST2(error, KErrNone);
   665 	delete TheCleanup;
   666 	
   667 	TheFsSession.Close();
   668 	TheTest.End();
   669 	TheTest.Close();
   670 	__UHEAP_MARKEND;
   671 	return KErrNone;
   672 	}