// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Automatically test the window server capabilities.
//
//
#include <e32std.h>
#include "W32STD.H"
#include "../SERVER/w32cmd.h"
#include <e32svr.h>
#include <bacline.h>
#include <hal.h>
typedef TInt (*TPanicFunction)(TInt aInt,TDes& capability,TInt aExternalGroupId);
LOCAL_D const TUint KPanicThreadHeapSize=0x2000;
#define EWindowGroupHandle 1234
#define EWindowGroupHandle2 4567
_LIT(KCAPABILITY_ALL,"CAPABILITY_ALL");
_LIT(KCAPABILITY_NONE,"CAPABILITY_NONE");
_LIT(KWRITEDATA_SWEVENT,"WRITEDATA+SWEVENT");
_LIT(KWRITEDATA_POWERMGMT,"WRITEDATA+POWERMGMT");
_LIT(KPOWERMGMT_SWEVENT,"POWERMGMT+SWEVENT");
_LIT(KSetOrdinalPositionPri,"EWsWinOpSetOrdinalPositionPri Capability Check");
_LIT(KSetOrdinalPositionErr,"EWsWinOpSetOrdinalPositionErr Capability Check");
TLogMessageText LogMessageText;
//Enum for indicating which capability is checked.
enum TTestCapability
{
EWriteDeviceData,
ESwEvent,
EPowerMgmt,
EDoNotTest,
ENoCapReq,
EEikSrvSID,
ESwEventPri,
ENoSwEventPri,
ENoSwEventPriSmallOrdinal,
ESwEventErr,
ENoSwEventErr,
ENoSwEventErrSmallOrdinal,
};
//Enum for test exit reasons
enum TTestState
{
EWsExitReasonBad,
EWsTestNext,
EWsTestFinished,
};
TTestCapability gTheTestCapability;
TInt gTestState=KErrNone;
//Panics if EWsExitReasonBad
enum TAutoPanics
{
EAutoPanicPanicFailed,
};
//Thread function structure
struct SPanicParams
{
TInt num;
TPanicFunction func;
TBuf<256> capability;
TInt externalGroupId;
};
class CTestBase
{
public:
CTestBase();
~CTestBase();
void ConstructL(const TDes* aCapabilityTest);
TInt TestWsPanicL(TPanicFunction aFunction, TInt aInt, const TDes& aCommandLine);
void UpdateLogsL();
private :
TInt TestPanicL(SPanicParams* aPtr);
TInt LaunchPanicThread(RThread& aThread, SPanicParams* aPtr);
void Test(TInt aCondition);
private :
TInt iThreadNumber;
RWsSession iWs;
TBuf<256> iCapabilityTest;
TInt iTestCount;
TInt iTestPass;
};
//RWsSession derived class to test the EWservMessShutdown message
class RShellWsSession : public RWsSession
{
public:
void ShutDown();
};
void RShellWsSession::ShutDown()
{
SendReceive(EWservMessShutdown,TIpcArgs(EWservShutdownCheck));
}
LOCAL_C TInt PanicThreadFunc(TAny* aPtr)
{
CTrapCleanup* CleanUpStack=CTrapCleanup::New();
SPanicParams* ptr=(SPanicParams*)aPtr;
TInt ret;
TRAP(ret,ret=(*ptr->func)(ptr->num,ptr->capability,ptr->externalGroupId));
delete CleanUpStack;
if (ret==EWsExitReasonBad)
{
User::Panic(_L("Auto"),EAutoPanicPanicFailed);
}
return(ret);
}
CTestBase::CTestBase()
{
}
CTestBase::~CTestBase()
{
iWs.Close();
}
void CTestBase::ConstructL(const TDes* aCapabilityTest)
{
iTestCount=iTestPass=0;
iWs.Connect();
TLex lex(*aCapabilityTest);
TPtrC capability = lex.NextToken();
iCapabilityTest.Append(capability);
}
TInt CTestBase::LaunchPanicThread(RThread& aThread, SPanicParams* aPtr)
{
TBuf<32> threadName;
_LIT(KPanicThread, "AutoPanicThread%d");
threadName.AppendFormat(KPanicThread,iThreadNumber++);
return(aThread.Create(threadName,PanicThreadFunc,KDefaultStackSize,KPanicThreadHeapSize,KPanicThreadHeapSize,aPtr,EOwnerThread));
}
TInt CTestBase::TestPanicL(SPanicParams* aPtr)
{
RThread thread;
TRequestStatus stat;
TInt err=LaunchPanicThread(thread, aPtr);
if (err==KErrAlreadyExists)
{
// wait for kernel to clear up old threads
// and have several attempts at starting the thread
// if unsuccessful the first time
for (TInt i=0;i<3;i++)
{
User::After(TTimeIntervalMicroSeconds32(100000)); //0.1 secs
err=LaunchPanicThread(thread, aPtr);
if (err!=KErrAlreadyExists)
{
break;
}
}
}
User::LeaveIfError(err);
thread.Logon(stat);
User::SetJustInTime(EFalse);
thread.Resume();
User::WaitForRequest(stat);
User::SetJustInTime(ETrue);
TInt threadExit=thread.ExitReason();
if (threadExit!=EWsTestFinished)
{
if (gTheTestCapability==ENoCapReq)
{
Test(threadExit==KErrNone);
}
else if(gTheTestCapability==EEikSrvSID)
{
Test(threadExit==KErrPermissionDenied);
}
else if(!iCapabilityTest.Compare(KCAPABILITY_ALL))
{
if(gTheTestCapability!=EDoNotTest)
{
iTestCount++;
if(gTheTestCapability==ESwEventPri)
{
Test(threadExit==KPasswordWindowGroupPriority);
}
else
{
Test(threadExit==KErrNone);
}
}
}
else if(!iCapabilityTest.Compare(KCAPABILITY_NONE))
{
if(gTheTestCapability!=EDoNotTest)
{
iTestCount++;
if((gTheTestCapability==ENoSwEventPriSmallOrdinal)||(gTheTestCapability==ENoSwEventPri))
{
Test(threadExit==KPasswordWindowGroupPriority-1);
}
else if(gTheTestCapability==ENoSwEventErrSmallOrdinal)
{
Test(threadExit==KErrNone);
}
else if(gTheTestCapability==ENoSwEventErr)
{
Test(threadExit==KErrPermissionDenied);
}
else
{
Test((threadExit==EWservPanicPermissionDenied)||(threadExit==KErrPermissionDenied));
}
}
}
else if(!iCapabilityTest.Compare(KWRITEDATA_SWEVENT))
{
if(gTheTestCapability==EWriteDeviceData || gTheTestCapability==ESwEvent)
{
iTestCount++;
Test(threadExit==KErrNone);
}
if(gTheTestCapability==EPowerMgmt)
{
iTestCount++;
Test((threadExit==EWservPanicPermissionDenied)||(threadExit==KErrPermissionDenied));
}
}
else if(!iCapabilityTest.Compare(KWRITEDATA_POWERMGMT))
{
if(gTheTestCapability==EWriteDeviceData || gTheTestCapability==EPowerMgmt)
{
iTestCount++;
Test(threadExit==KErrNone);
}
if(gTheTestCapability==ESwEvent)
{
iTestCount++;
Test((threadExit==EWservPanicPermissionDenied)||(threadExit==KErrPermissionDenied));
}
}
else if(!iCapabilityTest.Compare(KPOWERMGMT_SWEVENT))
{
if(gTheTestCapability==EPowerMgmt || gTheTestCapability==ESwEvent)
{
iTestCount++;
Test(threadExit==KErrNone);
}
if(gTheTestCapability==EWriteDeviceData)
{
iTestCount++;
Test((threadExit==EWservPanicPermissionDenied)||(threadExit==KErrPermissionDenied));
}
}
}
thread.Close();
return(threadExit);
}
TInt CTestBase::TestWsPanicL(TPanicFunction aFunction,TInt aTestNo, const TDes& aCommandLine)
{
TLex lex(aCommandLine);
TPtrC capability = lex.NextToken();
TPtrC idstr = lex.NextToken();
lex = idstr;
TInt id = 0;
lex.Val(id);
SPanicParams params;
params.num=aTestNo;
params.func=aFunction;
params.capability.Copy(capability);
params.externalGroupId = id;
return TestPanicL(¶ms);
}
void CTestBase::Test(TInt aCondition)
{
if(!aCondition)
{
TLogMessageText buf;
_LIT(Fail,"AUTO Failed in Capability Test : ");
buf.Append(Fail);
buf.Append(iCapabilityTest);
iWs.LogMessage(buf);
iWs.Flush();
}
else
{
iTestPass++;
}
}
void CTestBase::UpdateLogsL()
{
TBuf<256> testResult;
RFs fileSession;
RFile resultFile;
User::LeaveIfError(fileSession.Connect());
CleanupClosePushL(fileSession);
resultFile.Replace(fileSession,_L("C:\\DATA\\TestResult.Dat"),EFileWrite);
CleanupClosePushL(resultFile);
TFileText fileText;
fileText.Set(resultFile);
testResult.Num(iTestCount);
fileText.Write(testResult);
testResult.Num(iTestPass);
fileText.Write(testResult);
resultFile.Close();
fileSession.Close();
CleanupStack::PopAndDestroy(&resultFile);
CleanupStack::PopAndDestroy(&fileSession);
}
TInt TestCapability(TInt aTest, TDes& aCapability, TInt aExternalGroupId)
{
_LIT(KDllName,"CLICK");
RWsSession ws;
ws.Connect();
CleanupClosePushL(ws);
RWindowGroup gr1(ws);
RWindowGroup gr2(ws);
gr1.Construct(EWindowGroupHandle,EFalse);
gr2.Construct(EWindowGroupHandle2,EFalse);
CleanupClosePushL(gr1);
CleanupClosePushL(gr2);
TWsEvent event;
RSoundPlugIn click1(ws);
CWsScreenDevice *screenDevice;
TRawEvent rawEvent;
CPalette* defPalette=CPalette::NewDefaultL(EColor256);
TInt ret=KErrNone;
switch(aTest)
{
case 0:
// ws.LogMessage(_L("EWsClOpSetKeyboardRepeatRate Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetKeyboardRepeatRate(TTimeIntervalMicroSeconds32(1000000), TTimeIntervalMicroSeconds32(500000));
ws.Flush();
break;
case 1:
// ws.LogMessage(_L("EWsClOpSetDoubleClick Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetDoubleClick(TTimeIntervalMicroSeconds32(900000),10);
ws.Flush();
break;
case 2:
// ws.LogMessage(_L("EWsClOpSendEventToWindowGroup (external group) Capability Check"));
gTheTestCapability=ESwEvent;
event.SetType(EEventModifiersChanged);
ret=ws.SendEventToWindowGroup(aExternalGroupId,event);
break;
case 3:
// ws.LogMessage(_L("EWsClOpSendEventToAllWindowGroup Capability Check"));
gTheTestCapability=ESwEvent;
event.SetType(EEventModifiersChanged);
ret=ws.SendEventToAllWindowGroups(event);
break;
case 4:
// ws.LogMessage(_L("EWsClOpSendEventToAllWindowGroupPriority Capability Check"));
gTheTestCapability=ESwEvent;
event.SetType(EEventModifiersChanged);
gr1.SetOrdinalPosition(0,1);
ret=ws.SendEventToAllWindowGroups(gr1.OrdinalPriority(),event);
break;
case 5:
// ws.LogMessage(_L("EWsClOpSendEventToOneWindowGroupPerClient Capability Check"));
gTheTestCapability=ESwEvent;
event.SetType(EEventModifiersChanged);
ret=ws.SendEventToOneWindowGroupsPerClient(event);
break;
case 6:
// ws.LogMessage(_L("EWsClOpSendMessageToWindowGroup (external group) Capability Check"));
gTheTestCapability=ESwEvent;
ret=ws.SendMessageToWindowGroup(aExternalGroupId,TUid::Uid(123),_L8("SomeParams"));
break;
case 7:
// ws.LogMessage(_L("EWsClOpClaimSystemPointerCursorList Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.ClaimSystemPointerCursorList();
//This may return KErrInUse if succeeds.
if(ret==KErrInUse)
{
ret=KErrNone;
}
break;
case 8:
// ws.LogMessage(_L("EWsClOpSetClientCursorMode Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetClientCursorMode(EPointerCursorNone);
ws.Flush();
break;
case 9:
//Check only if capability is not defined,since the windowgroup is not focused.
if(aCapability.Compare(KCAPABILITY_ALL)&&aCapability.Compare(KWRITEDATA_POWERMGMT)&&aCapability.Compare(KWRITEDATA_SWEVENT))
{
// ws.LogMessage(_L("EWsClOpSetPointerCursorPosition Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetPointerCursorPosition(TPoint(60,20));
ws.Flush();
}
else
{
gTheTestCapability=EDoNotTest;
}
break;
case 10:
// ws.LogMessage(_L("EWsClOpSetModifierState Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetModifierState(EModifierCapsLock,ETurnOnModifier);
ret=ws.SetModifierState(EModifierCapsLock,ETurnOffModifier);
ws.Flush();
break;
case 11:
{
// ws.LogMessage(_L("EWsClOpRawEvent Capability Check"));
gTheTestCapability=ESwEvent;
rawEvent.Set(TRawEvent::EActive);
ws.SimulateRawEvent(rawEvent);
ws.Flush();
}
break;
case 12:
{
// ws.LogMessage(_L("EWsClOpKeyEvent Capability Check"));
gTheTestCapability=ESwEvent;
TKeyEvent keyEvent;
keyEvent.iCode='J';
keyEvent.iScanCode=0;
keyEvent.iModifiers=EModifierAutorepeatable;
keyEvent.iRepeats=0;
ws.SimulateKeyEvent(keyEvent);
ws.Flush();
}
break;
case 13:
// ws.LogMessage(_L("EWsClOpSendOffEventsToShell Capability Check"));
gTheTestCapability=EPowerMgmt;
ret=ws.RequestOffEvents(EFalse);
break;
case 14:
// ws.LogMessage(_L("EWsClOpSetFaded Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetSystemFaded(EFalse);
break;
case 15:
//Since there is some problem in running the EWsClOpNoFlickerFree
//code this test is not run if WriteDeviceData capability is defined.
// ws.LogMessage(_L("EWsClOpNoFlickerFree Capability Check"));
if(aCapability.Compare(KCAPABILITY_ALL)&&aCapability.Compare(KWRITEDATA_POWERMGMT)&&aCapability.Compare(KWRITEDATA_SWEVENT))
{
CWsScreenDevice* screen = new (ELeave) CWsScreenDevice(ws);
gTheTestCapability=EWriteDeviceData;
TInt err;
if ((err=screen->Construct(0))!=KErrNone)
{
delete screen;
User::Leave(err);
}
ws.TestWrite(ws.WsHandle(), EWsClOpNoFlickerFree, NULL, 0);
ws.Flush();
delete screen;
}
else
{
gTheTestCapability=EDoNotTest;
}
break;
case 16:
// ws.LogMessage(_L("EWsClOpSetFocusScreen Capability Check"));
gTheTestCapability=EWriteDeviceData;
ret=ws.SetFocusScreen(0);
break;
case 17:
{
//Check only if capability is not defined. Otherwise it will shut down the shell.
if(aCapability.Compare(KCAPABILITY_ALL)&&aCapability.Compare(KWRITEDATA_POWERMGMT)&&aCapability.Compare(KPOWERMGMT_SWEVENT))
{
// ws.LogMessage(_L("EWservMessShutdown Capability Check"));
gTheTestCapability=EPowerMgmt;
RShellWsSession wsShell;
wsShell.Connect();
wsShell.ShutDown();
}
else
{
gTheTestCapability=EDoNotTest;
}
break;
}
case 18:
// ws.LogMessage(_L("EWsWinOpCaptureKey Capability Check"));
gTheTestCapability=ESwEvent;
ret=gr2.CaptureKey('a',EModifierFunc,EModifierFunc);
//If the function succeeds capability check,the ret value is handle identifying the capture key.
if(ret>0)
{
ret=KErrNone;
}
break;
case 19:
// ws.LogMessage(_L("EWsWinOpCaptureKeyUpsAndDowns Capability Check"));
gTheTestCapability=ESwEvent;
ret=gr2.CaptureKeyUpAndDowns('a',0,0);
//If the function succeeds capability check,the ret value is handle identifying the capture key.
if(ret>0)
{
ret=KErrNone;
}
break;
case 20:
// ws.LogMessage(_L("EWsWinOpCaptureLongKey Capability Check"));
gTheTestCapability=ESwEvent;
ret=gr2.CaptureLongKey(EKeyEscape,'e',0,0,2,ELongCaptureNormal|ELongCaptureRepeatEvents);
//If the function succeeds capability check,the ret value is handle identifying the capture key.
if(ret>0)
{
ret=KErrNone;
}
break;
case 21:
// ws.LogMessage(_L("EWsClickOpLoad Capability Check"));
gTheTestCapability=EWriteDeviceData;
click1.Construct();
CleanupClosePushL(click1);
ret=click1.Load(KDllName);
CleanupStack::PopAndDestroy(&click1);
break;
case 22:
// ws.LogMessage(_L("EWsClickOpUnLoad Capability Check"));
gTheTestCapability=EWriteDeviceData;
click1.Construct();
ret=click1.Unload();
break;
case 23:
// ws.LogMessage(_L("EWsSdOpSetScreenMode Capability Check"));
gTheTestCapability=EWriteDeviceData;
screenDevice=new(ELeave) CWsScreenDevice(ws);
CleanupStack::PushL(screenDevice);
screenDevice->Construct(0);
screenDevice->SetScreenMode(0);
CleanupStack::PopAndDestroy(screenDevice);
break;
case 24:
// ws.LogMessage(_L("EWsSdOpSetScreenModeEnforcement Capability Check"));
gTheTestCapability=EWriteDeviceData;
screenDevice=new(ELeave) CWsScreenDevice(ws);
CleanupStack::PushL(screenDevice);
screenDevice->Construct(0);
screenDevice->SetScreenModeEnforcement(ESizeEnforcementNone);
ws.Flush();
CleanupStack::PopAndDestroy(screenDevice);
break;
case 25:
{
// ws.LogMessage(_L("EWsSdOpSetPalette Capability Check"));
gTheTestCapability=EWriteDeviceData;
screenDevice=new(ELeave) CWsScreenDevice(ws);
CleanupStack::PushL(screenDevice);
screenDevice->Construct(0);
ret=screenDevice->SetCustomPalette(defPalette);
//Returns KErrNotSupported if succeeds capability check.
if(ret==KErrNotSupported)
{
ret=KErrNone;
}
CleanupStack::PopAndDestroy(screenDevice);
}
break;
case 26:
{
//Checking the capability for SetHotKeys
// ws.LogMessage(_L("EWsClOpSetHotKey Capability Check"));
gTheTestCapability=ESwEvent;
ret=ws.SetHotKey(EHotKeyEnableLogging,'e',EModifierFunc|EModifierCtrl|EModifierShift,0);
ws.Flush();
}
break;
case 27:
{
//Checking the capability for ClearHotKeys
// ws.LogMessage(_L("EWsClOpClearHotKeys Capability Check"));
gTheTestCapability=ESwEvent;
ret=ws.ClearHotKeys(EHotKeyEnableLogging);
ws.Flush();
}
break;
case 28:
// ws.LogMessage(_L("EWsClOpSendEventToWindowGroup (own group) Capability Check"));
gTheTestCapability=ENoCapReq;
event.SetType(EEventModifiersChanged);
ret=ws.SendEventToWindowGroup(gr1.Identifier(),event);
break;
case 29:
// ws.LogMessage(_L("EWsClOpSendMessageToWindowGroup (own group) Capability Check"));
gTheTestCapability=ENoCapReq;
ret=ws.SendMessageToWindowGroup(gr1.Identifier(),TUid::Uid(123),_L8("SomeParams"));
break;
case 30:
// ws.LogMessage(_L("EWsClOpSetBackLight Capability Check"));
gTheTestCapability=EEikSrvSID;
screenDevice=new(ELeave) CWsScreenDevice(ws);
CleanupStack::PushL(screenDevice);
screenDevice->Construct(0);
ret=screenDevice->SetBackLight(ETrue); //Always returns KErrPermissionDenied.
CleanupStack::PopAndDestroy(screenDevice);
break;
case 31:
{
TBool test=EFalse;
if(!aCapability.Compare(KCAPABILITY_ALL))
{
gTheTestCapability=ESwEventPri;
test=ETrue;
}
else if(!aCapability.Compare(KCAPABILITY_NONE))
{
gTheTestCapability=ENoSwEventPri;
test=ETrue;
}
else
{
gTheTestCapability=EDoNotTest;
}
if(test)
{
LogMessageText.Format(KSetOrdinalPositionPri);
ws.LogMessage(LogMessageText);
gr1.SetOrdinalPosition(0,KPasswordWindowGroupPriority);
ret=ws.GetWindowGroupOrdinalPriority(gr1.Identifier());
}
}
break;
case 32:
if(!aCapability.Compare(KCAPABILITY_NONE))
{
LogMessageText.Format(KSetOrdinalPositionPri);
ws.LogMessage(LogMessageText);
gTheTestCapability=ENoSwEventPriSmallOrdinal;
gr1.SetOrdinalPosition(0,KPasswordWindowGroupPriority-1);
ret=ws.GetWindowGroupOrdinalPriority(gr1.Identifier());
}
else
{
gTheTestCapability=EDoNotTest;
}
break;
case 33:
{
TBool test=EFalse;
if(!aCapability.Compare(KCAPABILITY_ALL))
{
gTheTestCapability=ESwEventErr;
test=ETrue;
}
else if(!aCapability.Compare(KCAPABILITY_NONE))
{
gTheTestCapability=ENoSwEventErr;
test=ETrue;
}
else
{
gTheTestCapability=EDoNotTest;
}
if(test)
{
LogMessageText.Format(KSetOrdinalPositionErr);
ws.LogMessage(LogMessageText);
ret=gr1.SetOrdinalPositionErr(0,KPasswordWindowGroupPriority);
}
}
break;
case 34:
if(!aCapability.Compare(KCAPABILITY_NONE))
{
LogMessageText.Format(KSetOrdinalPositionErr);
ws.LogMessage(LogMessageText);
gTheTestCapability=ENoSwEventErrSmallOrdinal;
ret=gr1.SetOrdinalPositionErr(0,KPasswordWindowGroupPriority-1);
}
else
{
gTheTestCapability=EDoNotTest;
}
break;
case 35:
// EWsClOpSetCloseProximityThresholds Capability Check
gTheTestCapability=EWriteDeviceData;
ret=ws.SetCloseProximityThresholds(-20, -50);
ws.SetCloseProximityThresholds(KMaxTInt, KMinTInt);
break;
case 36:
// EWsClOpSetHighPressureThresholds Capability Check
gTheTestCapability=EWriteDeviceData;
ret=ws.SetHighPressureThresholds(4000, 2000);
ws.SetHighPressureThresholds(KMaxTInt, KMinTInt);
break;
default:
ret=gTestState=EWsTestFinished;
}
CleanupStack::PopAndDestroy(&gr2);
CleanupStack::PopAndDestroy(&gr1);
CleanupStack::PopAndDestroy(&ws);
return ret;
}
void MainL()
{
TBuf<256> commandLine;
User::CommandLine(commandLine);
CTestBase testBase;
testBase.ConstructL(&commandLine);
TInt ii=0;
while(gTestState!=EWsTestFinished)
testBase.TestWsPanicL(&TestCapability,ii++,commandLine) ;
// testBase.UpdateLogsL();
}
GLDEF_C TInt E32Main()
{
__UHEAP_MARK;
CTrapCleanup* cleanUpStack=CTrapCleanup::New();
if(cleanUpStack==NULL)
{
return KErrNoMemory;
}
TRAP_IGNORE(MainL())
delete cleanUpStack;
__UHEAP_MARKEND;
return(KErrNone);
}