graphicsresourceservices/graphicsresourceimplementation/test/src/tsgdrawablegeneric.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 16:21:04 +0300
changeset 36 01a6848ebfd7
permissions -rw-r--r--
Revision: 201009 Kit: 201015

// 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:
//
/**
 @file
 @test
 @internalComponent - Graphics Resource API Conformance Test Suite
*/
#include "tsgdrawablegeneric.h"

/**
Construct the CTsgDrawableGeneric tests; set whether the tests are being used as conformance
tests or OOM tests.

@param TBool ETrue to run the conformance tests, EFalse to run the OOM tests.
 */
CTSgDrawableGeneric::CTSgDrawableGeneric(TBool aConformanceTests) :
	CTSgTestStepBase(aConformanceTests)
	{
	INFO_PRINTF1(_L("Graphics resource component test - RSgDrawable Generic Tests.\r\n"));
	}

CTSgDrawableGeneric::~CTSgDrawableGeneric()
	{
	}

/** 
Overrides 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 CTSgDrawableGeneric::doTestStepL()
	{
	SetTestStepID(_L("GRAPHICS-RESOURCE-0013"));
	INFO_PRINTF1(_L("Opening an image in RSgDrawable.\r\n"));
	TestOpenImageAsDrawableL();
	RecordTestResultL();
		
	SetTestStepID(_L("GRAPHICS-RESOURCE-0014"));
	INFO_PRINTF1(_L("Retrieving drawable id of an RSgDrawable object.\r\n"));
	TestGetDrawableDrawableIdL();
	RecordTestResultL();
	
	SetTestStepID(_L("GRAPHICS-RESOURCE-0032"));
	INFO_PRINTF1(_L("RSgDrawable::Open() with invalid parameters.\r\n"));
	TestOpenDrawableInvalidL();
	RecordTestResultL();

	SetTestStepID(_L("GRAPHICS-RESOURCE-0033"));
	INFO_PRINTF1(_L("Releasing reference to the image in RSgDrawable without first opening it.\r\n"));
	TestCloseDrawableWithoutOpenL();
	RecordTestResultL();
	
#ifdef _DEBUG
	SetTestStepID(_L("GRAPHICS-RESOURCE-0080"));	
	INFO_PRINTF1(_L("RSgDrawable generic panic test - Open() when the driver is not initialised.\r\n"));
	TestPanicDrawableOpenNoDriverL();
	RecordTestResultL();
#else
	INFO_PRINTF1(_L("Warning: Skipping the panic tests in release build. \r\n"));
#endif

	return TestStepResult();
	}


/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0013
@SYMTestCaseDesc		Opens an RSgImage as an RSgDrawable.
@SYMPREQ				PREQ2637
@SYMFssID				RSgImage::Id()
						RSgDrawable::Open(const TSgDrawableId&)
@SYMTestPriority		High
@SYMTestType			UT
@SYMTestPurpose			To ensure an RSgDrawable object can reference an image.
@SYMTestActions			Initialise the graphics resource component. Create an image. Declare an
						RSgDrawable object. Call Open() on the object with the resource ID of the
						image. These tests are repeated in a seperate thread and seperate process.
@SYMTestExpectedResults	The function should return KErrNone. The RSgDrawable now references an
						image. The same should occur in the seperate thread and seperate process.
 */	
