author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Fri, 22 Oct 2010 11:38:29 +0100 | |
branch | bug235_bringup_0 |
changeset 206 | c170e304623f |
parent 0 | 5d03bc08d59c |
permissions | -rw-r--r-- |
// 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 "tdirectgdidriver.h" #include <graphics/directgdicontext.h> CTDirectGdiDriver::CTDirectGdiDriver() { SetTestStepName(KTDirectGdiDriverStep); } CTDirectGdiDriver::~CTDirectGdiDriver() { } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-DRIVER-0001 @SYMPREQ PREQ39 @SYMREQ REQ9211 REQ9226 REQ9195 REQ9201 REQ9202 REQ9222 REQ9223 REQ9236 REQ9237 @SYMTestCaseDesc Construction and destruction of a CDirectGdiDriver object. Only one object should be created as its a singleton. Open() should create the CDirectGdiDriverInternal object and increment the reference count. Close() should decrement the reference count and when it becomes zero, destroy the CDirectGdiDriver & CDirectGdiDriverInternal object. @SYMTestActions Open a driver. Open a driver again. Close a driver then open it again. Close a driver, check that it is still open. Close a driver, check that it is now closed. @SYMTestExpectedResults A driver can be opened and closed successfully with no errors. @SYMTestStatus Implemented */ void CTDirectGdiDriver::TestDriverL() { _LIT(KTestName, "Driver-TestDriver"); if(!iRunningOomTests) { INFO_PRINTF1(KTestName); } // Check the driver returns NULL CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static(); TESTL(dgdiDriver == NULL); // Open the driver once TInt res = CDirectGdiDriver::Open(); TESTNOERRORL(res); dgdiDriver = CDirectGdiDriver::Static(); TESTL(dgdiDriver != NULL); // Open the driver a second time res = CDirectGdiDriver::Open(); TESTNOERRORL(res); // Close the driver once dgdiDriver->Close(); // Open the driver again res = CDirectGdiDriver::Open(); TESTNOERRORL(res); // Close the driver twice, on the second close, the driver should delete // itself when its internal open count reaches zero dgdiDriver->Close(); TESTL(CDirectGdiDriver::Static() != NULL); dgdiDriver->Close(); TESTL(CDirectGdiDriver::Static() == NULL); } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-DRIVER-0002 @SYMPREQ PREQ39 @SYMREQ REQ9211 REQ9226 REQ9195 REQ9201 REQ9202 REQ9222 REQ9223 REQ9236 REQ9237 @SYMTestCaseDesc Out of memory test. Test that opening a driver does not cause memory leaks. @SYMTestActions Repeatedly call the "Driver-ErrorCodes" test (below) in OOM conditions to make sure no memory leaks occur. @SYMTestExpectedResults No memory leaks. @SYMTestStatus Implemented */ void CTDirectGdiDriver::TestDriverOOM() { TInt err, tryCount = 0; INFO_PRINTF1(_L("Driver-TestDriverOOM")); do { __UHEAP_FAILNEXT(++tryCount); __UHEAP_MARK; { err = TestDriverErrorCodes(); } __UHEAP_MARKEND; } while(err == KErrNoMemory); if(err == KErrNone) { __UHEAP_RESET; } else { TEST(err == KErrNone); } INFO_PRINTF2(_L("- server succeeded at heap failure rate of %i\n"), tryCount); } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-DRIVER-0003 @SYMPREQ PREQ39 @SYMREQ REQ9211 REQ9226 REQ9195 REQ9201 REQ9202 REQ9222 REQ9223 REQ9236 REQ9237 @SYMTestCaseDesc Checks the error code returned by GetError() after Construction and destruction of a CDirectGdiDriver object. @SYMTestActions Create and destroy a CDirectGdiDriver. @SYMTestExpectedResults Test that the only errors returned when opening a driver are KErrNone and KErrNoMemory. Test that GetError() returns KErrNone after a driver has been opened. @SYMTestStatus Implemented */ TInt CTDirectGdiDriver::TestDriverErrorCodes() { _LIT(KTestName, "Driver-ErrorCodes"); if(!iRunningOomTests) { INFO_PRINTF1(KTestName); } TInt errOpen = CDirectGdiDriver::Open(); TEST( errOpen == KErrNone || errOpen == KErrNoMemory ); if( errOpen != KErrNone ) return errOpen; CDirectGdiDriver* gdiDriver = CDirectGdiDriver::Static(); if( !gdiDriver ) return KErrNoMemory; TInt err = gdiDriver->GetError(); TESTNOERROR(err); gdiDriver->Close(); //Ref count should now be 0 return err; } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-0004 @SYMPREQ PREQ39 @SYMTestCaseDesc Sets the error code and then checks the error code by calling GetError(). Setting the error code should not affect the actual error code, unless GetError() is first called to reset the error code. @SYMTestActions Test the error setting and reporting functionality of the driver. Set the error code twice with different errors each time, get the error - the error returned should be the first error set, not the second. @SYMTestExpectedResults Error code should be KErrGeneral and not KErrNoMemory. */ void CTDirectGdiDriver::TestSetError() { _LIT(KTestName, "Driver-SetError"); if(!iRunningOomTests) { INFO_PRINTF1(KTestName); } TInt errOpen = CDirectGdiDriver::Open(); TEST( errOpen == KErrNone || errOpen == KErrNoMemory ); CDirectGdiDriver* gdiDriver = CDirectGdiDriver::Static(); TEST(gdiDriver!=NULL); gdiDriver->SetError(KErrGeneral); gdiDriver->SetError(KErrNoMemory); TInt err = gdiDriver->GetError(); TEST(err == KErrGeneral); gdiDriver->Close(); //Ref count should now be 0 } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-0005 @SYMPREQ PREQ39 @SYMTestCaseDesc Tests the function Flush() @SYMTestActions Open a DirectGDI driver Call Flush() Close the driver. @SYMTestExpectedResults On software DirectGDI, Flush() does not do anything but on hardware DirectGDI, it calls vgFlush(). No error should occur. */ void CTDirectGdiDriver::TestFlush() { _LIT(KTestName, "Driver-TestFlush"); if(!iRunningOomTests) { INFO_PRINTF1(KTestName); } TInt errOpen = CDirectGdiDriver::Open(); TEST(errOpen == KErrNone); CDirectGdiDriver* gdiDriver = CDirectGdiDriver::Static(); TEST(gdiDriver!=NULL); gdiDriver->Flush(); TInt err = gdiDriver->GetError(); TEST(err == KErrNone); gdiDriver->Close(); //Ref count should now be 0 } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-0006 @SYMPREQ PREQ39 @SYMTestCaseDesc Test that CDirectGdiDriver::GetInterface() returns KErrExtensionNotSupported when a non-existent extension interface is requested. @SYMTestActions Open a DirectGDI driver. Request a extension interface using the Uif 0xFFFFFFFF. @SYMTestExpectedResults KErrExtensionNotSupported should be returned and the requested interface pointer should be set to NULL. */ void CTDirectGdiDriver::TestGetInterfaceL() { _LIT(KTestName, "Driver-TestGetInterfaceL"); if(!iRunningOomTests) { INFO_PRINTF1(KTestName); } TInt err = CDirectGdiDriver::Open(); TESTNOERRORL(err); CDirectGdiDriver* driver = CDirectGdiDriver::Static(); TESTL(driver != NULL); // Set badInterface to something other than NULL to make sure GetInterface is setting it to NULL TAny* badInterface = &err; err = driver->GetInterface(TUid::Uid(0xFFFFFFFF), badInterface); TEST(err == KErrExtensionNotSupported); TEST(badInterface == NULL); driver->Close(); } /** @SYMTestCaseID GRAPHICS-DIRECTGDI-0007 @SYMPREQ PREQ39 @SYMTestCaseDesc Tests the MDirectGdiDriverCacheSize extension interface implementation provided by CDirectGdiDriver. Note that this extension is only implemented by the hardware DirectGdi adaptation, it is not provided by the software adaptation. @SYMTestActions if testing on hardware DirectGdi: Open a DirectGDI driver. Attempt to get the extension interface for MDirectGdiDriverCacheSize from the driver. - This should succeed. Get the currently set maximum image cache and glyph cache size. Set the new image and glyph cache sizes to less than the current size. Set the new image and glyph cache sizes to greater than the current size. Check that the reported image/glyph cache sizes are correctly set. if testing on software DirectGdi: Open a DirectGdi driver. Attempt to get the extension interface for MDirectGdiDriverCacheSize from the driver. - This should fail. @SYMTestExpectedResults Setting the caches to a smaller size that the existing size should cause KErrArgument to be returned. All other APIs should succeed. If using Software DirectGDI, it should skip the tests. */ void CTDirectGdiDriver::TestCacheSizesL() { _LIT(KTestName, "Driver-TestCacheSizes"); if(!iRunningOomTests) { INFO_PRINTF1(KTestName); } TInt err = CDirectGdiDriver::Open(); TESTNOERRORL(err); CDirectGdiDriver* driver = CDirectGdiDriver::Static(); TESTL(driver != NULL); CleanupClosePushL(*driver); MDirectGdiDriverCacheSize* driverCacheInterface = NULL; err = driver->GetInterface(TUid::Uid(KDirectGdiDriverCacheSizeUid), (TAny*&)driverCacheInterface); if (err == KErrNone) { // MDirectGdiDriverCacheSize is implemented in the hardware (VG) adaptation TESTL(driverCacheInterface != NULL); // This number must be > the default image cache size for this test to pass. const TInt KLargeImageCacheSize = 0x500000; // This number must be > the default glyph cache size for this test to pass. const TInt KLargeGlyphCacheSize = 0x500000; TESTNOERROR(driverCacheInterface->SetMaxImageCacheSize(KLargeImageCacheSize)); TESTNOERROR(driverCacheInterface->SetMaxGlyphCacheSize(KLargeGlyphCacheSize)); // Test the image cache size TEST(KErrArgument == driverCacheInterface->SetMaxImageCacheSize(-1)); TESTNOERROR(driverCacheInterface->SetMaxImageCacheSize(KLargeImageCacheSize+1)); TEST(driverCacheInterface->MaxImageCacheSize() == KLargeImageCacheSize+1); // Test the glyph cache size TEST(KErrArgument == driverCacheInterface->SetMaxGlyphCacheSize(-1)); TESTNOERROR(driverCacheInterface->SetMaxGlyphCacheSize(KLargeGlyphCacheSize+1)); TEST(driverCacheInterface->MaxGlyphCacheSize() == KLargeGlyphCacheSize+1); } else { // MDirectGdiDriverCacheSize is not implemented in the software adaptation of DirectGDI. // The only error code that should be returned is KErrExtensionNotSupported. TEST(err == KErrExtensionNotSupported); TEST(driverCacheInterface == NULL); INFO_PRINTF1(_L("Extension MDirectGdiDriverCacheSize not supported, skipping test.")); } CleanupStack::PopAndDestroy(1, driver); } /** Override of base class virtual @return - TVerdict code */ TVerdict CTDirectGdiDriver::doTestStepPreambleL() { CTDirectGdiStepBase::doTestStepPreambleL(); INFO_PRINTF1(_L("DirectGdi Driver pre-test setup")); return TestStepResult(); } /** 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. Creates background window with black & white checker board. This background windows is used for each test case in this file @return TVerdict code */ TVerdict CTDirectGdiDriver::doTestStepL() { INFO_PRINTF1(_L("DirectGdi Driver Test" )); if (iUseDirectGdi) { RunTestsL(); } return TestStepResult(); } void CTDirectGdiDriver::RunTestsL() { SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRIVER-0001")); TestDriverL(); RecordTestResultL(); SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRIVER-0003")); TestDriverErrorCodes(); RecordTestResultL(); SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRIVER-0002")); TestDriverOOM(); RecordTestResultL(); SetTestStepID(_L("GRAPHICS-DIRECTGDI-0004")); TestSetError(); RecordTestResultL(); SetTestStepID(_L("GRAPHICS-DIRECTGDI-0005")); TestFlush(); RecordTestResultL(); SetTestStepID(_L("GRAPHICS-DIRECTGDI-0006")); TestGetInterfaceL(); RecordTestResultL(); SetTestStepID(_L("GRAPHICS-DIRECTGDI-0007")); TestCacheSizesL(); RecordTestResultL(); CloseTMSGraphicsStep(); }