fbs/fontandbitmapserver/tfbs/TRalc.cpp
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.

// Copyright (c) 1997-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 "FbsRalc.h"
#include "UTILS.H"
#include "TRalc.h"
#include "fbsmessage.h"
#include "fbsdefs.h"

_LIT(KMbmFileEikon, "z:\\System\\Data\\tfbs_file4.mbm");
_LIT(KMbmFileTechview, "z:\\System\\Data\\tfbs_file5.mbm");
_LIT(KMbmFileTechviewU,"Z:\\SYSTEM\\DATA\\TFBS_FILE5.MBM");
_LIT(KMbmFileLafcurs, "z:\\System\\Data\\tfbs_file2.mbm");
_LIT(KMbmFileShell, "z:\\System\\Data\\tfbs_file1.mbm");
_LIT(KMbmFileShel, "z:\\System\\Data\\tfbs_file_.mbm");
_LIT(KMbmFileTimew, "z:\\System\\Data\\tfbs_file3.mbm");

_LIT(KMbmFileLafcursLong, "z:\\siuhsiughighifhgidfhguifhguidhfguifhghlarglaghghghghghkrjghszkjg\\System\\Data\\tfbs_file2.mbm");
_LIT(KMbmFileShellLong, "z:\\siuhsiughighifhgidfhguifhguidhfguifhghlarglaghghghghghkrjghszkjg\\System\\Data\\tfbs_file1.mbm");

// ============================================================================

CTRalc::CTRalc(CTestStep* aStep):
	CTGraphicsBase(aStep),
	iHandle(0),
	iFbs(NULL),
	iResourceCount(0),
	iAllocs(0)
	{
	}

CTRalc::~CTRalc()
	{
	if(iShutdownFbs)
		RFbsSession::GetSession()->SendCommand(EFbsMessShutdown);
	RFbsSession::Disconnect();
	}

void CTRalc::ConstructL()
	{
	if(RFbsSession::Connect()==KErrNone)
		{
		iShutdownFbs = EFalse;
		}
	else
		{
		FbsStartup();
		RFbsSession::Connect();
		iShutdownFbs = ETrue;
		}

	iFbs = RFbsSession::GetSession();

	TRAPD(err,ExpandCleanupStackL());
	if (err != KErrNone)
		User::Panic(_L("CleanupStack expansion failed"),err);

	INFO_PRINTF1(_L("FBS Client RALC testing"));
	}

