os/ossrv/genericservices/taskscheduler/Test/Robustness/TC_TSCH_IPC.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200 (2014-06-10)
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2008-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 
    17 #include <e32test.h>
    18 #include <e32math.h>
    19 #include <e32debug.h>
    20 #include "CSCHCODE.H"
    21 #include "SCHINFO.H"
    22 #include <bsul/bsul.h>
    23 #include <schinfointernal.h>
    24 using namespace BSUL;
    25 
    26 
    27 LOCAL_D RTest				Test (_L("TC_TSCH_IPC"));
    28 
    29 _LIT(KServerName, "!TaskScheduler");
    30 _LIT(KServerProcess, "SchExe");
    31 
    32 struct TTestInfo
    33 	{
    34 	TInt iFunction;
    35 	TInt iType;
    36 	TInt iArgCount;
    37 	};
    38 
    39 struct TExitDetails
    40 	{
    41 	TExitCategoryName iCategory;
    42 	TExitType iExitType;
    43 	TInt iReason;
    44 	};
    45 
    46 const TInt KAsynchDelay = 500000;
    47 
    48 const TInt KFunctionNumbers [] = {	ERegisterClient,
    49 									ECreateTimeSchedule,
    50 									ECreateConditionSchedule,
    51 									EScheduleTask,
    52 									ERemoveTask,
    53 									EDisableSchedule,
    54 									EEnableSchedule,
    55 									EDeleteSchedule,
    56 									EEditTimeSchedule,
    57 									EEditConditionSchedule,
    58 									EGetScheduleInfo,
    59 									EGetTimeScheduleData,
    60 									EGetConditionScheduleData,
    61 									EGetTaskData,
    62 									ECountSchedules,
    63 									ECountTasks,
    64 									EGetTaskRefs,
    65 									EGetTask,
    66 									EGetTaskDataSize,
    67 									EGetScheduleRefs,
    68 									EDeleteTask,
    69 									EGetSchedulerItemRefAndNextDueTime,
    70 									EGetScheduleType};
    71 
    72 const TInt KNumFunctions = sizeof(KFunctionNumbers)/sizeof(KFunctionNumbers[0]);
    73 
    74 //===============================================================================
    75 
    76 TBool IsFunctionAsynchronous(TInt aFunc)
    77 	{
    78 	TBool asynch = EFalse;
    79 	switch(aFunc)
    80 		{			
    81 			
    82 		default:
    83 			break;
    84 		}
    85 	return asynch;
    86 	}
    87 
    88 class RIpcFuzzTest : public RSessionBase
    89 {
    90 public: // Constructors and destructor
    91 
    92 	/**
    93 		* Constructor for performing 1st stage construction
    94 		*/
    95 	RIpcFuzzTest();
    96 
    97 	/**
    98 		* Destructor.
    99 		*/
   100 	~RIpcFuzzTest();
   101 
   102 	/**
   103 		* Performs test steps
   104 		*/
   105 	
   106 	void RunTestL(const TDesC& aTargetSrvName, TInt aFunc, 
   107 				TInt aTestType, TInt aArgCount);
   108 	
   109 private:
   110 	TInt Fuzz(TInt aMsg, TInt aArgCount);
   111 	TInt FuzzL(TInt aMsg, TInt aArgCount);
   112 	TInt Fuzz8L(TInt aMsg, TInt aArgCount);
   113 };
   114 
   115 RIpcFuzzTest::RIpcFuzzTest()
   116 	{
   117 	// No implementation required
   118 	}
   119 
   120 
   121 RIpcFuzzTest::~RIpcFuzzTest()
   122 	{
   123 	Close();	
   124 	}
   125 
   126 TInt RIpcFuzzTest::Fuzz(TInt aMsg, TInt aArgCount)
   127 	{
   128 	TIpcArgs args;
   129 	
   130 	for(TInt i = 0; i < aArgCount;i++)
   131 		{
   132 		args.Set(i,Math::Random());
   133 		}	
   134 	
   135 	TInt ret;
   136 	
   137 	if(IsFunctionAsynchronous(aMsg))
   138 		{
   139 		ret = Send(aMsg, args);
   140 		User::After(KAsynchDelay);
   141 		}
   142 	else
   143 		{
   144 		ret = SendReceive(aMsg, args);
   145 		}
   146 	return ret;
   147 	}
   148 
   149 TInt RIpcFuzzTest::Fuzz8L(TInt aMsg, TInt aArgCount)
   150 	{
   151 	HBufC8* buf = HBufC8::NewLC(255);
   152 	TPtr8 ptr = buf->Des();
   153 	ptr.Fill(Math::Random(),255);
   154 	
   155 	TIpcArgs args;
   156 	
   157 	for(TInt i = 0; i < aArgCount;i++)
   158 		{
   159 		args.Set(i,&ptr);
   160 		}
   161 	
   162 	TInt ret;
   163 	
   164 	if(IsFunctionAsynchronous(aMsg))
   165 		{
   166 		ret = Send(aMsg, args);
   167 		User::After(KAsynchDelay);
   168 		}
   169 	else
   170 		{
   171 		ret = SendReceive(aMsg, args);
   172 		}
   173 
   174 	CleanupStack::PopAndDestroy(buf);
   175 	return ret;
   176 	}
   177 
   178 TInt RIpcFuzzTest::FuzzL(TInt aMsg, TInt aArgCount)
   179 	{
   180 	HBufC* buf = HBufC::NewLC(255);
   181 	TPtr ptr = buf->Des();
   182 	ptr.Fill(Math::Random(),255);
   183 
   184 	TIpcArgs args;
   185 	
   186 	for(TInt i = 0; i < aArgCount;i++)
   187 		{
   188 		args.Set(i,&ptr);
   189 		}
   190 	
   191 	TInt ret;
   192 	
   193 	if(IsFunctionAsynchronous(aMsg))
   194 		{
   195 		ret = Send(aMsg, args);
   196 		User::After(KAsynchDelay);
   197 		}
   198 	else
   199 		{
   200 		ret = SendReceive(aMsg, args);
   201 		}
   202 
   203 	CleanupStack::PopAndDestroy(buf);
   204 	return ret;
   205 	}
   206 
   207 void RIpcFuzzTest::RunTestL(const TDesC& aTargetSrvName, 
   208 							TInt aFunc, TInt aTestType, TInt aArgCount)
   209 	{
   210 		TVersion version(0,0,0);
   211 	
   212 		TInt err = CreateSession(aTargetSrvName, version);
   213 		
   214 		User::LeaveIfError(err);
   215 	
   216 		switch(aTestType)
   217 			{
   218 			case 0:
   219 				Fuzz(aFunc,aArgCount);
   220 				break;
   221 				
   222 			case 1:
   223 				Fuzz8L(aFunc,aArgCount);
   224 				break;
   225 				
   226 			case 2:
   227 				FuzzL(aFunc,aArgCount);
   228 				break;			
   229 			}
   230 	}
   231 
   232 TInt KillProcess(const TDesC& aProcessName)
   233 	{
   234 	TFullName name;
   235 
   236 	RDebug::Print(_L("Find and kill \"%S\" process.\n"), &aProcessName);
   237 
   238 	TBuf<64> pattern(aProcessName);
   239 	TInt length = pattern.Length();
   240 	pattern += _L("*");
   241 	TFindProcess procFinder(pattern);
   242 
   243 	while (procFinder.Next(name) == KErrNone)
   244 		{
   245 		if (name.Length() > length)
   246 			{//If found name is a string containing aProcessName string.
   247 			TChar c(name[length]);
   248 			if (c.IsAlphaDigit() ||
   249 				c == TChar('_') ||
   250 				c == TChar('-'))
   251 				{
   252 				// If the found name is other valid application name
   253 				// starting with aProcessName string.
   254 				RDebug::Print(_L(":: Process name: \"%S\".\n"), &name);
   255 				continue;
   256 				}
   257 			}
   258 		RProcess proc;
   259 		if (proc.Open(name) == KErrNone)
   260 			{
   261 			proc.Kill(0);
   262 			RDebug::Print(_L("\"%S\" process killed.\n"), &name);
   263 			}
   264 		proc.Close();
   265 		}
   266 	return KErrNone;
   267 	}
   268 
   269 
   270 TInt FuzzServerL(TAny* aTestInfo)
   271 	{
   272    	CTrapCleanup* cleanup=CTrapCleanup::New();
   273    	TInt err=KErrNoMemory;
   274    	if (cleanup)
   275    		{
   276    		
   277 		TTestInfo* info = (TTestInfo*)aTestInfo;
   278 		RIpcFuzzTest fuzzer;
   279 		
   280 		TRAP(err,fuzzer.RunTestL(KServerName,info->iFunction
   281 				,info->iType, info->iArgCount));
   282 		
   283 		fuzzer.Close();
   284 
   285    		delete cleanup;
   286    		}
   287    	return err;
   288 	}
   289 
   290 
   291 void TestServerApi(TInt aFunctionNumber,
   292 			TInt aTestType,TInt aArgCount, TExitDetails& aExitDetails)
   293 	{
   294     
   295     TTestInfo testInfo;
   296 	testInfo.iFunction = aFunctionNumber;
   297 	testInfo.iType = aTestType;
   298 	testInfo.iArgCount = aArgCount;
   299     
   300     RThread thread;	
   301     _LIT(KThreadName,"FuzzerThread" );
   302 	thread.Create(KThreadName,&FuzzServerL, KDefaultStackSize, NULL,&testInfo);
   303 	
   304 	TRequestStatus threadStat;
   305 	thread.Logon(threadStat);
   306 	
   307 	TBool jit = User::JustInTime();
   308 	User::SetJustInTime(EFalse);
   309 	
   310 	thread.Resume();
   311 	
   312 	User::WaitForRequest(threadStat);
   313 	
   314 	User::SetJustInTime(jit);
   315 
   316 	aExitDetails.iCategory = thread.ExitCategory();
   317 	aExitDetails.iReason = thread.ExitReason();
   318 	aExitDetails.iExitType = thread.ExitType();
   319 	
   320 	thread.Close();
   321 
   322 	}
   323 
   324 
   325 TInt LaunchServer(RProcess& aServer)
   326 	{
   327 	
   328 	Test.Printf(_L("Launching Task Scheduler...\n"));
   329 	
   330 	const TUid KServerUid3 = {0x10005399};	
   331 	const TUidType serverUid(KNullUid,KNullUid,KServerUid3);
   332 	
   333 	TInt err = aServer.Create(KServerProcess, _L(""),serverUid);
   334 	 
   335 	if(err == KErrNone)
   336 		{   
   337 		aServer.SetPriority(EPriorityForeground);  
   338 		 
   339 		//Start server and wait until it is running
   340 		TRequestStatus serverStat;
   341 		aServer.SetJustInTime(false);   
   342 		aServer.Resume(); 
   343 		    
   344 		aServer.Rendezvous(serverStat);
   345 		User::WaitForRequest(serverStat);
   346 		}
   347 	 
   348 	 return err;
   349 	    
   350 	}
   351 
   352 void PrintTestMessage(TInt iFunc, TInt iType, TInt iArgCount)
   353 	{
   354 	switch(iType)
   355 		{
   356 		case 0:
   357 			Test.Printf(_L("\nFuzz Test on function number %d using random Int data. Number of Args = %d"), iFunc, iArgCount);
   358 			break;
   359 			
   360 		case 1:
   361 			Test.Printf(_L("\nFuzz Test on function number %d using random Des8 data. Number of Args = %d"), iFunc, iArgCount);
   362 			break;
   363 			
   364 		case 2:
   365 			Test.Printf(_L("\nFuzz Test on function number %d using random Des data. Number of Args = %d"), iFunc, iArgCount);
   366 			break;
   367 			
   368 		}
   369 	
   370 	}
   371 
   372 /**
   373 Invoke the tests
   374 */
   375 /**
   376 @SYMTestCaseID          SYSLIB-SCHSVR-CT-4004
   377 @SYMTestCaseDesc	    Tests SchSvr APIs for IPC Robustness
   378 @SYMTestPriority 	    High
   379 @SYMTestActions  	    The function calls each of the SchSvr APIs through a custom session object
   380 						passing random TInt, Des8 and Des16 data .
   381 @SYMTestExpectedResults The server should be robust to all malformed messages and should not
   382 						hang or panic.
   383 @SYMDEF                	PDEF118811
   384 */
   385 LOCAL_C void DoFuzzTestsL ()
   386     {  
   387     Test.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-4004 "));
   388     RProcess server;
   389     
   390     User::LeaveIfError(LaunchServer(server));
   391 
   392     TExitDetails exitDetails;
   393       
   394     for(TInt i = 0;i< KNumFunctions;i++)
   395     	{
   396     	
   397     	//Carry out each type of test
   398     	for(TInt testType = 0; testType < 3;testType++)
   399     		{
   400        		//Carry out each test with number of arguments 1 - 4
   401     		for(TInt argCount = 1;argCount <= 4;argCount++)
   402     			{
   403     			PrintTestMessage(KFunctionNumbers[i], testType, argCount);
   404 
   405     			TestServerApi(KFunctionNumbers[i], testType, argCount, exitDetails);
   406 		    	//Kill the server process and verify that it was still running
   407 		    	//If the server was already dead it would return the reason it exited
   408 	    		if(server.ExitType() != EExitPending)
   409 	    			{
   410 	    			server.Kill(0);
   411 	    			TInt exitReason = server.ExitReason();
   412 	    			server.Close();
   413 	    			Test(exitReason == 0);    	
   414 	    			User::LeaveIfError(LaunchServer(server));
   415 	    			}
   416     			}
   417 	    	
   418     		Test.Printf(_L("\nFuzz Test Successful\n"));
   419     		}
   420     	}
   421     }
   422 
   423 
   424 /*
   425  * SERVER API TESTING
   426  */
   427 
   428 typedef void (*TestFunction)();
   429 
   430 class RClientMessageTestSession : public RSessionBase
   431 	{
   432 public:
   433 	TInt Connect();
   434 	
   435 	TInt TestRegisterClient(const TDesC& aData0, TInt aArg1);
   436 	
   437 	TInt TestCreateTimeSchedule(TDesC8& aData0,TDesC8& aData1,TDes8& aData2);
   438 	TInt TestCreateCondSchedule(TDesC8& aData0,TDesC8& aData1,TDesC8& aData2,TDes8& aData3);
   439 	
   440 	TInt TestScheduleTask(TDesC8& aData0,TInt aArg1,TDes8& aData2,TDesC& aData3);
   441 	TInt TestDeleteTask(TInt aArg0);
   442 	TInt TestDeleteSchedule(TInt aArg0);
   443 	TInt TestDisableSchedule(TInt aArg0);
   444 	TInt TestEnableSchedule(TInt aArg0);
   445 	
   446 	TInt TestEditTimeSchedule(TInt aArg0, TInt aArg1, TDes8& aData2);
   447 	TInt TestEditCondSchedule(TInt aArg0, TInt aArg1, TDes8& aData2, TDes8& aData3);
   448 	
   449 	TInt TestGetScheduleRefs(TInt aArg0, TInt aArg1, TDes8& aData2);
   450 	TInt TestCountSchedules(TDes8& aData0, TInt aArg1);
   451 	TInt TestGetScheduleType(TInt aArg0,TDes8& aData1);
   452 	TInt TestGetScheduleInfo(TInt aArg0, TDes8& aData1, TDes8& aData2);
   453 	TInt TestGetTimeScheduleData(TInt aArg0, TDes8& aData1, TDes8& aData2);
   454 	TInt TestGetCondScheduleData(TInt aArg0, TDes8& aData1, TDes8& aData2, TDes8& aData3);
   455 	TInt TestGetScheduleItemRef(TInt aArg0, TDes8& aData1, TDes8& aData2);
   456 		
   457 	TInt TestGetTaskData(TInt aArg0, TDes8& aData1, TDes8& aData2);
   458 	TInt TestGetTaskRefs(TInt aArg0, TInt aArg1,TInt aArg2, TDes8& aData3);
   459 	TInt TestCountTasks(TDes8& aData0, TInt aArg1, TInt aArg2);	
   460 	TInt TestGetTaskInfo(TInt aArg0,TDesC8& aData1,TInt aArg2,TDesC& aData3);
   461 	TInt TestGetTaskDataSize(TInt aArg0,TDesC8& aData1);
   462 
   463 
   464 	};
   465 
   466 static TInt LaunchLogServerL()
   467 	{
   468 
   469 	RProcess process;
   470 
   471 	TInt err = process.Create(KServerProcess,_L(""));
   472 	 
   473 	if(err == KErrNone)
   474 		{
   475 		 TRequestStatus serverStat;		
   476 		 
   477 		 process.SetJustInTime(EFalse);
   478 		 process.Resume();
   479 		 process.Rendezvous(serverStat);
   480 		 User::WaitForRequest(serverStat);
   481 		}
   482 	
   483 	return err;
   484 	}
   485 
   486 
   487 TInt RClientMessageTestSession::Connect()
   488 	{
   489 	TInt retry = 2;
   490 	for(;;)
   491 		{
   492 		TInt r = CreateSession(KServerName,TVersion(1,0,0));
   493 		
   494 		if((r != KErrNotFound)&&(r != KErrServerTerminated))
   495 			{
   496 			return r;
   497 			}
   498 		
   499 		if(--retry == 0)
   500 			{
   501 			return r;
   502 			}
   503 		
   504 		r = LaunchLogServerL();
   505 		if((r != KErrNone)&&(r != KErrAlreadyExists))
   506 			{
   507 			return r;
   508 			}	
   509 		}
   510 	}
   511 
   512 TInt RClientMessageTestSession::TestRegisterClient(const TDesC& aData0, TInt aArg1)
   513 	{
   514 	return SendReceive(ERegisterClient,TIpcArgs(&aData0, aArg1));
   515 	}
   516 
   517 TInt RClientMessageTestSession::TestCreateTimeSchedule(TDesC8& aData0,TDesC8& aData1,TDes8& aData2)
   518 	{
   519 	return SendReceive(ECreateTimeSchedule,TIpcArgs(&aData0, &aData1,& aData2));
   520 	}
   521 
   522 TInt RClientMessageTestSession::TestCreateCondSchedule(TDesC8& aData0,TDesC8& aData1,TDesC8& aData2,TDes8& aData3)
   523 	{
   524 	return SendReceive(ECreateConditionSchedule,TIpcArgs(&aData0,&aData1, &aData2, &aData3));
   525 	}
   526 
   527 TInt RClientMessageTestSession::TestScheduleTask(TDesC8& aData0,TInt aArg1,TDes8& aData2,TDesC& aData3)
   528 	{
   529 	return SendReceive(EScheduleTask,TIpcArgs(&aData0, aArg1, &aData2, &aData3));
   530 	}
   531 
   532 TInt RClientMessageTestSession::TestDeleteTask(TInt aArg0)
   533 	{
   534 	return SendReceive(EDeleteTask,TIpcArgs(aArg0));
   535 	}
   536 
   537 TInt RClientMessageTestSession::TestDeleteSchedule(TInt aArg0)
   538 	{
   539 	return SendReceive(EDeleteSchedule,TIpcArgs(aArg0));
   540 	}
   541 
   542 TInt RClientMessageTestSession::TestDisableSchedule(TInt aArg0)
   543 	{
   544 	return SendReceive(EDisableSchedule,TIpcArgs(aArg0));
   545 	}
   546 
   547 TInt RClientMessageTestSession::TestEnableSchedule(TInt aArg0)
   548 	{
   549 	return SendReceive(EEnableSchedule,TIpcArgs(aArg0));
   550 	}
   551 
   552 TInt RClientMessageTestSession::TestEditTimeSchedule(TInt aArg0, TInt aArg1, TDes8& aData2)
   553 	{
   554 	return SendReceive(EEditTimeSchedule,TIpcArgs(aArg0, aArg1, &aData2));
   555 	}
   556 
   557 TInt RClientMessageTestSession::TestEditCondSchedule(TInt aArg0, TInt aArg1, TDes8& aData2, TDes8& aData3)
   558 	{
   559 	return SendReceive(EEditConditionSchedule,TIpcArgs(aArg0, aArg1, &aData2,&aData3));
   560 	}
   561 
   562 
   563 TInt RClientMessageTestSession::TestGetScheduleRefs(TInt aArg0, TInt aArg1, TDes8& aData2)
   564 	{
   565 	return SendReceive(EGetScheduleRefs,TIpcArgs(aArg0, aArg1, &aData2));
   566 	}
   567 
   568 TInt RClientMessageTestSession::TestCountSchedules(TDes8& aData0, TInt aArg1)
   569 	{
   570 	return SendReceive(ECountSchedules,TIpcArgs(&aData0, aArg1));
   571 	}
   572 
   573 TInt RClientMessageTestSession::TestGetScheduleType(TInt aArg0,TDes8& aData1)
   574 	{
   575 	return SendReceive(EGetScheduleType,TIpcArgs(aArg0, &aData1));
   576 	}
   577 
   578 TInt RClientMessageTestSession::TestGetScheduleInfo(TInt aArg0, TDes8& aData1, TDes8& aData2)
   579 	{
   580 	return SendReceive(EGetScheduleInfo,TIpcArgs(aArg0, &aData1, &aData2));
   581 	}
   582 
   583 TInt RClientMessageTestSession::TestGetTimeScheduleData(TInt aArg0, TDes8& aData1, TDes8& aData2)
   584 	{
   585 	return SendReceive(EGetTimeScheduleData,TIpcArgs(aArg0, &aData1, &aData2));
   586 	}
   587 
   588 TInt RClientMessageTestSession::TestGetCondScheduleData(TInt aArg0, TDes8& aData1, TDes8& aData2, TDes8& aData3)
   589 	{
   590 	return SendReceive(EGetConditionScheduleData,TIpcArgs(aArg0, &aData1, &aData2, &aData3));
   591 	}
   592 
   593 TInt RClientMessageTestSession::TestGetScheduleItemRef(TInt aArg0, TDes8& aData1, TDes8& aData2)
   594 	{
   595 	return SendReceive(EGetSchedulerItemRefAndNextDueTime,TIpcArgs(aArg0, &aData1, &aData2));
   596 	}
   597 
   598 TInt RClientMessageTestSession::TestGetTaskData(TInt aArg0, TDes8& aData1, TDes8& aData2)
   599 	{
   600 	return SendReceive(EGetTaskData,TIpcArgs(aArg0, &aData1, &aData2));
   601 	}
   602 
   603 TInt RClientMessageTestSession::TestGetTaskRefs(TInt aArg0, TInt aArg1,TInt aArg2, TDes8& aData3)
   604 	{
   605 	return SendReceive(EGetTaskRefs,TIpcArgs(aArg0, aArg1, aArg2, &aData3));
   606 	}
   607 
   608 TInt RClientMessageTestSession::TestCountTasks(TDes8& aData0, TInt aArg1, TInt aArg2)
   609 	{
   610 	return SendReceive(ECountTasks,TIpcArgs(&aData0, aArg1, aArg2));
   611 	}
   612 
   613 TInt RClientMessageTestSession::TestGetTaskInfo(TInt aArg0,TDesC8& aData1,TInt aArg2,TDesC& aData3)
   614 	{
   615 	return SendReceive(EGetTask,TIpcArgs(aArg0, &aData1, aArg2, &aData3));
   616 	}
   617 
   618 TInt RClientMessageTestSession::TestGetTaskDataSize(TInt aArg0,TDesC8& aData1)
   619 	{
   620 	return SendReceive(EGetTaskDataSize,TIpcArgs(aArg0, &aData1));
   621 	}
   622 
   623 
   624 
   625 
   626 
   627 TInt TestFunctionLauncherL(TAny* aTestFunction)
   628 	{
   629    	CTrapCleanup* cleanup=CTrapCleanup::New();
   630    	TInt r=KErrNoMemory;
   631    	if (cleanup)
   632    		{
   633    		TestFunction function = (TestFunction)aTestFunction;
   634 
   635 __UHEAP_MARK;  		
   636  		TRAP(r,function());
   637 __UHEAP_MARKEND;
   638  		
   639    		delete cleanup;
   640    		}
   641    	return r;
   642 	}
   643 
   644 
   645 TExitDetails LaunchTestThreadL(const TDesC& aThreadName, TestFunction aFunction)
   646 	{
   647 	RThread thread;	
   648 	thread.Create(aThreadName, &TestFunctionLauncherL, KDefaultStackSize, NULL, (TAny*)aFunction);
   649 	
   650 	TRequestStatus threadStat;
   651 	thread.Logon(threadStat);
   652 	
   653 	TBool jit = User::JustInTime();
   654 	User::SetJustInTime(EFalse);
   655 	
   656 	thread.Resume();
   657 	User::WaitForRequest(threadStat);
   658 	
   659 	User::SetJustInTime(jit);
   660 	 
   661 	TExitDetails exitDetails;
   662 	exitDetails.iCategory = thread.ExitCategory();
   663 	exitDetails.iReason = thread.ExitReason();
   664 	exitDetails.iExitType = thread.ExitType();
   665 	
   666 	return exitDetails;
   667 	}
   668 
   669 
   670 
   671 /**
   672 @SYMTestCaseID          SYSLIB-SCHSVR-CT-4005
   673 @SYMTestCaseDesc	    Tests Create Schedule API robustness
   674 @SYMTestPriority 	    High
   675 @SYMTestActions  	    Calls the Create Schedule APIs passing in varying parameters
   676 						to test the robustness of the API				
   677 @SYMTestExpectedResults The server should be robust to badly formed messages and should
   678 						return KErrBadParameter if messages do not fit the constraints 
   679 						defined in the message schema.  
   680 						The server should panic the client with KErrBadDescriptor if an 
   681 						invalid descriptor argument is passed.
   682 @SYMDEF                	PDEF118811
   683 */
   684 void TestCreateSchedulesL()
   685 	{
   686 	
   687 	RClientMessageTestSession session;
   688 	
   689 	TInt err = session.Connect();
   690 	
   691 	CleanupClosePushL(session);
   692 	
   693 	err = session.TestRegisterClient(_L("MyClient"),0);	
   694 	Test(err == KErrNone);
   695 	
   696 	err = session.TestRegisterClient(_L("MyClient2"),-1);	
   697 	Test(err == KErrBadParameter);
   698 	
   699 	TScheduleSettings2 settings;
   700 	TScheduleEntryInfo2 info;
   701 	TInt id;
   702 	
   703 	TPckg<TScheduleSettings2> pSettings(settings);
   704 	TPckg<TScheduleEntryInfo2> pInfo(info);
   705 	TPckg<TInt> pId(id);
   706 	
   707 	settings.iPersists = -1;
   708 	settings.iEntryCount = -1;	
   709 	
   710 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId);
   711 	Test(err == KErrBadParameter);
   712 	
   713 	settings.iPersists = 0;
   714 	settings.iEntryCount = 1;	
   715 	
   716 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId);
   717 	Test(err == KErrNone);
   718 	
   719 	TTsTime time;
   720 	TPckg<TTsTime> pTime(time);
   721 	TTaskSchedulerCondition conditions;
   722 	TPckg<TTaskSchedulerCondition> pConditions(conditions);
   723 	
   724 	err = session.TestCreateCondSchedule(pSettings, pConditions, pTime,pId);
   725 	Test(err == KErrNone);
   726 	
   727 	err = session.TestDisableSchedule(id);
   728 	Test(err == KErrNone);
   729 	
   730 	err = session.TestDisableSchedule(249990000);
   731 	Test(err == KErrNotFound);
   732 	
   733 	err = session.TestDisableSchedule(-1);
   734 	Test(err == KErrBadParameter);
   735 	
   736 	err = session.TestDisableSchedule(250000000);
   737 	Test(err == KErrBadParameter);
   738 	
   739 	CleanupStack::PopAndDestroy(&session);
   740 	}
   741 
   742 void TestCreateSchedulesPanic1L()
   743 	{
   744 	RClientMessageTestSession session;
   745 	
   746 	TInt err = session.Connect();
   747 	
   748 	CleanupClosePushL(session);
   749 	
   750 	err = session.TestRegisterClient(_L("MyClient"),0);	
   751 	Test(err == KErrNone);
   752 	
   753 	TScheduleSettings2 settings;
   754 	TScheduleEntryInfo2 info;
   755 	TInt id;
   756 	
   757 	TPckg<TScheduleSettings2> pSettings(settings);
   758 	TPckg<TScheduleEntryInfo2> pInfo(info);
   759 	TPckg<TInt> pId(id);
   760 	
   761 	settings.iPersists = 0;
   762 	settings.iEntryCount = 0;	
   763 	
   764 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId);
   765 	Test(err == KErrNone);
   766 
   767 	CleanupStack::PopAndDestroy(&session);
   768 	}
   769 
   770 void TestCreateSchedulesPanic2L()
   771 	{
   772 	RClientMessageTestSession session;
   773 	
   774 	TInt err = session.Connect();
   775 	
   776 	CleanupClosePushL(session);
   777 	
   778 	err = session.TestRegisterClient(_L("MyClient"),0);	
   779 	Test(err == KErrNone);
   780 	
   781 	TScheduleSettings2 settings;
   782 	TTaskSchedulerCondition conditions;
   783 	TTsTime time;
   784 	TInt id;
   785 	
   786 	TPckg<TScheduleSettings2> pSettings(settings);
   787 	TPckg<TTaskSchedulerCondition> pConditions(conditions);
   788 	TPckg<TTsTime> pTime(time);
   789 	TPckg<TInt> pId(id);
   790 	
   791 	settings.iEntryCount = 2;	
   792 	settings.iPersists = 0;
   793 	
   794 	err = session.TestCreateCondSchedule(pSettings, pConditions, pTime,pId);
   795 	Test(err == KErrNone);
   796 	
   797 	CleanupStack::PopAndDestroy(&session);
   798 	}
   799 
   800 /**
   801 @SYMTestCaseID          SYSLIB-SCHSVR-CT-4006
   802 @SYMTestCaseDesc	    Tests Edit Schedule API robustness
   803 @SYMTestPriority 	    High
   804 @SYMTestActions  	    Calls the Edit Schedule APIs passing in varying parameters
   805 						to test the robustness of the API				
   806 @SYMTestExpectedResults The server should be robust to badly formed messages and should
   807 						return KErrBadParameter if messages do not fit the constraints 
   808 						defined in the message schema.  
   809 @SYMDEF                	PDEF118811
   810 */
   811 void TestEditSchedulesL()
   812 	{
   813 	
   814 	RClientMessageTestSession session;
   815 	
   816 	TInt err = session.Connect();
   817 	
   818 	CleanupClosePushL(session);
   819 	
   820 	err = session.TestRegisterClient(_L("MyClient"),0);	
   821 	Test(err == KErrNone);
   822 	
   823 	TScheduleSettings2 settings;
   824 	TTaskSchedulerCondition conditions;
   825 	TTsTime time;
   826 	TInt id1;
   827 	TInt id2;
   828 	TScheduleInfo schedInfo;
   829 	
   830 	TPckg<TScheduleSettings2> pSettings(settings);
   831 	TPckg<TTaskSchedulerCondition> pConditions(conditions);
   832 	TPckg<TTsTime> pTime(time);
   833 	TPckg<TInt> pId1(id1);
   834 	TPckg<TInt> pId2(id2);
   835 	TPckg<TScheduleInfo> pSchedInfo(schedInfo);
   836 	
   837 	settings.iEntryCount = 1;	
   838 	settings.iPersists = 0;
   839 	
   840 	TScheduleEntryInfo2 info;
   841 	TPckg<TScheduleEntryInfo2> pInfo(info);
   842 	
   843 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
   844 	Test(err == KErrNone);
   845 	
   846 	err = session.TestEditTimeSchedule(settings.iEntryCount, id1,pInfo );
   847 	Test(err == KErrNone);
   848 	
   849 	err = session.TestEditTimeSchedule(-1, id1,pInfo );
   850 	Test(err == KErrBadParameter);
   851 	
   852 	err = session.TestEditTimeSchedule(10000, id1,pInfo );
   853 	Test(err == KErrBadParameter);
   854 	
   855 	err = session.TestEditTimeSchedule(settings.iEntryCount, -1,pInfo );
   856 	Test(err == KErrBadParameter);
   857 	
   858 	err = session.TestEditTimeSchedule(settings.iEntryCount,300000000,pInfo );
   859 	Test(err == KErrBadParameter);
   860 	
   861 	err = session.TestCreateCondSchedule(pSettings, pConditions, pTime,pId2);
   862 	Test(err == KErrNone);
   863 	
   864 	err = session.TestEditCondSchedule(settings.iEntryCount, id2,pConditions, pTime );
   865 	Test(err == KErrNone);
   866 	
   867 	err = session.TestEditCondSchedule(-231, id2,pConditions, pTime );
   868 	Test(err == KErrBadParameter);
   869 	
   870 	err = session.TestEditCondSchedule(11000, id2,pConditions, pTime );
   871 	Test(err == KErrBadParameter);
   872 	
   873 	err = session.TestEditCondSchedule(settings.iEntryCount, -1,pConditions, pTime );
   874 	Test(err == KErrBadParameter);
   875 	
   876 	err = session.TestEditCondSchedule(settings.iEntryCount, 250000000,pConditions, pTime );
   877 	Test(err == KErrBadParameter);
   878 		
   879 	CleanupStack::PopAndDestroy(&session);
   880 
   881 	}
   882 
   883 /**
   884 @SYMTestCaseID          SYSLIB-SCHSVR-CT-4007
   885 @SYMTestCaseDesc	    Tests  Schedule Data API robustness
   886 @SYMTestPriority 	    High
   887 @SYMTestActions  	    Calls the Get Schedule Data APIs passing in varying parameters
   888 						to test the robustness of the API				
   889 @SYMTestExpectedResults The server should be robust to badly formed messages and should
   890 						return KErrBadParameter if messages do not fit the constraints 
   891 						defined in the message schema.  
   892 						The server should panic the client with KErrBadDescriptor if an 
   893 						invalid descriptor argument is passed.
   894 @SYMDEF                	PDEF118811
   895 */
   896 void TestGetScheduleDataL()
   897 	{
   898 	RClientMessageTestSession session;
   899 		
   900 		TInt err = session.Connect();
   901 		
   902 		CleanupClosePushL(session);
   903 		
   904 		err = session.TestRegisterClient(_L("MyClient"),0);	
   905 		Test(err == KErrNone);
   906 		
   907 		TScheduleSettings2 settings;
   908 		TTaskSchedulerCondition conditions;
   909 		TTsTime time;
   910 		TInt id1;
   911 		TInt id2;
   912 		TScheduleInfo schedInfo;
   913 		
   914 		TPckg<TScheduleSettings2> pSettings(settings);
   915 		TPckg<TTaskSchedulerCondition> pConditions(conditions);
   916 		TPckg<TTsTime> pTime(time);
   917 		TPckg<TInt> pId1(id1);
   918 		TPckg<TInt> pId2(id2);
   919 		TPckg<TScheduleInfo> pSchedInfo(schedInfo);
   920 		
   921 		settings.iEntryCount = 1;	
   922 		settings.iPersists = 0;
   923 		
   924 		TScheduleEntryInfo2 info;
   925 		TPckg<TScheduleEntryInfo2> pInfo(info);
   926 		
   927 		err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
   928 		Test(err == KErrNone);
   929 		
   930 		err = session.TestCreateCondSchedule(pSettings, pConditions, pTime,pId2);
   931 		Test(err == KErrNone);
   932 				
   933 		err = session.TestGetScheduleInfo(id1,pSchedInfo, pTime);
   934 		Test(err == KErrNone);
   935 		
   936 		err = session.TestGetScheduleInfo(-1,pSchedInfo, pTime);
   937 		Test(err == KErrBadParameter);
   938 		
   939 		err = session.TestGetScheduleInfo(250000000,pSchedInfo, pTime);
   940 		Test(err == KErrBadParameter);
   941 		
   942 		TInt count;
   943 		TPckg<TInt> pCount(count);
   944 		
   945 		err = session.TestCountSchedules(pCount, -378);
   946 		Test(err == KErrBadParameter);
   947 		
   948 		err = session.TestCountSchedules(pCount, EAllSchedules);
   949 		Test(err == KErrNone);
   950 		
   951 		err = session.TestCountSchedules(pCount, EPendingSchedules);
   952 		Test(err == KErrNone);
   953 		
   954 		err = session.TestCountSchedules(pCount, 3);
   955 		Test(err == KErrBadParameter);
   956 		
   957 		schedInfo.iEntryCount = 1;
   958 		
   959 		err = session.TestGetTimeScheduleData(id1,pSchedInfo, pInfo);
   960 		Test(err == KErrNone);
   961 		
   962 		schedInfo.iEntryCount = 23;
   963 		
   964 		err = session.TestGetTimeScheduleData(id1,pSchedInfo, pInfo);
   965 		Test(err == KErrArgument);
   966 		
   967 		schedInfo.iEntryCount = 1;
   968 		
   969 		err = session.TestGetTimeScheduleData(250000000,pSchedInfo, pInfo);
   970 		Test(err == KErrBadParameter);
   971 		
   972 		err = session.TestGetCondScheduleData(id2,pSchedInfo, pInfo, pTime);
   973 		Test(err == KErrNone);
   974 		
   975 		schedInfo.iEntryCount = 23;
   976 		
   977 		err = session.TestGetCondScheduleData(id2,pSchedInfo, pInfo, pTime);
   978 		Test(err == KErrArgument);
   979 		
   980 		schedInfo.iEntryCount = 1;
   981 		
   982 		err = session.TestGetCondScheduleData(250000000,pSchedInfo, pInfo, pTime);
   983 		Test(err == KErrBadParameter);
   984 		
   985 		err = session.TestGetCondScheduleData(-3,pSchedInfo, pInfo, pTime);
   986 		Test(err == KErrBadParameter);			
   987 		
   988 		err = session.TestCountSchedules(pCount, EAllSchedules);
   989 		Test(err == KErrNone);
   990 		
   991 		HBufC8* data = HBufC8::NewL(sizeof(TSchedulerItemRef)* count);
   992 		TPtr8 pData = data->Des();
   993 		
   994 		err = session.TestGetScheduleRefs(count,EAllSchedules,pData);
   995 		Test(err == KErrNone);
   996 		
   997 		err = session.TestCountSchedules(pCount, EPendingSchedules);
   998 		Test(err == KErrNone);
   999 		
  1000 		err = session.TestGetScheduleRefs(count,EPendingSchedules,pData);
  1001 		Test(err == KErrArgument);
  1002 		
  1003 		err = session.TestGetScheduleRefs(count,3,pData);
  1004 		Test(err == KErrBadParameter);
  1005 		
  1006 		err = session.TestGetScheduleRefs(count,-1,pData);
  1007 		Test(err == KErrBadParameter);
  1008 		
  1009 		err = session.TestGetScheduleRefs(-5,EAllSchedules,pData);
  1010 		Test(err == KErrBadParameter);
  1011 		
  1012 		delete data;
  1013 		
  1014 		TInt type;
  1015 		TPckg<TInt> pType(type);
  1016 		
  1017 		err = session.TestGetScheduleType(id1,pType);
  1018 		Test(err == KErrNone);
  1019 		
  1020 		err = session.TestGetScheduleType(id2,pType);
  1021 		Test(err == KErrNone);
  1022 		
  1023 		err = session.TestGetScheduleType(-1,pType);
  1024 		Test(err == KErrBadParameter);
  1025 		
  1026 		err = session.TestGetScheduleType(250000002,pType);
  1027 		Test(err == KErrBadParameter);
  1028 		
  1029 		CleanupStack::PopAndDestroy(&session);
  1030 	}
  1031 
  1032 void TestGetScheduleDataPanic1L()
  1033 	{
  1034 	RClientMessageTestSession session;
  1035 		
  1036 	TInt err = session.Connect();
  1037 	
  1038 	CleanupClosePushL(session);
  1039 	
  1040 	err = session.TestRegisterClient(_L("MyClient"),0);	
  1041 	Test(err == KErrNone);
  1042 	
  1043 	TScheduleSettings2 settings;
  1044 	TTaskSchedulerCondition conditions;
  1045 	TTsTime time;
  1046 	TInt id1;
  1047 	TScheduleInfo schedInfo;
  1048 	
  1049 	TPckg<TScheduleSettings2> pSettings(settings);
  1050 	TPckg<TTsTime> pTime(time);
  1051 	TPckg<TInt> pId1(id1);
  1052 	TPckg<TScheduleInfo> pSchedInfo(schedInfo);
  1053 	
  1054 	settings.iEntryCount = 1;	
  1055 	settings.iPersists = 0;
  1056 	
  1057 	TScheduleEntryInfo2 info;
  1058 	TPckg<TScheduleEntryInfo2> pInfo(info);
  1059 	
  1060 	schedInfo.iEntryCount = 1;
  1061 	
  1062 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
  1063 	Test(err == KErrNone);
  1064 	
  1065 	err = session.TestGetTimeScheduleData(id1,pSchedInfo, pId1);
  1066 	Test(err == KErrOverflow);
  1067 
  1068 	CleanupStack::PopAndDestroy(&session);
  1069 	}
  1070 
  1071 void TestGetScheduleDataPanic2L()
  1072 	{
  1073 	RClientMessageTestSession session;
  1074 		
  1075 	TInt err = session.Connect();
  1076 	
  1077 	CleanupClosePushL(session);
  1078 	
  1079 	err = session.TestRegisterClient(_L("MyClient"),0);	
  1080 	Test(err == KErrNone);
  1081 	
  1082 	TScheduleSettings2 settings;
  1083 	TInt id1;
  1084 	TInt count;
  1085 	
  1086 	TPckg<TScheduleSettings2> pSettings(settings);
  1087 	TPckg<TInt> pId1(id1);
  1088 	TPckg<TInt> pCount(count);
  1089 	
  1090 	settings.iEntryCount = 1;	
  1091 	settings.iPersists = 0;
  1092 	
  1093 	TScheduleEntryInfo2 info;
  1094 	TPckg<TScheduleEntryInfo2> pInfo(info);
  1095 	
  1096 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
  1097 	Test(err == KErrNone);
  1098 	
  1099 	err = session.TestCountSchedules(pCount, EAllSchedules);
  1100 	Test(err == KErrNone);
  1101 		
  1102 	err = session.TestGetScheduleRefs(count,EAllSchedules,pInfo);
  1103 	Test(err == KErrOverflow);
  1104 	
  1105 	CleanupStack::PopAndDestroy(&session);
  1106 	}
  1107 
  1108 /**
  1109 @SYMTestCaseID          SYSLIB-SCHSVR-CT-4008
  1110 @SYMTestCaseDesc	    Tests  Schedule Task API robustness
  1111 @SYMTestPriority 	    High
  1112 @SYMTestActions  	    Calls the Schedule Tasks APIs passing in varying parameters
  1113 						to test the robustness of the API				
  1114 @SYMTestExpectedResults The server should be robust to badly formed messages and should
  1115 						return KErrBadParameter if messages do not fit the constraints 
  1116 						defined in the message schema.  
  1117 						The server should panic the client with KErrBadDescriptor if an 
  1118 						invalid descriptor argument is passed.
  1119 @SYMDEF                	PDEF118811
  1120 */
  1121 void TestScheduleTasksL()
  1122 	{
  1123 	
  1124 	RClientMessageTestSession session;
  1125 		
  1126 	TInt err = session.Connect();
  1127 	
  1128 	CleanupClosePushL(session);
  1129 	
  1130 	err = session.TestRegisterClient(_L("MyClient"),0);	
  1131 	Test(err == KErrNone);
  1132 	
  1133 	TScheduleSettings2 settings;
  1134 	TScheduleEntryInfo2 info;
  1135 	TInt id1;
  1136 	TInt taskId;
  1137 	
  1138 	TPckg<TScheduleSettings2> pSettings(settings);
  1139 	TPckg<TScheduleEntryInfo2> pInfo(info);
  1140 	TPckg<TInt> pId1(id1);
  1141 	TPckg<TInt> pTaskId(taskId);
  1142 
  1143 	
  1144 	settings.iEntryCount = 1;	
  1145 	settings.iPersists = 0;
  1146 	
  1147 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
  1148 	Test(err == KErrNone);
  1149 	
  1150 	TTaskInfo taskInfo;
  1151 	TPckg<TTaskInfo> pTaskInfo(taskInfo);
  1152 	TBuf<32> taskData;
  1153 	
  1154 	err = session.TestScheduleTask(pTaskInfo, -1, pTaskId,taskData);
  1155 	Test(err == KErrBadParameter);
  1156 	
  1157 	err = session.TestScheduleTask(pTaskInfo, 300000000, pTaskId,taskData);
  1158 	Test(err == KErrBadParameter);
  1159 	
  1160 	err = session.TestDeleteTask(0);
  1161 	Test(err == KErrNotFound);
  1162 	
  1163 	err = session.TestDeleteTask(249999999);
  1164 	Test(err == KErrNotFound);
  1165 	
  1166 	err = session.TestDeleteTask(250000000);
  1167 	Test(err == KErrNotFound);
  1168 	
  1169 	err = session.TestDeleteTask(-1);
  1170 	Test(err == KErrNotFound);
  1171 		
  1172 	CleanupStack::PopAndDestroy(&session);
  1173 	}
  1174 
  1175 void TestScheduleTasksPanic1L()
  1176 	{
  1177 	RClientMessageTestSession session;
  1178 		
  1179 	TInt err = session.Connect();
  1180 	
  1181 	CleanupClosePushL(session);
  1182 	
  1183 	err = session.TestRegisterClient(_L("MyClient"),0);	
  1184 	Test(err == KErrNone);
  1185 	
  1186 	TScheduleSettings2 settings;
  1187 	TScheduleEntryInfo2 info;
  1188 	TInt id1;
  1189 	TInt taskId;
  1190 	
  1191 	TPckg<TScheduleSettings2> pSettings(settings);
  1192 	TPckg<TScheduleEntryInfo2> pInfo(info);
  1193 	TPckg<TInt> pId1(id1);
  1194 	TPckg<TInt> pTaskId(taskId);
  1195 
  1196 	
  1197 	settings.iEntryCount = 1;	
  1198 	settings.iPersists = 0;
  1199 	
  1200 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
  1201 	Test(err == KErrNone);
  1202 	
  1203 	TTaskInfo taskInfo;
  1204 	TPckg<TTaskInfo> pTaskInfo(taskInfo);
  1205 	TBuf<32> taskData;
  1206 	
  1207 	//This should cause the server to panic the client as p0 is 
  1208 	//the wrong size
  1209 	err = session.TestScheduleTask(pInfo, id1, pTaskId,taskData);
  1210 		
  1211 	CleanupStack::PopAndDestroy(&session);
  1212 	}
  1213 
  1214 void TestScheduleTasksPanic2L()
  1215 	{
  1216 	RClientMessageTestSession session;
  1217 		
  1218 	TInt err = session.Connect();
  1219 	
  1220 	CleanupClosePushL(session);
  1221 	
  1222 	err = session.TestRegisterClient(_L("MyClient"),0);	
  1223 	Test(err == KErrNone);
  1224 	
  1225 	TScheduleSettings2 settings;
  1226 	TScheduleEntryInfo2 info;
  1227 	TInt id1;
  1228 	TInt taskId;
  1229 	
  1230 	TPckg<TScheduleSettings2> pSettings(settings);
  1231 	TPckg<TScheduleEntryInfo2> pInfo(info);
  1232 	TPckg<TInt> pId1(id1);
  1233 	TPckg<TInt> pTaskId(taskId);
  1234 
  1235 	
  1236 	settings.iEntryCount = 1;	
  1237 	settings.iPersists = 0;
  1238 	
  1239 	err = session.TestCreateTimeSchedule(pSettings, pInfo, pId1);
  1240 	Test(err == KErrNone);
  1241 	
  1242 	TTaskInfo taskInfo;
  1243 	TPckg<TTaskInfo> pTaskInfo(taskInfo);
  1244 	TBuf<32> taskData;
  1245 	
  1246 	//This should cause the server to panic the client as p2 is too large
  1247 	err = session.TestScheduleTask(pTaskInfo, id1, pTaskInfo,taskData);
  1248 		
  1249 	CleanupStack::PopAndDestroy(&session);
  1250 	}
  1251 
  1252 
  1253 /**
  1254 @SYMTestCaseID          SYSLIB-SCHSVR-CT-4009
  1255 @SYMTestCaseDesc	    Tests  Get Task Data API robustness
  1256 @SYMTestPriority 	    High
  1257 @SYMTestActions  	    Calls the Get Task Data APIs passing in varying parameters
  1258 						to test the robustness of the API				
  1259 @SYMTestExpectedResults The server should be robust to badly formed messages and should
  1260 						return KErrBadParameter if messages do not fit the constraints 
  1261 						defined in the message schema.  
  1262 @SYMDEF                	PDEF118811
  1263 */
  1264 void TestGetTaskDataL()
  1265 	{
  1266 	
  1267 	RClientMessageTestSession session;
  1268 		
  1269 	TInt err = session.Connect();
  1270 	
  1271 	CleanupClosePushL(session);
  1272 	
  1273 	err = session.TestRegisterClient(_L("MyClient"),0);	
  1274 	Test(err == KErrNone);
  1275 	
  1276 	TSchedulerItemRef itemRef;
  1277 	TScheduleInfo schedInfo;
  1278 	TTaskInfo taskInfo;
  1279 	TInt id1;
  1280 	TInt count;
  1281 	TInt taskId;
  1282 	
  1283 	TPckg<TScheduleInfo> pSchedInfo(schedInfo);
  1284 	TPckg<TSchedulerItemRef> pItemRef(itemRef);
  1285 	TPckg<TTaskInfo> pTaskInfo(taskInfo);
  1286 	TPckg<TInt> pId1(id1);
  1287 	TPckg<TInt> pCount(count);
  1288 	TPckg<TInt> pTaskId(taskId);
  1289 	
  1290 	
  1291 	err = session.TestGetTaskData(-1,pSchedInfo,pTaskInfo);
  1292 	Test(err == KErrBadParameter);
  1293 	
  1294 	err = session.TestGetTaskData(340000000,pSchedInfo,pTaskInfo);
  1295 	Test(err == KErrBadParameter);
  1296 	
  1297 	err = session.TestGetTaskRefs(0,0,0,pItemRef);
  1298 	Test(err == KErrArgument);
  1299 	
  1300 	err = session.TestGetTaskRefs(-1,EAllSchedules,EAllTasks,pItemRef);
  1301 	Test(err == KErrBadParameter);
  1302 	
  1303 	err = session.TestGetTaskRefs(340000000, EAllSchedules,EMyTasks,pItemRef);
  1304 	Test(err == KErrBadParameter);
  1305 	
  1306 	err = session.TestGetTaskRefs(1,-1,EAllTasks,pItemRef);
  1307 	Test(err == KErrBadParameter);
  1308 	
  1309 	err = session.TestGetTaskRefs(1,3,EAllTasks,pItemRef);
  1310 	Test(err == KErrBadParameter);
  1311 	
  1312 	err = session.TestGetTaskRefs(1,EPendingSchedules,-1,pItemRef);
  1313 	Test(err == KErrBadParameter);
  1314 	
  1315 	err = session.TestGetTaskRefs(1,EPendingSchedules,2,pItemRef);
  1316 	Test(err == KErrBadParameter);
  1317 	
  1318 	err = session.TestGetTaskRefs(1,EAllSchedules,EMyTasks,pItemRef);
  1319 	Test(err == KErrArgument);
  1320 	
  1321 	err = session.TestCountTasks(pCount,EAllSchedules,EMyTasks);
  1322 	Test(err == KErrNone);
  1323 	
  1324 	err = session.TestCountTasks(pCount,-1,EMyTasks);
  1325 	Test(err == KErrBadParameter);
  1326 	
  1327 	err = session.TestCountTasks(pCount,2,EMyTasks);
  1328 	Test(err == KErrBadParameter);
  1329 	
  1330 	err = session.TestCountTasks(pCount,EAllSchedules,-1);
  1331 	Test(err == KErrBadParameter);
  1332 	
  1333 	err = session.TestCountTasks(pCount,EAllSchedules,2);
  1334 	Test(err == KErrBadParameter);
  1335 	
  1336 	err = session.TestGetTaskDataSize(0,pCount);
  1337 	Test(err == KErrNotFound);
  1338 	
  1339 	err = session.TestGetTaskDataSize(249999999,pCount);
  1340 	Test(err == KErrNotFound);
  1341 	
  1342 	err = session.TestGetTaskDataSize(250000000,pCount);
  1343 	Test(err == KErrNotFound);
  1344 	
  1345 	err = session.TestGetTaskDataSize(-1,pCount);
  1346 	Test(err == KErrNotFound);
  1347 	
  1348 	TBuf<10> data;
  1349 	
  1350 	err = session.TestGetTaskInfo(0,pTaskInfo,10,data);
  1351 	Test(err == KErrNotFound);
  1352 	
  1353 	err = session.TestGetTaskInfo(249999999,pTaskInfo,10,data);
  1354 	Test(err == KErrNotFound);
  1355 	
  1356 	err = session.TestGetTaskInfo(250000000,pTaskInfo,10,data);
  1357 	Test(err == KErrNotFound);
  1358 	
  1359 	err = session.TestGetTaskInfo(-1,pTaskInfo,10,data);
  1360 	Test(err == KErrNotFound);
  1361 	
  1362 	TSchedulerItemRef schedItem;
  1363 	TTsTime time;
  1364 	
  1365 	TPckg<TSchedulerItemRef> pSchedItem(schedItem);
  1366 	TPckg<TTsTime> pTime(time);
  1367 
  1368 	err = session.TestGetScheduleItemRef(0,pSchedItem,pTime);
  1369 	Test(err == KErrNone);
  1370 	
  1371 	err = session.TestGetScheduleItemRef(249999999,pSchedItem,pTime);
  1372 	Test(err == KErrNotFound);
  1373 	
  1374 	err = session.TestGetScheduleItemRef(250000000,pSchedItem,pTime);
  1375 	Test(err == KErrBadParameter);
  1376 	
  1377 	err = session.TestGetScheduleItemRef(-1,pSchedItem,pTime);
  1378 	Test(err == KErrBadParameter);	
  1379 			
  1380 	CleanupStack::PopAndDestroy(&session);
  1381 	}
  1382 
  1383 
  1384 static void DoAPITestsL()
  1385 	{
  1386 	
  1387 	TExitDetails exitDetails;
  1388 	
  1389 	Test.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-4005 Test Create Schedule APIs "));
  1390 	exitDetails = LaunchTestThreadL(_L("TestCreateSchedulesL"), &TestCreateSchedulesL);
  1391 	Test(exitDetails.iExitType == EExitKill);
  1392 	
  1393 	exitDetails = LaunchTestThreadL(_L("TestCreateSchedulesPanic1L"), &TestCreateSchedulesPanic1L);
  1394 	Test(exitDetails.iExitType == EExitPanic);
  1395 	Test(exitDetails.iReason == KErrBadDescriptor);
  1396 	
  1397 	exitDetails = LaunchTestThreadL(_L("TestCreateSchedulesPanic2L"), &TestCreateSchedulesPanic2L);
  1398 	Test(exitDetails.iExitType == EExitPanic);
  1399 	Test(exitDetails.iReason == KErrBadDescriptor);
  1400 	
  1401 	Test.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-4006 Test Edit Schedule APIs "));
  1402 	exitDetails = LaunchTestThreadL(_L("TestEditSchedulesL"), &TestEditSchedulesL);
  1403 	Test(exitDetails.iExitType == EExitKill);
  1404 
  1405 	Test.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-4007 "));
  1406 	exitDetails = LaunchTestThreadL(_L("TestGetScheduleDataL"), &TestGetScheduleDataL);
  1407 	Test(exitDetails.iExitType == EExitKill);
  1408 	
  1409 	exitDetails = LaunchTestThreadL(_L("TestGetScheduleDataPanic1L"), &TestGetScheduleDataPanic1L);
  1410 	Test(exitDetails.iExitType == EExitPanic);
  1411 	Test(exitDetails.iReason == KErrOverflow);
  1412 	
  1413 	Test.Next(_L("  Test Get Schedule Data APIs "));
  1414 	exitDetails = LaunchTestThreadL(_L("TestGetScheduleDataPanic2L"), &TestGetScheduleDataPanic2L);
  1415 	Test(exitDetails.iExitType == EExitPanic);
  1416 	Test(exitDetails.iReason == KErrOverflow);
  1417 	
  1418 	Test.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-4008 Test Schedule Task APIs "));
  1419 	exitDetails = LaunchTestThreadL(_L("TestScheduleTasksL"), &TestScheduleTasksL);
  1420 	Test(exitDetails.iExitType == EExitKill);
  1421 	
  1422 	exitDetails = LaunchTestThreadL(_L("TestScheduleTasksPanic1L"), &TestScheduleTasksPanic1L);
  1423 	Test(exitDetails.iExitType == EExitPanic);
  1424 	Test(exitDetails.iReason == KErrBadDescriptor);
  1425 	
  1426 	exitDetails = LaunchTestThreadL(_L("TestScheduleTasksPanic2L"), &TestScheduleTasksPanic2L);
  1427 	Test(exitDetails.iExitType == EExitPanic);
  1428 	Test(exitDetails.iReason == KErrBadDescriptor);
  1429 	
  1430 	Test.Next(_L(" @SYMTestCaseID:SYSLIB-SCHSVR-CT-4009 Test Get Task Data APIs "));
  1431 	exitDetails = LaunchTestThreadL(_L("TestGetTaskDataL"), &TestGetTaskDataL);
  1432 	Test(exitDetails.iExitType == EExitKill);
  1433 	
  1434 	}
  1435 
  1436 
  1437 
  1438 
  1439 
  1440 
  1441 GLDEF_C TInt E32Main ()
  1442 	{
  1443 
  1444 	Test.Printf (_L ("\n"));
  1445 	Test.Title ();
  1446 	Test.Start (_L("IPC Fuzz Tests"));
  1447 
  1448    	CTrapCleanup* cleanup=CTrapCleanup::New();
  1449 	
  1450    	TInt err=KErrNoMemory;
  1451    	if (cleanup)
  1452    		{
  1453    		
  1454    		// Construct and install the active scheduler
  1455    		CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
  1456    		CActiveScheduler::Install (scheduler);
  1457    		
  1458    		KillProcess(KServerProcess);
  1459    		User::After(1000000);
  1460    				
  1461    		TRAP (err, DoFuzzTestsL ());
  1462    		Test (err == KErrNone);
  1463    		
  1464    		Test.Next(_L("Task Scheduler API Robustness Tests"));
  1465    		TRAP (err, DoAPITestsL ());
  1466    		Test (err == KErrNone);
  1467   
  1468    		Test.End ();
  1469    		Test.Close ();
  1470    		
  1471    		delete scheduler;
  1472    		delete cleanup;
  1473    		
  1474    		}
  1475 	return err;
  1476 	}