sl@0: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include "Thelpers.h" sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "TestUtils.h" sl@0: sl@0: // sl@0: // Literal constants sl@0: // sl@0: _LIT(KTestName, "TC_TSCH_SCHSVR_OOM"); sl@0: sl@0: sl@0: // sl@0: // Type definitions sl@0: // sl@0: typedef CArrayFixFlat CSchEntryInfoArray; sl@0: typedef CArrayFixFlat CTaskInfoArray; sl@0: typedef CArrayFixFlat CSchItemRefArray; sl@0: typedef CArrayFixFlat CSchConditionArray; sl@0: sl@0: // sl@0: // Global data sl@0: // sl@0: RTest TheTest(KTestName); sl@0: static RScheduler TheScheduler; sl@0: static CTrapCleanup* TheCleanup; sl@0: static RFs TheFsSession; sl@0: sl@0: const TUid KTestUid = TUid::Uid(0x12345678); sl@0: const TInt KTestKey1 = 1; sl@0: sl@0: sl@0: //*********************************************************************************** sl@0: static void GetTaskInfoL(CTaskInfoArray& aTaskInfoArray, sl@0: TInt aScheduleId) sl@0: // Extract schedule references from the schedule server based on a filter. If sl@0: { sl@0: aTaskInfoArray.Reset(); sl@0: TTime nextTimeScheduleIsDue; sl@0: TScheduleState state; sl@0: CSchEntryInfoArray* entries sl@0: = new (ELeave) CSchEntryInfoArray(3); sl@0: CleanupStack::PushL(entries); sl@0: TInt res = TheScheduler.GetScheduleL(aScheduleId, sl@0: state, sl@0: *entries, sl@0: aTaskInfoArray, sl@0: nextTimeScheduleIsDue); sl@0: TEST2(res, KErrNone); sl@0: CleanupStack::PopAndDestroy(entries); sl@0: } sl@0: sl@0: //*********************************************************************************** sl@0: static TInt CountTasksL(TInt aScheduleId) sl@0: { sl@0: CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3); sl@0: CleanupStack::PushL(tasks); sl@0: GetTaskInfoL(*tasks, aScheduleId); sl@0: TInt ret = tasks->Count(); sl@0: CleanupStack::PopAndDestroy(tasks); sl@0: return ret; sl@0: } sl@0: sl@0: //*********************************************************************************** sl@0: static TInt CountScheduledItemsL(TScheduleFilter aFilter, sl@0: RScheduler& aScheduler) sl@0: // Extract schedule references from the schedule server based on a filter. If sl@0: { sl@0: CSchItemRefArray* refs = new (ELeave) CSchItemRefArray(3); sl@0: CleanupStack::PushL(refs); sl@0: sl@0: TInt res = aScheduler.GetScheduleRefsL(*refs, aFilter); sl@0: TEST2(res, KErrNone); sl@0: sl@0: TInt count = refs->Count(); sl@0: CleanupStack::PopAndDestroy(); // refs sl@0: return count; sl@0: } sl@0: sl@0: sl@0: //*********************************************************************************** sl@0: static CSchEntryInfoArray* CreateScheduleArrayLC() sl@0: { sl@0: CSchEntryInfoArray* entryList = new (ELeave) CSchEntryInfoArray(3); sl@0: CleanupStack::PushL(entryList); sl@0: sl@0: TScheduleEntryInfo entry1; sl@0: entry1.iStartTime = SchSvrHelpers::TimeBasedOnOffset(0, 20); // 20m from "now" sl@0: entry1.iInterval = 1; sl@0: entry1.iIntervalType = EDaily; sl@0: entry1.iValidityPeriod = 20; sl@0: entryList->AppendL(entry1); sl@0: sl@0: return entryList; sl@0: } sl@0: sl@0: //*********************************************************************************** sl@0: static CSchConditionArray* CreateConditionArrayLC() sl@0: { sl@0: CSchConditionArray* conditionList = new (ELeave) CSchConditionArray(3); sl@0: CleanupStack::PushL(conditionList); sl@0: sl@0: TTaskSchedulerCondition condition1; sl@0: condition1.iCategory = KTestUid; sl@0: condition1.iKey = KTestKey1; sl@0: condition1.iState = 10; sl@0: condition1.iType = TTaskSchedulerCondition::EEquals; sl@0: conditionList->AppendL(condition1); sl@0: sl@0: return conditionList; sl@0: } sl@0: sl@0: /** sl@0: @SYMTestCaseID SYSLIB-SCHSVR-CT-1027 sl@0: @SYMTestCaseDesc Tests out of memory errors for time based API's sl@0: @SYMTestPriority High sl@0: @SYMTestActions Test for memory errors,while creating,enabling,disabling,editing and other operations on schedule task sl@0: @SYMTestExpectedResults Test must not fail sl@0: @SYMREQ REQ0000 sl@0: */ sl@0: static void DoTest1L() sl@0: // Time based API's sl@0: { sl@0: TInt err = KErrNone; sl@0: TInt tryCount = 0; sl@0: sl@0: TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1027 ===== Starting OOM test ===== ")); sl@0: sl@0: CSchEntryInfoArray* scheduleArray = CreateScheduleArrayLC(); sl@0: TSchedulerItemRef ref1; sl@0: sl@0: TheTest.Next(_L("===== Testing create persistent schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: // These allocations are ignored because they cause corruptness sl@0: // of the persistent store. Its a bit rubbish. sl@0: if(tryCount < 7 || tryCount >8 ) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.CreatePersistentSchedule(ref1, *scheduleArray); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: } sl@0: // Check schedule count sl@0: TInt scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: sl@0: // OK, now we have a persistent schedule sl@0: TheTest.Next(_L("===== Testing disable schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.DisableSchedule(ref1.iHandle); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: sl@0: TheTest.Next(_L("===== Testing enable schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.EnableSchedule(ref1.iHandle); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: sl@0: TheTest.Next(_L("===== Testing edit schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: // Even though we use the same array as before, the task scheduler sl@0: // code is not smart enough to just return but actually replaces sl@0: // the existing one, hence we are actually testing this method fully. sl@0: err = TheScheduler.EditSchedule(ref1.iHandle, *scheduleArray); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: sl@0: TheTest.Next(_L("===== Testing delete schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.DeleteSchedule(ref1.iHandle); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 0); sl@0: sl@0: // delete old files. sl@0: // We need to do this because we have actually corrupted the store, sl@0: // even though its empty. Without deleting it we get problems below. sl@0: // This is a bit rubbish having to do this but what else can be done?? sl@0: TheTest.Next(_L("Delete old files")); sl@0: SchSvrHelpers::DeleteScheduleFilesL(); sl@0: sl@0: // OK now add back schedule in preparation for adding tasks. sl@0: err = TheScheduler.CreatePersistentSchedule(ref1, *scheduleArray); sl@0: TEST2(err, KErrNone); sl@0: sl@0: TheTest.Next(_L("===== Testing ScheduleTask =====")); sl@0: sl@0: _LIT(KTaskName, "TheTaskName"); sl@0: TName name = KTaskName(); sl@0: TTaskInfo taskInfo(0, name, 2, 0); sl@0: sl@0: HBufC* data = _L("the data").AllocLC(); sl@0: // cant test ScheduleTask API using OOM loop as it does dodgy things to sl@0: // the store which cause allocation problems. Need to investigate this sl@0: // later at some stage. sl@0: TEST2(TheScheduler.ScheduleTask(taskInfo, *data, ref1.iHandle), KErrNone); sl@0: sl@0: // Check schedule and task count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: TInt taskCount = CountTasksL(ref1.iHandle); sl@0: TEST(taskCount = 1); sl@0: sl@0: TheTest.Next(_L("===== Testing GetScheduleRefsL =====")); sl@0: sl@0: CSchItemRefArray* refs = new (ELeave) CSchItemRefArray(3); sl@0: CleanupStack::PushL(refs); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetScheduleRefsL(*refs, EPendingSchedules); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule and task count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: taskCount = CountTasksL(ref1.iHandle); sl@0: TEST(taskCount = 1); sl@0: sl@0: TheTest.Next(_L("===== Testing GetScheduleL =====")); sl@0: sl@0: CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3); sl@0: CleanupStack::PushL(tasks); sl@0: TScheduleState state; sl@0: TTime time; sl@0: CSchEntryInfoArray* entryList = new (ELeave) CSchEntryInfoArray(3); sl@0: CleanupStack::PushL(entryList); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetScheduleL(ref1.iHandle, sl@0: state, sl@0: *entryList, sl@0: *tasks, time); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule and task count sl@0: TEST(entryList->Count() == 1); sl@0: TEST(tasks->Count() == 1); sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: taskCount = CountTasksL(ref1.iHandle); sl@0: TEST(taskCount = 1); sl@0: sl@0: CleanupStack::PopAndDestroy(entryList); sl@0: CleanupStack::PopAndDestroy(tasks); sl@0: sl@0: TheTest.Next(_L("===== Testing GetTaskRefsL =====")); sl@0: sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetTaskRefsL(*refs, sl@0: EAllSchedules, sl@0: EAllTasks); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: CleanupStack::PopAndDestroy(refs); sl@0: sl@0: TheTest.Next(_L("===== Testing GetTaskDataSize =====")); sl@0: sl@0: TInt size; sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetTaskDataSize(ref1.iHandle, sl@0: size); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: sl@0: TheTest.Next(_L("===== Testing GetTaskInfoL =====")); sl@0: sl@0: HBufC* newData = HBufC::NewLC(size); sl@0: TPtr pTaskData = newData->Des(); sl@0: sl@0: TTaskInfo newTaskInfo; sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetTaskInfoL(taskInfo.iTaskId, sl@0: newTaskInfo, sl@0: pTaskData, sl@0: ref1, sl@0: time); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: TEST(newData->MatchF(*data) == 0); sl@0: sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: taskCount = CountTasksL(ref1.iHandle); sl@0: TEST(taskCount = 1); sl@0: sl@0: CleanupStack::PopAndDestroy(newData); sl@0: CleanupStack::PopAndDestroy(data); sl@0: sl@0: TheTest.Next(_L("===== Testing GetScheduleTypeL =====")); sl@0: sl@0: TScheduleType type; sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetScheduleTypeL(ref1.iHandle, type); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: TEST(type == ETimeSchedule); sl@0: sl@0: CleanupStack::PopAndDestroy(scheduleArray); sl@0: sl@0: TheTest.Next(_L("===== Testing DeleteTask =====")); sl@0: sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.DeleteTask(taskInfo.iTaskId); sl@0: //include test for KErrNotFound here as task is actually deleted and sl@0: // then store is updated (which causes mem failure). Problems sl@0: // will still occur if you add a new task again and try and access store sl@0: // as store is likely to still be corrupt. Investigate this?? sl@0: if (err==KErrNone || err==KErrNotFound) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: taskCount = CountTasksL(ref1.iHandle); sl@0: TEST(taskCount == 0); sl@0: sl@0: //Now delete schedule to setup for next test sl@0: TEST2(TheScheduler.DeleteSchedule(ref1.iHandle), KErrNone); sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 0); sl@0: sl@0: SchSvrHelpers::Pause(TheTest); sl@0: } sl@0: sl@0: /** sl@0: @SYMTestCaseID SYSLIB-SCHSVR-CT-1028 sl@0: @SYMTestCaseDesc Tests out of memory errors for Condition based API's sl@0: @SYMTestPriority High sl@0: @SYMTestActions Create a persistent schedule,get and delete schedule. sl@0: Check for memory and no errors. sl@0: @SYMTestExpectedResults Test must not fail sl@0: @SYMREQ REQ0000 sl@0: */ sl@0: static void DoTest2L() sl@0: // Condition based API's sl@0: { sl@0: TInt err = KErrNone; sl@0: TInt tryCount = 0; sl@0: sl@0: TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-1028 ===== Starting Condition OOM test ===== ")); sl@0: sl@0: // delete old files. sl@0: // We need to do this because we have actually corrupted the store, sl@0: // with the DeleteTask call. Without deleting it we get problems below. sl@0: // This is a bit rubbish having to do this but what else can be done?? sl@0: TheTest.Next(_L("Delete old files")); sl@0: SchSvrHelpers::DeleteScheduleFilesL(); sl@0: sl@0: //Ensure P&S variables are defined. sl@0: err = RProperty::Define(KTestUid, KTestKey1, RProperty::EInt); sl@0: TEST(err == KErrNone || err == KErrAlreadyExists); sl@0: TEST2(RProperty::Set(KTestUid, KTestKey1,1), KErrNone); sl@0: sl@0: CSchConditionArray* conditionArray = CreateConditionArrayLC(); sl@0: TSchedulerItemRef ref1; sl@0: sl@0: TheTest.Next(_L("===== Testing create persistent schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.CreatePersistentSchedule(ref1, *conditionArray, Time::MaxTTime()); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: TInt scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: sl@0: // This test code causes problems when EditSchedule fails, it deletes the entries sl@0: // but doenst delete the actual CSchedule object. We can't do this really as the sl@0: // schedule may have oustanding tasks. Need to clean up data in a consistent manner. sl@0: // Fix this! Same applied for time based EditSchedule sl@0: /* TheTest.Next(_L("===== Testing edit schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: // Even though we use the same array as before, the task scheduler sl@0: // code is not smart enough to just return but actually replaces sl@0: // the existing one, hence we are actually testing this method fully. sl@0: err = TheScheduler.EditSchedule(ref1.iHandle, *conditionArray, sl@0: SchSvrHelpers::TimeBasedOnOffset(0, 20)); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 1); sl@0: */ sl@0: TheTest.Next(_L("===== Testing GetScheduleL =====")); sl@0: sl@0: CTaskInfoArray* tasks = new (ELeave) CTaskInfoArray(3); sl@0: CleanupStack::PushL(tasks); sl@0: TScheduleState state; sl@0: TTime time; sl@0: CSchConditionArray* entryList = new (ELeave) CSchConditionArray(3); sl@0: CleanupStack::PushL(entryList); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.GetScheduleL(ref1.iHandle, sl@0: state, sl@0: *entryList, sl@0: time, *tasks); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: CleanupStack::PopAndDestroy(entryList); sl@0: CleanupStack::PopAndDestroy(tasks); sl@0: sl@0: TheTest.Next(_L("===== Testing delete schedule =====")); sl@0: for (tryCount = 0; ;++tryCount) sl@0: { sl@0: TheScheduler.__DbgFailNext(tryCount); sl@0: TheScheduler.__DbgMarkHeap(); sl@0: err = TheScheduler.DeleteSchedule(ref1.iHandle); sl@0: if (err==KErrNone) sl@0: { sl@0: TheScheduler.__DbgResetHeap(); sl@0: break; sl@0: } sl@0: TEST2(err, KErrNoMemory); sl@0: // reset server side heap for next iteration. sl@0: TheScheduler.__DbgMarkEnd(0); sl@0: } sl@0: // Check schedule count sl@0: scheduleCount = CountScheduledItemsL(EAllSchedules, TheScheduler); sl@0: TEST(scheduleCount == 0); sl@0: sl@0: CleanupStack::PopAndDestroy(conditionArray); sl@0: sl@0: SchSvrHelpers::Pause(TheTest); sl@0: } sl@0: sl@0: //*********************************************************************************** sl@0: static TInt RunTestsL() sl@0: { sl@0: TheTest.Next(_L("Delete old files")); sl@0: SchSvrHelpers::DeleteScheduleFilesL(); sl@0: sl@0: TheTest.Next(_L("Create Task notification semaphore")); sl@0: //initialise task notification semaphore sl@0: STaskSemaphore sem; sl@0: sem.CreateL(); sl@0: sl@0: // Connect to the server sl@0: TheTest.Next(_L("===== Connect to Scheduler =====")); sl@0: TInt res = TheScheduler.Connect(); sl@0: TEST2(res, KErrNone); sl@0: // Register a client with the server sl@0: TheTest.Next(_L("===== Registering Client =====")); sl@0: res = SchSvrHelpers::RegisterClientL(TheScheduler); sl@0: TEST2(res, KErrNone); sl@0: sl@0: TheTest.Next(_L("Start tests")); sl@0: DoTest1L(); sl@0: DoTest2L(); sl@0: sl@0: // Need to add OOM tests for when a task is executed sl@0: // to clarify behaviour. This will be tricky!!! sl@0: sl@0: TheTest.Next(_L("Tidying up")); sl@0: //Tidying up so next test will be clear. sl@0: TheTest.Next(_L("Delete all schedules")); sl@0: SchSvrHelpers::DeleteAllSchedulesL(TheScheduler); sl@0: SchSvrHelpers::Pause(TheTest, 2); sl@0: TheTest.Next(_L("Delete old files\n")); sl@0: SchSvrHelpers::DeleteScheduleFilesL(); sl@0: sl@0: TheScheduler.Close(); sl@0: sl@0: //close handle to semaphore sl@0: sem.Close(); sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: //*********************************************************************************** sl@0: GLDEF_C TInt E32Main() sl@0: // sl@0: // TheTest the scheduler sl@0: // sl@0: { sl@0: __UHEAP_MARK; sl@0: TheTest.Start(_L("OOM testing")); sl@0: TheTest.Title(); sl@0: TheCleanup = CTrapCleanup::New(); sl@0: sl@0: //If the previous test fails, SCHSVR.exe may stay in memory. sl@0: TRAPD(error,CleanupHelpers::TestCleanupL()); sl@0: TEST2(error, KErrNone); sl@0: sl@0: TheTest(TheFsSession.Connect() == KErrNone);; sl@0: TRAP(error, RunTestsL()); sl@0: TEST2(error,KErrNone); sl@0: TRAP(error,CleanupHelpers::TestCleanupL()); sl@0: TEST2(error, KErrNone); sl@0: delete TheCleanup; sl@0: sl@0: TheFsSession.Close(); sl@0: TheTest.End(); sl@0: TheTest.Close(); sl@0: __UHEAP_MARKEND; sl@0: return KErrNone; sl@0: }