os/ossrv/lowlevellibsandfws/apputils/bsul/test/t_clientmessage/t_clientmessagetestserver.cpp
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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include "t_clientmessagetestserver.h"
19 _LIT(KServerName,"ClientMessageTestServer");
20 _LIT(KServer2Name,"SecondTestServer");
21 extern const BSUL::TClientMessageServerData KServerData;
22 extern const BSUL::TClientMessageServerData KServer2Data;
24 /* CClientMessageTestServer is a lightweight Server that is used to test
25 * the CClientMessage framework. Clientside code sends messages to the
26 * server which are processed and the client chceks the expected behaviour.
27 * The server code does no testing itself.
29 CServer2* CClientMessageTestServer::NewLC()
31 CClientMessageTestServer* self = new(ELeave) CClientMessageTestServer(CActive::EPriorityStandard);
32 CleanupStack::PushL(self);
38 void CClientMessageTestServer::ConstructL()
40 BSUL::CClientMessage::InitialiseFrameworkL(KServerData);
44 TInt CClientMessageTestServer::RunError(TInt aError)
46 Message().Complete(aError);
52 CClientMessageTestServer::CClientMessageTestServer(TInt aPriority):
57 CSession2* CClientMessageTestServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const
60 return new(ELeave)CClientMessageTestSession;
64 /* CClientMessageTestSession is a lightweight Session class processes
65 * messages from the client using the CClientMessage framework
68 CClientMessageTestSession::~CClientMessageTestSession()
70 delete iClientMessage;
73 void CClientMessageTestSession::CreateL(const CServer2& /*aServer*/)
79 void CClientMessageTestSession::ServiceL(const RMessage2& aMessage)
82 iClientMessage = BSUL::CClientMessage::NewL(aMessage);
84 TRAPD(err, iClientMessage->ValidateL());
87 TRAP(err, DoServiceL());
90 iClientMessage->CompleteRequestL(err);
92 delete iClientMessage;
93 iClientMessage = NULL;
97 void CClientMessageTestSession::DoServiceL()
101 switch(iClientMessage->Function())
201 //Just testing the validation of these functions.
202 //No action to be taken
216 //This should never happen because these functions have been
217 //incorrectly defined in the message schema and calling these
218 //functions should result in a server panic when creating the
219 //CClientMessage object using the message.
223 //These messages should never be called as they have a failing security policy
224 //for the client server
228 User::Panic(_L("ClientMessageTest"),0);
236 /*The test functions below read from or write to the
237 *clients message using the CCLientMessage framework.
244 void CClientMessageTestSession::TestFunction0L()
249 //Validate the first parameter
250 iClientMessage->ValidateL(0);
251 iClientMessage->ValidateL(1);
253 TRAPD(err,iClientMessage->ValidateL(2));
255 if(err != KErrArgument)
257 User::Leave(KErrGeneral);
260 //read the data from the clients message
261 arg0 = iClientMessage->GetIntL(0);
262 arg1 = iClientMessage->GetIntL(1);
264 TRAP(err,iClientMessage->GetIntL(-1));
266 if(err != KErrArgument)
268 User::Leave(KErrGeneral);
271 TRAP(err,iClientMessage->GetIntL(34));
273 if(err != KErrArgument)
275 User::Leave(KErrGeneral);
278 //Just use the variables to remove compiler warnings
282 void CClientMessageTestSession::TestFunction1L()
287 arg0 = iClientMessage->GetIntL(0);
288 //Trying to read this argument for function 1 should fail as function 1
289 //has been defined as having 2 int parameters
290 ptr0 = iClientMessage->GetPtrL(1);
292 //Just use the variables to remove compiler warnings
301 * Read Only Descriptor tests
304 void CClientMessageTestSession::TestFunction4L()
309 //Read the data from the clients message
310 iClientMessage->ReadL(0,des8);
311 iClientMessage->ReadL(1,des16);
314 void CClientMessageTestSession::TestFunction5L()
319 //This buffer is not large enough to hold the client message
320 //which has a defined length of 16. Attempting to read into this should fail
321 iClientMessage->ReadL(0,des8);
322 iClientMessage->ReadL(1,des16);
325 void CClientMessageTestSession::TestFunction6L()
329 //This offset is negative. Attempting to read into this should fail
330 iClientMessage->ReadL(0,des8,-1);
331 iClientMessage->ReadL(1,des16);
334 void CClientMessageTestSession::TestFunction7L()
338 //This offset is towards the end of the string - should be ok
339 //but only a partial string should be returned
340 iClientMessage->ReadL(0,des8,7);
341 iClientMessage->ReadL(1,des16);
345 * Read\Write Descriptor tests
348 void CClientMessageTestSession::TestFunction9L()
350 _LIT8(KDes8,"CClientMessageTest");
351 _LIT(KDes,"CClientMessageTest");
356 offSet0 = iClientMessage->GetIntL(1);
357 offSet1 = iClientMessage->GetIntL(3);
359 //Write the data to the clients message at the given offset
360 iClientMessage->WriteL(0,KDes8,offSet0);
361 iClientMessage->WriteL(2,KDes,offSet1);
364 void CClientMessageTestSession::TestFunction10L()
366 _LIT8(KDes8,"CClientMessageTest. This Descriptor is larger than the maximum allowed descriptor");
367 _LIT(KDes,"CClientMessageTest");
371 offSet0 = iClientMessage->GetIntL(1);
372 offSet1 = iClientMessage->GetIntL(3);
374 //Thi descriptor is too large and this should fail
375 iClientMessage->WriteL(0,KDes8,offSet0);
376 iClientMessage->WriteL(2,KDes,offSet1);
379 void CClientMessageTestSession::TestFunction11L()
384 //This buffer is not large enough to hold the client message
385 //which has a defined length of 64.
386 //Attempting to read into this should fail on UDEB
387 iClientMessage->ReadL(0,des8);
388 iClientMessage->ReadL(2,des16);
391 void CClientMessageTestSession::TestFunction14L()
396 offSet = iClientMessage->GetIntL(1);
398 //Read the data from the clients descriptor using the offset provided
399 TInt length = iClientMessage->GetDesLengthL(0);
401 //Get a reference to the local copy of the descriptor
402 const TDesC8& aDes = iClientMessage->GetDes8L(0);
404 //Just do a comparison here to sure the variables and avoid compiler warnings
405 if((length == aDes.Length()) && (length <= des8.MaxLength()))
407 iClientMessage->ReadL(0,des8,offSet);
410 //Write what was read back to the client
411 iClientMessage->WriteL(2,des8);
414 void CClientMessageTestSession::TestFunction15L()
419 offSet = iClientMessage->GetIntL(1);
421 //read from the second descriptor
422 TInt length = iClientMessage->GetDesLengthL(2);
423 iClientMessage->ReadL(2,des,0);
425 //Read the data from the clients descriptor using the offset provided
426 length = iClientMessage->GetDesLengthL(0);
428 //Get a reference to the local copy of the descriptor
429 const TDesC& aDes = iClientMessage->GetDes16L(0);
431 //Just do a comparison here to sure the variables and avoid compiler warnings
432 if((length == aDes.Length()) && (length <= des.MaxLength()))
434 iClientMessage->ReadL(0,des,offSet);
437 //Write what was read back to the client
438 if( length <= iClientMessage->GetDesMaxLengthL(2))
440 iClientMessage->WriteL(2,des);
448 void CClientMessageTestSession::TestFunction16L()
452 ptr = iClientMessage->GetPtrL(0);
454 //Just use the variables to remove compiler warnings
462 void CClientMessageTestSession::TestFunction17L()
464 _LIT8(KDes8,"CClientMessageTest");
466 //Ptr variables dont havea WriteL method so this should panic
467 iClientMessage->WriteL(0,KDes8);
474 void CClientMessageTestSession::TestFunction18L()
476 CMTestStruct2 struct1;
477 TPckg<CMTestStruct2> pData(struct1);
479 TInt length = iClientMessage->GetDesLengthL(0);
481 iClientMessage->ReadL(0,pData);
483 if(length == sizeof(CMTestStruct2))
487 struct1.iDes = _L("Message Handled");
489 length = iClientMessage->GetDesMaxLengthL(0);
491 if(length == sizeof(CMTestStruct2))
493 iClientMessage->WriteL(0,pData);
498 void CClientMessageTestSession::TestFunction19L()
500 CMTestStruct1 struct1;
501 TPckg<CMTestStruct1> pData(struct1);
503 iClientMessage->ReadL(0,pData);
507 void CClientMessageTestSession::TestFunction31L()
509 TInt function = iClientMessage->GetIntL(0);
515 function = iClientMessage->GetIntL(1);
521 const TDesC8& data = iClientMessage->GetDes8L(1);
528 iClientMessage->ReadL(1,buf);
534 iClientMessage->WriteL(1, _L8(""));
540 const TDesC& data = iClientMessage->GetDes16L(1);
547 iClientMessage->ReadL(1,buf);
553 iClientMessage->WriteL(1, _L(""));
559 function = iClientMessage->GetDesLengthL(1);
563 case EGetDesMaxLengthL:
565 function = iClientMessage->GetDesMaxLengthL(1);
572 /* CClientMessageTestServer2 is a lightweight Server that is used to test
573 * the CClientMessage framework. Client side code sends messages to the
574 * server which are processed and the client chceks the expected behaviour.
575 * The server code does no testing itself. The second server is used to
576 * test the ClientMessage Frameworks handling of Tls data.
578 CServer2* CClientMessageTestServer2::NewLC()
580 CClientMessageTestServer2* self = new(ELeave) CClientMessageTestServer2(CActive::EPriorityStandard);
581 CleanupStack::PushL(self);
587 void CClientMessageTestServer2::ConstructL()
589 StartL(KServer2Name);
592 TInt CClientMessageTestServer2::RunError(TInt aError)
594 Message().Complete(aError);
600 CClientMessageTestServer2::CClientMessageTestServer2(TInt aPriority):
606 CSession2* CClientMessageTestServer2::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const
609 return new(ELeave)CClientMessageTestSession2;
613 /* CClientMessageTestSession2 is a lightweight Session class processes
614 * messages from the client using the CClientMessage framework
617 CClientMessageTestSession2::~CClientMessageTestSession2()
619 delete iClientMessage;
622 void CClientMessageTestSession2::CreateL(const CServer2& /*aServer*/)
628 void CClientMessageTestSession2::ServiceL(const RMessage2& aMessage)
631 TRAPD(err,iClientMessage = BSUL::CClientMessage::NewL(aMessage));
633 if(err == BSUL::KErrNotInitialised)
635 BSUL::CClientMessage::InitialiseFrameworkL(KServer2Data);
637 iClientMessage = BSUL::CClientMessage::NewL(aMessage);
640 TRAP(err, DoServiceL());
642 iClientMessage->CompleteRequestL(err);
644 delete iClientMessage;
645 iClientMessage = NULL;
649 void CClientMessageTestSession2::DoServiceL()
651 //Just do this to test the ::Message API
652 const RMessage2& message = iClientMessage->Message();
654 switch(message.Function())
658 TRAPD(err,TestFunction0L());
659 if(err != BSUL::KErrNotValidated)
661 User::Leave(KErrGeneral);
663 iClientMessage->ValidateL();
678 iClientMessage->ValidateL();
686 User::Leave(KErrNotFound);
693 /*The test function below reads from the clients message
694 * using the CCLientMessage framework.
697 void CClientMessageTestSession2::TestFunction0L()
702 //read the data from the clients message
703 arg0 = iClientMessage->GetIntL(0);
704 arg1 = iClientMessage->GetIntL(1);
706 //Just use the variables to remove compiler warnings
710 /*The test function below reads the int parameter from the message
711 * The parameter is validated through a custom validation function
714 void CClientMessageTestSession2::TestFunction1L()
718 iClientMessage->ValidateL(0);
720 //read the data from the clients message
721 arg0 = iClientMessage->GetIntL(0);
726 /*The test function below reads the descriptor from the clients message
727 * The parameter is validated through a custom validation function
729 void CClientMessageTestSession2::TestFunction2L()
733 //read the data from the clients message
734 iClientMessage->ReadL(0,data,0);
740 static void DoRunServer1L()
742 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
743 CleanupStack::PushL(scheduler);
744 CActiveScheduler::Install(scheduler);
746 CServer2* server = CClientMessageTestServer::NewLC();
748 TInt err = User::RenameThread(KServerName);
750 RProcess().Rendezvous(KErrNone);
752 CActiveScheduler::Start();
754 CleanupStack::PopAndDestroy(server);
756 CleanupStack::PopAndDestroy(scheduler);
759 static TInt RunServer1(TAny*)
761 CTrapCleanup* cleanup=CTrapCleanup::New();
765 TRAP(r,DoRunServer1L());
771 static void DoRunServer2L()
773 CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
774 CleanupStack::PushL(scheduler);
775 CActiveScheduler::Install(scheduler);
777 CServer2* server = CClientMessageTestServer2::NewLC();
779 TInt err = User::RenameThread(KServer2Name);
781 RProcess().Rendezvous(KErrNone);
783 CActiveScheduler::Start();
785 CleanupStack::PopAndDestroy(server);
787 CleanupStack::PopAndDestroy(scheduler);
790 static TInt RunServer2(TAny*)
792 CTrapCleanup* cleanup=CTrapCleanup::New();
796 TRAP(r,DoRunServer2L());
802 /*Launch 2 servers in seperate threads to allow testing of ClientMessage Frameworks
806 static void RunServersL()
809 RThread server1Thread;
810 TInt err = server1Thread.Create(_L("Test Server 1"), &RunServer1, KDefaultStackSize, NULL, NULL);
812 if(err != KErrAlreadyExists)
814 User::LeaveIfError(err);
817 RThread server2Thread;
818 err = server2Thread.Create(_L("Test Server 2"), &RunServer2, KDefaultStackSize, NULL, NULL);
820 if(err != KErrAlreadyExists)
822 User::LeaveIfError(err);
825 server1Thread.Resume();
827 TRequestStatus thread1Stat;
828 server1Thread.Logon(thread1Stat);
830 server2Thread.Resume();
832 TRequestStatus thread2Stat;
833 server2Thread.Logon(thread2Stat);
835 User::WaitForRequest(thread1Stat,thread2Stat);
837 if(server1Thread.ExitType() != EExitPending)
839 User::Panic(server1Thread.ExitCategory(),server1Thread.ExitReason());
844 User::Panic(server2Thread.ExitCategory(),server2Thread.ExitReason());
850 // Server process entry-point
853 CTrapCleanup* cleanup=CTrapCleanup::New();
857 TRAP(r,RunServersL());