--- /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)