s4 should be locksurface2 according to JM's spreadsheet, and the spec indicates 2 is a clarification of 1, so we can't offer both
// 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)