void CTSgDrawableGeneric::TestOpenImageAsDrawableL()
	{
	TestOpenDriverL();
	RSgImage image;
	CreateImageL(image);
	CleanupClosePushL(image);
	const TSgDrawableId id = image.Id();
	TSgImageInfo imageinfo;
	image.GetInfo(imageinfo);
	
	//opening an image as a drawable in the current thread
	RSgImage image2;
	TEST(image2.IsNull());
	CheckErrorL(KErrNone, image2.Open(id), (TText8*)__FILE__, __LINE__);
	TEST(!image2.IsNull());
	image2.Close();
	if (iEnableConformanceTests)
		{
		//opening an image as a drawable in another thread in the same process
		TSgThreadTestInfo threadInfo(id, imageinfo, ESgresSecondThreadOpenDrawable);
		TInt testResult = 0;
		TRAPD(err, testResult=CreateSecondThreadAndDoTestL(threadInfo));
		TEST(err == KErrNone);
		TEST(testResult >= 0);	
		TEST(testResult & EFirstTestPassed);
		TEST(testResult & ESecondTestPassed);
		TEST(testResult & EThirdTestPassed);
		
		//opening an image as drawbale in a different process
		TSgProcessTestInfo processInfo(id, imageinfo, ESgresSecondProcessOpenDrawable);
		TRAP(err, testResult = CreateSecondProcessAndDoTestL(KSecondProcess, processInfo));
		TEST(err == KErrNone);
		TEST(testResult >= 0);
		TEST(testResult & EFirstTestPassed);	
		TEST(testResult & ESecondTestPassed);	
		TEST(testResult & EThirdTestPassed);	
		}
	
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0014
@SYMTestCaseDesc		Retrieves drawable id of an RSgDrawable.
@SYMPREQ				PREQ2637
@SYMFssID				RSgImage::Id() 
						RSgDrawable::Open(const TSgDrawableId&) 
						RSgDrawable::Id()
@SYMTestPriority		Critical
@SYMTestType			UT
@SYMTestPurpose			To ensure the globally unique drawable id of the RSgDrawable object can be retrieved.
@SYMTestActions			Initialise the graphics resource component. Create an image. Call Id() on the image.
						Construct an RSgDrawable object and open an image in it. Call Id() on the
						RSgDrawable object. Compare the two ids.
@SYMTestExpectedResults	The two drawable ids should be identical.
 */	
void CTSgDrawableGeneric::TestGetDrawableDrawableIdL()
	{
	TestOpenDriverL();
	RSgImage image;
	CreateImageL(image);
	CleanupClosePushL(image);
	TSgDrawableId id1 = image.Id();
	TEST(id1 != KSgNullDrawableId);
	
	RSgDrawable drawable;
	TEST(KErrNone == drawable.Open(id1));
	TSgDrawableId id2 = drawable.Id();
	TEST(id2 != KSgNullDrawableId);
	TEST(id1 == id2);	
	
	drawable.Close();
	CleanupStack::PopAndDestroy();
	TestCloseDriver();
	}


/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0032
@SYMTestCaseDesc		Calls RSgDrawable::Open() with invalid parameters.
@SYMPREQ				PREQ2637
@SYMFssID				RSgImage::Id()
						RSgDrawable::Open(const TSgDrawableId&)
@SYMTestPriority		Medium
@SYMTestType			UT
@SYMTestPurpose			To check the correct error codes are returned if Open() uses invalid parameters.
@SYMTestActions			Initialise the graphics resource component. Create an image. Declare an RSgDrawable 
						object. Call Open() with:
						1. null drawable id
						2. a non-existing
						3. valid drawable id
						4. on a RSgDrawable handle that is not null
						Do the same tests in a second thread in the same process and in a second process.
@SYMTestExpectedResults	The function should return:
						1. KErrArgument
						2. KErrNotFound
						3. KErrNone
						4. KErrInUse
 */	
void CTSgDrawableGeneric::TestOpenDrawableInvalidL()
	{		
	TestOpenDriverL();	
	//same thread
	//  null drawable id
	RSgDrawable drawable;
	CheckErrorL(KErrArgument, drawable.Open(KSgNullDrawableId), (TText8*)__FILE__, __LINE__);
	drawable.Close();
	
	//  non-existing drawable id
	TSgDrawableId fakeid = {0xFFFFFFFFFFFFFFFFU};
	CheckErrorL(KErrNotFound, drawable.Open(fakeid), (TText8*)__FILE__, __LINE__);
	drawable.Close();
	
	//create a valid image
	TSgImageInfo info;
	info.iSizeInPixels = TSize(8, 8);
	info.iUsage = ESgUsageBitOpenVgImage;
	info.iPixelFormat = EUidPixelFormatRGB_565;
	
	RSgImage image;
	CheckErrorL(KErrNone, image.Create(info, KCrossImageData, KCrossImageDataStride), (TText8*)__FILE__, __LINE__);
	CleanupClosePushL(image);
	const TSgDrawableId id = image.Id();	
	
	//  open an image - should succeed
	TEST(KErrNone == drawable.Open(id));
	
	//  open on a non-null RSgDrawable handle
	TEST(KErrInUse == drawable.Open(id));
	drawable.Close();	
	
	if (iEnableConformanceTests)
		{
		//different thread in the same process
		TSgThreadTestInfo threadInfo(id, info, ESgresSecondThreadOpenDrawableInvalid);
		TInt testResult = 0;
		TRAPD(err, testResult = CreateSecondThreadAndDoTestL(threadInfo));
		TEST(err == KErrNone);
		TEST(testResult >= 0);
		TEST(testResult & EFirstTestPassed);
		TEST(testResult & ESecondTestPassed);
		TEST(testResult & EThirdTestPassed);
		TEST(testResult & EFourthTestPassed);
		
		//different process
		TSgProcessTestInfo processInfo(id, info, ESgresSecondProcessOpenDrawableInvalid);
		TRAP(err, testResult = CreateSecondProcessAndDoTestL(KSecondProcess, processInfo));
		TEST(err == KErrNone);
		TEST(testResult >= 0);
		TEST(testResult & EFirstTestPassed);
		TEST(testResult & ESecondTestPassed);
		TEST(testResult & EThirdTestPassed);
		TEST(testResult & EFourthTestPassed);
		}
	CleanupStack::PopAndDestroy(&image);
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0033
@SYMTestCaseDesc		Closes RSgDrawable without first opening it.
@SYMPREQ				PREQ2637
@SYMFssID				RSgDrawable::Close()
@SYMTestPriority		Low
@SYMTestType			UT
@SYMTestPurpose			To check the function does nothing if Open() was not called.
@SYMTestActions			Initialise the graphics resource component. Declare an RSgDrawable object. Call Close().
@SYMTestExpectedResults	The function should not panic or return any error.
 */	
void CTSgDrawableGeneric::TestCloseDrawableWithoutOpenL()
	{
	TestOpenDriverL();	
	RSgDrawable drawable;
	drawable.Close();
	drawable.Close();
	drawable.Close();	
	TestCloseDriver();
	}

/**
@SYMTestCaseID			GRAPHICS-RESOURCE-0080
@SYMTestCaseDesc		Calls RSgDrawable::Open() when the driver was not initialised.
@SYMPREQ				PREQ2637
@SYMFssID				RSgImage::Open() 
@SYMTestPriority		Low
@SYMTestType			UT
@SYMTestPurpose			To ensure calling RSgDrawable::Open() with an uninitialised driver will cause a panic.
@SYMTestActions			Do not Initialise the graphics resource component and call RSgDrawable::Open() in a second thread.
@SYMTestExpectedResults The function should panic in the second thread with panic code SGRES 1 (ESgPanicNoDriver).
 */
void CTSgDrawableGeneric::TestPanicDrawableOpenNoDriverL()
	{
	TSgImageInfo info;
	TSgThreadTestInfo threadInfo(KSgNullDrawableId, info, ESgresSecondThreadPanicDrawableOpenNoDriver);
 	TExitCategoryName exitCategoryName(KSgTestGenericPanicCategory);
	_LIT(KTestName, "TestPanicDrawableOpenNoDriverL");
 	CreateSecondThreadAndCheckPanicL(threadInfo, 1, exitCategoryName, KTestName);
	}