void CTRalc::ExpandCleanupStackL()
	{
	TInt count=0;
	for(;count<10;count++)
		CleanupStack::PushL((TUint32*)0x1);
	CleanupStack::Pop(count);
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0604

	@SYMTestCaseDesc
	Tests the creation of CFbsRalCacheEl objects.

	@SYMTestActions
	1. Test the API on a default built element object.
	2. Test a New'd element object followed by delete.
	3. Test a New'd element object followed by destroy & free.
	4. Test matching of an element object.	
	
	@SYMTestExpectedResults
	Test should pass
*/
void CTRalc::TestRALCEntryClass()
	{
	INFO_PRINTF1(_L("Test of CFbsRalCacheEl API"));

	// Test the API on a defaultly built element object
		{
		CFbsRalCacheEl elOne;
		TEST(elOne.iAddress == 0);
		TEST(elOne.iFilename == 0);
	
		// Test matching method
		TBool r1 = EFalse;
		r1 = elOne.MatchKey (KMbmFileEikon);
		TEST(r1 == EFalse);

		// Test destruction
		}

	// Test a New'd element object followed by delete
		{
		CFbsRalCacheEl *elTwo = 0;
		elTwo = CFbsRalCacheEl::New(KMbmFileTimew, (TAny*)0x58001000);
		TEST(elTwo != 0);
		TEST(elTwo->iFilename->CompareF(KMbmFileTimew) == 0);
		TEST(elTwo->iAddress == (TAny*)0x58001000);

		delete elTwo;
		}
	
	// Test a New'd element object followed by destroy & free
		{
		CFbsRalCacheEl *elThree = 0;
		elThree = CFbsRalCacheEl::New(KMbmFileLafcursLong,  (TAny*)0x58002000);
		TEST(elThree != 0);
		TEST(elThree->iFilename->CompareF(KMbmFileLafcursLong) == 0);
		TEST(elThree->iAddress == (TAny*)0x58002000);

		elThree->~CFbsRalCacheEl();
		TEST(elThree->iFilename == 0);
		CFbsRalCacheEl::FreeOnly(elThree);
		TEST(elThree == 0);
		}

	// Test matching of an element object
		{
		CFbsRalCacheEl *elFour = 0;
		elFour = CFbsRalCacheEl::New(KMbmFileTechview,  (TAny*)0x58003000);
		TEST(elFour != 0);

		TBool r2 = EFalse;
		r2 = elFour->MatchKey (KMbmFileEikon);
		TEST(r2 == EFalse);

		r2 = elFour->MatchKey (KMbmFileTechview);
		TEST(r2);

		r2 = elFour->MatchKey(KMbmFileTechviewU);
		TEST(r2);

		delete elFour;
		}
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0605

	@SYMTestCaseDesc
	Tests the RALC Cache class.

	@SYMTestActions
	Connect to the file server. Creates a CFbsRalCache
	object on the heap. Deletes the object.
	Test the lookup facility of the cache with overflow.
	
	@SYMTestExpectedResults
	Test should pass
*/
void CTRalc::TestRALCCacheClass()
	{
	RFs fileServer;
	TInt ret;

	ret = fileServer.Connect();
	TEST(ret==KErrNone);

	INFO_PRINTF1(_L("Test of CFbsRalCache API"));

	// Test the construction/destruction API
		{
		CFbsRalCache* cache1 = CFbsRalCache::New(0, fileServer);
		TEST(cache1 == 0);

		cache1 = CFbsRalCache::New(5, fileServer);
		TEST(cache1 != 0);
		TEST(cache1->Count() == 0);
		TEST(cache1->Length() == 5);

		delete cache1;
		}

	// Test the lookup facility of the cache with overflow
		{
		CFbsRalCache* cache2 = CFbsRalCache::New(2, fileServer);

		TAny* p1;
		p1 = cache2->Lookup(KMbmFileLafcurs);
		TEST(p1 != 0);
		TEST(cache2->Count() == 1);

		p1 = cache2->Lookup(KMbmFileShel);
		TEST(p1 == 0);
		TEST(cache2->Count() == 1);

		p1 = cache2->Lookup(KMbmFileShell);
		TEST(p1 != 0);
		TEST(cache2->Count() == 2);

		p1 = cache2->Lookup(KMbmFileEikon);
		TEST(p1 != 0);
		TEST(cache2->Count() == 2);

		delete cache2;
		}

	fileServer.Close();
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0606

	@SYMTestCaseDesc
	Tests Out Of Memory conditions for the CFbsRalCache class.

	@SYMTestActions
	Connects to the file server. Sets a macro
	that makes heap allocation fail after a certain
	number of heap allocations. Creates a CFbsRalCache
	object on the heap. Deletes the object. Closes the file
	server handle.
	
	@SYMTestExpectedResults
	Test should pass
*/
void CTRalc::TestOOMCondition()
	{
	RFs fileServer;
	TInt ret;
	ret = fileServer.Connect();
	TEST(ret==KErrNone);

	INFO_PRINTF1(_L("Test of CFbsRalCache and OOM"));

	for (TInt count = 1; ; count++)
        {
        __UHEAP_SETFAIL(RHeap::EDeterministic,count);
        __UHEAP_MARK;

		CFbsRalCache* cache = 0;
		cache = CFbsRalCache::New(4, fileServer);

		if (cache == 0)
            {
            __UHEAP_MARKEND;
            }
        else 
            {
            delete cache;
            __UHEAP_MARKEND;
        	__UHEAP_SETFAIL(RHeap::ENone,count);
            break;
            }
        }
	
	fileServer.Close();
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0607

	@SYMTestCaseDesc
	Intended to measure performance of bitmap loading.

	@SYMTestActions
	Creates to CFbsBitmap objects on the stack and
	loads a bitmap file in to objects in a loop.
	Test case is not complete.
	
	@SYMTestExpectedResults
	No test result is given in the function.
*/
void CTRalc::MeasurePerformanceWith2()
	{
	TInt loopI;
	CFbsBitmap bitmap1;
	CFbsBitmap bitmap2;

	INFO_PRINTF1(_L("Performance Test with 2 Lookups"));

	for (loopI=0; loopI<2700; loopI++)
		bitmap1.Load(KMbmFileLafcurs, 0, EFalse);	

	for (loopI=0; loopI<600; loopI++)
		bitmap2.Load(KMbmFileShell, 0, EFalse);	

/*	RDebug::ProfileEnd(10);
	TProfile profile;
    RDebug::ProfileResult(&profile,10,1);
	RDebug::Print(_L("Performance test end %d.%d s\n"),profile.iTime/1000000,(profile.iTime/1000)%1000); */
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0609

	@SYMTestCaseDesc
	Intended to measure performance of bitmap loading.

	@SYMTestActions
	Creates to CFbsBitmap objects on the stack and
	loads a bitmap file in to objects in a loop.
	Test case is not complete.
	
	@SYMTestExpectedResults
	No test result is given in the function.
*/
void CTRalc::MeasurePerformanceWith2Long()
	{
	TInt loopI;
	CFbsBitmap bitmap1;
	CFbsBitmap bitmap2;

	INFO_PRINTF1(_L("Performance Test with 2 LONG Lookups"));
//	RDebug::ProfileReset(10, 1);
//	RDebug::ProfileStart(10);

	for (loopI=0; loopI<2700; loopI++)
		(void)bitmap1.Load(KMbmFileLafcursLong, 0, EFalse);	

	for (loopI=0; loopI<600; loopI++)
		(void)bitmap2.Load(KMbmFileShellLong, 0, EFalse);	

/*	RDebug::ProfileEnd(10);
	TProfile profile;
    RDebug::ProfileResult(&profile,10,1);
	RDebug::Print(_L("Performance test end %d.%d s\n"),profile.iTime/1000000,(profile.iTime/1000)%1000); */
	}
	
/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0608

	@SYMTestCaseDesc
	Intended to measure performance of bitmap loading.

	@SYMTestActions
	Creates five CFbsBitmap objects on the stack and
	loads different bitmap files in to the objects in a loop.
	
	@SYMTestExpectedResults
	No test result is given in the function.
*/
void CTRalc::MeasurePerformanceWith5()
	{
	TInt loopI;
	CFbsBitmap bitmap1;
	CFbsBitmap bitmap2;
	CFbsBitmap bitmap3;
	CFbsBitmap bitmap4;
	CFbsBitmap bitmap5;

	INFO_PRINTF1(_L("Performance Test with 5 Lookups"));
//	RDebug::ProfileReset(10, 1);
//	RDebug::ProfileStart(10);

	for (loopI=0; loopI<500; loopI++)
		bitmap1.Load(KMbmFileEikon, 0, EFalse);

	for (loopI=0; loopI<200; loopI++)
		bitmap2.Load(KMbmFileTechview, 0, EFalse);	

	for (loopI=0; loopI<2700; loopI++)
		bitmap3.Load(KMbmFileLafcurs, 0, EFalse);	

	for (loopI=0; loopI<600; loopI++)
		bitmap4.Load(KMbmFileShell, 0, EFalse);	

	for (loopI=0; loopI<1100; loopI++)
		bitmap5.Load(KMbmFileTimew, 0, EFalse);	

/*	RDebug::ProfileEnd(10);
	TProfile profile;
    RDebug::ProfileResult(&profile,10,1);
	RDebug::Print(_L("Performance test end %d.%d s\n"),profile.iTime/1000000,(profile.iTime/1000)%1000); */
	}

/**
	@SYMTestCaseID
	GRAPHICS-FBSERV-0610

	@SYMTestCaseDesc
	Intended to measure performance of bitmap loading.

	@SYMTestActions
	Creates five CFbsBitmap objects on the stack and
	loads different bitmap files in to the objects in a loop.
	
	@SYMTestExpectedResults
	No test result is given in the function.
*/
void CTRalc::MeasurePerformanceWith23Mix()
	{
	TInt loopI;
	CFbsBitmap bitmap1;
	CFbsBitmap bitmap2;
	CFbsBitmap bitmap3;
	CFbsBitmap bitmap4;
	CFbsBitmap bitmap5;

	INFO_PRINTF1(_L("Performance Test with 2/3 Mix of Lookups"));
//	RDebug::ProfileReset(10, 1);
//	RDebug::ProfileStart(10);

	for (loopI=0; loopI<500; loopI++)
		bitmap1.Load(KMbmFileEikon, 0, EFalse);

	for (loopI=0; loopI<200; loopI++)
		bitmap2.Load(KMbmFileTechview, 0, EFalse);	

	for (loopI=0; loopI<2700; loopI++)
		bitmap3.Load(KMbmFileLafcursLong, 0, EFalse);	

	for (loopI=0; loopI<600; loopI++)
		bitmap4.Load(KMbmFileShellLong, 0, EFalse);	

	for (loopI=0; loopI<1100; loopI++)
		bitmap5.Load(KMbmFileTimew, 0, EFalse);	

/*	RDebug::ProfileEnd(10);
	TProfile profile;
    RDebug::ProfileResult(&profile,10,1);
	RDebug::Print(_L("Performance test end %d.%d s\n"),profile.iTime/1000000,(profile.iTime/1000)%1000);*/
	}

void CTRalc::RunTestCaseL(TInt aCurTestCase)
	{
	TUint32* romAddress = NULL;
	if(!CFbsBitmap::IsFileInRom(KMbmFileEikon, romAddress)) //check any rom bitmap
		{
		INFO_PRINTF2(_L("Skipping CFbsRalCache tests since file \"%S\" is reported to not be a ROM bitmap."),
				&KMbmFileEikon);
		INFO_PRINTF1(_L("This should only occur on non-XIP ROMs, e.g. NAND ROMs, where ROM bitmaps aren't supported."));
		TestComplete();
		}
	else
		{
		((CTRalcStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
		switch(aCurTestCase)
			{
		case 1:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0604"));
			TestRALCEntryClass();
			break;
		case 2:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0605"));
			TestRALCCacheClass();
			break;
		case 3:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0606"));
			TestOOMCondition();
			break;
		case 4:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0607"));
			MeasurePerformanceWith2();
			break;
		case 5:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0608"));
			MeasurePerformanceWith5();
			break;
		case 6:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0609"));
			MeasurePerformanceWith2Long();
			break;
		case 7:
			((CTRalcStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0610"));
			MeasurePerformanceWith23Mix();
			break;
		case 8:
			((CTRalcStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
			((CTRalcStep*)iStep)->CloseTMSGraphicsStep();
			TestComplete();
			break;
			}
		((CTRalcStep*)iStep)->RecordTestResultL();
		}
	}

//--------------
__CONSTRUCT_STEP__(Ralc)

void CTRalcStep::TestSetupL()
	{
	// Leaking thread handles
	iThread.HandleCount(iStartProcessHandleCount, iStartThreadHandleCount);
	}
	
void CTRalcStep::TestClose()
	{
	// Check for open handles
	iThread.HandleCount(iEndProcessHandleCount, iEndThreadHandleCount);
	if(iStartThreadHandleCount != iEndThreadHandleCount)
		{__DEBUGGER()}							// Oops leaked some handles
	}