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: