sl@0: // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent - Internal Symbian test code sl@0: */ sl@0: sl@0: sl@0: #include "TMESSAGE.H" sl@0: sl@0: const TInt KTotalNumberOfTestMessages=5; sl@0: const TInt KMaxNumOfMessagesInActiveQueue=21; sl@0: const TInt KMaxNumOfSyncMessages=25; sl@0: const TInt KNumOfTestCases=7; sl@0: TInt MsgCountCheck=0; sl@0: TInt SyncSendReceiveCount=0; sl@0: TUid UidAtFirstLocation; sl@0: TUid UidAtLastLocation; sl@0: TBool TestNeedsExtraCheck=EFalse; sl@0: sl@0: CTMessage::CTMessage(CTestStep* aStep) : CTWsGraphicsBase(aStep), iSyncSendReceiveFlag(EFalse), iCounter(-1), iState(0) sl@0: { sl@0: } sl@0: sl@0: TInt CTMessage::CreateAndSendMessages(TInt aCount,TInt aNoOfMessages) sl@0: { sl@0: CMessageReceiver* msgReceiver=(*iMessageReceiver)[iState]; sl@0: TInt identifer=msgReceiver->GroupWin()->Identifier(); sl@0: TInt length=aCount*2; sl@0: TUint8 modificationFactor=(TUint8 )(aCount*3+1); sl@0: TUint8 msgValue=0; sl@0: if(!iSyncSendReceiveFlag && TestNeedsExtraCheck) sl@0: { sl@0: if(aCount==0) sl@0: { sl@0: UidAtFirstLocation=TUid::Uid(length+(modificationFactor<<24)); sl@0: } sl@0: else if(aCount==(aNoOfMessages-1)) sl@0: { sl@0: UidAtLastLocation=TUid::Uid(length+(modificationFactor<<24)); sl@0: } sl@0: } sl@0: iMsg->Des().Zero(); sl@0: for(TInt index=0;indexDes().Append(msgValue); sl@0: } sl@0: return TheClient->iWs.SendMessageToWindowGroup(identifer, TUid::Uid(length+(modificationFactor<<24)), *iMsg); sl@0: } sl@0: sl@0: TInt CTMessage::CallbackLowPriority(TAny* aMessageTest) sl@0: { sl@0: return static_cast(aMessageTest)->SendSyncMessages(); sl@0: } sl@0: sl@0: TInt CTMessage::SendSyncMessages() sl@0: { sl@0: if(iSyncSendReceiveFlag && iCounter++iWs.NumWindowGroups(); //Make sure all asyncronus calls have been processed sl@0: CTEventBase& eventHandler=*TheClient->EventHandler(); sl@0: if (eventHandler.iStatus.Int()==KRequestPending) sl@0: CActiveScheduler::Stop(); sl@0: else sl@0: return ETrue; sl@0: return EFalse; sl@0: } sl@0: sl@0: CTMessage::~CTMessage() sl@0: { sl@0: iMessageReceiver->ResetAndDestroy(); sl@0: iMessageReceiver->Close(); sl@0: delete iMessageReceiver; sl@0: iLowPriorityObject->Cancel(); sl@0: delete iLowPriorityObject; sl@0: iLowPriorityObject=NULL; sl@0: delete iMsg; sl@0: } sl@0: sl@0: void CTMessage::ConstructL() sl@0: { sl@0: iLowPriorityObject= new(ELeave) CLowPriorityIdle(); sl@0: iMessageReceiver=new(ELeave) RPointerArray(KNumOfTestCases); sl@0: iMsg=HBufC8::NewL(KMaxNumOfSyncMessages*2); sl@0: for(TInt index=0;indexConstructL(); sl@0: iMessageReceiver->AppendL(messageReceiver); sl@0: } sl@0: } sl@0: sl@0: sl@0: CLowPriorityIdle::CLowPriorityIdle() : CIdle(EPriorityIdle) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: TInt CLowPriorityIdle::RunError(TInt /*aError*/) sl@0: { sl@0: CActiveScheduler::Stop(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: LOCAL_C TInt DoPanicTest(TInt aInt, TAny *) sl@0: { sl@0: switch(aInt) sl@0: { sl@0: case 1: sl@0: User::Panic(KWSERV,EWservPanicGcActive); sl@0: break; sl@0: } sl@0: return(EWsExitReasonBad); sl@0: } sl@0: sl@0: CMessageReceiver::CMessageReceiver(CTClient *aClient, CTMessage *aTMessage) : CTWindowGroup(aClient), iMsgCount(0) sl@0: { sl@0: iTMessage = aTMessage; sl@0: } sl@0: sl@0: #define MESSAGES_READ 1 //Change to 2 to test the 16-bit functions too. sl@0: void CMessageReceiver::MessageReady(const TWsEvent& aEvent) sl@0: { sl@0: iTMessage->OnMessageReceived(aEvent, iMsgCount); sl@0: } sl@0: sl@0: void CTMessage::OnMessageReceived(const TWsEvent& aEvent, TInt& aMsgCount) sl@0: { sl@0: aMsgCount++; sl@0: if(aMsgCount>MsgCountCheck) sl@0: { sl@0: return; sl@0: } sl@0: if (MESSAGES_READ*(aMsgCount/MESSAGES_READ)iWs.FetchMessage(uid, msgPtr, aEvent); sl@0: TEST(retValue==KErrNone); sl@0: //GroupWin()->FetchMessage(uid, msgPtr2); sl@0: if(TestNeedsExtraCheck) sl@0: { sl@0: TEST(uid==(aMsgCount==1?UidAtFirstLocation:UidAtLastLocation)); sl@0: } sl@0: TInt msgLength=(uid.iUid)&0xFFFFFF; sl@0: TUint8 uidFactor=(TUint8)((uid.iUid&0xFF000000)>>24); sl@0: TBool retVal = msgPtr.Length()==msgLength; sl@0: TEST(retVal); sl@0: if (!retVal) sl@0: INFO_PRINTF3(_L("msgPtr.Length()==msgLength - Expected: %d, Actual: %d"), msgLength, msgPtr.Length()); sl@0: sl@0: TUint8 check=0; sl@0: for(TInt index=0;indexTestWsPanicL(&DoPanicTest,EWservPanicGcActive,1)); sl@0: iTest->CloseAllPanicWindows(); sl@0: } sl@0: sl@0: void CTMessage::MessageTests(TInt aNoOfMessages,TInt aMsgCountCheck,TBool aSyncSendReceiveFlag,TBool aTestNeedsExtraCheck) sl@0: { sl@0: iSyncSendReceiveFlag=aSyncSendReceiveFlag; sl@0: TestNeedsExtraCheck=aTestNeedsExtraCheck; sl@0: MsgCountCheck=aMsgCountCheck; sl@0: iLowPriorityObject->Start(TCallBack(CallbackLowPriority,this)); sl@0: sl@0: if(iSyncSendReceiveFlag) sl@0: { sl@0: //Messages will be sent and received one by one using the function SendSyncMessages(). sl@0: CActiveScheduler::Start(); sl@0: } sl@0: else sl@0: { sl@0: for(TInt count=0;countMessageCount(); sl@0: TEST(msgCount==MsgCountCheck); sl@0: if (msgCount!=MsgCountCheck) sl@0: { sl@0: _LIT(KLog,"Number of messages recieved=%d expected=%d"); sl@0: LOG_MESSAGE3(KLog,msgCount,MsgCountCheck); sl@0: } sl@0: } sl@0: } sl@0: sl@0: /** sl@0: Test delivery group messages in case when event queue is overflow sl@0: */ sl@0: void CTMessage::TestMessageQueueOverflowL() sl@0: { sl@0: const TInt numMaxMessages = 60; sl@0: TInt numWasteMessages = 0; sl@0: TInt numWgMessages = 5; sl@0: sl@0: TInt gotRealWasteMessages = 0; sl@0: TInt gotRealWgMessages = 0; sl@0: sl@0: const TInt oneSecond = 1000000; sl@0: const TInt allPossibleMessages = 500; sl@0: sl@0: RWsSession senderWsSession; sl@0: RWindowGroup senderGroupWin; sl@0: TInt sndrHanGrpWin = 7777; sl@0: sl@0: RWsSession receiverWsSession; sl@0: RWindowGroup receiverGroupWin; sl@0: TInt rcvrHanGrpWin = 8888; sl@0: sl@0: TRequestStatus testStatus; sl@0: TRequestStatus timerStatus; sl@0: TWsEvent wasteEvent; sl@0: TWsEvent event; sl@0: sl@0: RTimer timer; sl@0: timer.CreateLocal(); sl@0: CleanupClosePushL(timer); sl@0: sl@0: // Create sender WsSession and the window group sl@0: User::LeaveIfError(senderWsSession.Connect()); sl@0: CleanupClosePushL(senderWsSession); sl@0: sl@0: senderGroupWin = RWindowGroup(senderWsSession); sl@0: User::LeaveIfError(senderGroupWin.Construct(sndrHanGrpWin)); sl@0: CleanupClosePushL(senderGroupWin); sl@0: sl@0: // Create reciever WsSession and the window group sl@0: User::LeaveIfError(receiverWsSession.Connect()); sl@0: CleanupClosePushL(receiverWsSession); sl@0: sl@0: receiverGroupWin = RWindowGroup(receiverWsSession); sl@0: User::LeaveIfError(receiverGroupWin.Construct(rcvrHanGrpWin)); sl@0: CleanupClosePushL(receiverGroupWin); sl@0: sl@0: TInt err = KErrNone; sl@0: sl@0: // Send waste events to the receiver and overflow the event queue sl@0: for (TInt ind = 0; ind < numMaxMessages; ind++) sl@0: { sl@0: wasteEvent.SetType(sndrHanGrpWin); sl@0: err = senderWsSession.SendEventToWindowGroup(receiverGroupWin.Identifier(), wasteEvent); sl@0: if (err != KErrNone) sl@0: { sl@0: numWasteMessages = ind; // Real number waste messages that was sent sl@0: break; sl@0: } sl@0: } sl@0: sl@0: // Send messages to the receiver sl@0: for (TInt ind = 0; ind < numWgMessages; ind++) sl@0: { sl@0: TInt uidData = ind + sndrHanGrpWin; sl@0: TPtr8 msg((unsigned char*) &uidData, sizeof(uidData)); sl@0: err = senderWsSession.SendMessageToWindowGroup(receiverGroupWin.Identifier(), TUid::Uid(uidData), msg); sl@0: if (err != KErrNone) sl@0: { sl@0: LOG_MESSAGE2(_L("UnExpected Error Code = %d"),err); sl@0: numWgMessages = ind; // Real number window group messages that was sent sl@0: } sl@0: } sl@0: sl@0: // Check and count sent messages sl@0: for (TInt ind = 0; ind < allPossibleMessages; ind++) sl@0: { sl@0: receiverWsSession.EventReady(&testStatus); sl@0: timer.After(timerStatus, oneSecond); sl@0: User::WaitForRequest(testStatus, timerStatus); sl@0: if (testStatus == 0) sl@0: { sl@0: // Test incoming events sl@0: receiverWsSession.GetEvent(event); sl@0: if (event.Type() == sndrHanGrpWin) sl@0: { sl@0: ++gotRealWasteMessages; sl@0: } sl@0: else if (event.Type() == EEventMessageReady) sl@0: { sl@0: if (gotRealWgMessages == 0) sl@0: { sl@0: for (TInt ind = 0; ind < numMaxMessages; ind++) sl@0: { sl@0: wasteEvent.SetType(sndrHanGrpWin); sl@0: err = senderWsSession.SendEventToWindowGroup(receiverGroupWin.Identifier(), wasteEvent); sl@0: if (err == KErrNone) sl@0: { sl@0: ++numWasteMessages; sl@0: } sl@0: else sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: ++gotRealWgMessages; sl@0: TUid uid; sl@0: TPtr8 msgPtr(NULL,0); sl@0: err = receiverWsSession.FetchMessage(uid, msgPtr, event); sl@0: User::Free((TAny *) msgPtr.Ptr()); sl@0: } sl@0: // testStatus has been completed. Hence, Cancel the timer. sl@0: timer.Cancel(); sl@0: User::WaitForRequest(timerStatus); sl@0: } sl@0: else sl@0: { sl@0: // Times out, cancel the event notification sl@0: receiverWsSession.EventReadyCancel(); sl@0: User::WaitForRequest(testStatus); sl@0: // All events were recieved sl@0: break; sl@0: } sl@0: } sl@0: sl@0: LOG_MESSAGE3(_L("Got Waste message = %d expected =%d"),gotRealWasteMessages,numWasteMessages); sl@0: LOG_MESSAGE3(_L("Got Group message = %d expected =%d"),gotRealWgMessages,numWgMessages); sl@0: TEST(gotRealWasteMessages == numWasteMessages); sl@0: TEST(gotRealWgMessages == numWgMessages); sl@0: sl@0: CleanupStack::PopAndDestroy(&receiverGroupWin); sl@0: CleanupStack::PopAndDestroy(&receiverWsSession); sl@0: CleanupStack::PopAndDestroy(&senderGroupWin); sl@0: CleanupStack::PopAndDestroy(&senderWsSession); sl@0: CleanupStack::PopAndDestroy(&timer); sl@0: sl@0: TheClient->iWs.Flush(); sl@0: sl@0: } sl@0: sl@0: void CTMessage::RunTestCaseL(TInt /*aCurTestCase*/) sl@0: { sl@0: _LIT(KMsgTest0,"Message test 1"); sl@0: _LIT(KMsgTest1,"Message test 2"); sl@0: _LIT(KMsgTest2,"Message test 3"); sl@0: _LIT(KMsgTest3,"Message test 4"); sl@0: _LIT(KMsgTest4,"Message test 5"); sl@0: _LIT(KMsgTest5,"Message test 6"); sl@0: _LIT(KMsgTest6,"Message test 7"); sl@0: _LIT(KMsgTest7,"Message test 8 - when event queue is overflow"); sl@0: sl@0: iState=iTest->iState; // used by iMessageReceiver array sl@0: ((CTMessageStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); sl@0: switch(++iTest->iState) sl@0: { sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-WSERV-0084 sl@0: sl@0: @SYMDEF DEF081259 sl@0: sl@0: @SYMTestCaseDesc Test message sending and receiving sl@0: sl@0: @SYMTestPriority High sl@0: sl@0: @SYMTestStatus Implemented sl@0: sl@0: @SYMTestActions Generates 5 short messages and sends them to window group, window group receives them sl@0: sl@0: @SYMTestExpectedResults Expects that received messages have the same length and the same content as those sent sl@0: */ sl@0: case 1: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0084")); sl@0: iTest->LogSubTest(KMsgTest0); sl@0: MessageTests(KTotalNumberOfTestMessages,KTotalNumberOfTestMessages,EFalse,EFalse); sl@0: break; sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-WSERV-0406 sl@0: sl@0: @SYMDEF DEF102201,DEF141447 sl@0: sl@0: @SYMTestCaseDesc Test message sending and receiving sl@0: sl@0: @SYMTestPriority High sl@0: sl@0: @SYMTestStatus Implemented sl@0: sl@0: @SYMTestActions Generates some diffrent size of messages and sends them to window group, window group receives them sl@0: sl@0: @SYMTestExpectedResults Expects that received messages have the same length and the same content as those sent sl@0: */ sl@0: case 2: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest1); sl@0: MessageTests(KMaxNumOfMessagesInActiveQueue-1,KMaxNumOfMessagesInActiveQueue-1,EFalse,EFalse); sl@0: break; sl@0: case 3: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest2); sl@0: MessageTests(KMaxNumOfMessagesInActiveQueue,2,EFalse,ETrue); sl@0: break; sl@0: case 4: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest3); sl@0: MessageTests(KMaxNumOfMessagesInActiveQueue+1,2,EFalse,ETrue); sl@0: break; sl@0: case 5: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest4); sl@0: MessageTests(KMaxNumOfMessagesInActiveQueue+2,2,EFalse,ETrue); sl@0: break; sl@0: case 6: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest5); sl@0: SyncSendReceiveCount=KMaxNumOfSyncMessages; sl@0: MessageTests(KMaxNumOfSyncMessages,KMaxNumOfSyncMessages,ETrue,EFalse); sl@0: break; sl@0: case 7: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest6); sl@0: MessageTests(KMaxNumOfMessagesInActiveQueue+1,2,EFalse,ETrue); sl@0: ((*iMessageReceiver)[iState])->ResetMessageCount(); sl@0: SyncSendReceiveCount=KTotalNumberOfTestMessages; sl@0: MessageTests(KTotalNumberOfTestMessages,KTotalNumberOfTestMessages,ETrue,EFalse); sl@0: break; sl@0: case 8: sl@0: ((CTMessageStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0406")); sl@0: iTest->LogSubTest(KMsgTest7); sl@0: TestMessageQueueOverflowL(); sl@0: ((CTMessageStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); sl@0: ((CTMessageStep*)iStep)->CloseTMSGraphicsStep(); sl@0: TestComplete(); sl@0: return; sl@0: } sl@0: ((*iMessageReceiver)[iState])->ResetMessageCount(); sl@0: ((CTMessageStep*)iStep)->RecordTestResultL(); sl@0: } sl@0: sl@0: sl@0: __WS_CONSTRUCT_STEP__(Message)