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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
23 #include <e32property.h>
24 #include <schinfointernal.h>
25 #include "TestUtils.h"
30 _LIT(KTestName, "TC_TSCH_SCHSVR_OOM");
36 typedef CArrayFixFlat<TScheduleEntryInfo> CSchEntryInfoArray;
37 typedef CArrayFixFlat<TTaskInfo> CTaskInfoArray;
38 typedef CArrayFixFlat<TSchedulerItemRef> CSchItemRefArray;
39 typedef CArrayFixFlat<TTaskSchedulerCondition> CSchConditionArray;
44 RTest TheTest(KTestName);
45 static RScheduler TheScheduler;
46 static CTrapCleanup* TheCleanup;
47 static RFs TheFsSession;
49 const TUid KTestUid = TUid::Uid(0x12345678);
50 const TInt KTestKey1 = 1;
53 //***********************************************************************************
54 static void GetTaskInfoL(CTaskInfoArray& aTaskInfoArray,
56 // Extract schedule references from the schedule server based on a filter. If
58 aTaskInfoArray.Reset();
59 TTime nextTimeScheduleIsDue;
61 CSchEntryInfoArray* entries
62 = new (ELeave) CSchEntryInfoArray(3);
63 CleanupStack::PushL(entries);
64 TInt res = TheScheduler.GetScheduleL(aScheduleId,
68 nextTimeScheduleIsDue);
70 CleanupStack::PopAndDestroy(entries);
73 //***********************************************************************************
74 static TInt CountTasksL(TInt aScheduleId)
76 CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3);
77 CleanupStack::PushL(tasks);
78 GetTaskInfoL(*tasks, aScheduleId);
79 TInt ret = tasks->Count();
80 CleanupStack::PopAndDestroy(tasks);
84 //***********************************************************************************
85 static TInt CountScheduledItemsL(TScheduleFilter aFilter,
86 RScheduler& aScheduler)
87 // Extract schedule references from the schedule server based on a filter. If
89 CSchItemRefArray* refs = new (ELeave) CSchItemRefArray(3);
90 CleanupStack::PushL(refs);
92 TInt res = aScheduler.GetScheduleRefsL(*refs, aFilter);
95 TInt count = refs->Count();
96 CleanupStack::PopAndDestroy(); // refs
101 //***********************************************************************************
102 static CSchEntryInfoArray* CreateScheduleArrayLC()
104 CSchEntryInfoArray* entryList = new (ELeave) CSchEntryInfoArray(3);
105 CleanupStack::PushL(entryList);
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);
117 //***********************************************************************************
118 static CSchConditionArray* CreateConditionArrayLC()
120 CSchConditionArray* conditionList = new (ELeave) CSchConditionArray(3);
121 CleanupStack::PushL(conditionList);
123 TTaskSchedulerCondition condition1;
124 condition1.iCategory = KTestUid;
125 condition1.iKey = KTestKey1;
126 condition1.iState = 10;
127 condition1.iType = TTaskSchedulerCondition::EEquals;
128 conditionList->AppendL(condition1);
130 return conditionList;
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
141 static void DoTest1L()
147 TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1027 ===== Starting OOM test ===== "));
149 CSchEntryInfoArray* scheduleArray = CreateScheduleArrayLC();
150 TSchedulerItemRef ref1;
152 TheTest.Next(_L("===== Testing create persistent schedule ====="));
153 for (tryCount = 0; ;++tryCount)
155 // These allocations are ignored because they cause corruptness
156 // of the persistent store. Its a bit rubbish.
157 if(tryCount < 7 || tryCount >8 )
159 TheScheduler.__DbgFailNext(tryCount);
160 TheScheduler.__DbgMarkHeap();
161 err = TheScheduler.CreatePersistentSchedule(ref1, *scheduleArray);
164 TheScheduler.__DbgResetHeap();
167 TEST2(err, KErrNoMemory);
168 // reset server side heap for next iteration.
169 TheScheduler.__DbgMarkEnd(0);
172 // Check schedule count
173 TInt scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
174 TEST(scheduleCount == 1);
176 // OK, now we have a persistent schedule
177 TheTest.Next(_L("===== Testing disable schedule ====="));
178 for (tryCount = 0; ;++tryCount)
180 TheScheduler.__DbgFailNext(tryCount);
181 TheScheduler.__DbgMarkHeap();
182 err = TheScheduler.DisableSchedule(ref1.iHandle);
185 TheScheduler.__DbgResetHeap();
188 TEST2(err, KErrNoMemory);
189 // reset server side heap for next iteration.
190 TheScheduler.__DbgMarkEnd(0);
192 // Check schedule count
193 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
194 TEST(scheduleCount == 1);
196 TheTest.Next(_L("===== Testing enable schedule ====="));
197 for (tryCount = 0; ;++tryCount)
199 TheScheduler.__DbgFailNext(tryCount);
200 TheScheduler.__DbgMarkHeap();
201 err = TheScheduler.EnableSchedule(ref1.iHandle);
204 TheScheduler.__DbgResetHeap();
207 TEST2(err, KErrNoMemory);
208 // reset server side heap for next iteration.
209 TheScheduler.__DbgMarkEnd(0);
211 // Check schedule count
212 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
213 TEST(scheduleCount == 1);
215 TheTest.Next(_L("===== Testing edit schedule ====="));
216 for (tryCount = 0; ;++tryCount)
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);
226 TheScheduler.__DbgResetHeap();
229 TEST2(err, KErrNoMemory);
230 // reset server side heap for next iteration.
231 TheScheduler.__DbgMarkEnd(0);
233 // Check schedule count
234 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
235 TEST(scheduleCount == 1);
237 TheTest.Next(_L("===== Testing delete schedule ====="));
238 for (tryCount = 0; ;++tryCount)
240 TheScheduler.__DbgFailNext(tryCount);
241 TheScheduler.__DbgMarkHeap();
242 err = TheScheduler.DeleteSchedule(ref1.iHandle);
245 TheScheduler.__DbgResetHeap();
248 TEST2(err, KErrNoMemory);
249 // reset server side heap for next iteration.
250 TheScheduler.__DbgMarkEnd(0);
252 // Check schedule count
253 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
254 TEST(scheduleCount == 0);
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();
263 // OK now add back schedule in preparation for adding tasks.
264 err = TheScheduler.CreatePersistentSchedule(ref1, *scheduleArray);
265 TEST2(err, KErrNone);
267 TheTest.Next(_L("===== Testing ScheduleTask ====="));
269 _LIT(KTaskName, "TheTaskName");
270 TName name = KTaskName();
271 TTaskInfo taskInfo(0, name, 2, 0);
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);
279 // Check schedule and task count
280 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
281 TEST(scheduleCount == 1);
282 TInt taskCount = CountTasksL(ref1.iHandle);
285 TheTest.Next(_L("===== Testing GetScheduleRefsL ====="));
287 CSchItemRefArray* refs = new (ELeave) CSchItemRefArray(3);
288 CleanupStack::PushL(refs);
289 for (tryCount = 0; ;++tryCount)
291 TheScheduler.__DbgFailNext(tryCount);
292 TheScheduler.__DbgMarkHeap();
293 err = TheScheduler.GetScheduleRefsL(*refs, EPendingSchedules);
296 TheScheduler.__DbgResetHeap();
299 TEST2(err, KErrNoMemory);
300 // reset server side heap for next iteration.
301 TheScheduler.__DbgMarkEnd(0);
303 // Check schedule and task count
304 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
305 TEST(scheduleCount == 1);
306 taskCount = CountTasksL(ref1.iHandle);
309 TheTest.Next(_L("===== Testing GetScheduleL ====="));
311 CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3);
312 CleanupStack::PushL(tasks);
313 TScheduleState state;
315 CSchEntryInfoArray* entryList = new (ELeave) CSchEntryInfoArray(3);
316 CleanupStack::PushL(entryList);
317 for (tryCount = 0; ;++tryCount)
319 TheScheduler.__DbgFailNext(tryCount);
320 TheScheduler.__DbgMarkHeap();
321 err = TheScheduler.GetScheduleL(ref1.iHandle,
327 TheScheduler.__DbgResetHeap();
330 TEST2(err, KErrNoMemory);
331 // reset server side heap for next iteration.
332 TheScheduler.__DbgMarkEnd(0);
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);
342 CleanupStack::PopAndDestroy(entryList);
343 CleanupStack::PopAndDestroy(tasks);
345 TheTest.Next(_L("===== Testing GetTaskRefsL ====="));
347 for (tryCount = 0; ;++tryCount)
349 TheScheduler.__DbgFailNext(tryCount);
350 TheScheduler.__DbgMarkHeap();
351 err = TheScheduler.GetTaskRefsL(*refs,
356 TheScheduler.__DbgResetHeap();
359 TEST2(err, KErrNoMemory);
360 // reset server side heap for next iteration.
361 TheScheduler.__DbgMarkEnd(0);
363 CleanupStack::PopAndDestroy(refs);
365 TheTest.Next(_L("===== Testing GetTaskDataSize ====="));
368 for (tryCount = 0; ;++tryCount)
370 TheScheduler.__DbgFailNext(tryCount);
371 TheScheduler.__DbgMarkHeap();
372 err = TheScheduler.GetTaskDataSize(ref1.iHandle,
376 TheScheduler.__DbgResetHeap();
379 TEST2(err, KErrNoMemory);
380 // reset server side heap for next iteration.
381 TheScheduler.__DbgMarkEnd(0);
384 TheTest.Next(_L("===== Testing GetTaskInfoL ====="));
386 HBufC* newData = HBufC::NewLC(size);
387 TPtr pTaskData = newData->Des();
389 TTaskInfo newTaskInfo;
390 for (tryCount = 0; ;++tryCount)
392 TheScheduler.__DbgFailNext(tryCount);
393 TheScheduler.__DbgMarkHeap();
394 err = TheScheduler.GetTaskInfoL(taskInfo.iTaskId,
401 TheScheduler.__DbgResetHeap();
404 TEST2(err, KErrNoMemory);
405 // reset server side heap for next iteration.
406 TheScheduler.__DbgMarkEnd(0);
408 TEST(newData->MatchF(*data) == 0);
410 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
411 TEST(scheduleCount == 1);
412 taskCount = CountTasksL(ref1.iHandle);
415 CleanupStack::PopAndDestroy(newData);
416 CleanupStack::PopAndDestroy(data);
418 TheTest.Next(_L("===== Testing GetScheduleTypeL ====="));
421 for (tryCount = 0; ;++tryCount)
423 TheScheduler.__DbgFailNext(tryCount);
424 TheScheduler.__DbgMarkHeap();
425 err = TheScheduler.GetScheduleTypeL(ref1.iHandle, type);
428 TheScheduler.__DbgResetHeap();
431 TEST2(err, KErrNoMemory);
432 // reset server side heap for next iteration.
433 TheScheduler.__DbgMarkEnd(0);
435 TEST(type == ETimeSchedule);
437 CleanupStack::PopAndDestroy(scheduleArray);
439 TheTest.Next(_L("===== Testing DeleteTask ====="));
441 for (tryCount = 0; ;++tryCount)
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)
452 TheScheduler.__DbgResetHeap();
455 TEST2(err, KErrNoMemory);
456 // reset server side heap for next iteration.
457 TheScheduler.__DbgMarkEnd(0);
459 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
460 TEST(scheduleCount == 1);
461 taskCount = CountTasksL(ref1.iHandle);
462 TEST(taskCount == 0);
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);
469 SchSvrHelpers::Pause(TheTest);
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
481 static void DoTest2L()
482 // Condition based API's
487 TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1028 ===== Starting Condition OOM test ===== "));
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();
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);
501 CSchConditionArray* conditionArray = CreateConditionArrayLC();
502 TSchedulerItemRef ref1;
504 TheTest.Next(_L("===== Testing create persistent schedule ====="));
505 for (tryCount = 0; ;++tryCount)
507 TheScheduler.__DbgFailNext(tryCount);
508 TheScheduler.__DbgMarkHeap();
509 err = TheScheduler.CreatePersistentSchedule(ref1, *conditionArray, Time::MaxTTime());
512 TheScheduler.__DbgResetHeap();
515 TEST2(err, KErrNoMemory);
516 // reset server side heap for next iteration.
517 TheScheduler.__DbgMarkEnd(0);
519 // Check schedule count
520 TInt scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
521 TEST(scheduleCount == 1);
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)
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));
539 TheScheduler.__DbgResetHeap();
542 TEST2(err, KErrNoMemory);
543 // reset server side heap for next iteration.
544 TheScheduler.__DbgMarkEnd(0);
546 // Check schedule count
547 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
548 TEST(scheduleCount == 1);
550 TheTest.Next(_L("===== Testing GetScheduleL ====="));
552 CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3);
553 CleanupStack::PushL(tasks);
554 TScheduleState state;
556 CSchConditionArray* entryList = new (ELeave) CSchConditionArray(3);
557 CleanupStack::PushL(entryList);
558 for (tryCount = 0; ;++tryCount)
560 TheScheduler.__DbgFailNext(tryCount);
561 TheScheduler.__DbgMarkHeap();
562 err = TheScheduler.GetScheduleL(ref1.iHandle,
568 TheScheduler.__DbgResetHeap();
571 TEST2(err, KErrNoMemory);
572 // reset server side heap for next iteration.
573 TheScheduler.__DbgMarkEnd(0);
575 CleanupStack::PopAndDestroy(entryList);
576 CleanupStack::PopAndDestroy(tasks);
578 TheTest.Next(_L("===== Testing delete schedule ====="));
579 for (tryCount = 0; ;++tryCount)
581 TheScheduler.__DbgFailNext(tryCount);
582 TheScheduler.__DbgMarkHeap();
583 err = TheScheduler.DeleteSchedule(ref1.iHandle);
586 TheScheduler.__DbgResetHeap();
589 TEST2(err, KErrNoMemory);
590 // reset server side heap for next iteration.
591 TheScheduler.__DbgMarkEnd(0);
593 // Check schedule count
594 scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler);
595 TEST(scheduleCount == 0);
597 CleanupStack::PopAndDestroy(conditionArray);
599 SchSvrHelpers::Pause(TheTest);
602 //***********************************************************************************
603 static TInt RunTestsL()
605 TheTest.Next(_L("Delete old files"));
606 SchSvrHelpers::DeleteScheduleFilesL();
608 TheTest.Next(_L("Create Task notification semaphore"));
609 //initialise task notification semaphore
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);
622 TheTest.Next(_L("Start tests"));
626 // Need to add OOM tests for when a task is executed
627 // to clarify behaviour. This will be tricky!!!
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();
637 TheScheduler.Close();
639 //close handle to semaphore
645 //***********************************************************************************
646 GLDEF_C TInt E32Main()
648 // TheTest the scheduler
652 TheTest.Start(_L("OOM testing"));
654 TheCleanup = CTrapCleanup::New();
656 //If the previous test fails, SCHSVR.exe may stay in memory.
657 TRAPD(error,CleanupHelpers::TestCleanupL());
658 TEST2(error, KErrNone);
660 TheTest(TheFsSession.Connect() == KErrNone);;
661 TRAP(error, RunTestsL());
662 TEST2(error,KErrNone);
663 TRAP(error,CleanupHelpers::TestCleanupL());
664 TEST2(error, KErrNone);
667 TheFsSession.Close();