phonebookengines_old/contactsmodel/tsrc/cntmodel2/T_Packager.cpp
branchRCL_3
changeset 19 5b6f26637ad3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/cntmodel2/T_Packager.cpp	Tue Aug 31 15:05:21 2010 +0300
@@ -0,0 +1,1255 @@
+// Copyright (c) 2005-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:
+// Packaging Test module
+// 
+//
+
+
+#include <e32test.h>
+#include <coreappstest/testserver.h>
+
+_LIT(KTestName, "T_Packager"); // Used by Testhelper
+
+#include <cntfldst.h>
+#include "testhelpers.h"
+//#include "T_CntTest.h"
+
+#include "NbCntTestLib/NbCntTestLib.h" 
+
+#include "T_Packager.h"
+#include "T_CntTestImplDefs.h"
+#include "CCntPackager.h"
+#include <cntfilt.h>
+
+
+
+//#define RUN_CNT
+#define RUN_PL
+
+//
+// This test used to spit out a lot of html files which display
+// the contents of contact items. There are a lot of files
+// generated in the process which, as this is normally run on the
+// overnight build, are not read and just take up disk space.
+// Therefore, the call to the contact dumping method has been
+// configured out by #ifdefs and needs to be manually re-activated.
+//
+// So, uncomment the following line to turn on contact dumping.
+//#define __T_PACKAGER_DUMP_CONTACT__
+//
+
+
+#define KUidContactFieldCustom1Value		0x101FD209
+#define KUidContactFieldCustom2Value		0x101FD20A
+const TUid KUidContactFieldCustom1={KUidContactFieldCustom1Value};
+const TUid KUidContactFieldCustom2={KUidContactFieldCustom2Value};
+
+_LIT(KCreatePlPerform, "C:PlPerform.cdb");
+
+
+void CPackagerTests::AllTestsL()
+	{
+	ContactItemTestL();
+//	iCntTestImpl.CloseDatabase();
+	EmptyContactItemTestL();
+//	ContentTypeTestL();	
+	CntItemViewDefTestL();
+	CntViewDefTestL();	
+	DescArrayTestL();
+//	CContactIdArrayTestL();
+	CCntFilterTestL();
+	CntTextDefTestL();
+//	MessageBufferTestL();
+
+	iCntTestImpl.CloseDatabase();
+	}
+
+void CPackagerTests::ContactItemTestL()
+	{
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	test.Next(_L("ContactItemTestL"));
+
+
+	iCntTestImpl.CreateDatabaseL(nsCntTestImpl::KSecureDBName, ETrue);
+
+	const CContactTemplate& goldenTemplate = iCntTestImpl.GetSysTemplate();
+	//iTempl = iCntTestImpl.GetSysTemplate();
+
+#ifdef __T_PACKAGER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(goldenTemplate, _L("Template")));
+#endif
+
+	CContactItem* card = CContactCard::NewLC(&goldenTemplate);
+	TCnt theCnt(card);
+
+	theCnt[KUidContactFieldGivenName] = _L("AExample");
+	theCnt[KUidContactFieldFamilyName] = _L("BExample");
+
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("mo1 39849342");
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell += _L("mo2 34530903495803948503984545");
+
+	theCnt[KUidContactFieldEMail] & KHome = _L("home@email");
+	theCnt[KUidContactFieldAddress] & KHome = _L("Home addresssssss");
+	theCnt[KUidContactFieldLocality] & KHome = _L("Glazgo");
+	theCnt[KUidContactFieldIMAddress] & KHome & KWv = _L("wireless@village");
+	theCnt[KUidContactFieldSecondName] = _L("Second name");
+
+	theCnt[KUidContactFieldCompanyName] = _L("SymbianFoundation");
+	theCnt[KUidContactFieldJobTitle]	= _L("Driver");
+	theCnt[KUidContactFieldPhoneNumber] & KWork & KVoice = _L("work Tel 2342");
+
+	theCnt[KUidContactFieldEMail] & KWork = _L("work@email");
+	theCnt[KUidContactFieldUrl] & KWork = _L("sdfsd");
+	theCnt[KUidContactFieldAddress] & KWork = _L("afas df asd");
+	theCnt[KUidContactFieldLocality] & KWork = _L("sdfsd");
+
+	theCnt[KUidContactFieldCustom1] = _L("Filterable 1");
+	theCnt[KUidContactFieldCustom2] = _L("Filterable 2");
+
+	theCnt[KUidContactFieldGivenNamePronunciation] = _L("first name re");
+	theCnt[KUidContactFieldFamilyNamePronunciation] = _L("Last name re");
+	
+	theCnt[KUidContactFieldSIPID] & KPoc  = _L("SIP POC");
+	theCnt[KUidContactFieldSIPID] & KSwis = _L("SIP SWIS");
+	theCnt[KUidContactFieldSIPID] & KVoip = _L("SIP VOIP");
+
+#ifdef __T_PACKAGER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*card, _L("Before Creation")));
+#endif
+
+	iCntTestImpl.CreateL(*card);	
+	
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+	{
+		
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*card))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+	}
+	
+	CContactItem* cntItem = thePackage->UnpackCntItemLC();
+//	CleanupStack::PushL(cntItem);
+	err = CompareContactItemTestL(cntItem, card);
+	User::LeaveIfError(err);
+	CleanupStack::PopAndDestroy(3, thePackage);
+//	POPD(cntItem);
+//	POPD(card);
+//	POPD(thePackage);
+
+	
+	}
+
+void CPackagerTests::EmptyContactItemTestL()
+	{
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	test.Next(_L("EmptyContactItemTestL"));
+
+
+	CPersistenceLayer* iPersistLayer = CPersistenceLayer::NewLC(iFs);
+	CContactItemViewDef* cntItemVdef = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields, CContactItemViewDef::EMaskHiddenFields);
+	cntItemVdef->AddL(KUidContactFieldMatchAll);
+	
+	MLplContactsFile& cntFile = iPersistLayer->ContactsFileL();
+
+	TRAPD(err, cntFile.CreateL(KCreatePlPerform, true ? MLplContactsFile::EPlOverwrite : MLplContactsFile::EPlLeaveIfExist));
+	User::LeaveIfError(err);
+	TRAP(err, while(cntFile.OpenStepL(KCreatePlPerform)){});
+	User::LeaveIfError(err);
+	
+	CContactItem* card = NULL;
+	card = iPersistLayer->PersistenceBroker().ReadLC(KGoldenTemplateId, *cntItemVdef, EPlAllInfo, 0);
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	
+	err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+		
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*card))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+
+	CContactItem* cntItem = thePackage->UnpackCntItemLC();
+	err = CompareContactItemTestL(cntItem, card);
+	User::LeaveIfError(err);
+	CleanupStack::PopAndDestroy(5, thePackage);
+	
+	}
+
+void CPackagerTests::ContentTypeTestL()
+	{
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	test.Next(_L("ContentTypeTestL"));
+
+
+	iCntTestImpl.CreateDatabaseL(nsCntTestImpl::KSecureDBName, ETrue);
+
+	const CContactTemplate& goldenTemplate = iCntTestImpl.GetSysTemplate();
+	//iTempl = iCntTestImpl.GetSysTemplate();
+
+#ifdef __T_PACKAGER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(goldenTemplate, _L("Template")));
+#endif
+
+
+	CContactItem* card = CContactCard::NewLC(&goldenTemplate);
+	TCnt theCnt(card);
+
+	theCnt[KUidContactFieldGivenName] = _L("AExample");
+	theCnt[KUidContactFieldFamilyName] = _L("BExample");
+
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("mo1 39849342");
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell += _L("mo2 34530903495803948503984545");
+
+	theCnt[KUidContactFieldEMail] & KHome = _L("home@email");
+	theCnt[KUidContactFieldAddress] & KHome = _L("Home addresssssss");
+	theCnt[KUidContactFieldLocality] & KHome = _L("Glazgo");
+	theCnt[KUidContactFieldIMAddress] & KHome & KWv = _L("wireless@village");
+	theCnt[KUidContactFieldSecondName] = _L("Second name");
+
+	theCnt[KUidContactFieldCompanyName] = _L("SymbianFoundation");
+	theCnt[KUidContactFieldJobTitle]	= _L("Driver");
+	theCnt[KUidContactFieldPhoneNumber] & KWork & KVoice = _L("work Tel 2342");
+
+	theCnt[KUidContactFieldEMail] & KWork = _L("work@email");
+	theCnt[KUidContactFieldUrl] & KWork = _L("sdfsd");
+	theCnt[KUidContactFieldAddress] & KWork = _L("afas df asd");
+	theCnt[KUidContactFieldLocality] & KWork = _L("sdfsd");
+
+	theCnt[KUidContactFieldCustom1] = _L("Filterable 1");
+	theCnt[KUidContactFieldCustom2] = _L("Filterable 2");
+
+	theCnt[KUidContactFieldGivenNamePronunciation] = _L("first name re");
+	theCnt[KUidContactFieldFamilyNamePronunciation] = _L("Last name re");
+	
+	theCnt[KUidContactFieldSIPID] & KPoc  = _L("SIP POC");
+	theCnt[KUidContactFieldSIPID] & KSwis = _L("SIP SWIS");
+	theCnt[KUidContactFieldSIPID] & KVoip = _L("SIP VOIP");
+
+#ifdef __T_PACKAGER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*card, _L("Before Creation")));
+#endif
+	
+//	iCntTestImpl.CreateL(*card);
+	
+	// Get the Content Type from the contact item for testing.
+	// Contact Item Field Set	
+	CContactItemFieldSet& item1Fieldset = card->CardFields();
+	//CContactItemField* item1Field = &(item1Fieldset)[0];
+	TInt item1Fieldset_Count = item1Fieldset.Count();
+	CContentType* cntType1 = CContentType::NewL(item1Fieldset[0].ContentType());
+	CleanupStack::PushL(cntType1);
+		
+	if(item1Fieldset_Count<=0)
+		{
+		return;
+		}		
+	
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+	{
+		
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*cntType1))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+	}
+	
+	CContentType* cntType2 = thePackage->UnpackCntContentTypeLC();
+	err = CompareContentTypeTestL(*cntType1, *cntType2);
+	User::LeaveIfError(err);
+	CleanupStack::PopAndDestroy(4, thePackage);
+
+	}	
+	
+
+void CPackagerTests::CntTextDefTestL()
+	{
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);	
+	test.Next(_L("CntTextDefTestL"));
+
+
+	// To Do: Generate Test CContactTextDef object.
+	CContactTextDef* textDef1 = CContactTextDef::NewLC();
+	
+	//TContactViewPreferences preferences =  static_cast<TContactViewPreferences> (EContactsOnly | EUnSortedAtEnd | ESingleWhiteSpaceIsEmptyField);
+	
+	textDef1->AppendL(TContactTextDefItem(KUidContactFieldFamilyName));
+	textDef1->AppendL(TContactTextDefItem(KUidContactFieldGivenName));
+	textDef1->AppendL(TContactTextDefItem(KUidContactFieldCompanyName));
+	textDef1->AppendL(TContactTextDefItem(KUidContactFieldAddress));
+	textDef1->AppendL(TContactTextDefItem(KUidContactFieldEMail));
+	textDef1->AppendL(TContactTextDefItem(KUidContactFieldAdditionalName));
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	
+	TInt err = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*textDef1))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+
+	CContactTextDef* textDef2 = thePackage->UnpackCntTextDefLC();
+	err = CompareCntTextDefL(textDef1, textDef2);
+	User::LeaveIfError(err);
+	CleanupStack::PopAndDestroy(3, thePackage);
+	
+	}
+
+TInt CPackagerTests::CompareContactItemTestL(CContactItem* item1, CContactItem* item2)
+	{
+	
+	// Contact Item type
+	if(item1->Type()!=item2->Type())
+		{
+		return KErrNotFound;
+		}
+		
+	// Contact Item Field Set	
+	CContactItemFieldSet& item1Fieldset = item1->CardFields();
+	CContactItemFieldSet& item2Fieldset = item2->CardFields();
+	TInt item1Fieldset_Count = item1Fieldset.Count();
+	TInt item2Fieldset_Count = item2Fieldset.Count();
+	if(item1Fieldset_Count!=item2Fieldset_Count)
+		{
+		return KErrNotFound;
+		}	
+		
+	else // Same count!
+		{
+		for(TInt i=0; i<item1Fieldset_Count; i++)
+			{
+			if(CompareContactItemFieldTestL(&(item1Fieldset)[i], &(item2Fieldset)[i])!=KErrNone)
+				{
+				return KErrNotFound;	
+				}
+			
+			}
+		}
+
+	// Contact item's iAttributes
+	if(item1->iAttributes!=item2->iAttributes)
+		{
+		return KErrNotFound;
+		}
+	
+	// Contact item's ID
+	if(item1->Id()!=item2->Id())
+		{
+		return KErrNotFound;
+		}		
+		
+	// Contact item's TemplateRefId
+	if(item1->TemplateRefId()!=item2->TemplateRefId())
+		{
+		return KErrNotFound;
+		}	
+	
+	// Contact item's LastModified
+	if(item1->LastModified()!=item2->LastModified())
+		{
+		return KErrNotFound;
+		}					
+			
+	// Contact item's iCreationDate
+	if(item1->iCreationDate!=item2->iCreationDate)
+		{
+		return KErrNotFound;
+		}
+		
+	// Contact item's iAccessCount
+	if(item1->AccessCount()!=item2->AccessCount())
+		{
+		return KErrNotFound;
+		}		
+		
+	// Contact item's iGuid
+	if((item1->iGuid==NULL)||(item2->iGuid==NULL))
+		{
+		if(!((item1->iGuid==NULL)&&(item2->iGuid==NULL)))
+			{
+			return KErrNotFound;
+			}		
+		}
+	else	
+		{
+		if(item1->iGuid->Length()!=item2->iGuid->Length())
+			{
+			return KErrNotFound;
+			}	
+			
+		else
+			{
+			if(item1->iGuid->Compare(item2->iGuid->Des())!=0)
+				{
+				return KErrNotFound;
+				}	
+			}		
+		}
+		
+	// Contact item's group if applicable.
+	// We already check type above.
+	if((item1->Type()==KUidContactGroup)||
+	   (item1->Type()==KUidContactICCEntry)||
+	   (item1->Type()==KUidContactCard)||
+	   (item1->Type()==KUidContactOwnCard))
+		{
+		CContactCard* card1 = (CContactCard*) item1;
+		CContactCard* card2 = (CContactCard*) item2;
+		if((card1->GroupsJoined()==NULL)||(card2->GroupsJoined()==NULL))
+			{
+			if(!((card1->GroupsJoined()==NULL)&&(card2->GroupsJoined()==NULL)))
+				{
+				return KErrNotFound;
+				}
+				
+			}
+		else
+			{
+			CContactIdArray* array1 = card1->GroupsJoinedLC();
+			CContactIdArray* array2 = card2->GroupsJoinedLC();
+			if(array1->Count()!=array2->Count())
+				{
+				return KErrNotFound;
+				}	
+				
+			// Checked count above already.
+			for(TInt i=0;i<array1->Count();i++)			
+				{
+				if((*array1)[i]!=(*array2)[i])
+					{
+					return KErrNotFound;
+					}				
+				}
+			CleanupStack::PopAndDestroy(2);	
+			}
+		}
+			
+		// Contact item's items if applicable.
+	if(item1->Type()==KUidContactGroup)
+		{
+		CContactGroup* group1 = (CContactGroup*) item1;
+		CContactGroup* group2 = (CContactGroup*) item2;
+		if((group1->GroupsJoined()==NULL)||(group2->GroupsJoined()==NULL))
+			{
+			if(!((group1->GroupsJoined()==NULL)&&(group2->GroupsJoined()==NULL)))
+				{
+				return KErrNotFound;
+				}					
+			}	
+			
+		else
+			{
+			CContactIdArray* array1 = group1->GroupsJoinedLC();
+			CContactIdArray* array2 = group2->GroupsJoinedLC();
+			if(array1->Count()!=array2->Count())
+				{
+				return KErrNotFound;
+				}	
+				
+			// Checked count above already.
+			for(TInt i=0;i<array1->Count();i++)			
+				{
+				if((*array1)[i]!=(*array2)[i])
+					{
+					return KErrNotFound;
+					}				
+				}
+			CleanupStack::PopAndDestroy(2);	
+			}						
+		}
+						
+	
+	return KErrNone;
+	
+	}
+	
+TInt CPackagerTests::CompareContactItemFieldTestL(CContactItemField* itemField1, CContactItemField* itemField2)
+	{
+	// CContentType *iContentType;
+	/*if(!(itemField1->ContentType()==itemField2->ContentType()))
+		{
+		return KErrNotFound;
+		}*/
+	if(CompareContentTypeTestL(itemField1->ContentType(), itemField2->ContentType())!=KErrNone)
+		{
+		return KErrNotFound;
+		}
+		
+	// TStorageType iStorageType;
+	if(itemField1->StorageType()!=itemField2->StorageType())
+		{
+		return KErrNotFound;
+		}
+				
+	// HBufC* iLabel;	
+	if((itemField1->iLabel==NULL)||(itemField2->iLabel==NULL))
+		{
+		if(!((itemField1->iLabel==NULL)&&(itemField2->iLabel==NULL)))
+			{
+			return KErrNotFound;
+			}		
+		}	
+	else
+		{
+		if(itemField1->iLabel->Length()!=itemField2->iLabel->Length())
+			{
+			return KErrNotFound;
+			}
+		else
+			{
+			if(itemField1->iLabel->Compare(itemField2->iLabel->Des())!=0)
+				{
+				return KErrNotFound;
+				}
+			}				
+		}
+		
+	// TInt iId;
+	if(itemField1->iId!=itemField2->iId)
+		{
+		return KErrNotFound;
+		}
+		
+	// TUint32 iAttributes;
+	if(itemField1->iAttributes!=itemField2->iAttributes)
+		{
+		return KErrNotFound;
+		}	
+	
+	// TUint32 iExtendedAttributes;
+	if(itemField1->iExtendedAttributes!=itemField2->iExtendedAttributes)
+		{
+		return KErrNotFound;
+		}	
+	
+	// CContactFieldStorage* iStorage;
+    switch (itemField1->StorageType())
+        {
+    case KStorageTypeText:
+		if(itemField1->TextStorage()->Text()!=itemField2->TextStorage()->Text())
+			{
+			return KErrNotFound;
+			}			
+        break;
+        
+    case KStorageTypeStore:
+		if(itemField1->StoreStorage()->Thing()!=itemField2->StoreStorage()->Thing())			
+			{
+			return KErrNotFound;
+			}			
+        break;
+        
+    case KStorageTypeDateTime:
+		if(itemField1->DateTimeStorage()->Time()!=itemField2->DateTimeStorage()->Time())
+			{
+			return KErrNotFound;
+			}
+        break;
+        
+    case KStorageTypeContactItemId:
+		if(itemField1->AgentStorage()->Value()!=itemField2->AgentStorage()->Value())
+			{
+			return KErrNotFound;
+			}        
+        break;
+        
+    default:
+    	User::Leave(KErrNotSupported);
+    	break;
+        }
+        	
+	// TInt iTemplateFieldId;	
+	if(itemField1->iTemplateFieldId!=itemField2->iTemplateFieldId)
+		{
+		return KErrNotFound;
+		}		
+	
+	return KErrNone;
+	}
+	
+TInt CPackagerTests::CompareContentTypeTestL(const CContentType& contentType1, const CContentType& contentType2)
+	{
+	// CContentType *iContentType;
+	if(!(contentType1==contentType2))
+		{
+		return KErrNotFound;
+		}
+	
+	
+	return KErrNone;
+	}
+	
+TInt CPackagerTests::CompareCntTextDefL(CContactTextDef* textDef1, CContactTextDef* textDef2)
+	{
+	// CContactTextDef*
+	TInt textDef1_Count = textDef1->Count();
+	TInt textDef2_Count = textDef2->Count();	
+	if(textDef1_Count!=textDef2_Count)
+		{
+		return KErrNotFound;
+		}	
+		
+	else // Same count!
+		{
+		for(TInt i=0; i<textDef1_Count; i++)
+			{
+			if((*textDef1)[i].iFieldType.iUid!=(*textDef2)[i].iFieldType.iUid)
+				{
+				return KErrNotFound;
+				}
+				
+			if((*textDef1)[i].iSeperator!=(*textDef2)[i].iSeperator)
+				{
+				return KErrNotFound;
+				}				
+			}
+		}
+		
+	if(textDef1->FallbackField()!=textDef2->FallbackField())
+		{
+		return KErrNotFound;
+		}
+		
+	if(textDef1->ExactMatchOnly()!=textDef2->ExactMatchOnly())
+		{
+		return KErrNotFound;
+		}		
+
+	return KErrNone;
+	}
+
+
+void CPackagerTests::DescArrayTestL()
+	{
+	test.Next(_L("DescArrayTestL"));
+
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	// Create a Descriptor Array.
+	CDesCArray* testArray1 = new(ELeave) CDesCArrayFlat(5);
+	CleanupStack::PushL(testArray1);
+	testArray1->AppendL(_L("Symbian"));
+	testArray1->AppendL(_L("Software"));
+	testArray1->AppendL(_L("Ltd."));
+	testArray1->AppendL(_L("United Kingdom"));
+	testArray1->AppendL(_L("SE1"));
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+					
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*testArray1))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+		
+	CDesCArray* testArray2 = thePackage->UnpackDesCArrayLC();
+//	CleanupStack::PushL(testArray2);
+	err = CompareDescArrayTestL(testArray2, testArray1);
+	User::LeaveIfError(err);
+		
+	CleanupStack::PopAndDestroy(3, thePackage);
+	
+	}	
+	
+TInt CPackagerTests::CompareDescArrayTestL(CDesCArray* testArray1, CDesCArray* testArray2)
+	{				
+	// CDesCArray	
+	if((testArray1==NULL)||(testArray2==NULL))
+		{
+		if(!((testArray1==NULL)&&(testArray2==NULL)))
+			{
+			return KErrNotFound;
+			}		
+		}	
+		
+	else
+		{
+		if(testArray1->Count()!=testArray2->Count())
+			{
+			return KErrNotFound;
+			}
+		else
+			{
+			for(TInt i=0; i<testArray1->Count(); i++)
+				{
+				if((*testArray1)[i]!=(*testArray2)[i])
+					{
+					return KErrNotFound;
+					}
+				}
+			}				
+		}
+		
+	
+	return KErrNone;
+	}	
+	
+
+void CPackagerTests::CntItemViewDefTestL()
+	{
+	test.Next(_L("CntItemViewDefL"));
+
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	// Create a populated CContactItemViewDef object.
+	CContactItemViewDef* viewDef1=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields);
+	viewDef1->AddL(KUidContactFieldGivenName);
+	viewDef1->AddL(KUidContactFieldFamilyName);
+	viewDef1->AddL(KUidContactFieldPhoneNumber);
+	viewDef1->AddL(KUidContactFieldCompanyName);
+	viewDef1->AddL(KUidContactFieldAddress);
+	test(viewDef1->Count()==5);
+	test((*viewDef1)[0]==KUidContactFieldGivenName);
+	test((*viewDef1)[1]==KUidContactFieldFamilyName);
+	test((*viewDef1)[2]==KUidContactFieldPhoneNumber);
+	test((*viewDef1)[3]==KUidContactFieldCompanyName);
+	test((*viewDef1)[4]==KUidContactFieldAddress);
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+					
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*viewDef1))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+	
+	CContactItemViewDef* viewDef2 = thePackage->UnpackCntItemViewDefLC();
+	err = CompareCntItemViewDefTestL(viewDef1, viewDef2);
+	User::LeaveIfError(err);
+		
+	CleanupStack::PopAndDestroy(3, thePackage);
+	
+	}	
+	
+
+void CPackagerTests::CntViewDefTestL()
+	{
+	test.Next(_L("CntViewDefL"));
+
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	// Create a populated CContactItemViewDef object.
+	CContactItemViewDef* viewDef1=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields);
+	// CleanupStack::PushL(viewDef1);
+	viewDef1->AddL(KUidContactFieldGivenName);
+	viewDef1->AddL(KUidContactFieldFamilyName);
+	viewDef1->AddL(KUidContactFieldPhoneNumber);
+	viewDef1->AddL(KUidContactFieldCompanyName);
+	viewDef1->AddL(KUidContactFieldAddress);
+	test(viewDef1->Count()==5);
+	test((*viewDef1)[0]==KUidContactFieldGivenName);
+	test((*viewDef1)[1]==KUidContactFieldFamilyName);
+	test((*viewDef1)[2]==KUidContactFieldPhoneNumber);
+	test((*viewDef1)[3]==KUidContactFieldCompanyName);
+	test((*viewDef1)[4]==KUidContactFieldAddress);
+	
+	// Create CContactViewDef
+	CContactViewDef* def1=CContactViewDef::NewL(viewDef1);
+	CleanupStack::Pop(viewDef1); // viewDef1
+	CleanupStack::PushL(def1);
+	
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer = thePackage->GetTransmittingBuffer();
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+					
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*def1))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+	
+	CContactViewDef* def2 = thePackage->UnpackCntViewDefLC();
+	
+	err = CompareCntViewDefTestL(def1, def2);
+	User::LeaveIfError(err);
+	
+	CleanupStack::PopAndDestroy(3, thePackage);	
+
+	}	
+	
+void CPackagerTests::MessageBufferTestL()
+	{
+	test.Next(_L("MessageBufferTestL"));
+
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	// Create a Descriptor Array.
+	CDesCArray* testArray1 = new(ELeave) CDesCArrayFlat(5);
+	CleanupStack::PushL(testArray1);
+	testArray1->AppendL(_L("Symbian"));
+	testArray1->AppendL(_L("Software"));
+	testArray1->AppendL(_L("Ltd."));
+	testArray1->AppendL(_L("United Kingdom"));
+	testArray1->AppendL(_L("SE1"));
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtr8 theBuffer(NULL, NULL, NULL);
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+					
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*testArray1))));
+		err = error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+		
+	RMessage2 testMessage;		
+//	TDesC8& desBuf(theBuffer);
+	TInt length = theBuffer.Length();
+	TInt size = theBuffer.Size();
+	
+//	HBufC8* data = theBuffer.AllocLC();// HBufC8::NewLC(2000);
+	
+//	TPtr8 theBufferClone(data->Des());
+//	theBufferClone.Copy(theBuffer.Ptr());
+	length = theBuffer.Length();
+	size = theBuffer.Size();	
+	testMessage.WriteL(0, theBuffer);
+	testMessage.Complete(KErrNone);
+	
+	// Reset buffer and set buffer from the Message
+	thePackage->Clear();
+	thePackage->SetBufferFromMessageL(testMessage);
+
+		
+	CDesCArray* testArray2 = thePackage->UnpackDesCArrayLC();
+//	CleanupStack::PushL(testArray2);
+	err = CompareDescArrayTestL(testArray2, testArray1);
+	User::LeaveIfError(err);
+		
+	CleanupStack::PopAndDestroy(3, thePackage);
+	}
+	
+
+void CPackagerTests::CContactIdArrayTestL()
+	{
+	test.Next(_L("CContactIdArrayTestL"));
+
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	// Create a CContactIdArrayTestL Array from a contact item.
+	iCntTestImpl.CreateDatabaseL(nsCntTestImpl::KSecureDBName, ETrue);
+
+	const CContactTemplate& goldenTemplate = iCntTestImpl.GetSysTemplate();
+
+#ifdef __T_PACKAGER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(goldenTemplate, _L("Template")));
+#endif
+	
+	CContactItem* card = CContactCard::NewLC(&goldenTemplate);
+	TCnt theCnt(card);
+
+	theCnt[KUidContactFieldGivenName] = _L("AExample");
+	theCnt[KUidContactFieldFamilyName] = _L("BExample");
+
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("mo1 39849342");
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell += _L("mo2 34530903495803948503984545");
+
+	theCnt[KUidContactFieldEMail] & KHome = _L("home@email");
+	theCnt[KUidContactFieldAddress] & KHome = _L("Home addresssssss");
+	theCnt[KUidContactFieldLocality] & KHome = _L("Glazgo");
+	theCnt[KUidContactFieldIMAddress] & KHome & KWv = _L("wireless@village");
+	theCnt[KUidContactFieldSecondName] = _L("Second name");
+
+	theCnt[KUidContactFieldCompanyName] = _L("SymbianFoundation");
+	theCnt[KUidContactFieldJobTitle]	= _L("Driver");
+	theCnt[KUidContactFieldPhoneNumber] & KWork & KVoice = _L("work Tel 2342");
+
+	theCnt[KUidContactFieldEMail] & KWork = _L("work@email");
+	theCnt[KUidContactFieldUrl] & KWork = _L("sdfsd");
+	theCnt[KUidContactFieldAddress] & KWork = _L("afas df asd");
+	theCnt[KUidContactFieldLocality] & KWork = _L("sdfsd");
+
+	theCnt[KUidContactFieldCustom1] = _L("Filterable 1");
+	theCnt[KUidContactFieldCustom2] = _L("Filterable 2");
+
+	theCnt[KUidContactFieldGivenNamePronunciation] = _L("first name re");
+	theCnt[KUidContactFieldFamilyNamePronunciation] = _L("Last name re");
+	
+	theCnt[KUidContactFieldSIPID] & KPoc  = _L("SIP POC");
+	theCnt[KUidContactFieldSIPID] & KSwis = _L("SIP SWIS");
+	theCnt[KUidContactFieldSIPID] & KVoip = _L("SIP VOIP");
+
+#ifdef __T_PACKAGER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*card, _L("Before Creation")));
+#endif
+
+	iCntTestImpl.CreateL(*card);
+	
+	// Create second contact item
+	CPersistenceLayer* iPersistLayer = CPersistenceLayer::NewLC(iFs);
+	CContactItemViewDef* cntItemVdef = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields, CContactItemViewDef::EMaskHiddenFields);
+	cntItemVdef->AddL(KUidContactFieldMatchAll);
+	
+	MLplContactsFile& cntFile = iPersistLayer->ContactsFileL();
+
+	TRAPD(err, cntFile.CreateL(KCreatePlPerform, true ? MLplContactsFile::EPlOverwrite : MLplContactsFile::EPlLeaveIfExist));
+	User::LeaveIfError(err);
+	TRAP(err, while(cntFile.OpenStepL(KCreatePlPerform)){});
+	User::LeaveIfError(err);
+	
+	CContactItem* card2 = NULL;
+	card2 = iPersistLayer->PersistenceBroker().ReadLC(KGoldenTemplateId, *cntItemVdef, EPlAllInfo, 0);		
+		
+	
+	// Create CContactIdArray
+	CContactIdArray* theIdArray1 = CContactIdArray::NewLC();
+	theIdArray1->AddL(card->Id());
+	theIdArray1->AddL(card->TemplateRefId());
+	theIdArray1->AddL(card2->Id());
+	theIdArray1->AddL(card2->TemplateRefId());	
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer(NULL, NULL);
+	TInt err2  = KErrNoMemory;
+	while(err2==KErrNoMemory)
+		{
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*theIdArray1))));
+		err2= error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+		
+	CContactIdArray* theIdArray2 = thePackage->UnpackCntIdArrayLC();
+	err2 = CompareCContactIdArrayTestL(theIdArray1, theIdArray2);
+	User::LeaveIfError(err2);
+
+	CleanupStack::PopAndDestroy(7, thePackage);
+	}
+	
+TInt CPackagerTests::CompareCContactIdArrayTestL(CContactIdArray* idArray1, CContactIdArray* idArray2)
+	{				
+	// CContactIdArray
+	if((idArray1==NULL)||(idArray2==NULL))
+		{
+		if(!((idArray1==NULL)&&(idArray2==NULL)))
+			{
+			return KErrNotFound;
+			}		
+		}	
+		
+	else
+		{
+		if(idArray1->Count()!=idArray2->Count())
+			{
+			return KErrNotFound;
+			}
+		else
+			{
+			for(TInt i=0; i<idArray1->Count(); i++)
+				{
+				if((*idArray1)[i]!=(*idArray2)[i])
+					{
+					return KErrNotFound;
+					}
+				}
+			}				
+		}
+
+	return KErrNone;
+	}		
+	
+TInt CPackagerTests::CompareCntItemViewDefTestL(CContactItemViewDef* viewDef1, CContactItemViewDef* viewDef2)
+	{				
+	// CContactItemViewDef	
+
+	if(viewDef1->Mode()!=viewDef2->Mode())
+		{
+		return KErrNotFound;
+		}		
+	
+	if(viewDef1->Use()!=viewDef2->Use())
+		{
+		return KErrNotFound;
+		}		
+
+	if(viewDef1->Count()!=viewDef2->Count())
+		{
+		return KErrNotFound;
+		}
+	else
+		{
+		for(TInt i=0; i<viewDef1->Count(); i++)
+			{
+			if((*viewDef1)[i]!=(*viewDef2)[i])
+				{
+				return KErrNotFound;
+				}
+			}
+		}						
+	
+	return KErrNone;
+	}
+	
+TInt CPackagerTests::CompareCntViewDefTestL(CContactViewDef* def1, CContactViewDef* def2)
+	{				
+	// CContactViewDef	
+
+	return CompareCntItemViewDefTestL(&(def1->ItemDef()), &(def2->ItemDef()));
+	}	
+	
+
+void CPackagerTests::CCntFilterTestL()
+	{
+	test.Next(_L("CContactIdArrayTestL"));
+
+	CCntPackager* thePackage = CCntPackager::NewL();
+	CleanupStack::PushL(thePackage);
+	
+	// Create a CCntFilter item.
+	CCntFilter* filter1 = CCntFilter::NewL();
+	CleanupStack::PushL(filter1);
+
+	filter1->SetContactFilterTypeCard(ETrue);
+	TTime time;
+	time.UniversalTime();
+	time-=TTimeIntervalMinutes(20); // changes in the last 20 mins
+	filter1->SetFilterDateTime(time);
+	filter1->SetIncludeNewContacts(ETrue);
+	filter1->SetContactFilterTypeALL(ETrue);
+
+	// For now, call this to allocate memory for buffer in packager.
+	TPtrC8 theBuffer(NULL, NULL);
+	TInt err  = KErrNoMemory;
+	while(err==KErrNoMemory)
+		{
+		TRAPD(error, (theBuffer.Set(thePackage->PackL(*filter1))));
+		err= error;
+		if(error==KErrNoMemory)
+			{
+			thePackage->GetTransmittingBuffer();
+			
+			}
+		}
+		
+	CCntFilter* filter2 = thePackage->UnpackCntFilterLC();
+	err = CompareCCntFilterTestL(filter1, filter2);
+	User::LeaveIfError(err);
+
+	CleanupStack::PopAndDestroy(3, thePackage);
+	}
+	
+TInt CPackagerTests::CompareCCntFilterTestL(CCntFilter* filter1, CCntFilter* filter2)
+	{				
+	// CCntFilter
+	if(CompareCContactIdArrayTestL(filter1->iIds, filter2->iIds)!=KErrNone)
+		{
+		return KErrNotFound;
+		}
+	
+	if(filter1->GetFilterDateTime()!=filter2->GetFilterDateTime())
+		{
+		return KErrNotFound;
+		}
+		
+	if(filter1->iInclude!=filter2->iInclude)
+		{
+		return KErrNotFound;
+		}
+		
+	if(filter1->iContactType!=filter2->iContactType)
+		{
+		return KErrNotFound;
+		}		
+		
+	return KErrNone;
+	}		
+	
+//Persistence test construction and destruction
+CPackagerTests* CPackagerTests::NewLC (CCntTestImplementor& aCntTestImpl)
+	{
+	CPackagerTests* self = new (ELeave) CPackagerTests(aCntTestImpl);
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	return self;
+	}
+
+void CPackagerTests::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	iMatchAll = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	iMatchAll->AddL(KUidContactFieldMatchAll);
+	CleanupStack::Pop(iMatchAll);
+	}
+
+CPackagerTests::~CPackagerTests()
+	{
+	delete iMatchAll;
+	iFs.Close();	
+	}
+
+
+/**
+
+@SYMTestCaseID     PIM-T-PACKAGER-0001
+
+*/
+
+
+LOCAL_C void DoTestsL()
+	{
+    CleanupClosePushL(test);
+	CPackagerTests* cntTester = NULL;
+	test.Start(_L("@SYMTESTCaseID:PIM-T-PACKAGER-0001 Persistency tests"));
+
+	
+	RPIMTestServer serv;
+	User::LeaveIfError(serv.Connect());
+
+#ifdef RUN_CNT
+
+	test.Start(_L("Contact model tests"));
+
+    __UHEAP_MARK;
+	CCntTestImpl* oldCntTestImpl = CCntTestImpl::NewLC();
+
+	cntTester = CPackagerTests::NewLC(*oldCntTestImpl);
+	cntTester->AllTestsL();
+	POPD(cntTester);
+
+	CleanupStack::PopAndDestroy(oldCntTestImpl);
+	oldCntTestImpl = NULL;
+	test.End();
+    __UHEAP_MARKEND;
+#endif	
+
+#ifdef RUN_PL
+
+	test.Start(_L("Persistence Layer Tests"));
+
+    __UHEAP_MARK;
+	CPlTestImpl* plCntTestImpl = CPlTestImpl::NewLC();
+  	cntTester = CPackagerTests::NewLC(*plCntTestImpl);
+	cntTester->AllTestsL();
+
+	POPD(cntTester);
+	CleanupStack::PopAndDestroy(plCntTestImpl);
+	plCntTestImpl = NULL;
+	test.End();
+    __UHEAP_MARKEND;
+
+#endif 
+	
+
+	serv.Close();	
+	test.End();
+    CleanupStack::PopAndDestroy(1);  // test.Close
+
+	}
+
+
+
+
+GLDEF_C TInt E32Main()
+	{
+    // Init
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    if (!cleanupStack)
+        {
+        return KErrNoMemory;
+        }
+
+    CActiveScheduler* activeScheduler = new CActiveScheduler;
+    if (!activeScheduler)
+        {
+        return KErrNoMemory;
+        }
+    CActiveScheduler::Install(activeScheduler);
+
+    // Run the tests
+    __UHEAP_MARK;
+    TRAPD(err, DoTestsL());
+    __UHEAP_MARKEND;
+
+
+	test(__NB_failures == 0);
+		
+    // Cleanup
+    delete activeScheduler;
+    delete cleanupStack;
+	activeScheduler = NULL;
+	cleanupStack = NULL;
+	
+	return err;
+    }
+
+