sl@0: // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Test out of memory redraws sl@0: // sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent - Internal Symbian test code sl@0: */ sl@0: sl@0: #include "TOOMDRAW.H" sl@0: sl@0: void DrawTestScreen(CWindowGc *aGc, const TSize &aSize) sl@0: { sl@0: aGc->SetPenSize(TSize(10,10)); sl@0: aGc->SetBrushStyle(CGraphicsContext::EVerticalHatchBrush); sl@0: aGc->DrawRect(TRect(aSize)); sl@0: } sl@0: sl@0: CTestWin::CTestWin() sl@0: { sl@0: } sl@0: sl@0: void CTestWin::Draw() sl@0: { sl@0: #if defined(FULLLOGGING) sl@0: _LIT(KLog,"Drawing Test Win:%d %d,%d"); sl@0: TLogMessageText buf; sl@0: buf.Format(KLog,Size().iWidth>320?1:0,Size().iWidth,Size().iHeight); sl@0: TheClient->LogMessage(buf); sl@0: #endif sl@0: DrawTestScreen(iGc,Size()); sl@0: } sl@0: sl@0: CBaseTestWin::CBaseTestWin() : CTBackedUpWin(EGray4) sl@0: {} sl@0: sl@0: void CBaseTestWin::Resized(const TSize &aNewSize) sl@0: { sl@0: TheGc->Activate(*DrawableWin()); sl@0: DrawTestScreen(TheGc,aNewSize); sl@0: TheGc->Deactivate(); sl@0: } sl@0: sl@0: CToomDraw::CToomDraw(CTestStep* aStep): sl@0: CTWsGraphicsBase(aStep) sl@0: { sl@0: } sl@0: sl@0: CToomDraw::~CToomDraw() sl@0: { sl@0: TheClient->iWs.HeapSetFail(RHeap::ENone,0); //In case the test crashes and it hasn't been reset sl@0: DeleteWindows(); sl@0: } sl@0: sl@0: void CToomDraw::DeleteWindows() sl@0: { sl@0: delete iTestWin; sl@0: iTestWin=NULL; sl@0: delete iBaseWin; sl@0: iBaseWin=NULL; sl@0: delete iBackWin; sl@0: iBackWin=NULL; sl@0: delete iBlankWin; sl@0: iBlankWin=NULL; sl@0: } sl@0: sl@0: void CToomDraw::ConstructL() sl@0: { sl@0: iScrSize=TheClient->iScreen->SizeInPixels(); sl@0: iBlankWin=new(ELeave) CTBlankWindow; sl@0: iBlankWin->ConstructL(*TheClient->iGroup); sl@0: iBlankWin->SetColor(TRgb::Gray4(2)); //Grey sl@0: iBlankWin->Activate(); sl@0: iBackWin=new(ELeave) CTestWin(); sl@0: iBackWin->SetUpL(TPoint(0,iScrSize.iHeight/4), TSize(iScrSize.iWidth,iScrSize.iHeight/2), TheClient->iGroup, *TheClient->iGc); sl@0: iBaseWin=new(ELeave) CBaseTestWin(); sl@0: iBaseWin->SetUpL(TPoint(iScrSize.iWidth*2/3,0), TSize(iScrSize.iWidth/3,iScrSize.iHeight), TheClient->iGroup, *TheClient->iGc); sl@0: } sl@0: sl@0: void CToomDraw::CreateTestWinL() sl@0: { sl@0: iTestWin=new(ELeave) CTestWin(); sl@0: iTestWin->ConstructL(*TheClient->iGroup); sl@0: iTestWin->SetExtL(TPoint(0,0), TSize(iScrSize.iWidth/3,iScrSize.iHeight)); sl@0: iTestWin->AssignGC(*TheClient->iGc); sl@0: iTestWin->BaseWin()->SetShadowHeight(2); sl@0: } sl@0: sl@0: void CToomDraw::TriggerOomDrawsL(TInt aCount) sl@0: { sl@0: if(iTestWin) sl@0: { sl@0: iTestWin->SetExtL(TPoint(),iScrSize); sl@0: } sl@0: delete iTestWin; sl@0: iTestWin=NULL; sl@0: CreateTestWinL(); sl@0: TheClient->iWs.HeapSetFail(RHeap::EDeterministic,aCount); sl@0: iTestWin->Activate(); sl@0: TheClient->iWs.Finish(); sl@0: } sl@0: sl@0: TBool CToomDraw::CheckWindowsL() sl@0: { sl@0: TLogMessageText buf; sl@0: TBool pass = DoCheckRect(iTestWin,iBaseWin); sl@0: if (pass) sl@0: { sl@0: TEST(ETrue); //Adds one to test count sl@0: #if defined(FULLLOGGING) sl@0: _LIT(KLog,"OOM Draw Test Pass, State=%d"); sl@0: buf.Format(KLog,iState); sl@0: #endif sl@0: iRetryCount=0; sl@0: } sl@0: else sl@0: { sl@0: if (iRetryCount==4) sl@0: { sl@0: if ((iTest->RedrawStoreTypeL()==EPartialRedraw_PreserveStoredCmds || sl@0: iTest->RedrawStoreTypeL()==EPartialRedraw_FullRedrawSupport) && (iState==19 || iState==30) || sl@0: ((iState>=2 && iState<=6) && (iTest->RedrawStoreTypeL()==EPartialRedraw_None || iTest->RedrawStoreTypeL()==EPartialRedraw_FullRedrawSupport))) sl@0: { sl@0: #if defined(FULLLOGGING) sl@0: _LIT(KLog,"OOM Draw Test Known F a i l, State=%d"); sl@0: buf.Format(KLog,iState); sl@0: #endif sl@0: pass=ETrue; sl@0: } sl@0: else sl@0: { sl@0: if (iFailAt==0) sl@0: iFailAt=iState; sl@0: ++iFails; //mark this test as failed sl@0: #if defined(LOGGING) sl@0: _LIT(KLog,"OOM Draw Test FAIL, State=%d <------- FAIL"); sl@0: buf.Format(KLog,iState); sl@0: #endif sl@0: ++iState; //and advance to next test sl@0: } sl@0: iRetryCount=0; sl@0: } sl@0: else sl@0: { sl@0: #if defined(FULLLOGGING) sl@0: _LIT(KLog,"OOM Draw Test F a i l, State=%d retrying"); sl@0: buf.Format(KLog,iState); sl@0: #endif sl@0: if (++iRetryCount%2==0) sl@0: iBackWin->DrawNow(); sl@0: } sl@0: } sl@0: if (buf.Length()>0) sl@0: TheClient->LogMessage(buf); sl@0: return pass; sl@0: } sl@0: sl@0: void CToomDraw::RunTestCaseL(TInt aCurTestCase) sl@0: { sl@0: TBool testFinished = false; sl@0: ((CToomDrawStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); sl@0: switch(aCurTestCase) sl@0: { sl@0: /** sl@0: @SYMTestCaseID GRAPHICS-WSERV-0110 sl@0: sl@0: @SYMDEF DEF081259 sl@0: sl@0: @SYMTestCaseDesc Test trying to draw when out of memory sl@0: sl@0: @SYMTestPriority High sl@0: sl@0: @SYMTestStatus Implemented sl@0: sl@0: @SYMTestActions Set out of memory and try drawing sl@0: sl@0: @SYMTestExpectedResults Out of memory drawing is handle correctly sl@0: */ sl@0: case 1: sl@0: ((CToomDrawStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0110")); sl@0: while (!testFinished) sl@0: { sl@0: if (iDoCheck) sl@0: { sl@0: TheClient->iWs.HeapSetFail(RHeap::ENone,0); sl@0: TheClient->WaitForRedrawsToFinish(); sl@0: if (CheckWindowsL()) sl@0: { sl@0: ++iState; sl@0: if (iState==EMaxOOMState) sl@0: DeleteWindows(); sl@0: } sl@0: iDoCheck=EFalse; sl@0: TheClient->iWs.Finish(); sl@0: } sl@0: else sl@0: { sl@0: if (iState==EMaxOOMState) sl@0: { sl@0: if (iFails>0) sl@0: { sl@0: #if defined(LOGING) sl@0: _LIT(KLog,"OOM Draw Test Failed, First Fail At %d, Number of Fails %d"); sl@0: TLogMessageText buf; sl@0: buf.Format(KLog,iFailAt,iFails); sl@0: TheClient->LogMessage(buf); sl@0: #endif sl@0: TEST(iFails==0); sl@0: } sl@0: User::After(500000); // Let the rest of the world catch up after OOM death sl@0: testFinished = true; sl@0: } sl@0: else if (iState < 3 && iTest->IsFullRomL()) sl@0: testFinished = true; sl@0: else sl@0: TriggerOomDrawsL(iState); sl@0: iDoCheck=ETrue; sl@0: } sl@0: } sl@0: break; sl@0: case 2: sl@0: ((CToomDrawStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); sl@0: ((CToomDrawStep*)iStep)->CloseTMSGraphicsStep(); sl@0: TestComplete(); sl@0: break; sl@0: } sl@0: ((CToomDrawStep*)iStep)->RecordTestResultL(); sl@0: } sl@0: sl@0: __WS_CONSTRUCT_STEP__(oomDraw)