sl@0: /*
sl@0: * Copyright (c) 2006-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: *
sl@0: */
sl@0: 
sl@0: 
sl@0: #include "FNTSTD.H"
sl@0: #include "t_linkedfontsmemory.h"
sl@0: #include "T_LinkedFonts2.h"
sl@0: #include "fbsmessage.h"
sl@0: #include <hal.h>
sl@0: #include <linkedfonts.h>
sl@0: 
sl@0: class CTLinkedFontsMemory : public CTLinkedFonts2
sl@0: 	{
sl@0: public:
sl@0: 	CTLinkedFontsMemory(CTestStep* aStep);
sl@0: 	~CTLinkedFontsMemory();
sl@0: 	//base class static void TestPanic(TInt aPanic);
sl@0: protected:
sl@0: // From CTGraphicsStep
sl@0: 	virtual void RunTestCaseL(TInt aCurTestCase);
sl@0: private:
sl@0: 	
sl@0: 	TInt TestLinkedFontsMemory1L(TInt aTypefaces);
sl@0: 	void TestLinkedFontsMemory1L();
sl@0: 	TInt TestLinkedFontsCreateLinkedTypefacesL(const TDesC& aName,TInt aTypefaces);
sl@0: 	TInt TestLinkedFontsMemory_Part2(const TDesC& aName);
sl@0: 	void TestLinkedFontsMemory2();
sl@0: 	void TestLinkedFontsMemory3();
sl@0: 	void TestLinkedFontsMemory4();
sl@0: 	void TestMemoryUsage();
sl@0: 	
sl@0: 	void SetHeapFail(RFbsSession::THeapFailType aType, TInt aFailures);
sl@0: 	TInt HeapCount(RFbsSession::THeapFailType aType);
sl@0: 	void SetHeapReset(RFbsSession::THeapFailType aType);
sl@0: 	void SetHeapCheck(RFbsSession::THeapFailType aType);
sl@0: 	void TestCompareText();
sl@0: 	TInt FontAndBitmapServerSharedHeap();
sl@0: 	void DisplayRamInfo(const TDesC &aTextInfo) const;
sl@0: 	TBool CheckRasterizerInstalledL();
sl@0: 	};
sl@0: 
sl@0: CTLinkedFontsMemory::CTLinkedFontsMemory(CTestStep* aStep)
sl@0: 	:	CTLinkedFonts2(aStep)
sl@0: 	{
sl@0: 	}	
sl@0: 
sl@0: CTLinkedFontsMemory::~CTLinkedFontsMemory()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: void CTLinkedFontsMemory::SetHeapFail(RFbsSession::THeapFailType aType, TInt aFailures)
sl@0: 	{
sl@0: 	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0: 	iFbs->SendCommand(EFbsMessSetHeapFail, aType, aFailures);
sl@0: 	}
sl@0: 
sl@0: TInt CTLinkedFontsMemory::HeapCount(RFbsSession::THeapFailType aType)
sl@0: 	{
sl@0: 	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0: 	return iFbs->SendCommand(EFbsMessHeapCount, aType);
sl@0: 	}
sl@0: 
sl@0: void CTLinkedFontsMemory::SetHeapReset(RFbsSession::THeapFailType aType)
sl@0: 	{
sl@0: 	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0: 	iFbs->SendCommand(EFbsMessSetHeapReset, aType);
sl@0: 	}
sl@0: 
sl@0: void CTLinkedFontsMemory::SetHeapCheck(RFbsSession::THeapFailType aType)
sl@0: 	{
sl@0: 	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0: 	iFbs->SendCommand(EFbsMessSetHeapCheck, aType);
sl@0: 	}
sl@0: 
sl@0: TInt CTLinkedFontsMemory::FontAndBitmapServerSharedHeap()
sl@0: 	{
sl@0: 	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0: 	return iFbs->SendCommand(EFbsMessHeap);
sl@0: 	}
sl@0: 
sl@0: _LIT(KLinkedFontsMemoryTestFont,"MemTestLinkedFnt");
sl@0: TBool CTLinkedFontsMemory::CheckRasterizerInstalledL()
sl@0: 	{
sl@0: 	CFbsTypefaceStore* store = CFbsTypefaceStore::NewL(iDev);
sl@0: 	CleanupStack::PushL(store);
sl@0: 	
sl@0: 	// Create typeface to be linked
sl@0: 	CLinkedTypefaceSpecification *typefaceSpec;
sl@0: 	typefaceSpec = CLinkedTypefaceSpecification::NewLC(KLinkedFontsMemoryTestFont);
sl@0: 	
sl@0: 	CLinkedTypefaceGroup* group1 = CLinkedTypefaceGroup::NewLC(1);
sl@0: 	typefaceSpec->AddLinkedTypefaceGroupL(*group1);
sl@0: 	CleanupStack::Pop();
sl@0: 	
sl@0: 	// Add first typeface
sl@0: 	CLinkedTypefaceElementSpec *elementSpec1;
sl@0: 	_LIT(KLinkedTypefaceTT, "DejaVu Sans Condensed");
sl@0: 	elementSpec1 = CLinkedTypefaceElementSpec::NewLC(KLinkedTypefaceTT, 1);
sl@0: 	elementSpec1->SetCanonical(ETrue);
sl@0: 		
sl@0: 	typefaceSpec->AddTypefaceAtBackL(*elementSpec1);
sl@0: 	CleanupStack::Pop(1, elementSpec1);
sl@0: 	
sl@0: 	// Now try regstering the linked typeface
sl@0: 	TRAPD(ret, typefaceSpec->RegisterLinkedTypefaceL(*store));
sl@0: 	CleanupStack::PopAndDestroy(2, store);
sl@0: 
sl@0: 	switch (ret)
sl@0: 		{
sl@0: 		case KErrAlreadyExists:
sl@0: 		case KErrNone:
sl@0: 			return ETrue;
sl@0: 		default:
sl@0: 			INFO_PRINTF1(_L("Linked fonts memory: no linked fonts rasterizer found"));
sl@0: 			return EFalse;
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: _LIT(KDrawMe, "lInKED FOnTS");
sl@0: 
sl@0: void CTLinkedFontsMemory::TestCompareText()
sl@0: 	{
sl@0: 	_LIT(KWithout, "WithoutLinkedFontTT");
sl@0: 	TTypeface typeface;
sl@0: 	typeface.iName = KWithout;
sl@0: 	TFontSpec fs;
sl@0: 	fs.iTypeface = typeface;
sl@0: 	fs.iHeight = 20;
sl@0: 	CFbsFont* font = NULL;
sl@0: 	TInt err1 = iDev->GetNearestFontToDesignHeightInPixels(font, fs);
sl@0: 
sl@0: 	if (font && err1 == KErrNone)
sl@0: 		{
sl@0: 		// Use the font
sl@0: 		TSize scrSize = iDev->SizeInPixels();
sl@0: 		iGc->UseFont(font);
sl@0: 		iGc->DrawText(KDrawMe, TPoint((scrSize.iWidth / 2) + 50, 50));
sl@0: 		iGc->DiscardFont();
sl@0: 		iDev->ReleaseFont(font);
sl@0: 		TPoint left(0, 0);
sl@0: 		TPoint right(scrSize.iWidth / 2, 0);
sl@0: 		TBool val = iDev->RectCompare(TRect(left, TPoint(scrSize.iWidth / 2, scrSize.iHeight)), *iDev,TRect(right, TPoint(scrSize.iWidth, scrSize.iHeight)));
sl@0: 		if (!val)
sl@0: 			{
sl@0: 			iGc->DrawRect(TRect(left, TPoint(scrSize.iWidth / 2, scrSize.iHeight)));
sl@0: 			iGc->DrawRect(TRect(right, TPoint(scrSize.iWidth, scrSize.iHeight)));
sl@0: 			}
sl@0: 		TEST(val);
sl@0: 		
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		TEST(0);  //there is a failure
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: /** these fonts need to be provided, and are used for creating linked typefaces
sl@0: TLinkedFont1.ttf
sl@0: Typeface name: LinkedFont1
sl@0: This will be the dominant font. It contains 178 characters.
sl@0: Some of the characters (13) are deleted from this file and separated in to other three files.
sl@0: Characters missing are F, D, J, M, P, S, V, X, Z, a, n, l, y.
sl@0: 
sl@0: TLinkedFont2.ttf
sl@0: Typeface name: LinkedFont2
sl@0: Characters available (7):	F, J, M, S, Z, a, y.
sl@0: 
sl@0: TLinkedFont3.ttf
sl@0: Typeface name: LinkedFont3
sl@0: Characters available (4):	D, P, x, l
sl@0: 
sl@0: TLinkedFont4.ttf
sl@0: Typeface name: LinkedFont4
sl@0: Characters available (2):	V, n
sl@0: 
sl@0: TWithoutLinkedFont.ttf
sl@0: Typeface name: WithoutLinkedFont
sl@0: Characters available:	It contains 191 characters U+0020-U+007E and U+00A0-U+00FF
sl@0: */	
sl@0: 
sl@0: _LIT(KLinkedFont1, "LinkedFont1TT");
sl@0: _LIT(KLinkedFont2, "LinkedFont2TT");
sl@0: _LIT(KLinkedFont3, "LinkedFont3TT");
sl@0: _LIT(KLinkedFont4, "LinkedFont4TT");
sl@0: 
sl@0: /** Memory test helper function to create different typefaces.  Function adds from 1 to four
sl@0:  typefaces.
sl@0: */
sl@0: TInt CTLinkedFontsMemory::TestLinkedFontsCreateLinkedTypefacesL(const TDesC &aName,TInt aTypefaces)
sl@0: 	{
sl@0: 	TInt ret = KErrNone;
sl@0: 
sl@0: 	CLinkedTypefaceSpecification *typefaceSpec;
sl@0: 
sl@0: 	typefaceSpec = CLinkedTypefaceSpecification::NewLC(aName);
sl@0: 	
sl@0: 	CLinkedTypefaceGroup* group1;
sl@0: 
sl@0: 	group1 = CLinkedTypefaceGroup::NewLC(1); //may well leave, function trapped, groupID = 1
sl@0: 	typefaceSpec->AddLinkedTypefaceGroupL(*group1);
sl@0: 	CleanupStack::Pop(); //pop the group, now referenced via typeface
sl@0: 	
sl@0: 	CLinkedTypefaceElementSpec *elementSpec1;
sl@0: 	elementSpec1 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont1, 1);	
sl@0: 	elementSpec1->SetCanonical(ETrue);
sl@0: 	typefaceSpec->AddTypefaceAtBackL(*elementSpec1);
sl@0: 	CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0: 
sl@0: 	// Create and add second linked typeface
sl@0: 	if (aTypefaces>=2)
sl@0: 		{
sl@0: 		CLinkedTypefaceElementSpec *elementSpec2;
sl@0: 		elementSpec2 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont2, 1);	
sl@0: 		typefaceSpec->AddTypefaceAtBackL(*elementSpec2);
sl@0: 		CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0: 		}
sl@0: 
sl@0: 	// Create and add third typeface to be linked
sl@0: 	if (aTypefaces>=3)
sl@0: 		{
sl@0: 		CLinkedTypefaceElementSpec *elementSpec3;
sl@0: 		elementSpec3 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont3, 1);	
sl@0: 		typefaceSpec->AddTypefaceAtBackL(*elementSpec3);
sl@0: 		CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0: 		}
sl@0: 
sl@0: 	// Create and add fourth typeface to be linked
sl@0: 	if (aTypefaces>=4)
sl@0: 		{
sl@0: 		CLinkedTypefaceElementSpec *elementSpec4;
sl@0: 		elementSpec4 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont4, 1);	
sl@0: 		TRAP(ret,typefaceSpec->AddTypefaceAtBackL(*elementSpec4));
sl@0: 		CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0: 		}
sl@0: 
sl@0: 	// Try registering the typeface
sl@0: 	CFbsTypefaceStore* store = CFbsTypefaceStore::NewL(iDev);
sl@0: 	CleanupStack::PushL(store);
sl@0: 	typefaceSpec->RegisterLinkedTypefaceL(*store);
sl@0: 	CleanupStack::PopAndDestroy(2, typefaceSpec); //store and typefaceSpec
sl@0: 	return ret;
sl@0: 	}
sl@0: 
sl@0: /** This is the function which does the operations which are tested, called from OOM loop
sl@0:  * in general the function does not return a low memory error; the function just leaves.
sl@0:  * An exception may be for registration.
sl@0: */
sl@0: TInt CTLinkedFontsMemory::TestLinkedFontsMemory1L(TInt aTypefaces)
sl@0: 	{
sl@0: 	TInt ret = KErrNone;
sl@0: 	
sl@0: 	//these are for the linked typefaces
sl@0: 	_LIT(KLinkedTypeface1, "LinkedMem1-1"); //has LinkedFont1
sl@0: 	_LIT(KLinkedTypeface2, "LinkedMem1-2"); //has LinkedFont1, LinkedFont2
sl@0: 	_LIT(KLinkedTypeface3, "LinkedMem1-3"); //has LinkedFont1, LinkedFont2, LinkedFont3
sl@0: 	_LIT(KLinkedTypeface4, "LinkedMem1-4"); //has LinkedFont1, LinkedFont2, LinkedFont3, LinkedFont4	
sl@0: 	
sl@0: 	// Create canonical typeface to be linked
sl@0: 
sl@0: 	switch (aTypefaces)
sl@0: 		{
sl@0: 		case 1:
sl@0: 			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface1,1);
sl@0: 			break;
sl@0: 		case 2:
sl@0: 			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface2,2);
sl@0: 			break;
sl@0: 		case 3:
sl@0: 			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface3,3);
sl@0: 			break;
sl@0: 		case 4:
sl@0: 			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface4,4);
sl@0: 			break;
sl@0: 		default:
sl@0: 			__ASSERT_ALWAYS(ETrue,Panic(EFntTypefaceIndexOutOfRange));
sl@0: 			break;
sl@0: 		}
sl@0: 	
sl@0: 	RDebug::Printf("%d TestLinkedFontsMemory1L(%d)", ret, aTypefaces);
sl@0: 	return ret;
sl@0: 	}
sl@0: 
sl@0: /**
sl@0:    @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0102
sl@0: 
sl@0:    @SYMPREQ					PREQ2146
sl@0: 
sl@0:    @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0: 
sl@0:    @SYMTestCaseDesc			To ensure that a linked typeface can be created and registered 
sl@0:    							without memory leaks, under low memory conditions. 
sl@0: 
sl@0:    @SYMTestPriority			Critical
sl@0: 
sl@0:    @SYMTestStatus			Implemented
sl@0: 
sl@0:    @SYMTestActions			(1) Create an OOM loop,	setting this process's heap memory to fail.
sl@0:    								testing the client side heap memory allocation.
sl@0: 								In the loop create and register a linked typeface with 1-4
sl@0: 								typefaces
sl@0: 
sl@0:    @SYMTestExpectedResults	(1) - There are no memory leaks, and the test exits the OOM loop.
sl@0: */
sl@0: void CTLinkedFontsMemory::TestLinkedFontsMemory1L()
sl@0: 	{
sl@0: 	TInt failures;
sl@0: 
sl@0: 	INFO_PRINTF1(_L("TestLinkedFontsMemory"));
sl@0: 	TInt steps;
sl@0: 	for (steps=1;steps<=4;steps++)
sl@0: 		{
sl@0: 
sl@0: 		for (failures = 1; ; failures++)
sl@0: 			{
sl@0: 			__UHEAP_SETFAIL(RHeap::EDeterministic,failures);
sl@0: 			__UHEAP_MARK;
sl@0: 
sl@0: 			// Test steps
sl@0: 			TInt err;
sl@0: 			TInt val = KErrNone;
sl@0: 			TRAP(err, val= TestLinkedFontsMemory1L(steps));
sl@0: 			__UHEAP_CHECK(0);
sl@0: 			__UHEAP_RESET;
sl@0: 			__UHEAP_MARKEND;
sl@0: 
sl@0: 			if (err == KErrNotFound)
sl@0: 				{
sl@0: 				INFO_PRINTF3(_L("Failure below occurred on Step %i; failure=%i"), steps, failures);
sl@0: 				TEST(EFalse);
sl@0: 				break;
sl@0: 				}
sl@0: 			
sl@0: 			if ((err == KErrNone) && (val == KErrNone))
sl@0: 				{
sl@0: 				break;
sl@0: 				}
sl@0: 			}
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: /**
sl@0:    @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0103
sl@0: 
sl@0:    @SYMPREQ					PREQ2146
sl@0: 
sl@0:    @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0: 
sl@0:    @SYMTestCaseDesc			To ensure that a linked typeface can be created and fonts created
sl@0: 							and used without memory leaks, under low memory conditions
sl@0: 
sl@0:    @SYMTestPriority			Critical
sl@0: 
sl@0:    @SYMTestStatus			Implemented
sl@0: 
sl@0:    @SYMTestActions			(1) Create an OOM loop, setting the server's heap memory to fail.
sl@0: 								In the loop create and register a linked typeface with 1-4
sl@0: 								typefaces.  
sl@0: 							(2) Draw text with the four linked fonts from the four
sl@0: 								linked typefaces.  
sl@0: 							(3) Compare the text output against an unlinked font with the same 
sl@0: 								character forms.
sl@0: 
sl@0:    @SYMTestExpectedResults	(1) - There are no memory leaks, and the test exits the OOM loop.
sl@0:    							(2) - The text is draw successfully
sl@0:    							(3) - The text compares identically.
sl@0: */	
sl@0: void CTLinkedFontsMemory::TestLinkedFontsMemory2()
sl@0: 	{
sl@0: 	TInt failures;
sl@0: 
sl@0: 	INFO_PRINTF1(_L("TestLinkedFontsMemory Server Heap"));
sl@0: 
sl@0: 	// Initially test for linked typeface creation
sl@0: 	_LIT(name1, "typefaceNameMem2-1");
sl@0: 	_LIT(name2, "typefaceNameMem2-2");
sl@0: 	_LIT(name3, "typefaceNameMem2-3");
sl@0: 	_LIT(name4, "typefaceNameMem2-4");
sl@0: 
sl@0: 	TInt steps;
sl@0: 	for (steps=1;steps<=4;steps++)
sl@0: 		{
sl@0: 		INFO_PRINTF2(_L("Testing creating linked typeface %d typefaces"),steps);
sl@0: 		for (failures = 1;;failures++)
sl@0: 			{
sl@0: 			// Try creating the typeface
sl@0: 
sl@0: 			TInt err;
sl@0: 			TInt val = KErrNone;
sl@0: 
sl@0: 			SetHeapFail(RFbsSession::EHeapFailTypeServerMemory, failures);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //on
sl@0: 
sl@0: 			switch(steps)
sl@0: 				{
sl@0: 				case 1:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name1, steps));
sl@0: 					break;
sl@0: 				case 2:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name2, steps));
sl@0: 					break;
sl@0: 				case 3:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name3, steps));
sl@0: 					break;
sl@0: 				case 4:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name4, steps));
sl@0: 					break;
sl@0: 				}
sl@0: 
sl@0: 			SetHeapReset(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //off
sl@0: 
sl@0: 			//If the linked font cannot be created because the typefaces are not present or
sl@0: 			//it has already been created then fail the test.
sl@0: 			if (err == KErrNotFound || err == KErrAlreadyExists)
sl@0: 				{
sl@0: 				INFO_PRINTF1(_L("Failure below caused by missing linked font element file or linked font file already being generated."));
sl@0: 				TEST(EFalse);
sl@0: 				break;
sl@0: 				}
sl@0: 			
sl@0: 			if ((val >= 0) && (err == KErrNone))
sl@0: 				break;
sl@0: 			}
sl@0: 		}
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Testing linked typeface font creation and usage"));
sl@0: 	for(steps=1;steps<=4;steps++)
sl@0: 		{
sl@0: 		INFO_PRINTF2(_L("Testing font usage: linked font with %d fonts"),steps);
sl@0: 		for (failures = 1; ; failures++)
sl@0: 			{
sl@0: 			TInt val = 0;
sl@0: #ifdef _DEBUG
sl@0: 			TInt serverBefore=HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 			TInt countBefore =0;
sl@0: 
sl@0: 			RHeap *heap = (RHeap*)FontAndBitmapServerSharedHeap();
sl@0: 			
sl@0: 			if (heap)
sl@0: 				{
sl@0: 				__RHEAP_MARK(heap);
sl@0: 				countBefore = heap->Count();
sl@0: 				}
sl@0: 			SetHeapFail(RFbsSession::EHeapFailTypeServerMemory, failures);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0: #endif
sl@0: 
sl@0: 			switch(steps)
sl@0: 				{
sl@0: 				case 1:
sl@0: 					val=TestLinkedFontsMemory_Part2(name1);
sl@0: 					break;
sl@0: 				case 2:
sl@0: 					val=TestLinkedFontsMemory_Part2(name2);
sl@0: 					break;
sl@0: 				case 3:
sl@0: 					val=TestLinkedFontsMemory_Part2(name3);
sl@0: 					break;
sl@0: 				case 4:
sl@0: 					val=TestLinkedFontsMemory_Part2(name4);
sl@0: 					break;
sl@0: 				}
sl@0: #ifdef _DEBUG
sl@0: 			TInt serverAfter = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 			TInt countAfter=0;
sl@0: 			TInt badCell=0;
sl@0: 			if (heap)
sl@0: 				{
sl@0: 				countAfter = heap->Count();
sl@0: 				badCell = __RHEAP_MARKEND(heap);
sl@0: 				}
sl@0: 
sl@0: 			SetHeapReset(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0: #endif
sl@0: 			if (val == KErrNone)
sl@0: 				{
sl@0: 				if (steps == 4)
sl@0: 					{
sl@0: 					//do a comparison of the text
sl@0: 					TestCompareText();
sl@0: 					}
sl@0: 				break;
sl@0: 				}
sl@0: #ifdef _DEBUG
sl@0: 			TEST(badCell == 0);
sl@0: 			TEST(countBefore == countAfter);
sl@0: 			TEST(serverBefore == serverAfter);
sl@0: #endif
sl@0: 			}
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: TInt CTLinkedFontsMemory::TestLinkedFontsMemory_Part2(const TDesC &aName)
sl@0: 	{
sl@0: 
sl@0: 	TTypeface Typeface;
sl@0: 	Typeface.iName = aName;
sl@0: 	TFontSpec fs;
sl@0: 	fs.iTypeface = Typeface;
sl@0: 	fs.iHeight = 20;
sl@0: 	CFbsFont* font = NULL;
sl@0: 	TInt err1 = iDev->GetNearestFontToDesignHeightInPixels(font, fs);
sl@0: 
sl@0: 	if (font && err1 == KErrNone)
sl@0: 		{
sl@0: 		// Use the font
sl@0: 		iGc->UseFont(font);
sl@0: 		iGc->Clear();
sl@0: 		iGc->DrawText(KDrawMe, TPoint(50, 50));
sl@0: 		iGc->DiscardFont();
sl@0: 		iDev->ReleaseFont(font);
sl@0: 		}
sl@0: 	else if (font == NULL)
sl@0: 		{
sl@0: 		TEST(err1==KErrNoMemory);
sl@0: 		if (err1==KErrNone)
sl@0: 			{
sl@0: 			err1 = KErrGeneral;
sl@0: 			}
sl@0: 		}
sl@0: 
sl@0: 	return err1;
sl@0: 	}
sl@0: 
sl@0: /**
sl@0:    @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0104
sl@0: 
sl@0:    @SYMPREQ					PREQ2146
sl@0: 
sl@0:    @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0: 
sl@0:    @SYMTestCaseDesc			To ensure that a linked typeface can be created and fonts created
sl@0: 							and used under low memory conditions
sl@0: 
sl@0:    @SYMTestPriority			Critical
sl@0: 
sl@0:    @SYMTestStatus			Implemented
sl@0: 
sl@0:    @SYMTestActions			(1) This function checks that no memory has been retained from the
sl@0: 								usage of a linked font.  This tests server heap and shared heap
sl@0: 								memory.
sl@0: 
sl@0:    @SYMTestExpectedResults	(1) - There are no memory leaks.
sl@0: */
sl@0: void CTLinkedFontsMemory::TestLinkedFontsMemory3()
sl@0: 	{
sl@0: 	_LIT( KTest1, "typefaceNameMem2-1");
sl@0: 	_LIT( KTest2, "typefaceNameMem2-2");
sl@0: 	_LIT( KTest3, "typefaceNameMem2-3");
sl@0: 	_LIT( KTest4, "typefaceNameMem2-4");
sl@0: 
sl@0: #if _DEBUG
sl@0: 		TInt serverBefore = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 		// need to get heap from client side.
sl@0: 		RHeap *heap = (RHeap*)FontAndBitmapServerSharedHeap();
sl@0: 		TInt countBefore=0;
sl@0: 		if (heap)
sl@0: 			{
sl@0: 			__RHEAP_MARK(heap);
sl@0: 			countBefore = heap->Count();
sl@0: 			}
sl@0: 		TInt serverAfter;
sl@0: #endif
sl@0: 	for (TInt numRuns = 0 ; numRuns <= 50 ; numRuns++)
sl@0: 		{
sl@0: 		for (TInt steps=1;steps<=4;steps++)
sl@0: 			{
sl@0: 			TTypeface Typeface;
sl@0: 			switch (steps)
sl@0: 				{
sl@0: 				case 1:
sl@0: 					Typeface.iName = KTest1;
sl@0: 					break;
sl@0: 				case 2:
sl@0: 					Typeface.iName = KTest2;
sl@0: 					break;
sl@0: 				case 3:
sl@0: 					Typeface.iName = KTest3;
sl@0: 					break;
sl@0: 				case 4:
sl@0: 					Typeface.iName = KTest4;
sl@0: 					break;
sl@0: 				}
sl@0: 			TFontSpec fs;
sl@0: 			fs.iTypeface = Typeface;
sl@0: 			fs.iHeight = 50;
sl@0: 			TInt count;
sl@0: 			CFbsFont *fnt[10];
sl@0: 	
sl@0: 			TInt err;
sl@0: 			for (count = 0; count < 10; count++)
sl@0: 				{
sl@0: 				err = iDev->GetNearestFontToDesignHeightInPixels(fnt[count], fs);
sl@0: 				//now try getting the same font twice, if count is 5
sl@0: 				if(count!=5)
sl@0: 					fs.iHeight++;
sl@0: 				TEST(err == KErrNone);
sl@0: 				}
sl@0: 			for (count = 0; count < 10; count++)
sl@0: 				{
sl@0: 				iDev->ReleaseFont(fnt[count]);
sl@0: 				}
sl@0: 			}
sl@0: 		}
sl@0: #ifdef _DEBUG
sl@0: 		serverAfter = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 		TInt countAfter=0;
sl@0: 		TInt badCell=0;
sl@0: 		if (heap)
sl@0: 			{
sl@0: 			countAfter = heap->Count();
sl@0: 			badCell = __RHEAP_MARKEND(heap);
sl@0: 			}
sl@0: 		TEST(badCell == 0);
sl@0: 		TEST (countAfter <= countBefore);
sl@0: 
sl@0: 			RDebug::Printf("serverAfter(%i) <= serverBefore(%i)", serverAfter, serverBefore);
sl@0: 			INFO_PRINTF3(_L("serverAfter(%i) <= serverBefore(%i)"), serverAfter, serverBefore);
sl@0: 
sl@0: 		TEST(serverAfter <= serverBefore); // Note some true type tables are freed.
sl@0: #endif
sl@0: 	}
sl@0: 
sl@0: /**
sl@0:    @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0105
sl@0: 
sl@0:    @SYMPREQ					PREQ2146
sl@0: 
sl@0:    @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0: 
sl@0:    @SYMTestCaseDesc			To ensure that a linked typeface can be created and fonts created
sl@0: 							and used under low memory conditions of the font and bitmap
sl@0: 							server shared heap.
sl@0: 
sl@0:    @SYMTestPriority			Critical
sl@0: 
sl@0:    @SYMTestStatus			Implemented
sl@0: 
sl@0:    @SYMTestActions			(1) Create an OOM loop, setting the shared heap memory to fail.
sl@0: 								In the loop create and register a linked typeface with 1-4
sl@0: 								typefaces.  Draw text with the four linked fonts from the four
sl@0: 								linked typefaces.
sl@0: 
sl@0:    @SYMTestExpectedResults	(1) - There are no memory leaks, and the test exits the OOM loop.
sl@0: */
sl@0: void CTLinkedFontsMemory::TestLinkedFontsMemory4()
sl@0: 	{
sl@0: 
sl@0: 	TInt failures;
sl@0: 
sl@0: 	INFO_PRINTF1(_L("TestLinkedFontsMemory Shared Heap"));
sl@0: 
sl@0: 	// Initially test for linked typeface creation
sl@0: 	// Initially test for linked typeface creation
sl@0: 	_LIT(name1, "typefaceNameMem4-1");
sl@0: 	_LIT(name2, "typefaceNameMem4-2");
sl@0: 	_LIT(name3, "typefaceNameMem4-3");
sl@0: 	_LIT(name4, "typefaceNameMem4-4");
sl@0: 
sl@0: 	TInt steps;
sl@0: 	for(steps=1;steps<=4;steps++)
sl@0: 		{
sl@0: 		INFO_PRINTF2(_L("Testing creating linked typeface %d typefaces"),steps);
sl@0: 		for (failures = 1; ; failures++)
sl@0: 			{
sl@0: 			// Try creating the typeface
sl@0: 
sl@0: 			TInt err;
sl@0: 			TInt val = KErrNone;
sl@0: 
sl@0: 			SetHeapFail(RFbsSession::EHeapFailTypeHeapMemory, failures);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //on
sl@0: 
sl@0: 			switch(steps)
sl@0: 				{
sl@0: 				case 1:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name1, 1));
sl@0: 					break;
sl@0: 				case 2:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name2, 2));
sl@0: 					break;
sl@0: 				case 3:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name3, 3));
sl@0: 					break;
sl@0: 				case 4:
sl@0: 					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name4, 4));
sl@0: 					break;
sl@0: 				}
sl@0: 
sl@0: 			SetHeapReset(RFbsSession::EHeapFailTypeHeapMemory);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //off
sl@0: 
sl@0: 			//If the linked font cannot be created because the typefaces are not present or
sl@0: 			//it has already been created then fail the test.
sl@0: 			if (err == KErrNotFound || err == KErrAlreadyExists)
sl@0: 				{
sl@0: 				INFO_PRINTF1(_L("Failure below caused by missing linked font element file or linked font file already being generated."));
sl@0: 				TEST(EFalse);
sl@0: 				break;
sl@0: 				}
sl@0: 			
sl@0: 			if ((val >= 0) && (err == KErrNone))
sl@0: 				break;
sl@0: 			}
sl@0: 		}
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Testing linked typeface font creation and usage"));
sl@0: 	for (steps=1;steps<=4;steps++)
sl@0: 		{
sl@0: 		INFO_PRINTF2(_L("Testing font usage: linked font with %d fonts"), steps);
sl@0: 		for (failures = 1; ; failures++)
sl@0: 			{
sl@0: 			TInt val = 0;
sl@0: #ifdef _DEBUG
sl@0: 			TInt serverBefore=HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 			RHeap *heap=(RHeap*)FontAndBitmapServerSharedHeap();
sl@0: 			TInt countBefore = 0;
sl@0: 			if (heap)
sl@0: 				{
sl@0: 				__RHEAP_MARK(heap);
sl@0: 			 	countBefore = heap->Count();
sl@0: 				}
sl@0: 			SetHeapFail(RFbsSession::EHeapFailTypeHeapMemory, failures);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0: #endif
sl@0: 			switch (steps)
sl@0: 				{
sl@0: 				case 1:
sl@0: 					val = TestLinkedFontsMemory_Part2(name1);
sl@0: 					break;
sl@0: 				case 2:
sl@0: 					val = TestLinkedFontsMemory_Part2(name2);
sl@0: 					break;
sl@0: 				case 3:
sl@0: 					val = TestLinkedFontsMemory_Part2(name3);
sl@0: 					break;
sl@0: 				case 4:
sl@0: 					val = TestLinkedFontsMemory_Part2(name4);
sl@0: 					break;
sl@0: 				}
sl@0: #ifdef _DEBUG
sl@0: 			TInt serverAfter = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0: 			TInt countAfter =0;
sl@0: 			TInt badCell = 0;
sl@0: 			if (heap)
sl@0: 				{
sl@0: 				countAfter = heap->Count();
sl@0: 				badCell = __RHEAP_MARKEND(heap);
sl@0: 				}
sl@0: 			SetHeapReset(RFbsSession::EHeapFailTypeHeapMemory);
sl@0: 			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0: #endif
sl@0: 			if (val == KErrNone)
sl@0: 				{
sl@0: 				if (steps == 4)
sl@0: 					{
sl@0: 					TestCompareText();
sl@0: 					}
sl@0: 				break;
sl@0: 				}
sl@0: #ifdef _DEBUG
sl@0: 			TEST(badCell == 0);
sl@0: 			TEST (countBefore == countAfter);
sl@0: 			TEST(serverBefore == serverAfter);
sl@0: #endif
sl@0: 			}
sl@0: 		}
sl@0: 	}
sl@0: 
sl@0: void CTLinkedFontsMemory::DisplayRamInfo(const TDesC& aTextInfo) const
sl@0: 	{
sl@0: 	TInt val;
sl@0: 	HAL::Get(HALData::EMemoryRAMFree, val);
sl@0: 	TBuf <80> buf;
sl@0: 	_LIT(KTotalRamText, "RAM free: %d ");
sl@0: 	buf.Format(KTotalRamText,val);
sl@0: 	buf.Append(aTextInfo);
sl@0: 	iStep->INFO_PRINTF1(buf);
sl@0: 	}
sl@0: 
sl@0: /**
sl@0:    @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0106
sl@0: 
sl@0:    @SYMPREQ					PREQ2146
sl@0: 
sl@0:    @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0: 
sl@0:    @SYMTestCaseDesc			To test memory usage performance of linked font creation. 
sl@0:    							Test memory usage performance of linked font character access.
sl@0: 
sl@0:    @SYMTestPriority			High
sl@0: 
sl@0:    @SYMTestStatus			Implemented
sl@0: 
sl@0:    @SYMTestActions			(1) Display available ram.  Create a linked typeface with 1-4 linked typeface
sl@0: 								and display ram available.
sl@0: 							(2) Create four linked fonts from the four linked typefaces.  After each step
sl@0: 								display the available RAM.
sl@0: 							(3) Use each of the four linked fonts in turn for drawing text, and at each
sl@0: 								step display the available RAM.	
sl@0: 
sl@0:    @SYMTestExpectedResults	(1) (2) (3) RAM usage is displayed.  
sl@0:    							There are no memory leaks.
sl@0: */
sl@0: void CTLinkedFontsMemory::TestMemoryUsage()
sl@0: 	{
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Test Memory Usage 1"));
sl@0: 
sl@0: 	// Initially test for linked typeface creation
sl@0: 	// Initially test for linked typeface creation
sl@0: 	_LIT(name0, "WithoutLinkedFontTT");
sl@0: 	_LIT(name1, "typefaceMemUse-1");
sl@0: 	_LIT(name2, "typefaceMemUse-2");
sl@0: 	_LIT(name3, "typefaceMemUse-3");
sl@0: 	_LIT(name4, "typefaceMemUse-4");
sl@0: 
sl@0: 	TInt steps;
sl@0: 	_LIT(KPriorToTesting, "Prior to testing");
sl@0: 
sl@0: 	DisplayRamInfo(KPriorToTesting);
sl@0: 
sl@0: 	TInt err=KErrNone;
sl@0: 	TInt val=KErrNone;
sl@0: 	//get memory after registering a typeface
sl@0: 	for(steps=1;steps<=4;steps++)
sl@0: 		{
sl@0: 		switch(steps)
sl@0: 			{
sl@0: 			case 1:
sl@0: 				TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name1, 1));
sl@0: 				_LIT(KOneTypeface, "Typeface with one typeface created");
sl@0: 				DisplayRamInfo(KOneTypeface);
sl@0: 				break;
sl@0: 			case 2:
sl@0: 				TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name2, 2));
sl@0: 				_LIT(KTwoTypeface, "Typeface with two typefaces created");
sl@0: 				DisplayRamInfo(KTwoTypeface);
sl@0: 				break;
sl@0: 			case 3:
sl@0: 				TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name3, 3));
sl@0: 				_LIT(KThreeTypeface, "Typeface with three typefaces created");
sl@0: 				DisplayRamInfo(KThreeTypeface);
sl@0: 				break;
sl@0: 			case 4:
sl@0: 				TRAP(err,val = TestLinkedFontsCreateLinkedTypefacesL(name4, 4));
sl@0: 				_LIT(KFourTypeface, "Typeface with four typefaces created");
sl@0: 				DisplayRamInfo(KFourTypeface);
sl@0: 				break;
sl@0: 			}
sl@0: 		TEST(err == KErrNone);
sl@0: 		TEST(val == KErrNone);
sl@0: 		}
sl@0: 
sl@0: 	CFont* font[5];
sl@0: 	memset (font,0, sizeof(CFont*)*5);
sl@0: 
sl@0: 	_LIT(KGettingFonts, "Now getting 5 fonts, the first one of which is not linked");
sl@0: 	DisplayRamInfo(KGettingFonts);
sl@0: 	//get memory after retrieving a font
sl@0: 	for (steps=0;steps<5;steps++)
sl@0: 		{
sl@0: 		switch (steps)
sl@0: 			{
sl@0: 			case 0:
sl@0: 				{
sl@0: 				TTypeface typeface;
sl@0: 				typeface.iName = name0;
sl@0: 				TFontSpec fs;
sl@0: 				fs.iTypeface = typeface;
sl@0: 				fs.iHeight = 20;
sl@0: 				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0: 				TEST(err==KErrNone);
sl@0: 				_LIT(KOneFont, "Non linked font typeface");
sl@0: 				DisplayRamInfo(KOneFont);
sl@0: 				}
sl@0: 			break;
sl@0: 
sl@0: 			case 1:
sl@0: 				{
sl@0: 				TTypeface typeface;
sl@0: 				typeface.iName = name1;
sl@0: 				TFontSpec fs;
sl@0: 				fs.iTypeface = typeface;
sl@0: 				fs.iHeight = 20;
sl@0: 				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0: 				TEST(err==KErrNone);
sl@0: 				_LIT(KOneFont, "LinkedFont one typeface");
sl@0: 				DisplayRamInfo(KOneFont);
sl@0: 				}
sl@0: 			break;
sl@0: 			case 2:
sl@0: 				{
sl@0: 				TTypeface typeface;
sl@0: 				typeface.iName = name2;
sl@0: 				TFontSpec fs;
sl@0: 				fs.iTypeface = typeface;
sl@0: 				fs.iHeight = 20;
sl@0: 				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0: 				TEST(err==KErrNone);
sl@0: 				_LIT(KTwoFont, "LinkedFont two typefaces");
sl@0: 				DisplayRamInfo(KTwoFont);
sl@0: 				}
sl@0: 			break;
sl@0: 			case 3:
sl@0: 				{
sl@0: 				TTypeface typeface;
sl@0: 				typeface.iName = name3;
sl@0: 				TFontSpec fs;
sl@0: 				fs.iTypeface = typeface;
sl@0: 				fs.iHeight = 20;
sl@0: 				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0: 				TEST(err==KErrNone);
sl@0: 				_LIT(KThreeFont, "LinkedFont three typefaces");
sl@0: 				DisplayRamInfo(KThreeFont);
sl@0: 				}
sl@0: 			break;
sl@0: 			case 4:
sl@0: 				{
sl@0: 				TTypeface typeface;
sl@0: 				typeface.iName = name4;
sl@0: 				TFontSpec fs;
sl@0: 				fs.iTypeface = typeface;
sl@0: 				fs.iHeight = 20;
sl@0: 				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0: 				TEST(err==KErrNone);
sl@0: 				_LIT(KFourFont, "LinkedFont four typefaces");
sl@0: 				DisplayRamInfo(KFourFont);
sl@0: 				}
sl@0: 			break;
sl@0: 			}
sl@0: 		}
sl@0: 
sl@0: 	//get memory after font usage
sl@0: 	const TDesC* string[5];
sl@0: 	_LIT(KString0,"A");
sl@0: 	_LIT(KString1,"B");
sl@0: 	_LIT(KString2,"F");
sl@0: 	_LIT(KString3,"D");
sl@0: 	_LIT(KString4,"V");
sl@0: 	string[0]=&KString0();
sl@0: 	string[1]=&KString1();
sl@0: 	string[2]=&KString2();
sl@0: 	string[3]=&KString3();
sl@0: 	string[4]=&KString4();
sl@0: 
sl@0: 	_LIT(KWritingCharacter,"Now outputing a single character from each of the five fonts");
sl@0: 	DisplayRamInfo(KWritingCharacter);
sl@0: 	for (steps=0;steps<5;steps++)
sl@0: 		{
sl@0: 		// Use the font
sl@0: 		iGc->UseFont(font[steps]);
sl@0: 		iGc->Clear();
sl@0: 		_LIT(KNowUsingFont,"Now using font");
sl@0: 		DisplayRamInfo(KNowUsingFont);
sl@0: 		iGc->DrawText(*string[steps], TPoint(100, 100));
sl@0: 		TBuf <80> buf;
sl@0: 		_LIT(KNumberOfSteps,"The font in use has %d linked fonts");
sl@0: 		buf.Format(KNumberOfSteps, steps);
sl@0: 		DisplayRamInfo(buf);
sl@0: 		iGc->DiscardFont();
sl@0: 		}
sl@0: 
sl@0: 	//release the fonts
sl@0: 	for (steps=0;steps<5;steps++)
sl@0: 		{
sl@0: 		iDev->ReleaseFont(font[steps]);
sl@0: 		}
sl@0: 	_LIT(KTestEnd,"At the end of the memory test");
sl@0: 	DisplayRamInfo(KTestEnd);
sl@0: 	}
sl@0: 
sl@0: void CTLinkedFontsMemory::RunTestCaseL( TInt aCurTestCase )
sl@0: 	{
sl@0: 		
sl@0: 	((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
sl@0: 	switch ( aCurTestCase )
sl@0: 		{
sl@0: 	case 1:
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0: 		StartServer();
sl@0: 		if (!CheckRasterizerInstalledL())
sl@0: 			{
sl@0: 			TestComplete();
sl@0: 			return;
sl@0: 			}
sl@0: 		break;
sl@0: 	case 2:
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0102"));
sl@0: #ifdef _DEBUG
sl@0: 		//memory tests are not valid under DEBUG/ urel, and they will fail
sl@0: 		__UHEAP_MARK;
sl@0: 		// This is for client side memory
sl@0: 		TestLinkedFontsMemory1L();
sl@0: 		__UHEAP_MARKEND;
sl@0: 		__UHEAP_RESET;
sl@0: #endif
sl@0: 		break;
sl@0: 	case 3:
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0: #ifdef _DEBUG
sl@0: 		__UHEAP_MARK;
sl@0: 		//((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0103"));
sl@0: 		// This is for server side memory
sl@0: 		//TestLinkedFontsMemory2(); //- test crashes the server (from the rasterizer)
sl@0: 		//TEST(EFalse);
sl@0: 		__UHEAP_MARKEND;
sl@0: 		__UHEAP_RESET;
sl@0: #endif
sl@0: 		break;
sl@0: 	case 4:
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0104"));
sl@0: #ifdef _DEBUG
sl@0: 		__UHEAP_MARK;
sl@0: 		// This is to check that there are no leaks getting and releasing fonts
sl@0: 		//TestLinkedFontsMemory3();
sl@0: 		__UHEAP_MARKEND;
sl@0: 		__UHEAP_RESET;
sl@0: #endif
sl@0: 		break;
sl@0: 	case 5:
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0105"));
sl@0: #ifdef _DEBUG
sl@0: 		__UHEAP_MARK;
sl@0: 		// This is for heap memory
sl@0: 		//TestLinkedFontsMemory4();
sl@0: 		__UHEAP_MARKEND;
sl@0: 		__UHEAP_RESET;
sl@0: #endif
sl@0: 		break;
sl@0: 
sl@0: 	case 6:
sl@0: #ifdef _DEBUG
sl@0: 		__UHEAP_MARK;
sl@0: #endif		
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0106"));
sl@0: 		TestMemoryUsage();
sl@0: #ifdef _DEBUG		
sl@0: 		__UHEAP_MARKEND;
sl@0: 		__UHEAP_RESET;
sl@0: #endif		
sl@0: 		break;	
sl@0: 	case 7:
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0: 		((CTLinkedFontsMemoryStep*)iStep)->CloseTMSGraphicsStep();
sl@0: 		TestComplete();
sl@0: 		break;
sl@0: 		}
sl@0: 	((CTLinkedFontsMemoryStep*)iStep)->RecordTestResultL();
sl@0: 	}
sl@0: 
sl@0: // --------------
sl@0: __CONSTRUCT_STEP__(LinkedFontsMemory)