diff -r 000000000000 -r 3e07fef1e154 testexecfw/useremul/src/RandomTest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecfw/useremul/src/RandomTest.cpp Mon Mar 08 15:03:44 2010 +0800 @@ -0,0 +1,520 @@ +/*------------------------------------------------------------------ + - + * Software Name : UserEmulator + * Version : v4.2.1309 + * + * Copyright (c) 2009 France Telecom. All rights reserved. + * This software is distributed under the License + * "Eclipse Public License - v 1.0" the text of which is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * France Telecom + * + * Contributors: + *------------------------------------------------------------------ + - + * File Name: RandomTest.cpp + * + * Created: 13/08/2009 + * Author(s): Marcell Kiss, Reshma Sandeep Das + * + * Description: + * Random test class + *------------------------------------------------------------------ + - + * + */ + +// System Includes +#include +#include +#include +#include +// User Includes +#include "RandomTest.h" + +// Constants +#define KOkButton 167 +#define KBackspace 1 + +#define TESTSTEPSNUMBER 40 +#define COUNTERFOROK 200 + +// Uid of the Aactive Idle framework (3.1 devices) +const TUid KUidStandBy1 = { 0x101fd64c }; +// Uid of the Aactive Idle framework (3.2 devices) +const TUid KUidStandBy = { 0x102750f0 }; +// Uid of the Active Idle framework (5.0 devices) +const TUid KUidStandby50 = {0x20017CD9}; + +enum {ETap=0,EDoubleTap,EFlick,EDrag,EKeys,EKeys1,EKeys2,EKeys3}; +const TInt KMaxChance = 200; +const TInt KShortFlickDist = 40; +const TInt KEventTypeMax = 8; +const TInt KScancodeMax = 65535; +const TInt KLogAppAtStep = 100; + +const TInt KLSK = 164; +const TInt KRSK = 165; + +// ======== MEMBER FUNCTIONS ======== + +CRandomTest::CRandomTest(MKeyObserver& aObserver,RWsSession& aRWsSession,CSettings& aSettings,RApaLsSession& aSession,CLogger& aLogger) +:CActive(EPriorityNormal),iObserver(aObserver),iRWsSession(&aRWsSession),iSettings(aSettings),iSession(aSession),iLogger(aLogger) +{ +} + +CRandomTest::~CRandomTest() +{ + iSlotUIDs.Close(); + Cancel(); + iTimer.Close(); +} + +CRandomTest* CRandomTest::NewL(MKeyObserver& aObserver,RWsSession& aRWsSession,CSettings& aSettings,RApaLsSession& aSession,CLogger& aLogger) +{ + CRandomTest* me = CRandomTest::NewLC(aObserver,aRWsSession,aSettings,aSession,aLogger); + CleanupStack::Pop(me); + return me; +} + +CRandomTest* CRandomTest::NewLC(MKeyObserver& aObserver,RWsSession& aRWsSession,CSettings& aSettings,RApaLsSession& aSession,CLogger& aLogger) + { + CRandomTest* me = new (ELeave) CRandomTest(aObserver,aRWsSession,aSettings,aSession,aLogger); + CleanupStack::PushL(me); + me->ConstructL(); + return me; + } +// ---------------------------------------------------------- +// Second phase constructor +// ---------------------------------------------------------- +// +void CRandomTest::ConstructL(void) +{ + CActiveScheduler::Add(this); + iTimer.CreateLocal(); +} + +// ---------------------------------------------------------- +// Starts random test +// ---------------------------------------------------------- +// +void CRandomTest::StartRandomTestL() +{ + Cancel(); + iAppTestCounter = 0; + iAppNameLoggingCounter = 0; + iCounterForOkButton = 0; + iCantStartAppToTest = ETrue; + + if(iSettings.iRandomTestAppIdStatus) + { + _LIT(KCantStartApp,"Can't start app %d.\n"); + TUid uid; + + TThreadId threadId; + TBuf buf; + TBuf CurrentAppUid; + TBuf RandomTestAppIDs; + RandomTestAppIDs.Copy(iSettings.iRandomTestAppID); + TUint32 k; + TInt res; + TInt pos=0; + TInt i=1; + _LIT(KCommaZero,",0"); + + // 'Close' string by these chars + RandomTestAppIDs.Append(KCommaZero); + + while((pos=RandomTestAppIDs.Locate(','))!=KErrNotFound) + { + k=0; + if(RandomTestAppIDs.Left(pos).Length()<=10) + CurrentAppUid = RandomTestAppIDs.Left(pos); + else + CurrentAppUid.Copy(KEMPTYTEXT); + + CurrentAppUid.Trim(); + RandomTestAppIDs.Copy(RandomTestAppIDs.Right(RandomTestAppIDs.Length()-pos-1)); + + + // Converts decimal or hexa uid to integer + if(CurrentAppUid.Left(2).Compare(KHEX)==0) + { + TLex id1(CurrentAppUid.Right(CurrentAppUid.Length()-2)); + res = id1.Val(k,EHex); + } + else + { + TLex id1(CurrentAppUid); + res = id1.Val(k,EDecimal); + } + + TInt doc_res=0; + // Starts test application + if(res==KErrNone) + { + uid.iUid = k; + doc_res=iSession.StartDocument(KN, uid ,threadId); + User::After(KWait01); + } + if(doc_res==KErrNone && res==KErrNone) + { + iSlotUIDs.Append(uid); + } + else + { + buf.Format(KCantStartApp, i); + iLogger.WriteLogL(buf,EFalse); + } + + i++; + } + + User::After(KWait02); + } + // Starts timer + iTimer.After(iStatus,KWait02); + SetActive(); +} +// -------------------------------------------- +// Stops random test (The active object) +// -------------------------------------------- +// +void CRandomTest::CancelRandomTest() + { + Cancel(); + } + +// -------------------------------------------- +// Restarts random test (The active object) +// -------------------------------------------- +// +void CRandomTest::RestartRandomTest() + { + iTimer.After(iStatus,KWait02); + SetActive(); + } + +// -------------------------------------------- +// Stops random test +// -------------------------------------------- +// +void CRandomTest::StopRandomTest() + { + if(iSettings.iRandomTestAppIdStatus) + { + // Stops test apps if uids were valid and apps are running + for(TInt t=0;t COUNTERFOROK) + {// Ok button press event + iCounterForOkButton = 0; + repeats = 0; + chance = KMaxChance-20; + randomevent = EKeys; + } + + TWsEvent wsEvent; + TKeyEvent& keyEvent(*wsEvent.Key()); + + TRawEvent event; + TRawEvent event1; + TRawEvent event2; + TRawEvent event3; + + // Log foreground app's name + CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(*iRWsSession, iRWsSession->GetFocusWindowGroup()); + TApaAppInfo appInfo; + RApaLsSession ApaLs; + User::LeaveIfError(ApaLs.Connect()); + ApaLs.GetAppInfo(appInfo, gn->AppUid()); + + + // If one of our apps is in foreground then don't close it just send it to background + if(appInfo.iUid == KUidPanicCapturer ) + { + TApaTaskList taskList(*iRWsSession); + TApaTask task = taskList.FindApp(appInfo.iUid); + + if (task.Exists()) + task.SendToBackground(); + CleanupStack::PopAndDestroy(gn); + ApaLs.Close(); + + iTimer.After(iStatus,KWait01); + SetActive(); + + return; + } + // If app in foreground is different now or it's there for a long time then log it's name + else if(iLastAppName.Compare(appInfo.iCaption)!=0 || iAppNameLoggingCounter++>KLogAppAtStep ) + { + iAppNameLoggingCounter = 0; + iLastAppName.Zero(); + iLastAppName.Copy(appInfo.iCaption); + TBuf buf; + _LIT(KText,"Launched app.: "); + _LIT(KNL,"\n"); + buf.Copy(KText); + buf.Append(iLastAppName); + buf.Append(KNL); + iLogger.WriteLogL(buf,EFalse); + } + CleanupStack::PopAndDestroy(gn); + ApaLs.Close(); + + // If random test run is on in Settings dialog... + if(iSettings.iRandomTestAppIdStatus) + { + TThreadId threadId; // not used + // Bring given ID's app to foreground + TUid uid; + uid.iUid = 0; + + // Decides which test app should be in foreground + TInt count = iAppTestCounter/TESTSTEPSNUMBER; + + if(iSlotUIDs.Count()>count) + uid = iSlotUIDs[count]; + else + { + iAppTestCounter=0; + if(iSlotUIDs.Count()>0) + uid = iSlotUIDs[0]; + } + + iAppTestCounter++; + + + // If app in foreground is not one of our test apps then close it. + if( iSlotUIDs.Count()>0 ) + { + TApaTaskList taskList(*iRWsSession); + TApaTask task = taskList.FindApp(uid); + + if( !IsUidInTestList(appInfo.iUid) && appInfo.iUid.iUid!=0x100058b3 && + appInfo.iUid.iUid!=_UID3 ) // Don't close telephony app. and User Emulator (exceptions) + { + TApaTask task1 = taskList.FindApp(appInfo.iUid); + if (task1.Exists()) + { + task1.EndTask(); + User::After(KWait01); + } + } + // If our test app is not in foreground then bring it to foreground + if (task.Exists()) + task.BringToForeground(); + else + // If it's not started then start it + iSession.StartDocument(KN, uid ,threadId); + } + else + { + // If there's no valid app uid display error message + if(iCantStartAppToTest) + { + _LIT(KNoValid,"No valid application to start! Random test ends."); + iCantStartAppToTest = EFalse; + CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue); + errorNote->ExecuteLD(KNoValid); + iObserver.RandomTestEndsL(); + return; + } + + iTimer.After(iStatus,KWait05); + SetActive(); + + return; + } + } + + // Run pointer test if device enables it otherwise key events only + if(!AknLayoutUtils::PenEnabled()) + randomevent = EKeys; + + // Events + switch(randomevent) + { + case ETap: + event.Set(TRawEvent::EButton1Down, x, y); + iRWsSession->SimulateRawEvent(event); + User::After(KWait01); + event1.Set(TRawEvent::EButton1Up, x, y); + iRWsSession->SimulateRawEvent(event1); + break; + case EDoubleTap: + event.Set(TRawEvent::EButton1Down, x, y); + iRWsSession->SimulateRawEvent(event); + User::After(KWait01); + event1.Set(TRawEvent::EButton1Up, x, y); + iRWsSession->SimulateRawEvent(event1); + User::After(KWait01); + event2.Set(TRawEvent::EButton1Down, x, y); + iRWsSession->SimulateRawEvent(event2); + User::After(KWait01); + event3.Set(TRawEvent::EButton1Up, x, y); + iRWsSession->SimulateRawEvent(event3); + break; + case EFlick: + event.Set(TRawEvent::EButton1Down, x, y); + iRWsSession->SimulateRawEvent(event); + User::After(KWait01); + + event1.Set(TRawEvent::EPointerMove, x+KShortFlickDist, y+KShortFlickDist); + iRWsSession->SimulateRawEvent(event1); + User::After(KWait01); + + event2.Set(TRawEvent::EButton1Up, x+KShortFlickDist, y+KShortFlickDist); + iRWsSession->SimulateRawEvent(event2); + break; + case EDrag: + event.Set(TRawEvent::EButton1Down, x, y); + iRWsSession->SimulateRawEvent(event); + User::After(KWait01); + + event1.Set(TRawEvent::EPointerMove, x+KShortFlickDist, y); + iRWsSession->SimulateRawEvent(event1); + User::After(KWait01); + + event2.Set(TRawEvent::EPointerMove, x+KShortFlickDist,y+KShortFlickDist); + iRWsSession->SimulateRawEvent(event2); + User::After(KWait01); + + event3.Set(TRawEvent::EButton1Up, x+KShortFlickDist, y+KShortFlickDist); + iRWsSession->SimulateRawEvent(event3); + break; + case EKeys: + case EKeys1: + case EKeys2: + case EKeys3: + default: + CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(*iRWsSession, iRWsSession->GetFocusWindowGroup()); + TUid foreTaskUid = gn->AppUid(); + CleanupStack::PopAndDestroy(gn); + + iRWsSession->GetFocusWindowGroup(); + keyEvent.iModifiers=0; + + // Increasing the chance of menu, ok, arrow ,etc. keys + if( chance > KMaxChance-120) + { + if(chance no menu button push + // It's for random tests without predefined test apps + while(keyEvent.iScanCode == EStdKeyApplication0 || keyEvent.iCode == EKeyDevice2) + keyEvent.iScanCode = Math::Random()%KScancodeMax; + + } + + // Sends the key event + keyEvent.iCode = keyEvent.iScanCode; + + + TRawEvent lEventDown; + lEventDown.Set(TRawEvent::EKeyDown, keyEvent.iScanCode); + UserSvr::AddEvent(lEventDown); + + User::After(KWait01); + + // long key press + if(repeats>0) + User::After((KWait01*12)*repeats); // 1.2 sec * repeats + + TRawEvent lEventUp; + lEventUp.Set(TRawEvent::EKeyUp, keyEvent.iScanCode); + UserSvr::AddEvent(lEventUp); + + break; + } + // Restart timer + iTimer.After(iStatus,KWait01); + SetActive(); +}