windowing/windowserver/test/tauto/TOOMDRAW.CPP
branchRCL_3
changeset 163 bbf46f59e123
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tauto/TOOMDRAW.CPP	Tue Aug 31 16:31:06 2010 +0300
@@ -0,0 +1,244 @@
+// Copyright (c) 1996-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:
+// Test out of memory redraws
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "TOOMDRAW.H"
+
+void DrawTestScreen(CWindowGc *aGc, const TSize &aSize)
+	{
+	aGc->SetPenSize(TSize(10,10));
+	aGc->SetBrushStyle(CGraphicsContext::EVerticalHatchBrush);
+	aGc->DrawRect(TRect(aSize));
+	}
+
+CTestWin::CTestWin()
+	{
+	}
+
+void CTestWin::Draw()
+	{
+#if defined(FULLLOGGING)
+	_LIT(KLog,"Drawing Test Win:%d  %d,%d");
+	TLogMessageText buf;
+	buf.Format(KLog,Size().iWidth>320?1:0,Size().iWidth,Size().iHeight);
+	TheClient->LogMessage(buf);
+#endif
+	DrawTestScreen(iGc,Size());
+	}
+
+CBaseTestWin::CBaseTestWin() : CTBackedUpWin(EGray4)
+	{}
+
+void CBaseTestWin::Resized(const TSize &aNewSize)
+	{
+	TheGc->Activate(*DrawableWin());
+	DrawTestScreen(TheGc,aNewSize);
+	TheGc->Deactivate();
+	}
+
+CToomDraw::CToomDraw(CTestStep* aStep):
+	CTWsGraphicsBase(aStep)
+	{
+	}
+
+CToomDraw::~CToomDraw()
+	{
+	TheClient->iWs.HeapSetFail(RHeap::ENone,0);		//In case the test crashes and it hasn't been reset
+	DeleteWindows();
+	}
+
+void CToomDraw::DeleteWindows()
+	{
+	delete iTestWin;
+	iTestWin=NULL;
+	delete iBaseWin;
+	iBaseWin=NULL;
+	delete iBackWin;
+	iBackWin=NULL;
+	delete iBlankWin;
+	iBlankWin=NULL;
+	}
+
+void CToomDraw::ConstructL()
+	{
+	iScrSize=TheClient->iScreen->SizeInPixels();
+	iBlankWin=new(ELeave) CTBlankWindow;
+	iBlankWin->ConstructL(*TheClient->iGroup);
+	iBlankWin->SetColor(TRgb::Gray4(2));		//Grey
+	iBlankWin->Activate();
+	iBackWin=new(ELeave) CTestWin();
+	iBackWin->SetUpL(TPoint(0,iScrSize.iHeight/4), TSize(iScrSize.iWidth,iScrSize.iHeight/2), TheClient->iGroup, *TheClient->iGc);
+	iBaseWin=new(ELeave) CBaseTestWin();
+	iBaseWin->SetUpL(TPoint(iScrSize.iWidth*2/3,0), TSize(iScrSize.iWidth/3,iScrSize.iHeight), TheClient->iGroup, *TheClient->iGc);
+	}
+
+void CToomDraw::CreateTestWinL()
+	{
+	iTestWin=new(ELeave) CTestWin();
+	iTestWin->ConstructL(*TheClient->iGroup);
+	iTestWin->SetExtL(TPoint(0,0), TSize(iScrSize.iWidth/3,iScrSize.iHeight));
+	iTestWin->AssignGC(*TheClient->iGc);
+	iTestWin->BaseWin()->SetShadowHeight(2);
+	}
+
+void CToomDraw::TriggerOomDrawsL(TInt aCount)
+	{
+	if(iTestWin)
+		{
+		iTestWin->SetExtL(TPoint(),iScrSize);		
+		}
+	delete iTestWin;
+	iTestWin=NULL;
+	CreateTestWinL();
+	TheClient->iWs.HeapSetFail(RHeap::EDeterministic,aCount);
+	iTestWin->Activate();
+	TheClient->iWs.Finish();
+	}
+
+TBool CToomDraw::CheckWindowsL()
+	{
+	TLogMessageText buf;
+	TBool pass = DoCheckRect(iTestWin,iBaseWin);
+	if (pass)
+		{
+		TEST(ETrue);		//Adds one to test count
+	#if defined(FULLLOGGING)
+		_LIT(KLog,"OOM Draw Test Pass, State=%d");
+		buf.Format(KLog,iState);
+	#endif
+		iRetryCount=0;
+		}
+	else
+		{
+		if (iRetryCount==4)
+			{
+			if ((iTest->RedrawStoreTypeL()==EPartialRedraw_PreserveStoredCmds ||
+			iTest->RedrawStoreTypeL()==EPartialRedraw_FullRedrawSupport) && (iState==19 || iState==30) ||
+			((iState>=2 && iState<=6) && (iTest->RedrawStoreTypeL()==EPartialRedraw_None || iTest->RedrawStoreTypeL()==EPartialRedraw_FullRedrawSupport)))
+				{
+			#if defined(FULLLOGGING)
+				_LIT(KLog,"OOM Draw Test Known F a i l, State=%d");
+				buf.Format(KLog,iState);
+			#endif
+				pass=ETrue;
+				}
+			else
+				{
+				if (iFailAt==0)
+					iFailAt=iState;
+				++iFails; //mark this test as failed
+			#if defined(LOGGING)
+				_LIT(KLog,"OOM Draw Test FAIL, State=%d  <------- FAIL");
+				buf.Format(KLog,iState);
+			#endif
+				++iState; //and advance to next test
+				}
+			iRetryCount=0;
+			}
+		else
+			{
+		#if defined(FULLLOGGING)
+			_LIT(KLog,"OOM Draw Test F a i l, State=%d retrying");
+			buf.Format(KLog,iState);
+		#endif
+			if (++iRetryCount%2==0)
+				iBackWin->DrawNow();
+			}
+		}
+	if (buf.Length()>0)
+		TheClient->LogMessage(buf);
+	return pass;
+	}
+
+void CToomDraw::RunTestCaseL(TInt aCurTestCase)
+	{
+	TBool testFinished = false;
+	((CToomDrawStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0110
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Test trying to draw when out of memory
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Set out of memory and try drawing
+
+@SYMTestExpectedResults Out of memory drawing is handle correctly
+*/
+	case 1:
+		((CToomDrawStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0110"));
+		while (!testFinished)
+			{
+		if (iDoCheck)
+			{
+			TheClient->iWs.HeapSetFail(RHeap::ENone,0);
+			TheClient->WaitForRedrawsToFinish();
+			if (CheckWindowsL())
+				{
+				++iState;
+				if (iState==EMaxOOMState)
+					DeleteWindows();
+				}
+			iDoCheck=EFalse;
+			TheClient->iWs.Finish();
+			}
+		else
+			{
+			if (iState==EMaxOOMState)
+				{
+				if (iFails>0)
+					{
+			#if defined(LOGING)
+					_LIT(KLog,"OOM Draw Test Failed, First Fail At %d, Number of Fails %d");
+					TLogMessageText buf;
+					buf.Format(KLog,iFailAt,iFails);
+					TheClient->LogMessage(buf);
+			#endif
+					TEST(iFails==0);
+					}
+				User::After(500000);	// Let the rest of the world catch up after OOM death
+				testFinished = true;
+				}
+			else if (iState < 3 && iTest->IsFullRomL())
+				testFinished = true;
+			else
+				TriggerOomDrawsL(iState);
+			iDoCheck=ETrue;
+			}
+			}
+		break;
+	case 2:
+		((CToomDrawStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CToomDrawStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+		}
+	((CToomDrawStep*)iStep)->RecordTestResultL();
+	}
+
+__WS_CONSTRUCT_STEP__(oomDraw)