diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tauto/TBUFFERSECURITY.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/tauto/TBUFFERSECURITY.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,457 @@ +// Copyright (c) 2006-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: +// DEF075471 buffer security test +// +// + +/** + @file + @test + @internalComponent - Internal Symbian test code +*/ + +#include "TBUFFERSECURITY.H" +#include "graphics/windowserverconstants.h" + +//Set this #define in buffersecurity.h to add extra logging to this test case (useful when debugging a test fail) +//#define _TBUFS_LOGGING + +//Set this #define in buffersecurity.h to initiate a long running soak test, this should be done periodically +//#define _TBUFS_TEST_SOAK_TEST + + + +LOCAL_C TInt TestWsThreadFunc(TAny* aPtr) + { + TTestThreadData* data = (TTestThreadData*)aPtr; + RWsSession ws; + + TInt err=ws.Connect(); + if (err!=KErrNone) + return(err); + ws.TestWrite(ws.WsHandle(), data->iOpCode, data->iData, data->iDataLength); + ws.Flush(); + ws.Close(); + + return(KErrNone); + } + +LOCAL_C TInt TestAnimDllThreadFunc(TInt aInt, TAny* /*aPtr*/) + { + TBool useTestWrite = (TBool)aInt; + + RWsSession ws; + TInt err=ws.Connect(); + if (err != KErrNone) + return (err); + if (useTestWrite) + { + TUint32 data[2]; + data[0] = 200; + data[1] = 4; + ws.TestWrite(ws.WsHandle(), EWsClOpCreateAnimDll, REINTERPRET_CAST(TUint8*,data), 8); + ws.Flush(); + } + else + { + RAnimDll animDll(ws); + const TPtrC filename(REINTERPRET_CAST(TUint16*,4),200); + animDll.Load(filename); + animDll.Close(); + } + ws.Close(); + + return(KErrNone); + } + +TInt RTestIpcSession::Connect() + { + TVersion v(KWservMajorVersionNumber,KWservMinorVersionNumber,KWservBuildVersionNumber); + TInt err = CreateSession(KWSERVServerName,v); + if (err == KErrNone) + { + err=iWsHandle=SendReceive(EWservMessInit,TIpcArgs()); + } + return err; + } + +TInt RTestIpcSession::SendBadBuffer() + { + TIpcArgs ipcArgs; + TUint32 iData[2]; + iData[0] = 200; + iData[1] = 4; + ipcArgs.Set(KBufferMessageSlot,&iData); + return SendReceive(EWservMessCommandBuffer,ipcArgs); + } + +LOCAL_C TInt TestIpcThreadFunc(TInt /*aInt*/, TAny* /*aPtr*/) + { + RTestIpcSession server; + + TInt handle=server.Connect(); + if (handle >= KErrNone) + server.SendBadBuffer(); + + return(KErrNone); + } + + +CTBufferSecurity::CTBufferSecurity(CTestStep* aStep): + CTWsGraphicsBase(aStep) + { + } + +CTBufferSecurity::~CTBufferSecurity() + { + } + +void CTBufferSecurity::ConstructL() + { + RProperty securityTesting; + TInt err=securityTesting.Attach(KUidWServSecurityTesting,EWServSecTestBufferSecurity); + User::LeaveIfError(err); + err=securityTesting.Define(KUidWServSecurityTesting,EWServSecTestBufferSecurity,RProperty::EInt,KAllowAllPolicy,KWriteDeviceDataMgmtPolicy); + if (err!=KErrAlreadyExists) + User::LeaveIfError(err); + TInt value = ETrue; + err = securityTesting.Set(value); + User::LeaveIfError(err); + } + +void CTBufferSecurity::TestWsBufferL(TInt aOpCode, TUint aDataFill, TBool aEightBit) + { + // create a new thread in which to test each of the TWsClientOpCode values + // so if the thread is panicked the test will not fail. + RThread testThread; + TTestThreadData data; + TRequestStatus status; + TUint8 storeData[KTestDataMax]; + TTestDataStore store; + store.any=storeData; + + //collect initial values + for (TInt count = 0; count < KTestDataMax; count++) + storeData[count] = 0; + switch (aOpCode) + { + case EWsClOpHeapSetFail: + store.heapSetFail->type = RAllocator::ENone; + break; + case EWsClOpSetPointerCursorArea: + store.cursorArea->area = TheClient->iWs.PointerCursorArea(); + break; + case EWsClOpRawEvent: + //skip switch off (would need a timer to turn it back on again) + if (aDataFill == TRawEvent::ESwitchOff) + aDataFill = TRawEvent::ENone; + break; +#if defined(__WINS__) + case EWsClOpSimulateXyInput: + *store.xyInputType = EXYInputMouse; + break; +#endif + } + + data.iOpCode = aOpCode; + if (aEightBit) + { + for (TInt count = 0; count < KTestDataMax; count++) + data.iData[count] = (TUint8)aDataFill; + } + else + { + for (TInt count = 0; count < KTestDataMax32; count++) + data.iData32[count] = aDataFill; + } + data.iDataLength = KTestDataMax; + _LIT(KThreadNameFormat,"BufSecTestWsThread-%d-%d"); + HBufC* threadName = HBufC::NewLC(KThreadNameFormat().Size() + 32); + TPtr threadNamePtr(threadName->Des()); + threadNamePtr.Format(KThreadNameFormat(), aOpCode, aDataFill); + TInt err = testThread.Create(threadNamePtr, TestWsThreadFunc,KDefaultStackSize,KPanicThreadHeapSize,KPanicThreadHeapSize,(TAny*)&data,EOwnerThread); + + if (err != KErrNone) + { + User::After(100000); + err = testThread.Create(threadNamePtr,TestWsThreadFunc,KDefaultStackSize,KPanicThreadHeapSize,KPanicThreadHeapSize,(TAny*)&data,EOwnerThread); + } + CleanupStack::PopAndDestroy(threadName); + testThread.Logon(status); + User::SetJustInTime(EFalse); + testThread.Resume(); + User::WaitForRequest(status); + User::SetJustInTime(ETrue); +#ifdef _TBUFS_LOGGING + TLogMessageText logMessageText; + TBufSStartLogText("TestWsBufferL"); + logMessageText.Format(_L(" OpCode(%d), ExitReason: %d"),aOpCode,testThread.ExitReason()); + TBufSLogFormat(logMessageText); +#endif + + testThread.Close(); + //reset some values to sensible ones + switch (aOpCode) + { + case EWsClOpHeapSetFail: + case EWsClOpSetPointerCursorArea: +#if defined(__WINS__) + case EWsClOpSimulateXyInput: +#endif + RThread resetThread; + TheClient->iWs.TestWrite(TheClient->iWs.WsHandle(), data.iOpCode, storeData, data.iDataLength); + TheClient->iWs.Flush(); + break; + } + } + +void CTBufferSecurity::TestBadStringAnimDllL() + { + TEST(iTest->TestPanicL(&TestAnimDllThreadFunc,3,EFalse,NULL,KLitKernExec)); + } + +void CTBufferSecurity::TestBadStringL() + { + TEST(iTest->TestWsPanicL(&TestAnimDllThreadFunc,EWservPanicBufferPtr,ETrue,NULL)); + } + +void CTBufferSecurity::TestBadIpcL() + { + TEST(iTest->TestWsPanicL(&TestIpcThreadFunc,EWservPanicDescriptor,1)); + } + +void CTBufferSecurity::RunTestCaseL(TInt /*aCurTestCase*/) + { + TInt ii; + ((CTBufferSecurityStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); + switch(++iTest->iState) + { + case 1: + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0022")); + _LIT(KBuffSecTestBadIpcL,"TestBadIpcL"); + iTest->LogSubTest(KBuffSecTestBadIpcL); + TestBadIpcL(); + break; + case 2: +/** +@SYMTestCaseID GRAPHICS-WSERV-0549 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0549")); + _LIT(KBuffSecTestBadStringLRAnimDll,"TestBadStringL use RAnimDll"); + iTest->LogSubTest(KBuffSecTestBadStringLRAnimDll); + TestBadStringAnimDllL(); + break; + case 3: +/** +@SYMTestCaseID GRAPHICS-WSERV-0550 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0550")); + _LIT(KBuffSecTestBadStringLTestWrite,"TestBadStringL use TestWrite"); + iTest->LogSubTest(KBuffSecTestBadStringLTestWrite); + TestBadStringL(); + break; +#ifdef _TBUFS_TEST_SOAK_TEST + case 4: +/** +@SYMTestCaseID GRAPHICS-WSERV-0551 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0551")); + _LIT(KBuffSecTestWsBufferLSoak8bit,"TestWsBufferL Soak 8bit"); + iTest->LogSubTest(KBuffSecTestWsBufferLSoak8bit); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TUint8 soak8=0;//gets set as KMaxTUint8 on first iteration + do + { + --soak8; + TestWsBufferL(ii,soak8); + } + while (soak8>0); + } + break; + case 5: +/** +@SYMTestCaseID GRAPHICS-WSERV-0552 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0552")); + _LIT(KBuffSecTestWsBufferLSoak32bit,"TestWsBufferL Soak 32bit"); + iTest->LogSubTest(KBuffSecTestWsBufferLSoak32bit); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TUint32 soak32=0;//gets set as KMaxTUint8 on first iteration + do + { + --soak32; + TestWsBufferL(ii,soak32,EFalse); + } + while (soak32>0); + } + break; +#else + case 4: +/** +@SYMTestCaseID GRAPHICS-WSERV-0553 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0553")); + _LIT(KBuffSecTestWsBufferL0,"TestWsBufferL 0"); + iTest->LogSubTest(KBuffSecTestWsBufferL0); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,0); + } + break; + case 5: +/** +@SYMTestCaseID GRAPHICS-WSERV-0554 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0554")); + _LIT(KBuffSecTestWsBufferL5,"TestWsBufferL 5"); + iTest->LogSubTest(KBuffSecTestWsBufferL5); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,5); + } + break; + case 6: +/** +@SYMTestCaseID GRAPHICS-WSERV-0555 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0555")); + _LIT(KBuffSecTestWsBufferL32,"TestWsBufferL 32"); + iTest->LogSubTest(KBuffSecTestWsBufferL32); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,32); + } + break; + case 7: +/** +@SYMTestCaseID GRAPHICS-WSERV-0556 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0556")); + _LIT(KBuffSecTestWsBufferL64,"TestWsBufferL 64"); + iTest->LogSubTest(KBuffSecTestWsBufferL64); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,64); + } + break; + case 8: +/** +@SYMTestCaseID GRAPHICS-WSERV-0557 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0557")); + _LIT(KBuffSecTestWsBufferL128,"TestWsBufferL 128"); + iTest->LogSubTest(KBuffSecTestWsBufferL128); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,128); + } + break; + case 9: +/** +@SYMTestCaseID GRAPHICS-WSERV-0558 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0558")); + _LIT(KBuffSecTestWsBufferL255,"TestWsBufferL 255"); + iTest->LogSubTest(KBuffSecTestWsBufferL255); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,255); + } + break; + case 10: +/** +@SYMTestCaseID GRAPHICS-WSERV-0559 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0559")); + _LIT(KBuffSecTestWsBufferL325,"TestWsBufferL 32-5"); + iTest->LogSubTest(KBuffSecTestWsBufferL325); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,5,EFalse); + } + break; + case 11: +/** +@SYMTestCaseID GRAPHICS-WSERV-0560 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0560")); + _LIT(KBuffSecTestWsBufferL32128,"TestWsBufferL 32-128"); + iTest->LogSubTest(KBuffSecTestWsBufferL32128); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,128,EFalse); + } + break; + case 12: +/** +@SYMTestCaseID GRAPHICS-WSERV-0561 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0561")); + _LIT(KBuffSecTestWsBufferL32512,"TestWsBufferL 32-512"); + iTest->LogSubTest(KBuffSecTestWsBufferL32512); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,512,EFalse); + } + break; + case 13: +/** +@SYMTestCaseID GRAPHICS-WSERV-0562 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0562")); + _LIT(KBuffSecTestWsBufferL320x01234567,"TestWsBufferL 32-0x01234567"); + iTest->LogSubTest(KBuffSecTestWsBufferL320x01234567); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,0x01234567,EFalse); + } + break; + case 14: +/** +@SYMTestCaseID GRAPHICS-WSERV-0563 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0563")); + _LIT(KBuffSecTestWsBufferL320x89abcdef,"TestWsBufferL 32-0x89abcdef"); + iTest->LogSubTest(KBuffSecTestWsBufferL320x89abcdef); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,0x89abcdef,EFalse); + } + break; + case 15: +/** +@SYMTestCaseID GRAPHICS-WSERV-0564 +*/ + ((CTBufferSecurityStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0564")); + _LIT(KBuffSecTestWsBufferL320xCCCCCCCC,"TestWsBufferL 32-0xCCCCCCCC"); + iTest->LogSubTest(KBuffSecTestWsBufferL320xCCCCCCCC); + for(ii = EWsClOpDisconnect; ii < EWsClOpLastEnumValue; ii++) + { + TestWsBufferL(ii,0xCCCCCCCC,EFalse); + } + break; +#endif + default: + ((CTBufferSecurityStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); + ((CTBufferSecurityStep*)iStep)->CloseTMSGraphicsStep(); + TInt err = RProperty::Set(KUidWServSecurityTesting,EWServSecTestBufferSecurity,EFalse); + User::LeaveIfError(err); + TestComplete(); + } + ((CTBufferSecurityStep*)iStep)->RecordTestResultL(); + } + +__WS_CONSTRUCT_STEP__(BufferSecurity)