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: #include "T_IsolatedFontStore.h" sl@0: #include "openfontsprivate.h" sl@0: #include <f32file.h> sl@0: #include <e32test.h> sl@0: #include <fntstore.h> sl@0: #include <f32file.h> sl@0: #include <s32file.h> sl@0: #include <fbs.h> sl@0: #include <graphics/openfontconstants.h> sl@0: #include <graphics/openfontrasterizer.h> sl@0: #include "T_Cache.H" sl@0: sl@0: LOCAL_C TInt Ptr2Offset(const TAny* aAny, TUint8* aHeapBase) sl@0: { sl@0: if (aAny && aHeapBase) sl@0: { sl@0: return (TInt)aAny - (TInt)aHeapBase; sl@0: } sl@0: return 0; sl@0: } sl@0: sl@0: //LOCAL_C TAny* Offset2Ptr(const TInt aOffset, TUint8* aHeapBase) sl@0: // { sl@0: // if (aOffset && aHeapBase) sl@0: // { sl@0: // return (TAny*)(aOffset + (TInt)aHeapBase); sl@0: // } sl@0: // return NULL; sl@0: // } sl@0: sl@0: CTCache::CTCache(CTestStep* aStep): sl@0: CTGraphicsBase(aStep) sl@0: { sl@0: INFO_PRINTF1(_L("FontStore T_Cache test\n")); sl@0: iHeap=UserHeap::ChunkHeap(NULL,0x1000000,0x1000000); sl@0: } sl@0: sl@0: CTCache::~CTCache() sl@0: { sl@0: iHeap->Close(); sl@0: } sl@0: sl@0: //below code is for unit test and coverage only sl@0: sl@0: void CTCache::TFontCache() sl@0: { sl@0: #ifdef _DEBUG sl@0: TFontTableGlyphOutlineCacheMemMonitor mon; sl@0: CFontTableCache* fontCache = new CFontTableCache(iHeap,mon); sl@0: sl@0: //user array sl@0: TCacheUserInfo* user1 = new TCacheUserInfo(111,0); sl@0: TCacheUserInfo* user2 = new TCacheUserInfo(222,1); sl@0: RPointerArray<TCacheUserInfo> userArray; sl@0: userArray.Append(user1); sl@0: userArray.Append(user2); sl@0: sl@0: //item array sl@0: CFontTableCacheItem* item1; sl@0: TInt len = 3; sl@0: TAny* content = (iHeap->Alloc(3)); sl@0: TUid iUid = TUid::Uid(123456); sl@0: item1 = new CFontTableCacheItem(iUid, 0x68656164, Ptr2Offset(content, iHeap->Base()), len); sl@0: item1->SetUser(userArray); sl@0: RPointerArray<CFontTableCacheItem> itemArray; sl@0: itemArray.Append(item1); sl@0: sl@0: //font cache sl@0: fontCache->SetFontItem(itemArray); sl@0: TBool has = fontCache->HasOutstandingRefCount(); sl@0: TEST(has); sl@0: has = fontCache->HasOutstandingRefCountWithUid(iUid); sl@0: TEST(has); sl@0: TUid uid = TUid::Uid(1234); sl@0: fontCache->HasOutstandingRefCountWithUid(uid); //for coverage sl@0: sl@0: TAny *outline = NULL; sl@0: TInt length = 3; sl@0: TInt id = 0; sl@0: TUint32 tag = 0x1234; sl@0: TInt err = fontCache->Find(uid, tag, outline, length, &id); sl@0: TEST(err != KErrNone); sl@0: err = fontCache->Find(iUid, tag, outline, length, &id); sl@0: TEST(err != KErrNone); sl@0: __UHEAP_FAILNEXT(1); sl@0: fontCache->Append(uid, tag, content, length); sl@0: TEST(err != KErrNone); sl@0: __UHEAP_RESET; sl@0: sl@0: fontCache->CleanupCacheOnFbsSessionTermination(123); sl@0: TEST(err != KErrNone); sl@0: sl@0: userArray.Close(); sl@0: delete fontCache; sl@0: itemArray.Close(); sl@0: #endif sl@0: } sl@0: sl@0: void CTCache::TFontCacheItem() sl@0: { sl@0: #ifdef _DEBUG sl@0: TCacheUserInfo* user1 = new TCacheUserInfo(111,0); sl@0: TCacheUserInfo* user2 = new TCacheUserInfo(222,1); sl@0: RPointerArray<TCacheUserInfo> userArray; sl@0: userArray.Append(user1); sl@0: userArray.Append(user2); sl@0: sl@0: CFontTableCacheItem* item1; sl@0: TAny* content = User::Alloc(4); sl@0: TUid iUid = TUid::Uid(123456); sl@0: item1 = new CFontTableCacheItem(iUid, 0x68656164, Ptr2Offset(content, User::Heap().Base()), 3); sl@0: User::Free(content); sl@0: __UHEAP_FAILNEXT(1); sl@0: TInt err = item1->IncRefCount(111); sl@0: TEST(err == KErrNoMemory); sl@0: __UHEAP_RESET; sl@0: sl@0: TBool has = item1->HasOutstandingRefCount(); sl@0: TEST(!has); sl@0: sl@0: sl@0: item1->SetUser(userArray); sl@0: has = item1->HasOutstandingRefCount(); sl@0: TEST(has); sl@0: sl@0: TInt id = 1; sl@0: err = item1->FindUser(333, &id); sl@0: TEST(err != KErrNone); sl@0: sl@0: err = item1->DecRefCount(333); sl@0: TEST(err == KErrNotFound); sl@0: sl@0: sl@0: userArray.Close(); sl@0: delete item1; sl@0: sl@0: #endif sl@0: } sl@0: sl@0: void CTCache::TGlyphCacheItem() sl@0: { sl@0: #ifdef _DEBUG sl@0: sl@0: TCacheUserInfo* user1 = new TCacheUserInfo(111,0); sl@0: TCacheUserInfo* user2 = new TCacheUserInfo(222,1); sl@0: sl@0: RPointerArray<TCacheUserInfo> userArray; sl@0: userArray.Append(user1); sl@0: userArray.Append(user2); sl@0: sl@0: COutlineCacheItem* item1; sl@0: TInt len = 3; sl@0: TAny* content = User::Alloc(4); sl@0: item1 = new COutlineCacheItem(Ptr2Offset(content, User::Heap().Base()), len); sl@0: User::Free(content); sl@0: __UHEAP_FAILNEXT(1); sl@0: TInt err = item1->DecRefCount(333); sl@0: err = item1->IncRefCount(111); sl@0: TEST(err == KErrNoMemory); sl@0: __UHEAP_RESET; sl@0: sl@0: sl@0: item1->SetUser(userArray); sl@0: err = item1->IncRefCount(333); sl@0: TEST(err == KErrNone); sl@0: sl@0: userArray.Close(); sl@0: delete item1; sl@0: #endif sl@0: } sl@0: sl@0: void CTCache::THintedGlyphCache() sl@0: { sl@0: #ifdef _DEBUG sl@0: TFontTableGlyphOutlineCacheMemMonitor mon; sl@0: CHintedOutlineCache* hintedCache = new CHintedOutlineCache(iHeap,mon); sl@0: TCacheUserInfo* user1 = new TCacheUserInfo(111,0); sl@0: TCacheUserInfo* user2 = new TCacheUserInfo(222,1); sl@0: RPointerArray<TCacheUserInfo> userArray; sl@0: userArray.Append(user1); sl@0: userArray.Append(user2); sl@0: COutlineCacheItem* item1; sl@0: TInt len = 4; sl@0: //TUint content[] = {1,2,3}; sl@0: TAny* content = User::Alloc(4); sl@0: item1 = new COutlineCacheItem(Ptr2Offset(content, User::Heap().Base()), len); sl@0: item1->SetUser(userArray); sl@0: COpenFont* openFont = NULL; sl@0: THintedOutlineId hintedId(openFont, 11); sl@0: hintedCache->SetHintedItem(hintedId, item1); sl@0: RHashMap<THintedOutlineId, COutlineCacheItem*> map = hintedCache->GetHintedMap(); sl@0: //for coverage sl@0: THintedOutlineId hintedId1(openFont, 12); sl@0: TInt err = hintedCache->IncRefCount(hintedId1, 111); sl@0: TEST(err != KErrNone); sl@0: COpenFont* openFont1 = reinterpret_cast<COpenFont*>(0x123); sl@0: //for coverage sl@0: err = hintedCache->CleanupCacheOnOpenFontRemoval(openFont1); sl@0: TEST(err == KErrNone); sl@0: //following return value alway KErrNone sl@0: hintedCache->CleanupCacheOnFbsSessionTermination(111); sl@0: hintedCache->CleanupCacheOnFbsSessionTermination(333); sl@0: sl@0: TAny* ptr; sl@0: TInt size = 0; sl@0: __UHEAP_FAILNEXT(1); sl@0: hintedCache->CacheHintedOutline(hintedId1, &content, len, ptr, size); sl@0: __UHEAP_RESET; sl@0: sl@0: __RHEAP_FAILNEXT(iHeap, 1); sl@0: hintedCache->CacheHintedOutline(hintedId1, &content, len, ptr, size); sl@0: __RHEAP_RESET(iHeap); sl@0: sl@0: sl@0: mon.Inc(KFontTable_GlyphOutline_CacheMaxMem); sl@0: err = hintedCache->CacheHintedOutline(hintedId1, &content, len, ptr, len); sl@0: TEST(err == KErrNoMemory); sl@0: User::Free(content); sl@0: sl@0: map.Close(); sl@0: delete item1; sl@0: userArray.Close(); sl@0: delete hintedCache; sl@0: #endif sl@0: } sl@0: sl@0: void CTCache::TUnHintedGlyphCache() sl@0: { sl@0: #ifdef _DEBUG sl@0: TFontTableGlyphOutlineCacheMemMonitor mon; sl@0: CUnhintedOutlineCache* unhintedCache = new CUnhintedOutlineCache(iHeap,mon); sl@0: TCacheUserInfo* user1 = new TCacheUserInfo(111,0); sl@0: TCacheUserInfo* user2 = new TCacheUserInfo(222,1); sl@0: RPointerArray<TCacheUserInfo> userArray; sl@0: userArray.Append(user1); sl@0: userArray.Append(user2); sl@0: COutlineCacheItem* item1; sl@0: TInt len = 3; sl@0: TAny* content = (iHeap->Alloc(3)); sl@0: item1 = new COutlineCacheItem(Ptr2Offset(content, iHeap->Base()), len); sl@0: item1->SetUser(userArray); sl@0: TUid uid = TUid::Uid(123); sl@0: TUnhintedOutlineId unhintedId(uid, 11, 1); sl@0: unhintedCache->SetUnHintedItem(unhintedId, item1); sl@0: // RHashMap<TUnhintedOutlineId, COutlineCacheItem*> map = unhintedCache->GetHintedMap(); sl@0: TUnhintedOutlineId unhintedId1(uid, 12, 1); sl@0: TInt err = unhintedCache->IncRefCount(unhintedId1, 111); sl@0: TEST(err != KErrNone); sl@0: //for coverage sl@0: unhintedCache->CleanupCacheOnFbsSessionTermination(111); sl@0: unhintedCache->CleanupCacheOnFbsSessionTermination(333); sl@0: sl@0: TAny* ptr; sl@0: TInt size = 0; sl@0: __UHEAP_FAILNEXT(1); sl@0: unhintedCache->CacheUnhintedOutline(unhintedId1, &content, len, ptr, size); sl@0: __UHEAP_RESET; sl@0: sl@0: __RHEAP_FAILNEXT(iHeap, 1); sl@0: unhintedCache->CacheUnhintedOutline(unhintedId1, &content, len, ptr, size); sl@0: __RHEAP_RESET(iHeap); sl@0: sl@0: sl@0: mon.Inc(KFontTable_GlyphOutline_CacheMaxMem); sl@0: err = unhintedCache->CacheUnhintedOutline(unhintedId1, &content, len, ptr, len); sl@0: TEST(err == KErrNoMemory); sl@0: sl@0: userArray.Close(); sl@0: delete unhintedCache; sl@0: sl@0: #endif sl@0: } sl@0: sl@0: void CTCache::TFontCacheForCov() sl@0: { sl@0: #ifdef _DEBUG sl@0: TFontTableGlyphOutlineCacheMemMonitor mon; sl@0: CFontTableCache* fontCache = new CFontTableCache(iHeap,mon); sl@0: sl@0: TCacheUserInfo* user1 = new TCacheUserInfo(111,0); sl@0: RPointerArray<TCacheUserInfo> userArray; sl@0: userArray.Append(user1); sl@0: CFontTableCacheItem* item1; sl@0: TInt len = 3; sl@0: TAny* content = (iHeap->Alloc(3)); sl@0: TUid iUid = TUid::Uid(123456); sl@0: item1 = new CFontTableCacheItem(iUid, 0x68656164, Ptr2Offset(content, iHeap->Base()), len); sl@0: item1->SetUser(userArray); sl@0: RPointerArray<CFontTableCacheItem> itemArray; sl@0: itemArray.Append(item1); sl@0: fontCache->SetFontItem(itemArray); sl@0: sl@0: TBool has = fontCache->HasOutstandingRefCount(); sl@0: TEST(!has); sl@0: has = fontCache->HasOutstandingRefCountWithUid(iUid); sl@0: TEST(!has); sl@0: sl@0: TUint length = 3; sl@0: TUint32 tag = 0x1234; sl@0: TUid uid = TUid::Uid(1234); sl@0: mon.Inc(KFontTable_GlyphOutline_CacheMaxMem); sl@0: TInt err = fontCache->Append(uid, tag, content, length); sl@0: TEST(err == KErrNoMemory); sl@0: sl@0: userArray.Close(); sl@0: delete fontCache; sl@0: itemArray.Close(); sl@0: #endif sl@0: } sl@0: sl@0: void CTCache::RunTestCaseL(TInt aCurTestCase) sl@0: { sl@0: ((CTCacheStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName); sl@0: switch(aCurTestCase) sl@0: { sl@0: case 1: sl@0: ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0001")); sl@0: INFO_PRINTF1(_L("FontStore T_Cache test 1: TFontCacheItem\n")); sl@0: TFontCacheItem(); sl@0: break; sl@0: sl@0: case 2: sl@0: ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0002")); sl@0: INFO_PRINTF1(_L("FontStore T_Cache test 2: TFontCache\n")); sl@0: TFontCache(); sl@0: TFontCacheForCov(); sl@0: break; sl@0: sl@0: case 3: sl@0: ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0003")); sl@0: INFO_PRINTF1(_L("FontStore T_Cache test 3: THintedGlyphCacheItem\n")); sl@0: TGlyphCacheItem(); sl@0: break; sl@0: sl@0: case 4: sl@0: ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0004")); sl@0: INFO_PRINTF1(_L("FontStore T_Cache test 4: THintedGlyphCache\n")); sl@0: THintedGlyphCache(); sl@0: break; sl@0: sl@0: case 5: sl@0: ((CTCacheStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-Cache-0005")); sl@0: INFO_PRINTF1(_L("FontStore T_Cache test 5: TUnHintedGlyphCache\n")); sl@0: TUnHintedGlyphCache(); sl@0: break; sl@0: sl@0: case 6: sl@0: ((CTCacheStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName); sl@0: ((CTCacheStep*)iStep)->CloseTMSGraphicsStep(); sl@0: TestComplete(); sl@0: break; sl@0: } sl@0: ((CTCacheStep*)iStep)->RecordTestResultL(); sl@0: } sl@0: sl@0: //-------------- sl@0: __CONSTRUCT_STEP__(Cache) sl@0: sl@0: sl@0: