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)