diff -r 000000000000 -r 5d03bc08d59c graphicsdeviceinterface/directgdi/test/tdirectgdioom.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicsdeviceinterface/directgdi/test/tdirectgdioom.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,260 @@ +// Copyright (c) 2007-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: +// + +#include "tdirectgdioom.h" +#include + +CTDirectGdiOom::CTDirectGdiOom() + { + SetTestStepName(KTDirectGdiOom); + } + +CTDirectGdiOom::~CTDirectGdiOom() + { + } + +/** +@SYMTestCaseID + GRAPHICS-DIRECTGDI-OOM-0001 + +@SYMTestPriority + Medium + +@SYMPREQ + PREQ39 + +@SYMREQ + REQ9195 + REQ9201 + REQ9202 + REQ9222 + REQ9223 + REQ9236 + REQ9237 + +@SYMTestCaseDesc + Draw a line with many points to increase coverage of path drawing in OOM conditions. + +@SYMTestActions + Create an array of 1000 points. + Draw it as a line. + +@SYMTestExpectedResults + No image is produced by this test, it is purely for checking that no OOM errors occur. +*/ +void CTDirectGdiOom::TestDrawLargePolyLineL() + { + _LIT(KTestName, "OOM_TestDrawLargePolyLine"); + if(!iRunningOomTests) + { + INFO_PRINTF1(KTestName); + } + + TInt err = CDirectGdiDriver::Open(); + TESTNOERRORL(err); + + CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static(); + TESTL(dgdiDriver != NULL); + CleanupClosePushL(*dgdiDriver); + + CDirectGdiContext* gc = CDirectGdiContext::NewL(*dgdiDriver); + TESTL(gc != NULL); + CleanupStack::PushL(gc); + + // Set the bitmap up... + RSgImage rsgImage; + TSgImageInfo imageInfo; + imageInfo.iSizeInPixels = TSize (320, 240); + imageInfo.iPixelFormat = iTestParams.iTargetPixelFormat; + imageInfo.iUsage = ESgUsageDirectGdiTarget; + err = rsgImage.Create(imageInfo, NULL,0); + TESTNOERRORL(err); + CleanupClosePushL(rsgImage); + + RDirectGdiImageTarget dgdiImageTarget(*dgdiDriver); + err = dgdiImageTarget.Create(rsgImage); + TESTNOERRORL(err); + CleanupClosePushL(dgdiImageTarget); + + err = gc->Activate(dgdiImageTarget); + TESTNOERRORL(err); + + // Draw a polygon that had lots of points to attempt to make the AppendPathCommand + // methods in vgengine fail + const TInt pCount = 1000; + CArrayFixFlat* points = new (ELeave)CArrayFixFlat(pCount); + TESTL(points != NULL); + CleanupStack::PushL(points); + + for(TInt i = pCount; i > 0; --i) + { + points->AppendL(TPoint(i, i)); + } + + gc->DrawPolyLine(points->Array()); + TESTNOERRORL(dgdiDriver->GetError()); + + CleanupStack::PopAndDestroy(5, dgdiDriver); + + FreeSgImagePixelFormatCache(); + } + +/** +@SYMTestCaseID + GRAPHICS-DIRECTGDI-OOM-0002 + +@SYMTestPriority + Medium + +@SYMPREQ + PREQ39 + +@SYMREQ + REQ9195 + REQ9201 + REQ9202 + REQ9222 + REQ9223 + REQ9236 + REQ9237 + +@SYMTestCaseDesc + Set the pen size in OOM conditions. + +@SYMTestActions + Create a graphics context. + Call SetPenSize(). + +@SYMTestExpectedResults + No memory leak should occur. +*/ +void CTDirectGdiOom::TestSetPenSizeL() + { + _LIT(KTestName, "OOM_TestSetPenSize"); + if(!iRunningOomTests) + { + INFO_PRINTF1(KTestName); + } + + TInt err = CDirectGdiDriver::Open(); + TESTNOERRORL(err); + + CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static(); + TESTL(dgdiDriver != NULL); + CleanupClosePushL(*dgdiDriver); + + CDirectGdiContext* gc = CDirectGdiContext::NewL(*dgdiDriver); + TESTL(gc != NULL); + CleanupStack::PushL(gc); + + // Set the bitmap up... + RSgImage rsgImage; + TSgImageInfo imageInfo; + imageInfo.iSizeInPixels = TSize (320, 240); + imageInfo.iPixelFormat = iTestParams.iTargetPixelFormat; + imageInfo.iUsage = ESgUsageDirectGdiTarget; + err = rsgImage.Create(imageInfo, NULL,0); + TESTNOERRORL(err); + CleanupClosePushL(rsgImage); + + RDirectGdiImageTarget dgdiImageTarget(*dgdiDriver); + err = dgdiImageTarget.Create(rsgImage); + TESTNOERRORL(err); + CleanupClosePushL(dgdiImageTarget); + + err = gc->Activate(dgdiImageTarget); + TESTNOERRORL(err); + + TRect rect(0, 0, 200, 1000); + TSize csize(300, 300); + + for(TInt i = 0; i < 10; i++) + { + gc->SetPenSize(TSize(i,i)); + gc->SetPenStyle(DirectGdi::ENullPen); + gc->SetBrushStyle(DirectGdi::ESolidBrush); + gc->DrawRoundRect(rect, csize); + gc->SetPenStyle(DirectGdi::ESolidPen); + gc->DrawRoundRect(rect, csize); + TESTNOERRORL(dgdiDriver->GetError()); + } + + CleanupStack::PopAndDestroy(4, dgdiDriver); + + FreeSgImagePixelFormatCache(); + } + +/** +Helper function to force SgImage's internal cache of pixel formats to be emptied, +by asking it to lookup a configuration that will always return 0. +*/ +void CTDirectGdiOom::FreeSgImagePixelFormatCache() + { + // This will force the SgImage's cached array of pixel formats to be freed. + TInt count; + TSgImageInfo info; + info.iSizeInPixels = TSize(10, 10); + info.iUsage = ESgUsageDirectGdiSource; + info.iShareable = EFalse; + info.iCpuAccess = ESgCpuAccessReadWrite; + info.iScreenId = 100; + TEST(KErrNone == RSgImage::GetPixelFormats(info, NULL, count)); + TEST(count == 0); + } + +/** +Override of base class pure virtual +Our implementation only gets called if the base class doTestStepPreambleL() did +not leave. That being the case, the current test result value will be EPass. +@leave Gets system wide error code +@return TVerdict code +*/ +TVerdict CTDirectGdiOom::doTestStepL() + { + if (iUseDirectGdi) + { + // Just test for one pixel format to speed up testing + iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[0]; + RunOomTestsL(); + } + SetOverallTestStepID(_L("GRAPHICS-DIRECTGDI-OOM-0001")); + RecordTestResultL(); + SetOverallTestStepID(_L("GRAPHICS-DIRECTGDI-OOM-0002")); + RecordTestResultL(); + CloseTMSGraphicsStep(); + return TestStepResult(); + } + +/** +Override of base class virtual +@leave Gets system wide error code +@return - TVerdict code +*/ +TVerdict CTDirectGdiOom::doTestStepPreambleL() + { + CTDirectGdiStepBase::doTestStepPreambleL(); + return TestStepResult(); + } + +/** +Override of base class pure virtual +Lists the tests to be run +*/ +void CTDirectGdiOom::RunTestsL() + { + TestDrawLargePolyLineL(); + TestSetPenSizeL(); + } +