loggingservices/eventlogger/test/src/t_logservIPC.cpp
changeset 0 08ec8eefde2f
child 11 667e88a979d7
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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 "LogCliServShared.h"
       
    20 #include "logservpanic.h"
       
    21 #include "logpackage.h"
       
    22 
       
    23 LOCAL_D RTest				TheTest(_L("T_LogServIPC"));
       
    24 
       
    25 _LIT(KServerName, "!LogServ");
       
    26 _LIT(KServerProcess, "LogServ");
       
    27 
       
    28 //===========================================================================================
       
    29 
       
    30 static TPtrC FileName(const TText* aFile)
       
    31     {
       
    32     TPtrC p(aFile);
       
    33     TInt ix=p.LocateReverse('\\');
       
    34     if (ix<0)
       
    35         ix=p.LocateReverse('/');
       
    36     if (ix>=0)
       
    37         p.Set(p.Mid(1+ix));
       
    38     return p;
       
    39     }
       
    40 
       
    41 void LogLeave(TInt aErr, const TText* aFile, TInt aLine)
       
    42     {
       
    43     TPtrC fname(FileName(aFile));
       
    44     RDebug::Print(_L("*** LogEng test leave, err=%d, file: %S-%d\r\n"), aErr, &fname, aLine);
       
    45     User::Leave(aErr);
       
    46     }
       
    47 
       
    48 #undef  TEST_STRING
       
    49 #define TEST_STRING(s) _S(s)
       
    50 
       
    51 #undef  LEAVE
       
    52 #undef  LEAVE_IF_ERROR
       
    53 #define LEAVE(err)           LogLeave(err, TEST_STRING(__FILE__), __LINE__)
       
    54 #define LEAVE_IF_ERROR(err)  (err < KErrNone ? LogLeave(err, TEST_STRING(__FILE__), __LINE__) : void(0))
       
    55 
       
    56 //===========================================================================================
       
    57 
       
    58 ///////////////////////////////////////////////////////////////////////////////////////
       
    59 ///////////////////////////////////////////////////////////////////////////////////////
       
    60 //Test macross and functions
       
    61 
       
    62 static void Check(TInt aValue, TInt aLine)
       
    63 	{
       
    64 	if(!aValue)
       
    65 		{
       
    66 		TheTest(EFalse, aLine);
       
    67 		}
       
    68 	}
       
    69 static  void Check(TInt aValue, TInt aExpected, TInt aLine)
       
    70 	{
       
    71 	if(aValue != aExpected)
       
    72 		{
       
    73 		RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue);
       
    74 		TheTest(EFalse, aLine);
       
    75 		}
       
    76 	}
       
    77 #define TEST(arg) ::Check((arg), __LINE__)
       
    78 #define TEST2(aValue, aExpected) ::Check(aValue, aExpected, __LINE__)
       
    79 	
       
    80 ///////////////////////////////////////////////////////////////////////////////////////
       
    81 //
       
    82 
       
    83 struct TTestInfo
       
    84 	{
       
    85 	TInt iFunction;
       
    86 	TInt iType;
       
    87 	TInt iArgCount;
       
    88 	};
       
    89 
       
    90 struct TExitDetails
       
    91 	{
       
    92 	TExitCategoryName iCategory;
       
    93 	TExitType iExitType;
       
    94 	TInt iReason;
       
    95 	};
       
    96 
       
    97 const TInt KAsynchDelay = 500000;
       
    98 
       
    99 const TInt KFunctionNumbers [] = {ELogOperationCancel,
       
   100 								ELogOperationGetResult,
       
   101 								ELogOperationInitiate,
       
   102 								ELogNotify,
       
   103 								ELogNotifyCancel,
       
   104 								ELogViewCreate,
       
   105 								ELogViewDelete,
       
   106 								ELogViewCount,
       
   107 								ELogViewOperationInitiate,
       
   108 								ELogViewChangeNotificationsRequest,
       
   109 								ELogViewChangeNotificationsCancel,
       
   110 								ELogViewFetchChanges,
       
   111 								ELogViewNotifyLockStatusChange,
       
   112 								ELogViewNotifyLockStatusChangeCancel,
       
   113 								ELogNotifyExtended,
       
   114 								ELogNotifyExtendedCancel};
       
   115 
       
   116 const TInt KNumFunctions = sizeof(KFunctionNumbers)/sizeof(KFunctionNumbers[0]);
       
   117 
       
   118 //===============================================================================
       
   119 
       
   120 TBool IsFunctionAsynchronous(TInt aFunc)
       
   121 	{
       
   122 	TBool asynch = EFalse;
       
   123 	switch(aFunc)
       
   124 		{			
       
   125 		case ELogOperationInitiate:
       
   126 		case ELogNotify:
       
   127 		case ELogViewOperationInitiate:
       
   128 		case ELogViewChangeNotificationsRequest:
       
   129 		case ELogViewNotifyLockStatusChange:
       
   130 		case ELogNotifyExtended:
       
   131 			asynch = ETrue;
       
   132 			break;
       
   133 			
       
   134 		default:
       
   135 			break;
       
   136 		}
       
   137 	return asynch;
       
   138 	}
       
   139 
       
   140 class RIpcFuzzTest : public RSessionBase
       
   141 {
       
   142 public: // Constructors and destructor
       
   143 
       
   144 	/**
       
   145 		* Constructor for performing 1st stage construction
       
   146 		*/
       
   147 	RIpcFuzzTest();
       
   148 
       
   149 	/**
       
   150 		* Destructor.
       
   151 		*/
       
   152 	~RIpcFuzzTest();
       
   153 
       
   154 	/**
       
   155 		* Performs test steps
       
   156 		*/
       
   157 	
       
   158 	void RunTestL(const TDesC& aTargetSrvName, TInt aFunc, 
       
   159 				TInt aTestType, TInt aArgCount);
       
   160 	
       
   161 private:
       
   162 	TInt Fuzz(TInt aMsg, TInt aArgCount);
       
   163 	TInt FuzzL(TInt aMsg, TInt aArgCount);
       
   164 	TInt Fuzz8L(TInt aMsg, TInt aArgCount);
       
   165 };
       
   166 
       
   167 RIpcFuzzTest::RIpcFuzzTest()
       
   168 	{
       
   169 	// No implementation required
       
   170 	}
       
   171 
       
   172 
       
   173 RIpcFuzzTest::~RIpcFuzzTest()
       
   174 	{
       
   175 	Close();	
       
   176 	}
       
   177 
       
   178 TInt RIpcFuzzTest::Fuzz(TInt aMsg, TInt aArgCount)
       
   179 	{
       
   180 	TIpcArgs args;
       
   181 	
       
   182 	for(TInt i = 0; i < aArgCount;i++)
       
   183 		{
       
   184 		args.Set(i,Math::Random());
       
   185 		}	
       
   186 	
       
   187 	TInt ret;
       
   188 	
       
   189 	if(IsFunctionAsynchronous(aMsg))
       
   190 		{
       
   191 		ret = Send(aMsg, args);
       
   192 		User::After(KAsynchDelay);
       
   193 		}
       
   194 	else
       
   195 		{
       
   196 		ret = SendReceive(aMsg, args);
       
   197 		}
       
   198 	return ret;
       
   199 	}
       
   200 
       
   201 TInt RIpcFuzzTest::Fuzz8L(TInt aMsg, TInt aArgCount)
       
   202 	{
       
   203 	HBufC8* buf = HBufC8::NewLC(255);
       
   204 	TPtr8 ptr = buf->Des();
       
   205 	ptr.Fill(Math::Random(),255);
       
   206 	
       
   207 	TIpcArgs args;
       
   208 	
       
   209 	for(TInt i = 0; i < aArgCount;i++)
       
   210 		{
       
   211 		args.Set(i,&ptr);
       
   212 		}
       
   213 	
       
   214 	TInt ret;
       
   215 	
       
   216 	if(IsFunctionAsynchronous(aMsg))
       
   217 		{
       
   218 		ret = Send(aMsg, args);
       
   219 		User::After(KAsynchDelay);
       
   220 		}
       
   221 	else
       
   222 		{
       
   223 		ret = SendReceive(aMsg, args);
       
   224 		}
       
   225 
       
   226 	CleanupStack::PopAndDestroy(buf);
       
   227 	return ret;
       
   228 	}
       
   229 
       
   230 TInt RIpcFuzzTest::FuzzL(TInt aMsg, TInt aArgCount)
       
   231 	{
       
   232 	HBufC* buf = HBufC::NewLC(255);
       
   233 	TPtr ptr = buf->Des();
       
   234 	ptr.Fill(Math::Random(),255);
       
   235 
       
   236 	TIpcArgs args;
       
   237 	
       
   238 	for(TInt i = 0; i < aArgCount;i++)
       
   239 		{
       
   240 		args.Set(i,&ptr);
       
   241 		}
       
   242 	
       
   243 	TInt ret;
       
   244 	
       
   245 	if(IsFunctionAsynchronous(aMsg))
       
   246 		{
       
   247 		ret = Send(aMsg, args);
       
   248 		User::After(KAsynchDelay);
       
   249 		}
       
   250 	else
       
   251 		{
       
   252 		ret = SendReceive(aMsg, args);
       
   253 		}
       
   254 
       
   255 	CleanupStack::PopAndDestroy(buf);
       
   256 	return ret;
       
   257 	}
       
   258 
       
   259 void RIpcFuzzTest::RunTestL(const TDesC& aTargetSrvName, 
       
   260 							TInt aFunc, TInt aTestType, TInt aArgCount)
       
   261 	{
       
   262 		TVersion version(0,0,0);
       
   263 	
       
   264 		TInt err = CreateSession(aTargetSrvName, version);
       
   265 		
       
   266 		LEAVE_IF_ERROR(err);
       
   267 	
       
   268 		switch(aTestType)
       
   269 			{
       
   270 			case 0:
       
   271 				Fuzz(aFunc,aArgCount);
       
   272 				break;
       
   273 				
       
   274 			case 1:
       
   275 				Fuzz8L(aFunc,aArgCount);
       
   276 				break;
       
   277 				
       
   278 			case 2:
       
   279 				FuzzL(aFunc,aArgCount);
       
   280 				break;			
       
   281 			}
       
   282 	}
       
   283 
       
   284 TInt KillProcess(const TDesC& aProcessName)
       
   285 	{
       
   286 	TFullName name;
       
   287 
       
   288 	RDebug::Print(_L("Find and kill \"%S\" process.\n"), &aProcessName);
       
   289 
       
   290 	TBuf<64> pattern(aProcessName);
       
   291 	TInt length = pattern.Length();
       
   292 	pattern += _L("*");
       
   293 	TFindProcess procFinder(pattern);
       
   294 
       
   295 	while (procFinder.Next(name) == KErrNone)
       
   296 		{
       
   297 		if (name.Length() > length)
       
   298 			{//If found name is a string containing aProcessName string.
       
   299 			TChar c(name[length]);
       
   300 			if (c.IsAlphaDigit() ||
       
   301 				c == TChar('_') ||
       
   302 				c == TChar('-'))
       
   303 				{
       
   304 				// If the found name is other valid application name
       
   305 				// starting with aProcessName string.
       
   306 				RDebug::Print(_L(":: Process name: \"%S\".\n"), &name);
       
   307 				continue;
       
   308 				}
       
   309 			}
       
   310 		RProcess proc;
       
   311 		if (proc.Open(name) == KErrNone)
       
   312 			{
       
   313 			proc.Kill(0);
       
   314 			RDebug::Print(_L("\"%S\" process killed.\n"), &name);
       
   315 			}
       
   316 		proc.Close();
       
   317 		}
       
   318 	return KErrNone;
       
   319 	}
       
   320 
       
   321 
       
   322 TInt FuzzServerL(TAny* aTestInfo)
       
   323 	{
       
   324    	CTrapCleanup* cleanup=CTrapCleanup::New();
       
   325    	TInt err=KErrNoMemory;
       
   326    	if (cleanup)
       
   327    		{
       
   328    		
       
   329 		TTestInfo* info = (TTestInfo*)aTestInfo;
       
   330 		RIpcFuzzTest fuzzer;
       
   331 		
       
   332 		TRAP(err,fuzzer.RunTestL(KServerName,info->iFunction
       
   333 				,info->iType, info->iArgCount));
       
   334 		
       
   335 		fuzzer.Close();
       
   336 
       
   337    		delete cleanup;
       
   338    		}
       
   339    	return err;
       
   340 	}
       
   341 
       
   342 
       
   343 void TestServerApi(TInt aFunctionNumber,
       
   344 			TInt aTestType,TInt aArgCount, TExitDetails& aExitDetails)
       
   345 	{
       
   346     
       
   347     TTestInfo testInfo;
       
   348 	testInfo.iFunction = aFunctionNumber;
       
   349 	testInfo.iType = aTestType;
       
   350 	testInfo.iArgCount = aArgCount;
       
   351     
       
   352     RThread thread;	
       
   353     _LIT(KThreadName,"FuzzerThread" );
       
   354 	TInt err = thread.Create(KThreadName,&FuzzServerL, KDefaultStackSize, NULL,&testInfo);
       
   355 	TEST2(err, KErrNone);
       
   356 	
       
   357 	TRequestStatus threadStat;
       
   358 	thread.Logon(threadStat);
       
   359 	
       
   360 	TBool jit = User::JustInTime();
       
   361 	User::SetJustInTime(EFalse);
       
   362 	
       
   363 	thread.Resume();
       
   364 	
       
   365 	User::WaitForRequest(threadStat);
       
   366 	
       
   367 	User::SetJustInTime(jit);
       
   368 
       
   369 	aExitDetails.iCategory = thread.ExitCategory();
       
   370 	aExitDetails.iReason = thread.ExitReason();
       
   371 	aExitDetails.iExitType = thread.ExitType();
       
   372 	
       
   373 	thread.Close();
       
   374 
       
   375 	}
       
   376 
       
   377 
       
   378 TInt LaunchServer(RProcess& aServer)
       
   379 	{
       
   380 	
       
   381 	TheTest.Printf(_L("Launching LogServer...\n"));
       
   382 	
       
   383 	const TUid KServerUid3 = {0x0101f401d};	
       
   384 	const TUidType serverUid(KNullUid,KNullUid,KServerUid3);
       
   385 	
       
   386 	TInt err = aServer.Create(KServerProcess, _L(""),serverUid);
       
   387 	 
       
   388 	if(err == KErrNone)
       
   389 		{   
       
   390 		aServer.SetPriority(EPriorityForeground);  
       
   391 		 
       
   392 		//Start server and wait until it is running
       
   393 		TRequestStatus serverStat;
       
   394 		aServer.SetJustInTime(false);   
       
   395 		aServer.Resume(); 
       
   396 		    
       
   397 		aServer.Rendezvous(serverStat);
       
   398 		User::WaitForRequest(serverStat);
       
   399 		}
       
   400 	 
       
   401 	 return err;
       
   402 	    
       
   403 	}
       
   404 
       
   405 void PrintTestMessage(TInt iFunc, TInt iType, TInt iArgCount)
       
   406 	{
       
   407 	switch(iType)
       
   408 		{
       
   409 		case 0:
       
   410 			TheTest.Printf(_L("\nFuzz Test on function number %d using random Int data. Number of Args = %d"), iFunc, iArgCount);
       
   411 			break;
       
   412 			
       
   413 		case 1:
       
   414 			TheTest.Printf(_L("\nFuzz Test on function number %d using random Des8 data. Number of Args = %d"), iFunc, iArgCount);
       
   415 			break;
       
   416 			
       
   417 		case 2:
       
   418 			TheTest.Printf(_L("\nFuzz Test on function number %d using random Des data. Number of Args = %d"), iFunc, iArgCount);
       
   419 			break;
       
   420 			
       
   421 		}
       
   422 	
       
   423 	}
       
   424 
       
   425 /**
       
   426 Invoke the tests
       
   427 */
       
   428 /**
       
   429 @SYMTestCaseID          SYSLIB-LOGENG-CT-4002
       
   430 @SYMTestCaseDesc	    Tests LogEng APIs for IPC Robustness
       
   431 @SYMTestPriority 	    High
       
   432 @SYMTestActions  	    The function calls each of the Logeng APIs through a custom session object
       
   433 						passing random TInt, Des8 and Des16 data .
       
   434 @SYMTestExpectedResults The server should be robust to all malformed messages and should not
       
   435 						hang or panic.
       
   436 @SYMDEF                	INC114113
       
   437 */
       
   438 LOCAL_C void DoFuzzTestsL ()
       
   439     {  
       
   440     TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4002 "));
       
   441     RProcess server;
       
   442     
       
   443     LEAVE_IF_ERROR(LaunchServer(server));
       
   444 
       
   445     TExitDetails exitDetails;
       
   446       
       
   447     for(TInt i = 0;i< KNumFunctions;i++)
       
   448     	{
       
   449     	
       
   450     	//Carry out each type of test
       
   451     	for(TInt testType = 0; testType < 3;testType++)
       
   452     		{
       
   453        		//Carry out each test with number of arguments 1 - 4
       
   454     		for(TInt argCount = 1;argCount <= 4;argCount++)
       
   455     			{
       
   456     			PrintTestMessage(KFunctionNumbers[i], testType, argCount);
       
   457 
       
   458     			TestServerApi(KFunctionNumbers[i], testType, argCount, exitDetails);
       
   459 		    	//Kill the server process and verify that it was still running
       
   460 		    	//If the server was already dead it would return the reason it exited
       
   461 	    		if(server.ExitType() != EExitPending)
       
   462 	    			{
       
   463 	    			server.Kill(0);
       
   464 	    			TInt exitReason = server.ExitReason();
       
   465 	    			server.Close();
       
   466 	    			TEST2(exitReason, 0);    	
       
   467 	    			LEAVE_IF_ERROR(LaunchServer(server));
       
   468 	    			}
       
   469     			}
       
   470 	    	
       
   471     		TheTest.Printf(_L("\nFuzz Test Successful\n"));
       
   472     		}
       
   473     	}
       
   474     }
       
   475 
       
   476 
       
   477 /*
       
   478  * SERVER API TESTING
       
   479  */
       
   480 
       
   481 typedef void (*TestFunction)();
       
   482 
       
   483 class RClientMessageTestSession : public RSessionBase
       
   484 	{
       
   485 public:
       
   486 	TInt Connect();
       
   487 	
       
   488 	TInt TestMakeTransient(TInt aArg0);
       
   489 	TInt TestMakeTransient(const TDesC8& aArg0);
       
   490 	
       
   491 	TInt TestCliServDataParam(TInt aFunc, TDes8& aArg0);
       
   492 	TInt TestCliServDataParam(TInt aFunc, TDes8& aArg0, TUint32 aArg1);
       
   493 	TInt TestCliServDataParam(TInt aFunc, TDes8& aArg0, TDes8& aArg1, TInt aArg2);
       
   494 	TInt TestCliServDataParam(TInt aFunc, TDes& aArg0, TDes8& aArg1, TInt aArg2);
       
   495 	
       
   496 	TInt TestLogNotify(TInt aArg0);
       
   497 	TInt TestLogNotifyCancel();
       
   498 	
       
   499 	TInt TestLogViewCreate(TInt aArg0, TInt aArg1);	
       
   500 	
       
   501 	TInt TestLogViewIdParam(TInt aFunc, TInt aArg0);
       
   502 	TInt TestLogViewIdParam(TInt aFunc, TDes8& aArg1);
       
   503 	
       
   504 	TInt TestLogViewFetchChanges(TInt aArg0, TInt aArg1, TDes8& aArg2);
       
   505 	TInt TestLogViewFetchChanges(TInt aArg0, TInt aArg1, const TDesC8& aArg2);
       
   506 	
       
   507 	TInt TestLogNotifyExtended(TDes8& aArg0, TDes8& aArg1, TDes8& aArg2,TDes8& aArg3);
       
   508 	TInt TestLogNotifyExtended(TDes& aArg0, TDes& aArg1, TDes& aArg2,TDes& aArg3);
       
   509 	TInt TestLogNotifyExtended(TDes8& aArg0, TInt aArg1, TInt aArg2,const TDesC8& aArg3);
       
   510 	
       
   511 	TInt TestFunction45(TAny* aData);
       
   512 	
       
   513 
       
   514 	};
       
   515 
       
   516 static TInt LaunchLogServer()
       
   517 	{
       
   518 
       
   519 	RProcess process;
       
   520 
       
   521 	TInt err = process.Create(KServerProcess,_L(""));
       
   522 	 
       
   523 	if(err == KErrNone)
       
   524 		{
       
   525 		 TRequestStatus serverStat;		
       
   526 		 
       
   527 		 process.SetJustInTime(EFalse);
       
   528 		 process.Resume();
       
   529 		 process.Rendezvous(serverStat);
       
   530 		 User::WaitForRequest(serverStat);
       
   531 		}
       
   532 	
       
   533 	return err;
       
   534 	}
       
   535 
       
   536 
       
   537 TInt RClientMessageTestSession::Connect()
       
   538 	{
       
   539 	TInt retry = 2;
       
   540 	for(;;)
       
   541 		{
       
   542 		TInt r = CreateSession(KServerName,TVersion(1,0,0));
       
   543 		
       
   544 		if((r != KErrNotFound)&&(r != KErrServerTerminated))
       
   545 			{
       
   546 			return r;
       
   547 			}
       
   548 		
       
   549 		if(--retry == 0)
       
   550 			{
       
   551 			return r;
       
   552 			}
       
   553 		
       
   554 		r = LaunchLogServer();
       
   555 		if((r != KErrNone)&&(r != KErrAlreadyExists))
       
   556 			{
       
   557 			return r;
       
   558 			}	
       
   559 		}
       
   560 	}
       
   561 
       
   562 TInt RClientMessageTestSession::TestMakeTransient(TInt aArg0)
       
   563 	{
       
   564 	return SendReceive(ELogMakeTransient,TIpcArgs(aArg0));
       
   565 	}
       
   566 
       
   567 TInt RClientMessageTestSession::TestMakeTransient(const TDesC8& aArg0)
       
   568 	{
       
   569 	return SendReceive(ELogMakeTransient,TIpcArgs(&aArg0));
       
   570 	}
       
   571 
       
   572 TInt RClientMessageTestSession::TestCliServDataParam(TInt aFunc, TDes8& aArg0)
       
   573 	{
       
   574 	return SendReceive(aFunc,TIpcArgs(&aArg0));
       
   575 	}
       
   576 
       
   577 TInt RClientMessageTestSession::TestCliServDataParam(TInt aFunc, TDes8& aArg0, TUint32 aArg1)
       
   578 	{
       
   579 	return SendReceive(aFunc,TIpcArgs(&aArg0, aArg1));
       
   580 	}
       
   581 
       
   582 TInt RClientMessageTestSession::TestCliServDataParam(TInt aFunc, TDes8& aArg0, TDes8& aArg1, TInt aArg2)
       
   583 	{
       
   584 	return SendReceive(aFunc,TIpcArgs(&aArg0, &aArg1, aArg2));
       
   585 	}
       
   586 
       
   587 TInt RClientMessageTestSession::TestLogNotify(TInt aArg0)
       
   588 	{
       
   589 	return Send(ELogNotify,TIpcArgs(aArg0));
       
   590 	}
       
   591 
       
   592 TInt RClientMessageTestSession::TestLogNotifyCancel()
       
   593 	{
       
   594 	return Send(ELogNotifyCancel);
       
   595 	}
       
   596 	
       
   597 TInt RClientMessageTestSession::TestLogViewCreate(TInt aArg0, TInt aArg1)
       
   598 	{
       
   599 	return SendReceive(ELogViewCreate,TIpcArgs(aArg0,aArg1));
       
   600 	}
       
   601 
       
   602 
       
   603 TInt RClientMessageTestSession::TestLogViewIdParam(TInt aFunc, TInt aArg0)
       
   604 	{
       
   605 	return SendReceive(aFunc,TIpcArgs(aArg0));
       
   606 	}
       
   607 
       
   608 TInt RClientMessageTestSession::TestLogViewIdParam(TInt aFunc, TDes8& aArg0)
       
   609 	{
       
   610 	return SendReceive(aFunc,TIpcArgs(&aArg0));
       
   611 	}
       
   612 
       
   613 TInt RClientMessageTestSession::TestLogViewFetchChanges(TInt aArg0, TInt aArg1, TDes8& aArg2)
       
   614 	{
       
   615 	return SendReceive(ELogViewFetchChanges,TIpcArgs(aArg0,aArg1, &aArg2));
       
   616 	}
       
   617 
       
   618 TInt RClientMessageTestSession::TestLogViewFetchChanges(TInt aArg0, TInt aArg1, const TDesC8& aArg2)
       
   619 	{
       
   620 	return SendReceive(ELogViewFetchChanges,TIpcArgs(aArg0,aArg1, &aArg2));
       
   621 	}
       
   622 
       
   623 TInt RClientMessageTestSession::TestLogNotifyExtended(TDes8& aArg0, 
       
   624 								TDes8& aArg1, TDes8& aArg2,TDes8& aArg3)
       
   625 	{
       
   626 	return Send(ELogNotifyExtended,TIpcArgs(&aArg0,&aArg1,&aArg2,&aArg3));
       
   627 	}
       
   628 
       
   629 TInt RClientMessageTestSession::TestLogNotifyExtended(TDes& aArg0, 
       
   630 								TDes& aArg1, TDes& aArg2,TDes& aArg3)
       
   631 	{
       
   632 	return Send(ELogNotifyExtended,TIpcArgs(&aArg0,&aArg1,&aArg2,&aArg3));
       
   633 	}
       
   634 
       
   635 TInt RClientMessageTestSession::TestLogNotifyExtended(TDes8& aArg0, 
       
   636 								TInt aArg1, TInt aArg2,const TDesC8& aArg3)
       
   637 	{
       
   638 	return Send(ELogNotifyExtended,TIpcArgs(&aArg0,&aArg1,&aArg2,&aArg3));
       
   639 	}
       
   640 
       
   641 TInt RClientMessageTestSession::TestFunction45(TAny* aData)
       
   642 	{
       
   643 	return SendReceive(45,TIpcArgs(aData));
       
   644 	}
       
   645 
       
   646 
       
   647 TInt TestFunctionLauncherL(TAny* aTestFunction)
       
   648 	{
       
   649    	CTrapCleanup* cleanup=CTrapCleanup::New();
       
   650    	TInt r=KErrNoMemory;
       
   651    	if (cleanup)
       
   652    		{
       
   653    		TestFunction function = (TestFunction)aTestFunction;
       
   654 
       
   655 __UHEAP_MARK;  		
       
   656  		TRAP(r,function());
       
   657 __UHEAP_MARKEND;
       
   658  		
       
   659    		delete cleanup;
       
   660    		}
       
   661    	return r;
       
   662 	}
       
   663 
       
   664 
       
   665 TExitDetails LaunchTestThreadL(const TDesC& aThreadName, TestFunction aFunction)
       
   666 	{
       
   667 	RThread thread;	
       
   668 	TInt err = thread.Create(aThreadName, &TestFunctionLauncherL, KDefaultStackSize, NULL, (TAny*)aFunction);
       
   669 	TEST2(err, KErrNone);
       
   670 	
       
   671 	TRequestStatus threadStat;
       
   672 	thread.Logon(threadStat);
       
   673 	
       
   674 	TBool jit = User::JustInTime();
       
   675 	User::SetJustInTime(EFalse);
       
   676 	
       
   677 	thread.Resume();
       
   678 	User::WaitForRequest(threadStat);
       
   679 	
       
   680 	User::SetJustInTime(jit);
       
   681 	 
       
   682 	TExitDetails exitDetails;
       
   683 	exitDetails.iCategory = thread.ExitCategory();
       
   684 	exitDetails.iReason = thread.ExitReason();
       
   685 	exitDetails.iExitType = thread.ExitType();
       
   686 	
       
   687 	return exitDetails;
       
   688 	}
       
   689 
       
   690 /**
       
   691 @SYMTestCaseID          SYSLIB-LOGENG-CT-4003
       
   692 @SYMTestCaseDesc	    Tests Message schema validation for the ELogMakeTransient message.
       
   693 @SYMTestPriority 	    High
       
   694 @SYMTestActions  	    Sends messages to the test server to test the validation of messages
       
   695                         against the message schema.
       
   696 @SYMTestExpectedResults The server should validate the message and handle bad messages appropriately
       
   697 @SYMDEF                	INC114113
       
   698 */
       
   699 void TestMakeTransientL()
       
   700 	{
       
   701 	
       
   702 	RClientMessageTestSession session;
       
   703 	
       
   704 	TInt err = session.Connect();
       
   705 	TEST2(err, KErrNone);
       
   706 	
       
   707 	CleanupClosePushL(session);
       
   708 	
       
   709 	err = session.TestMakeTransient(0);	
       
   710 	TEST2(err, KErrNone);
       
   711 	
       
   712 	//anything different from 0 should be considered as ETrue
       
   713 	err = session.TestMakeTransient(1);	
       
   714 	TEST2(err, KErrNone);
       
   715 	
       
   716 	err = session.TestMakeTransient(-5);	
       
   717 	TEST2(err, KErrNone);
       
   718 	
       
   719 	err = session.TestMakeTransient(3);	
       
   720 	TEST2(err, KErrNone);
       
   721 	
       
   722 	err = session.TestMakeTransient( _L8("Des8"));	
       
   723 	TEST2(err, KErrNone);
       
   724 	
       
   725 	CleanupStack::PopAndDestroy(&session);
       
   726 	}
       
   727 
       
   728 /**
       
   729 @SYMTestCaseID          SYSLIB-LOGENG-CT-4004
       
   730 @SYMTestCaseDesc	    Tests Message schema validation for the messages accepting
       
   731  						TLogClientServerData parameters.
       
   732 @SYMTestPriority 	    High
       
   733 @SYMTestActions  	    Sends messages to the test server to test the validation of messages
       
   734 						against the message schema.  The messages contain either valid or invalid 
       
   735 						parameters. 
       
   736 @SYMTestExpectedResults The server should validate the message and handle bad messages appropriately
       
   737 @SYMDEF                	INC114113
       
   738 */
       
   739 void TestCliServDataParamL()
       
   740 	{
       
   741 	
       
   742 	RClientMessageTestSession session;
       
   743 	
       
   744 	TInt err = session.Connect();
       
   745     TEST2(err, KErrNone);
       
   746 	
       
   747 	CleanupClosePushL(session);
       
   748 	
       
   749 	TLogClientServerData data;
       
   750 	TPckg<TLogClientServerData> pData(data);
       
   751 	
       
   752 	TBuf8<sizeof(TLogClientServerData)> buf;
       
   753 	
       
   754 	buf.SetLength(sizeof(TLogClientServerData));
       
   755 	
       
   756 	buf.Fill(0xFF);
       
   757 	
       
   758 	data.iOperationType = 	ELogOperationEventAdd; 
       
   759 	data.iOperationId = 1;
       
   760 	err = session.TestCliServDataParam(ELogOperationInitiate,pData);	
       
   761 	TEST2(err, KErrBadDescriptor);
       
   762 	
       
   763 	data.iOperationType = 	ELogOperationViewWindowFetch; 
       
   764 	data.iOperationId = 5;
       
   765 	err = session.TestCliServDataParam(ELogOperationInitiate,pData);	
       
   766 	TEST2(err, KErrArgument);
       
   767 	
       
   768 	data.iOperationType = 	ELogOperationEventAdd; 
       
   769 	data.iOperationId = 0x8FFFFFFF;
       
   770 	err = session.TestCliServDataParam(ELogOperationInitiate,pData);	
       
   771 	TEST2(err, KErrBadDescriptor);
       
   772 
       
   773 	data.iOperationType = 	ELogOperationEventAdd; 
       
   774 	data.iOperationId = 0x8FFFFFFF;
       
   775 	err = session.TestCliServDataParam(ELogOperationInitiate,buf);	
       
   776 	TEST2(err, KErrArgument);
       
   777 	
       
   778 	data.iOperationType = 	ELogOperationEventAdd; 
       
   779 	data.iOperationId = 1;
       
   780 	err = session.TestCliServDataParam(ELogOperationCancel,pData);	
       
   781 	TEST2(err, KErrCancel);
       
   782 	
       
   783 	data.iOperationType = 	ELogOperationEventAdd; 
       
   784 	data.iOperationId = 1;
       
   785 	err = session.TestCliServDataParam(ELogOperationCancel,buf);	
       
   786 	TEST2(err, KErrArgument);
       
   787 	
       
   788 	CLogPackage* package = CLogPackage::NewL();
       
   789 	TPtr8 ptr(package->Ptr());
       
   790 	
       
   791 	data.iOperationType = 	ELogOperationEventAdd; 
       
   792 	data.iOperationId = 1;
       
   793 	err = session.TestCliServDataParam(ELogOperationGetResult,buf, ptr, 0);	
       
   794 	TEST2(err, KErrArgument);
       
   795 	
       
   796 	data.iOperationType = 	ELogOperationEventAdd; 
       
   797 	data.iOperationId = 1;
       
   798 	err = session.TestCliServDataParam(ELogOperationGetResult,pData, ptr, -1 );	
       
   799 	TEST2(err, KErrNone);
       
   800 	
       
   801 	delete package;
       
   802 	
       
   803 	TBuf8<8> smallBuf;
       
   804 	data.iOperationType = 	ELogOperationEventAdd; 
       
   805 	data.iOperationId = 1;
       
   806 	err = session.TestCliServDataParam(ELogOperationGetResult,buf, smallBuf, 0);	
       
   807 	TEST2(err, KErrArgument);
       
   808 	
       
   809 	CleanupStack::PopAndDestroy(&session);
       
   810 	}
       
   811 
       
   812 /**
       
   813 @SYMTestCaseID          SYSLIB-LOGENG-LEGACY-T_LOGSERVIPC-0001
       
   814 @SYMTestCaseDesc	    Tests Message schema validation for the messages accepting
       
   815  						TLogClientServerData parameters.
       
   816 @SYMTestPriority 	    High
       
   817 @SYMTestActions  	    Sends messages to the test server to test the validation of messages
       
   818 						against the message schema.  The messages contain either valid or invalid 
       
   819 						parameters. 
       
   820 @SYMTestExpectedResults The server should validate the message and handle bad messages appropriately
       
   821 @SYMDEF                	INC114113
       
   822 */
       
   823 void TestCliServDataParam2L()
       
   824 	{
       
   825 	RClientMessageTestSession session;
       
   826 	
       
   827 	TInt err = session.Connect();
       
   828     TEST2(err, KErrNone);
       
   829 	
       
   830 	CleanupClosePushL(session);
       
   831 	
       
   832 	TBuf8<sizeof(TLogClientServerData) - 1> buf;
       
   833 	
       
   834 	buf.FillZ();
       
   835 	
       
   836 	//This should panic with Logserv 63
       
   837 	err = session.TestCliServDataParam(ELogOperationInitiate,buf);	
       
   838     TEST2(err, KErrNone);
       
   839 	
       
   840 	CleanupStack::PopAndDestroy(&session);
       
   841 	}
       
   842 
       
   843 /**
       
   844 @SYMTestCaseID          SYSLIB-LOGENG-LEGACY-T_LOGSERVIPC-0002
       
   845 @SYMTestCaseDesc	    Tests Message schema validation for the messages accepting
       
   846  						TLogClientServerData parameters.
       
   847 @SYMTestPriority 	    High
       
   848 @SYMTestActions  	    Sends messages to the test server to test the validation of messages
       
   849 						against the message schema.  The messages contain either valid or invalid 
       
   850 						parameters. 
       
   851 @SYMTestExpectedResults The server should validate the message and handle bad messages appropriately
       
   852 @SYMDEF                	INC114113
       
   853 */
       
   854 void TestCliServDataParam3L()
       
   855 	{
       
   856 	RClientMessageTestSession session;
       
   857 	
       
   858 	TInt err = session.Connect();
       
   859     TEST2(err, KErrNone);
       
   860 	
       
   861 	CleanupClosePushL(session);
       
   862 	
       
   863 	TBuf8<sizeof(TLogClientServerData) + 1> buf;
       
   864 	
       
   865 	buf.FillZ();
       
   866 	
       
   867 	err = session.TestCliServDataParam(ELogOperationInitiate,buf);	
       
   868 	TEST2(err, KErrArgument);
       
   869 	
       
   870 	CleanupStack::PopAndDestroy(&session);
       
   871 	}
       
   872 
       
   873 
       
   874 /**
       
   875 @SYMTestCaseID          SYSLIB-LOGENG-CT-4005
       
   876 @SYMTestCaseDesc	    Tests Message schema validation for the ELogNotify message.
       
   877 @SYMTestPriority 	    High
       
   878 @SYMTestActions  	    Sends messages to the test server to test the validation of messages
       
   879 						against the message schema.  The messages contain either valid or invalid 
       
   880 						parameters. 
       
   881 @SYMTestExpectedResults The server should validate the message and handle bad messages appropriately
       
   882 @SYMDEF                	INC114113
       
   883 */
       
   884 void TestLogNotifyL()
       
   885 	{
       
   886 	
       
   887 	RClientMessageTestSession session;
       
   888 	
       
   889 	TInt err = session.Connect();
       
   890     TEST2(err, KErrNone);
       
   891 
       
   892     CleanupClosePushL(session);
       
   893 	
       
   894 	err = session.TestLogNotify(0);
       
   895 	TEST2(err, KErrNone);	
       
   896 	
       
   897 	//Cancel the pending notification
       
   898 	err = session.TestLogNotifyCancel();
       
   899 	TEST2(err, KErrNone);
       
   900 	
       
   901 	err = session.TestLogNotify(1000000);
       
   902 	TEST2(err, KErrNone);
       
   903 	
       
   904 	//Cancel the pending notification
       
   905 	err = session.TestLogNotifyCancel();
       
   906 	TEST2(err, KErrNone);
       
   907 	
       
   908 	err = session.TestLogNotify(-1);
       
   909 	TEST2(err, KErrNone);
       
   910 	
       
   911 	CleanupStack::PopAndDestroy(&session);
       
   912 	}
       
   913 
       
   914 /**
       
   915 @SYMTestCaseID          SYSLIB-LOGENG-CT-4006
       
   916 @SYMTestCaseDesc	    Tests Message schema validation for the ELogViewCreate message.
       
   917 @SYMTestPriority 	    High
       
   918 @SYMTestActions  	    Sends messages to the test server to test the validation of messages
       
   919 						against the message schema.  The messages contain either valid or invalid 
       
   920 						parameters. 
       
   921 @SYMTestExpectedResults The server should validate the message and handle bad messages appropriately
       
   922 @SYMDEF                	INC114113
       
   923 */
       
   924 void TestLogViewCreateL()
       
   925 	{
       
   926 	
       
   927 	RClientMessageTestSession session;
       
   928 	
       
   929 	TInt err = session.Connect();
       
   930     TEST2(err, KErrNone);
       
   931 	
       
   932 	CleanupClosePushL(session);
       
   933 	
       
   934 	err = session.TestLogViewCreate(0,ELogViewTypeEvent);	
       
   935 	TEST2(err, KErrNone);
       
   936 	
       
   937 	err = session.TestLogViewCreate(100000,ELogViewTypeDuplicate);	
       
   938 	TEST2(err, KErrNone);
       
   939 	
       
   940 	err = session.TestLogViewCreate(0,ELogViewTypeDuplicate + 1);	
       
   941 	TEST2(err, KErrArgument);
       
   942 	
       
   943 	err = session.TestLogViewCreate(-1,ELogViewTypeRecent);	
       
   944 	TEST2(err, KErrNone);
       
   945 	
       
   946 	err = session.TestLogViewCreate(20,-1);	
       
   947 	TEST2(err, KErrArgument);
       
   948 
       
   949 	CleanupStack::PopAndDestroy(&session);
       
   950 	}
       
   951 
       
   952 
       
   953 /**
       
   954 @SYMTestCaseID          SYSLIB-LOGENG-CT-4012
       
   955 @SYMTestCaseDesc	    Tests Message schema validation for the ELogNotifyExtended message.
       
   956 @SYMTestPriority 	    High
       
   957 @SYMTestActions  	    Sends a message to the test server to test the validation of messages
       
   958 						against the message schema.  The message contains an invalid descriptor. 
       
   959 @SYMTestExpectedResults The server should panic the client with KErrBadDescriptor
       
   960 @SYMDEF                	INC114113
       
   961 */
       
   962 void TestLogNotifyExtended2L()
       
   963 	{
       
   964 	
       
   965 	RClientMessageTestSession session;
       
   966 
       
   967 	TInt err = session.Connect();
       
   968     TEST2(err, KErrNone);
       
   969 	
       
   970 	CleanupClosePushL(session);
       
   971 
       
   972 	_LIT8(KDes8,"Des8");
       
   973 	TPckgBuf<TInt> int0(0);
       
   974 	
       
   975 	err = session.TestLogNotifyExtended(int0, 0, -1, KDes8);	
       
   976 	TEST2(err, KErrNone);
       
   977 
       
   978 	CleanupStack::PopAndDestroy(&session);
       
   979 	}
       
   980 
       
   981 /**
       
   982 @SYMTestCaseID          SYSLIB-LOGENG-CT-4013
       
   983 @SYMTestCaseDesc	    Tests Message schema validation for an invalid message
       
   984 @SYMTestPriority 	    High
       
   985 @SYMTestActions  	    Sends a message to the test server with a message number not 
       
   986 						defined in the schema.
       
   987 @SYMTestExpectedResults The server should return KErrInvalidFunction
       
   988 @SYMDEF                	INC114113
       
   989 */
       
   990 void InvalidMessageTestL()
       
   991 	{
       
   992 	
       
   993 	RClientMessageTestSession session;
       
   994 	
       
   995 	TInt err = session.Connect();
       
   996     TEST2(err, KErrNone);
       
   997 	
       
   998 	CleanupClosePushL(session);
       
   999 	
       
  1000 	//This should cause the server to panic the client
       
  1001 	err = session.TestFunction45(0);	
       
  1002 	
       
  1003 	CleanupStack::PopAndDestroy(&session);
       
  1004 	}
       
  1005 
       
  1006 
       
  1007 
       
  1008 static void DoAPITestsL()
       
  1009 	{
       
  1010 	
       
  1011 	TExitDetails exitDetails;
       
  1012 	
       
  1013 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4004 "));
       
  1014 	exitDetails = LaunchTestThreadL(_L("TestCliServDataParamL"), &TestCliServDataParamL);
       
  1015 	TEST2(exitDetails.iExitType, EExitKill);
       
  1016 	
       
  1017 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-LEGACY-T_LOGSERVIPC-0001 "));
       
  1018 	exitDetails = LaunchTestThreadL(_L("TestCliServDataParam2L"), &TestCliServDataParam2L);
       
  1019 	TEST2(exitDetails.iExitType, EExitPanic);
       
  1020 	TEST2(exitDetails.iReason, ELogBadDescriptor);
       
  1021 	
       
  1022 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-LEGACY-T_LOGSERVIPC-0002 "));
       
  1023 	exitDetails = LaunchTestThreadL(_L("TestCliServDataParam3L"), &TestCliServDataParam3L);
       
  1024 	TEST2(exitDetails.iExitType, EExitPanic);
       
  1025 	TEST2(exitDetails.iReason, ELogBadDescriptor);
       
  1026 	
       
  1027 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4005 "));
       
  1028 	exitDetails = LaunchTestThreadL(_L("TestLogNotifyL"), &TestLogNotifyL);
       
  1029 	TEST2(exitDetails.iExitType, EExitKill);
       
  1030 	
       
  1031 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4006 "));
       
  1032 	exitDetails = LaunchTestThreadL(_L("TestLogViewCreateL"), &TestLogViewCreateL);
       
  1033 	TEST2(exitDetails.iExitType, EExitKill);
       
  1034 	
       
  1035 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4012 "));
       
  1036 	exitDetails = LaunchTestThreadL(_L("TestLogNotifyExtended2L"), &TestLogNotifyExtended2L);
       
  1037 	TEST2(exitDetails.iExitType, EExitKill);
       
  1038 	
       
  1039 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4013 "));
       
  1040 	exitDetails = LaunchTestThreadL(_L("InvalidMessageTestL"), &InvalidMessageTestL);
       
  1041 	TEST2(exitDetails.iExitType, EExitPanic);
       
  1042 	TEST2(exitDetails.iReason, ELogIllegalFunction);
       
  1043 
       
  1044  	//test for debug-only API
       
  1045 #ifdef _DEBUG
       
  1046 	TheTest.Next(_L(" @SYMTestCaseID:SYSLIB-LOGENG-CT-4003 "));
       
  1047  	exitDetails = LaunchTestThreadL(_L("TestMakeTransientL"), &TestMakeTransientL);
       
  1048  	TEST2(exitDetails.iExitType, EExitKill);
       
  1049 #endif//_DEBUG	
       
  1050 	}
       
  1051 
       
  1052 
       
  1053 
       
  1054 
       
  1055 GLDEF_C TInt E32Main ()
       
  1056 	{
       
  1057 
       
  1058 	TheTest.Printf (_L ("\n"));
       
  1059 	TheTest.Title ();
       
  1060 	TheTest.Start (_L("IPC Fuzz Tests"));
       
  1061 
       
  1062    	CTrapCleanup* cleanup=CTrapCleanup::New();
       
  1063    	TEST(cleanup != NULL);
       
  1064 	
       
  1065    	TInt err=KErrNoMemory;
       
  1066    	if (cleanup)
       
  1067    		{
       
  1068    		
       
  1069    		// Construct and install the active scheduler
       
  1070    		CActiveScheduler* scheduler = new CActiveScheduler;
       
  1071    	    TEST(scheduler != NULL);
       
  1072    		CActiveScheduler::Install (scheduler);
       
  1073    		
       
  1074    		KillProcess(KServerProcess);
       
  1075    		User::After(1000000);
       
  1076    				
       
  1077    		TRAP (err, DoFuzzTestsL ());
       
  1078    		TEST2(err, KErrNone);
       
  1079    		
       
  1080    		TheTest.Next(_L("LogServ API Robustness Tests"));
       
  1081    		TRAP (err, DoAPITestsL ());
       
  1082    		TEST2(err, KErrNone);
       
  1083    		
       
  1084    		TheTest.End ();
       
  1085    		TheTest.Close ();
       
  1086    		
       
  1087    		delete scheduler;
       
  1088    		delete cleanup;
       
  1089    		
       
  1090    		}
       
  1091 	return err;
       
  1092 	}