fbs/fontandbitmapserver/tfbs/TALLOC.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/TALLOC.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1298 @@
+// Copyright (c) 1996-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 <s32file.h>
+#include <graphics/bitmapuid.h>
+#include "../sfbs/UTILS.H"
+#include "TFBS.H"
+#include "TALLOC.H"
+#include "../sfbs/fbsbitmapasyncstreamer.h"
+#include "fbsmessage.h"
+#include "fbsdefs.h"
+
+const TSize KLargeSize(4096 + 100, 1);
+const TSize KLargeSizeAlt(4096 + 200, 2);
+const TSize KSmallSize(10, 10);
+const TSize KSmallSizeAlt(20, 20);
+
+CTAlloc::CTAlloc(CTestStep* aStep):
+	CTGraphicsBase(aStep), 
+	iFbs(NULL),
+	iStore(NULL),
+	iBitmap(NULL),
+	iBitmap2(NULL)
+	{
+	INFO_PRINTF1(_L("Font/Bitmap Server Alloc Failure Recovery Testing"));
+	}
+
+CTAlloc::~CTAlloc()
+	{
+	if (iShutdownFbs)
+		{
+		iFbs->SendCommand(EFbsMessShutdown);
+		}
+	iFbs->Disconnect();
+	
+	delete iStore;
+	}
+
+void CTAlloc::ConstructL()
+	{
+	iStore = CFbsTypefaceStore::NewL(NULL);
+
+	if(RFbsSession::Connect()==KErrNone)
+		{
+		RFbsSession::Disconnect();
+		iShutdownFbs = EFalse;
+		}
+	else
+		{
+		FbsStartup();
+		iShutdownFbs = ETrue;
+		}
+	}
+
+void CTAlloc::RunTestCaseL(TInt aCurTestCase)
+	{
+	((CTAllocStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+	case 1:
+		((CTAllocStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0511"));
+		Session();
+		break;
+	case 2:
+		{
+/**
+	@SYMTestCaseID GRAPHICS-FBSERV-0611
+*/
+		((CTAllocStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0611"));
+		TInt ret = RFbsSession::Connect();
+		TEST2(ret, KErrNone);
+		iFbs = RFbsSession::GetSession();
+		TEST(iFbs != NULL);
+		}
+		break;
+	case 4:
+		((CTAllocStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0512"));
+		BitmapsL();
+		break;
+	case 5:
+		((CTAllocStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0514"));
+		BitmapHandlerL();
+		break;
+	case 6:
+		((CTAllocStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0513"));
+		TypefaceStoreL();
+		break;
+	case 7:
+		((CTAllocStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0515"));
+		FontStoreL();
+		break;
+	case 8:
+		((CTAllocStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTAllocStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();
+		break;
+	default:
+		((CTAllocStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		break;
+		}
+	((CTAllocStep*)iStep)->RecordTestResultL();
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0511
+
+	@SYMTestCaseDesc
+	Allocated sessions with the FbsServer and simulates memory allocation errors
+
+	@SYMTestActions
+	Checks the heap
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTAlloc::Session()
+	{
+	INFO_PRINTF1(_L("RFbsSession::Connect()\r\n"));
+
+	for (TInt count = 1; ; count++)
+		{
+		__UHEAP_FAILNEXT(count);
+		__UHEAP_MARK;
+
+		TInt ret = RFbsSession::Connect();
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			RFbsSession::Disconnect();
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0512
+
+	@SYMTestCaseDesc
+	Creates bitmaps in different ways and checks if memory allocation succeeded 
+
+	@SYMTestActions
+	Creates normal size bitmaps, large bitmaps, loads bitmaps, loads shared bitmaps,
+	duplicated bitmaps, resizes bitmaps, compresses bitmaps, externalized bitmaps to write store, 
+	internalizes bitmaps back again from write store. All ways of creating bitmaps are tested
+	against Out Of Memory error conditions	
+
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTAlloc::BitmapsL()
+	{
+	TInt heapMarkCheckFlag;	
+	if( !iStep->GetIntFromConfig(KDefaultSectionName, KFbsHeapMarkCheckFlag, heapMarkCheckFlag) )
+		{
+		INFO_PRINTF1(_L("Error reading ini file"));
+		User::Leave(KErrNotFound);
+		}
+	
+	CFbsBitmap iBitmap;
+	CFbsBitmap iBitmap2;
+
+	iTestBitmapName = KTestBitmapOnZ;
+	TInt ret = iBitmap.Load(iTestBitmapName,ETfbs,NULL);
+	TEST2(ret, KErrNone);
+
+	ret = iBitmap.Create(KLargeSize,EColor256); // Expand server caches
+	TEST2(ret, KErrNone);
+	iBitmap.Reset();
+
+	TInt count;
+
+// Create bitmap
+	INFO_PRINTF1(_L("CFbsBitmap::Create()\r\n"));
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+		ret = iBitmap.Create(KSmallSize,EColor256);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMark);
+				iFbs->SendCommand(EFbsMessUserMark);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMark);
+				iFbs->SendCommand(EFbsMessUserMark);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret=iBitmap.Create(KSmallSize,EGray2);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+// Create (large)
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Create(KLargeSize,EColor256);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Create(KLargeSize,EColor256);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+// Load
+	INFO_PRINTF1(_L("CFbsBitmap::Load()\r\n"));
+	ret = iBitmap.Load(iTestBitmapName,ETfbs,NULL);
+	TEST2(ret, KErrNone);
+	iBitmap.Reset();
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Load(iTestBitmapName,ETfbs,NULL);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Load(iTestBitmapName,ETfbs,NULL);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+	}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+// Load (shared)
+	INFO_PRINTF1(_L("CFbsBitmap::Load() - shared \r\n"));
+	
+	// Do an initial load to ensure the StreamId cache does not get updated whilst OOM testing
+	ret = iBitmap.Load(iTestBitmapName,ETfbs,ETrue);
+	TEST2(ret, KErrNone);
+	iBitmap.Reset();
+	
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Load(iTestBitmapName,ETfbs,ETrue);
+		
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			continue;
+			}
+		else if (ret != KErrNone)
+			TEST2(ret, KErrNone);
+			
+		ret = iBitmap2.Load(iTestBitmapName,ETfbs,ETrue);	
+			
+		if (ret == KErrNoMemory)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			continue;
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();	
+			iBitmap2.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);		
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Load(iTestBitmapName,ETfbs,ETrue);
+		
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			continue;
+			}
+		else if (ret != KErrNone)
+			TEST2(ret, KErrNone);
+			
+		ret = iBitmap2.Load(iTestBitmapName,ETfbs,ETrue);
+
+		if (ret == KErrNoMemory)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			continue;
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			iBitmap2.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+	}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+	
+	
+// Duplicate
+	CFbsBitmap bmpalt;
+	ret = bmpalt.Create(KSmallSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	INFO_PRINTF1(_L("CFbsBitmap::Duplicate()\r\n"));
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Duplicate(bmpalt.Handle());
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==1);
+	ret = bmpalt.Create(KSmallSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Duplicate(bmpalt.Handle());
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	bmpalt.Reset();
+	TEST(iFbs->ResourceCount()==0);
+
+// Resize
+	// force fbserv to do a resize. This makes the pile to insert an index in it's array
+	// If the array is empty when the tests below are run then the insert will look like a mem leak
+	ret=iBitmap.Create(KLargeSize,EColor256);
+	iBitmap.Resize(KLargeSizeAlt);
+	iBitmap.Reset();
+	
+	ret=iBitmap.Create(KSmallSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	INFO_PRINTF1(_L("CFbsBitmap::Resize()\r\n"));
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Resize(KSmallSizeAlt);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+	
+	
+	// force fbserv to do a resize. This makes the pile to insert an index in it's array
+	// If the array is empty when the tests below are run then the insert will look like a mem leak
+	ret=iBitmap.Create(KLargeSize,EColor256);
+	iBitmap.Resize(KLargeSizeAlt);
+	iBitmap.Reset();
+	
+	ret=iBitmap.Create(KLargeSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Resize(KLargeSizeAlt);
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+// Compress
+	ret=iBitmap.Create(KSmallSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	INFO_PRINTF1(_L("CFbsBitmap::Compress()\r\n"));
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Compress();
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	ret=iBitmap.Create(KLargeSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	INFO_PRINTF1(_L("CFbsBitmap::Compress()\r\n"));
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		ret = iBitmap.Compress();
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+// WriteStore creation
+	RFs fs;
+	ret=fs.Connect();
+	TEST2(ret, KErrNone);
+	CDirectFileStore* writestore=NULL;
+
+	//Construct filename using the thread id to enable concurrent test runs.
+	_LIT(KSbmFileName,"c:\\tall_");
+	TBuf<36> buf(KSbmFileName);
+	TThreadId threadId = RThread().Id();
+	TUint64 id = threadId.Id();
+	TBuf<20> threadIdBuf;
+	threadIdBuf.Num(id);
+	buf.Append(threadIdBuf);
+	buf.Append(_L(".sbm"));
+	
+	TRAP(ret,writestore=CDirectFileStore::ReplaceL(fs,buf,EFileStream|EFileWrite));
+	TEST2(ret, KErrNone);
+	TUidType uidtype(KDirectFileStoreLayoutUid,KMultiBitmapFileImageUid);
+	TRAP(ret,writestore->SetTypeL(uidtype));
+	TEST2(ret, KErrNone);
+
+	RStoreWriteStream writestrm;
+	TStreamId headerid(0);
+	TRAP(ret,headerid=writestrm.CreateL(*writestore));
+	TEST2(ret, KErrNone);
+	TRAP(ret,writestore->SetRootL(headerid));
+	TEST2(ret, KErrNone);
+
+// Externalize
+	ret=iBitmap.Create(KSmallSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	INFO_PRINTF1(_L("CFbsBitmap::ExternalizeL()\r\n"));
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		TRAP(ret,iBitmap.ExternalizeL(writestrm));
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+	TEST(iFbs->ResourceCount()==0);
+
+// ExternalizeRectangle
+	ret=iBitmap.Create(KSmallSize,EColor256);
+	TEST2(ret, KErrNone);
+
+	INFO_PRINTF1(_L("CFbsBitmap::ExternalizeRectangleL()\r\n"));
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		TRAP(ret,iBitmap.ExternalizeRectangleL(writestrm,TRect(3,3,7,7)));
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+	writestrm.Close();
+	delete writestore;
+	iBitmap.Reset();
+	TEST(iFbs->ResourceCount()==0);
+
+// Internalize
+	INFO_PRINTF1(_L("CFbsBitmap::InternalizeL()\r\n"));
+	for (count = 1; ; count++)
+		{
+		// ReadStore creation
+		CDirectFileStore* readstore=NULL;
+		TRAP(ret,readstore=CDirectFileStore::OpenL(fs,buf,EFileStream|EFileRead|EFileShareAny));
+		TEST2(ret, KErrNone);
+		RStoreReadStream readstrm;
+		headerid=readstore->Root();
+		TRAP(ret,readstrm.OpenL(*readstore,headerid));
+		TEST2(ret, KErrNone);
+
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		TRAP(ret,iBitmap.InternalizeL(readstrm));
+
+		readstrm.Close();
+		delete readstore;
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	for (count = 1; ; count++)
+		{
+		// ReadStore re-creation
+		CDirectFileStore* readstore=NULL;
+//		TRAP(ret,readstore=CDirectFileStore::OpenL(fs,_L("c:\\tall.sbm"),EFileStream|EFileRead|EFileShareAny));
+		TRAP(ret,readstore=CDirectFileStore::OpenL(fs,buf,EFileStream|EFileRead|EFileShareAny));
+		TEST2(ret, KErrNone);
+		headerid=readstore->Root();
+		RStoreReadStream readstrm;
+		TRAP(ret,readstrm.OpenL(*readstore,headerid));
+		TEST2(ret, KErrNone);
+
+		iFbs->SendCommand(EFbsMessUserAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			iFbs->SendCommand(EFbsMessUserMark);
+			}
+
+		TRAP(ret,iBitmap.InternalizeL(readstrm));
+
+		readstrm.Close();
+		delete readstore;
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			iBitmap.Reset();
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				iFbs->SendCommand(EFbsMessUserMarkEnd);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+	iFbs->SendCommand(EFbsMessUserAllocFail,0);
+	TEST(iFbs->ResourceCount()==0);
+
+	fs.Delete(buf);
+	fs.Close();
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0513
+
+	@SYMTestCaseDesc
+	Checks allocations of CFbsTypeFaceStore Objects OOM conditions
+
+	@SYMTestActions
+	Uses different fonts and allocates CFbsTypeFaceStore objects
+	and checks them under Out Of Memory conditions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTAlloc::TypefaceStoreL()
+	{
+	TInt count;
+	TInt ret;
+	CFbsTypefaceStore* tfs = NULL;
+	INFO_PRINTF1(_L("CFbsTypefaceStore::NewL()\r\n"));
+
+	TInt heapMarkCheckFlag;
+	if( !iStep->GetIntFromConfig(KDefaultSectionName, KFbsHeapMarkCheckFlag, heapMarkCheckFlag) )
+		{
+		INFO_PRINTF1(_L("Error reading ini file"));
+		User::Leave(KErrNotFound);
+		}
+	
+// CFbsTypefaceStore::NewL()
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		TRAP(ret,tfs=CFbsTypefaceStore::NewL(NULL));
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			delete tfs;
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+
+// CFbsTypefaceStore::SetFontNameAliasL()
+	_LIT(KFontNameAlias,"Fubar");
+	TRAP(ret,tfs = CFbsTypefaceStore::NewL(NULL));
+	TEST2(ret, KErrNone);
+	TRAP(ret, tfs->SetFontNameAliasL(_L("ExpandArray"),_L("DejaVu Serif Condensed")));
+	TEST2(ret, KErrNone);
+	TRAP(ret, tfs->SetFontNameAliasL(_L("ExpandArray"),KNullDesC));
+	TEST2(ret, KErrNone);
+
+	for (count = 1; ; count++)
+		{
+		iFbs->SendCommand(EFbsMessDefaultAllocFail,count);
+		if(heapMarkCheckFlag)
+			{
+			iFbs->SendCommand(EFbsMessDefaultMark);
+			}
+
+		TRAP(ret, tfs->SetFontNameAliasL(KFontNameAlias,_L("DejaVu Serif Condensed")));
+
+		if (ret == KErrNoMemory)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd);
+				}
+			}
+		else if (ret == KErrNone)
+			{
+			if(heapMarkCheckFlag)
+				{
+				iFbs->SendCommand(EFbsMessDefaultMarkEnd,2);
+				}
+			break;
+			}
+		else 
+			TEST2(ret, KErrNone);
+		}
+
+	iFbs->SendCommand(EFbsMessDefaultAllocFail,0);
+
+// GetNearestFontToDesignHeightInTwips()
+	TFontSpec spec(_L("SwissA"),12);
+	CFont* font = NULL;
+	ret = tfs->GetNearestFontToDesignHeightInTwips(font,spec);
+	TEST2(ret, KErrNone);
+	tfs->ReleaseFont(font);
+	spec.iTypeface.iName = _L("DejaVu Serif Condensed");
+
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+		
+		ret = tfs->GetNearestFontToDesignHeightInTwips(font,spec);
+
+		if (ret == KErrNoMemory)
+			{
+			ASSERT(!font);
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			ASSERT(font);
+			tfs->ReleaseFont(font);
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+
+// GetNearestFontToDesignHeightInTwips() with alias
+	spec.iTypeface.iName = KFontNameAlias;
+	TRAP(ret, tfs->SetFontNameAliasL(KFontNameAlias,_L("DejaVu Serif Condensed")));
+	TEST2(ret, KErrNone);
+
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		ret = tfs->GetNearestFontToDesignHeightInTwips(font,spec);
+
+		if (ret == KErrNoMemory)
+			{
+			ASSERT(!font);
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			ASSERT(font);
+			tfs->ReleaseFont(font);
+			__UHEAP_MARKEND;
+			break;
+			}
+		else
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+	TRAP(ret, tfs->SetFontNameAliasL(KFontNameAlias,KNullDesC));
+	TEST2(ret, KErrNone);
+	delete tfs;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0514
+
+	@SYMTestCaseDesc
+	Asynchronous loading and saving of bitmaps
+
+	@SYMTestActions
+	Creates a loader for bitmaps and simulates Out Of Memory conditions
+	and then creates and saver and simulates Out Of Memory conditions
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTAlloc::BitmapHandlerL()
+	{
+	TInt ret=KErrNone;
+	CFbsBitmapAsyncStreamer* bmphandler=NULL;
+
+// Create loader
+	TInt count;
+	INFO_PRINTF1(_L("CFbsBitmapAsyncStreamer::NewL()\r\n"));
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		TRAP(ret,bmphandler = CFbsBitmapAsyncStreamer::NewL(CFbsBitmapAsyncStreamer::ELoad));
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			delete bmphandler;
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+	TEST(iFbs->ResourceCount()==0);
+
+// Create saver
+	for (count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		TRAP(ret,bmphandler=CFbsBitmapAsyncStreamer::NewL(CFbsBitmapAsyncStreamer::ESave));
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			delete bmphandler;
+			__UHEAP_MARKEND;
+			break;
+			}
+		else 
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	__UHEAP_RESET;
+	TEST(iFbs->ResourceCount()==0);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0515
+
+	@SYMTestCaseDesc
+	Tests memory allocation of CFontStore object
+
+	@SYMTestActions
+	CFontStore objects is created on the heap
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTAlloc::FontStoreL()
+	{
+	INFO_PRINTF1(_L("CFontStore::NewL()\r\n"));
+
+	for (TInt count = 1; ; count++)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic,count);
+		__UHEAP_MARK;
+
+		CFontStore* fs = NULL;
+		TRAPD(ret,fs = CFontStore::NewL(&User::Heap()));
+
+		if (ret == KErrNoMemory)
+			{
+			__UHEAP_MARKEND;
+			}
+		else if (ret == KErrNone)
+			{
+			delete fs;
+			__UHEAP_MARKEND;
+			__UHEAP_SETFAIL(RHeap::ENone,count);
+			break;
+			}
+		else
+			{
+			__UHEAP_MARKEND;
+			TEST2(ret, KErrNone);
+			}
+		}
+
+	}
+
+//--------------
+__CONSTRUCT_STEP__(Alloc)
+