fbs/fontandbitmapserver/tfbs/TCLEAN.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fbs/fontandbitmapserver/tfbs/TCLEAN.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,495 @@
+// 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 "../sfbs/UTILS.H"
+#include "TFBS.H"
+#include "TCLEAN.H"
+#include "fbsmessage.h"
+#include "fbsdefs.h"
+
+void CTClean::DeleteScanLineBuffer()
+	{
+	delete iFbs->iScanLineBuffer;
+	iFbs->iScanLineBuffer = NULL;
+	}
+
+CTClean::CTClean(CTestStep* aStep):
+	CTGraphicsBase(aStep),
+	iFbs(NULL),
+	iStore(NULL),
+	iBitmap(NULL),
+	iTc(NULL)
+	{}
+
+CTClean::~CTClean()
+	{
+	delete iStore;
+	if(iShutdownFbs)
+		RFbsSession::GetSession()->SendCommand(EFbsMessShutdown);
+	RFbsSession::Disconnect();
+	}
+
+void CTClean::ConstructL()
+	{
+	INFO_PRINTF1(_L("Font/Bitmap Server Thread Death Cleanup Testing"));
+
+	if(RFbsSession::Connect()==KErrNone)
+		{
+		RFbsSession::Disconnect();
+		iShutdownFbs = EFalse;
+		}
+	else
+		{
+		FbsStartup();
+		iShutdownFbs = ETrue;
+		}
+	RFbsSession::Connect();
+	iFbs=RFbsSession::GetSession();
+	iStore=CFbsTypefaceStore::NewL(NULL);
+	}
+
+void CTClean::RunTestCaseL(TInt aCurTestCase)
+	{
+	((CTCleanStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+	case 1:
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0593"));
+		INFO_PRINTF1(_L("Thread Cleanup\r\n"));
+		DeadThread();
+		break;
+	case 2:
+#if defined(_DEBUG)
+		INFO_PRINTF1(_L("Font\r\n"));
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0594"));
+		LaunchThread(EFont1);
+		((CTCleanStep*)iStep)->RecordTestResultL();
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0595"));
+		LaunchThread(EFont2);
+#else
+		((CTCleanStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+#endif
+		break;
+	case 3:
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0596"));
+		INFO_PRINTF1(_L("Bitmap\r\n"));
+		LaunchThread(EBitmap1);
+		break;
+	case 4:
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0597"));
+		INFO_PRINTF1(_L("Pile\r\n"));
+		LaunchThread(EPile1);
+		break;
+	case 5:
+		INFO_PRINTF1(_L("Session\r\n"));
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0598"));
+		LaunchThread(ESession1);
+		((CTCleanStep*)iStep)->RecordTestResultL();
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0599"));
+		LaunchThread(ESession2);
+		break;
+	case 6:
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0600"));
+		INFO_PRINTF1(_L("TypefaceStore\r\n"));
+		LaunchThread(ETypefaceStore1);
+		break;
+	case 7:
+		((CTCleanStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0601"));
+		INFO_PRINTF1(_L("Bad Message\r\n"));
+		LaunchThread(EBadMessage);
+	case 8:
+		((CTCleanStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTCleanStep*)iStep)->CloseTMSGraphicsStep();
+		TestComplete();		
+		break;
+		}
+	((CTCleanStep*)iStep)->RecordTestResultL();
+	}
+
+TInt CleanupTestThread(TAny* aAny)
+	{
+	CTClean* theTest = (CTClean*) aAny;
+	CTrapCleanup::New();
+	RFbsSession::Connect();
+	CFbsBitmapEx bmp1;
+	CFbsBitmapEx bmp2;
+	CFbsBitmapEx bmp3;
+	TInt ret=bmp1.Create(TSize(10,10),EGray2);
+	theTest->TEST(ret==KErrNone);
+	ret=bmp2.Create(TSize(100,100),EGray16);
+	theTest->TEST(ret==KErrNone);
+	ret=bmp3.Duplicate(bmp2.Handle());
+	theTest->TEST(ret==KErrNone);
+	CFbsFontEx* fon1;
+	CFbsFontEx* fon2;
+	CFbsTypefaceStore* tfs=NULL;
+	TRAP(ret,tfs=CFbsTypefaceStore::NewL(NULL));
+	theTest->TEST(ret==KErrNone);
+	ret=tfs->GetNearestFontToDesignHeightInPixels((CFont*&)fon1,TFontSpec(_L("Swiss"),12));
+	theTest->TEST(ret==KErrNone);
+	fon2=(CFbsFontEx*)User::Alloc(sizeof(CFbsFontEx));
+	theTest->TEST(fon2!=NULL);
+	new(fon2) CFbsFontEx;
+	ret=fon2->Duplicate(fon1->Handle());
+	theTest->TEST(ret==KErrNone);
+	TInt rc=RFbsSession::GetSession()->ResourceCount();
+	theTest->TEST(rc==5);
+	TInt id;
+#ifdef __WINS__
+	ret=tfs->AddFile(_L("z:\\resource\\fonts\\eon14.gdr"),id);
+#else
+	ret=tfs->AddFile(_L("z:\\resource\\fonts\\eon.gdr"),id);
+#endif
+	theTest->TEST(ret==KErrNone);
+	bmp2.LockHeap();
+	RFbsSession::Disconnect();
+	User::Panic(_L("CleanupTest"),KErrNone);
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0593
+
+	@SYMTestCaseDesc
+	Tests the cleaning when a thead is panicing.
+
+	@SYMTestActions
+	Creates a bitmap. Checks the resource count. Creates
+	a thread with high priority. Unlocks the heap and locks
+	it back again. Disables just-in-time debugging. Waits for 
+	he thead to complete its execution. The created thread creates
+	its own cleanup stack and connects to a FbsSession. It creates 
+	three bitmaps and duplicates one of them to the other. 
+	A FbsTypefaceStore object is created on the heap an 
+	GetNearestFontToDesignHeightInPixel is called on it. Disconnect
+	from the FbsSession. The thread is paniced and terminated. The
+	function that created the thread now continues its execution by
+	checking the exit reason for the thread. Closes the thead. Enables
+	just-in-time again. Locks the heap and unlocks it again.
+	Checks the resource count. Deletes scan line buffer. The
+	heap is checked for memory leaks.	
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTClean::DeadThread()
+	{
+	__UHEAP_MARK;
+	CFbsBitmapEx bmp;
+	TInt ret=bmp.Create(TSize(100,100),EGray16);
+	TEST(ret==KErrNone);
+	TInt rc=iFbs->ResourceCount();
+	TEST(rc==1);
+	RThread thrd;
+	TRequestStatus stat;
+	thrd.Create(_L("ctt"),CleanupTestThread,KDefaultStackSize,0x8000,0x8000,this);
+	thrd.SetPriority(EPriorityMuchMore);
+	thrd.Logon(stat);
+	User::SetJustInTime(EFalse);
+	bmp.LockHeap();
+	bmp.UnlockHeap();
+	thrd.Resume();
+	User::WaitForRequest(stat);
+	ret = thrd.ExitReason();
+	thrd.Close();
+	User::SetJustInTime(ETrue);
+	TEST(ret == KErrNone);
+	INFO_PRINTF1(_L("About to lock heap\r\n"));
+	bmp.LockHeap();
+	bmp.UnlockHeap();
+	rc=iFbs->ResourceCount();
+	TEST(rc==1);
+	DeleteScanLineBuffer();
+	__UHEAP_MARKEND;
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0594
+
+	@SYMTestCaseDesc
+	Tests a CFbsFontEx object in a thead function.
+	
+	@SYMTestActions
+	Connects to an FbsSession, creates a CFbsFontEx
+	object and gets the font address.
+	Thread returns with error code KErrNone.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt Font1(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	theTest->INFO_PRINTF1(_L("Font1"));
+	RFbsSession::Connect();
+	CFbsFontEx font;
+	(void)font.Address();
+	theTest->ERR_PRINTF1(_L("ERROR - NO PANIC"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0595
+
+	@SYMTestCaseDesc
+	Tests a CFbsFontEx object in a thead function.
+	
+	@SYMTestActions
+	Connects to an FbsSession, creates a CFbsFontEx object,
+	sets the fonts handle, gets the fonts address.
+	Thread returns with error code KErrNone.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt Font2(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	theTest->INFO_PRINTF1(_L("Font2"));
+	RFbsSession::Connect();
+	CFbsFontEx font;
+	font.SetHandle();
+	(void)font.Address();
+	theTest->ERR_PRINTF1(_L("ERROR - NO PANIC"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0596
+
+	@SYMTestCaseDesc
+	Creates a bitmap in a thread function, locks the heap
+	and panics the thread.
+	
+	@SYMTestActions
+	Connects to an FbsSession, creates a CFbsBitmapEx object,
+	creates a bitmap on the stack. Creation is checked for errors
+	and thenb locks the heap. The thread is paniced.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt Bitmap1(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	theTest->INFO_PRINTF1(_L("Bitmap1"));
+	RFbsSession::Connect();
+	CFbsBitmapEx bitmap;
+	TInt ret=bitmap.Create(TSize(200,200),EGray16);
+	if(ret!=KErrNone)
+		{
+		theTest->ERR_PRINTF1(_L("ERROR - BITMAP NOT CREATED"));
+		}
+	bitmap.LockHeap();
+	User::Panic(_L(""),KErrNone);
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0597
+
+	@SYMTestCaseDesc
+	Tests creation of a chunk in a thread function. 
+
+	@SYMTestActions
+	Creates a chunk. The thread returns with error code KErrNone.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt Pile1(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	theTest->INFO_PRINTF1(_L("Pile1"));
+	RChunk chunk;
+	CChunkPile::NewL(chunk);
+	theTest->ERR_PRINTF1(_L("ERROR - NO PANIC"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0598
+
+	@SYMTestCaseDesc
+	Tests sending a close command to a connected
+	server from a thread function.
+
+	@SYMTestActions
+	Connects to a FbsSession and sends a
+	EFbsMessClose-command to the server. The thread
+	returns with error code KErrNone.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt Session1(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	RFbsSession::Connect();
+	RFbsSession::GetSession()->SendCommand(EFbsMessClose);
+	theTest->INFO_PRINTF1(_L("Session1"));
+	theTest->ERR_PRINTF1(_L("ERROR - NO PANIC"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0599
+
+	@SYMTestCaseDesc
+	Tests sending an init command to a connected
+	server from a thread function.
+
+	@SYMTestActions
+	Connects to a FbsSession and sends a
+	EFbsMessInit-command to the server. The thread
+	returns with error code KErrNone.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt Session2(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	RFbsSession session;
+	session.SendCommand(EFbsMessInit);
+	theTest->INFO_PRINTF1(_L("Session2"));
+	theTest->ERR_PRINTF1(_L("ERROR - NO PANIC"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0600
+
+	@SYMTestCaseDesc
+	Tests the creation of a CFbsTypefaceStore
+	object on the heap in a thread function.
+
+	@SYMTestActions
+	Creates a CFbsTypefaceStore object on the heap
+	in a thread function and returns with error code
+	KErrNone.
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt TypefaceStore1(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	CFbsTypefaceStore::NewL(NULL);
+	theTest->INFO_PRINTF1(_L("TypefaceStore1"));
+	theTest->ERR_PRINTF1(_L("ERROR - NO PANIC"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0601
+
+	@SYMTestCaseDesc
+	Tests sending an invalid message from a thread function
+	to a connected FbsSession.
+
+	@SYMTestActions
+	Connects to a FbsSession. Gets a pointer to the session
+	object. Sends an invalid command to the server. The thread
+	returns with error code KErrNone.	
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+TInt BadMessage(TAny* aAny)
+	{
+	CTClean* theTest = static_cast <CTClean*> (aAny);
+	CTrapCleanup::New();
+	RFbsSession::Connect();
+	RFbsSession* sess=RFbsSession::GetSession();
+	sess->SendCommand(TFbsMessage(0x0fffffff));
+	theTest->INFO_PRINTF1(_L("Bad Message Test Thread"));
+	theTest->ERR_PRINTF1(_L("ERROR - BAD MESSAGE DID NOT PANIC THREAD"));
+	return(KErrNone);
+	}
+
+/**
+	@SYMTestCaseID
+	GRAPHICS-FBSERV-0602
+
+	@SYMTestCaseDesc
+	Launches different threads for testing.
+
+	@SYMTestActions
+	Creates a thread and gives it higher priority.
+	Disables just-in-time and starts the thread and 
+	waits for the it to finish. Closes the thead,
+	enables just-in-time and checks the heap for
+	memory leaks.	
+	
+	@SYMTestExpectedResults
+	Test should pass
+*/
+void CTClean::LaunchThread(TTestType aType)
+	{
+	__UHEAP_MARK;
+	RThread thrd;
+	TRequestStatus stat;
+	switch(aType)
+		{
+	case EFont1:
+		thrd.Create(_L("Font1"),Font1,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case EFont2:
+		thrd.Create(_L("Font2"),Font2,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case EBitmap1:
+		thrd.Create(_L("Bitmap1"),Bitmap1,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case EPile1:
+		thrd.Create(_L("Pile1"),Pile1,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case ESession1:
+		thrd.Create(_L("Session1"),Session1,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case ESession2:
+		thrd.Create(_L("Session2"),Session2,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case ETypefaceStore1:
+		thrd.Create(_L("TypefaceStore1"),TypefaceStore1,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	case EBadMessage:
+		thrd.Create(_L("BadMessage"),BadMessage,KDefaultStackSize,0x2000,0x2000,this);
+		break;
+	default:
+		User::Panic(_L("TCLEAN"),KErrArgument);
+		}
+	thrd.SetPriority(EPriorityMuchMore);
+	thrd.Logon(stat);
+	User::SetJustInTime(EFalse);
+	thrd.Resume();
+	User::WaitForRequest(stat);
+	thrd.Close();
+	User::SetJustInTime(ETrue);
+	__UHEAP_MARKEND;
+	}
+
+//--------------
+__CONSTRUCT_STEP__(Clean)
+