// 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
}