phonebookengines_old/contactsmodel/tsrc/T_PersistenceLayer.cpp
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/T_PersistenceLayer.cpp	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,718 @@
+// 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:
+// Persistence Layer Test module
+// 
+//
+
+
+#include <e32test.h>
+#include <coreappstest/testserver.h>
+#include "persistencelayer.h"
+#include "cnttestsynchroniser.h"
+
+_LIT(KTestName, "T_PersistenceLayer"); // Used by Testhelper
+
+#include "testhelpers.h"
+
+#include "NbCntTestLib/NbCntTestLib.h" 
+
+#include "T_PersistenceLayer.h"
+#include "T_CntTestImplDefs.h"
+
+
+#define RUN_PL
+#define RUN_CNT
+
+#define KUidContactFieldCustom1Value		0x101FD209
+#define KUidContactFieldCustom2Value		0x101FD20A
+const TUid KUidContactFieldCustom1={KUidContactFieldCustom1Value};
+const TUid KUidContactFieldCustom2={KUidContactFieldCustom2Value};
+_LIT(KCrudTestDbFile, "C:CRUD_TEST");
+
+//
+// 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_PERSISTENCELAYER_DUMP_CONTACT__
+//
+
+
+void CPersistenceTests::AllTestsL()
+	{
+	FileCreationL();
+
+	IccL();
+	DuplicatedFieldUidsL();
+
+	BasicCRUDL();
+	ViewDefsInclL();
+	ViewDefsMaskL();
+
+	TDriveUnit drv(EDriveC);
+	CDesCArray* arr = iCntTestImpl.ListDatabasesL(drv);
+	delete arr;
+
+	OomTestL();
+	AccessCountL();
+	TemplateAccessCountL();
+	GroupsL();
+	iCntTestImpl.CloseDatabase();
+	}
+	
+
+void CPersistenceTests::IccL()
+	{
+	CContactSyncChecker::ResetL();
+	CContactItem* iccEntry = CContactICCEntry::NewL(iCntTestImpl.GetSysTemplate());
+	PUSH(iccEntry);
+	
+	TCnt theCnt(iccEntry);
+	theCnt[KUidContactFieldGivenName] = _L("Name");
+	theCnt[KUidContactFieldFamilyName] = _L("Example");
+
+	iCntTestImpl.CreateL(*iccEntry);
+
+	POPD(iccEntry);
+	}
+
+
+void CPersistenceTests::OomTestL()
+	{
+	test.Next(_L("ReadLC OOM test"));
+	CContactItem* cnt = iCntTestImpl.ReadLC(1, *iMatchAll);
+	POPD(cnt);
+
+	TInt ret = 0;
+	for(TInt i=1; i < 2000; ++i)
+		{
+		__UHEAP_SETFAIL(RHeap::EDeterministic, i);
+		__UHEAP_MARK;
+		TRAP(ret, CContactItem* cnt = iCntTestImpl.ReadLC(1, *iMatchAll);	POPD(cnt); );
+		__UHEAP_MARKEND;
+		__UHEAP_RESET;
+
+		if (ret == KErrNone)
+			{
+			break;
+			}
+		else if (ret != KErrNoMemory)
+			{
+			TESTVALUE(ret, KErrNoMemory);
+			break;
+			}
+		if (!(i % 100))
+			{
+			test.Printf(_L("."), i/100);
+			}
+		}
+	test.Printf(_L("\r\n"));
+	}
+
+
+
+void CPersistenceTests::TemplateAccessCountL()
+	{
+	test.Next(_L("Template Access Count test"));
+
+	//Create a custom template
+	CContactItem* templ = iCntTestImpl.CreateContactCardTemplateLC(_L("UserTemplate"));
+	TContactItemId templId = templ->Id();
+	POPD(templ); templ = NULL;
+
+	//Read the template from the database
+	templ = iCntTestImpl.ReadLC(templId, *iMatchAll);
+	TESTVALUE(templ->IsDeleted(), EFalse);
+
+
+	//Create a contact based on the template
+	CContactItem* card = CContactCard::NewLC(templ);
+	TCnt theCnt(card);
+	theCnt[KUidContactFieldGivenName] += _L("Contact");
+	theCnt[KUidContactFieldFamilyName] += _L("Based on");
+	theCnt[KUidContactFieldEMail] & KHome += _L("User Template");
+	iCntTestImpl.CreateL(*card);
+
+	const TInt createdEntryId =  card->Id();
+	POPD(card); card = NULL;
+	POPD(templ); templ = NULL;
+
+	//Try to delete the template (it should only be marked and deleted)
+	TESTTRAP(iCntTestImpl.DeleteL(templId));
+
+	//Read the template from the database
+	//It should work and the template must be marked as deleted
+	templ = iCntTestImpl.ReadLC(templId, *iMatchAll);
+	TESTTRUE(templ->IsDeleted());
+	POPD(templ); templ = NULL;
+
+	//Delete the only contact, based on the user template
+	TESTTRAP(iCntTestImpl.DeleteL(createdEntryId));
+
+	//Because the contact was the only thing dependant on the template
+	//Template was deleted also
+	TRAPD(err, iCntTestImpl.ReadLC(templId, *iMatchAll); POPD(templ););
+	TESTVALUE(err, KErrNotFound);
+	}
+
+void CPersistenceTests::AccessCountL()
+	{
+	test.Next(_L("Access Count test"));
+	static const TInt KAccessReps = 10;
+	TInt i = 0;
+	const CContactTemplate& goldenTemplate = iCntTestImpl.GetSysTemplate();
+
+	//Create a contact and set Acces Count to 10.
+	CContactItem* card = CContactCard::NewLC(&goldenTemplate);
+	TCnt theCnt(card);
+
+	theCnt[KUidContactFieldGivenName] = _L("Sample");
+	theCnt[KUidContactFieldFamilyName] = _L("Test1");
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("mo1 7700900333");
+	theCnt[KUidContactFieldEMail] & KHome = _L("test@email");
+	theCnt[KUidContactFieldAddress] & KHome = _L("Home addresssssss");
+//	theCnt[KUidContactFieldLocality] & KHome = _L("Rome");
+
+	for(i = 0; i < KAccessReps; ++i )
+		{
+		card->IncAccessCount();
+		}
+	TESTTRUE(card->AccessCount() == KAccessReps);;
+	iCntTestImpl.CreateL(*card);
+	const TInt createdEntryId =  card->Id();
+	POPD(card);
+
+	//Check is Access cound was saved
+	card = iCntTestImpl.ReadLC(createdEntryId, *iMatchAll);
+	TESTTRUE(card->AccessCount() == KAccessReps);;
+	POPD(card);	
+
+	//Try to delete entry 10 times
+	for(i = 0; i < KAccessReps; ++i )
+		{
+		iCntTestImpl.DeleteL(createdEntryId);
+		}
+	//Delete doesn't physically delete an entry, is simply marks is as deleted.
+
+	//Check is Access count was saved, set it back to 0 and update
+	card = iCntTestImpl.OpenLC(createdEntryId, *iMatchAll);
+	TESTTRUE(card->IsDeleted());
+	TESTTRUE(card->AccessCount() == KAccessReps);;
+	for(i = 0; i < KAccessReps; ++i )
+		{
+		card->DecAccessCount();
+		}
+
+	iCntTestImpl.UpdateL(*card); //The contact is actually deleted here
+	POPD(card);					 //because the access count is now 0
+
+	//The contact should not be there anymore
+	TRAPD(err, card = iCntTestImpl.ReadLC(createdEntryId, *iMatchAll));
+	TESTTRUE(err == KErrNotFound);
+	}
+
+
+void CPersistenceTests::DuplicatedFieldUidsL()
+	{
+	CContactItem* cntItem = iCntTestImpl.OpenLC(1, *iMatchAll);
+	TCnt theCnt(cntItem);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("Before UID field")));
+#endif
+
+	theCnt[KUidContactFieldPhoneNumber] & KWork & KPager = _L("New work pager");
+	
+	iCntTestImpl.UpdateL(*cntItem);
+
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("After UID field")));
+#endif
+	
+	TPtrC phone = theCnt[KUidContactFieldPhoneNumber] & KWork & KPager;
+
+	POPD(cntItem);
+	}
+
+
+// Implementation of CPersistenceTests member functions
+
+void CPersistenceTests::FileCreationL()
+	{
+	test.Next(_L("File creation test"));
+
+#ifndef __SYMBIAN_CNTMODEL_USE_SQLITE__	
+	TRAPD(err,iCntTestImpl.CreateDatabaseL(_L("JustAFilename.ext"), ETrue));
+	TESTVALUE(err, KErrBadName); //The filename MUST contain a drive name
+#endif
+
+	iCntTestImpl.CreateDatabaseL(KCrudTestDbFile, ETrue);
+	const CContactTemplate& goldenTemplate = iCntTestImpl.GetSysTemplate();
+
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(goldenTemplate, _L("Template")));
+#endif
+
+	CContactItem* card = CContactCard::NewLC(&goldenTemplate);
+	TBuf<10> uidStr(_L("UidString"));
+	card->SetUidStringL(uidStr);
+	TCnt theCnt(card);
+
+	theCnt[KUidContactFieldGivenName] = _L("Example1");
+	theCnt[KUidContactFieldFamilyName] = _L("NameL");
+
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("mo1 7700900333");
+	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");
+
+	//If the code fails on this line, you most likely haven't built the cnttutil
+	//test library that create the test version of the system template cntmodel.rsc
+	theCnt[KUidContactFieldSecondName] = _L("Second name");
+
+	theCnt[KUidContactFieldCompanyName] = _L("Test");
+	theCnt[KUidContactFieldJobTitle]	= _L("Name1");
+	theCnt[KUidContactFieldPhoneNumber] & KWork & KVoice = _L("work Tel 12345");
+
+	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_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*card, _L("Before Creation")));
+#endif
+	iCntTestImpl.CreateL(*card);
+	POPD(card);
+
+	card = CContactCard::NewLC(&goldenTemplate);
+	theCnt[KUidContactFieldGivenName] = _L("Sample");
+	theCnt[KUidContactFieldFamilyName] = _L("Test");
+	theCnt[KUidContactFieldCompanyName] = _L("SYMBIANFOUNDATION");
+	theCnt[KUidContactFieldJobTitle]	= _L("Test");
+	theCnt[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("tel. 7700900333");
+	iCntTestImpl.CreateL(*card);
+	POPD(card);
+	
+	//Create a group
+	CContactGroup* group1 = iCntTestImpl.CreateGroupLC(_L("MyGroup1"));
+	POPD(group1);
+	}
+
+void CPersistenceTests::ViewDefsMaskL()
+	{
+	test.Next(_L("View Definition with Masks"));
+
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Full"), *iMatchAll));
+#endif
+
+	//ViewDefinition with masking of normal fields
+	CContactItemViewDef* viewDef0 = CContactItemViewDef::NewLC( CContactItemViewDef::EMaskFields,
+																CContactItemViewDef::EIncludeHiddenFields);	
+
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("MaskFields_nothing"), *viewDef0));
+#endif
+
+	viewDef0->AddL(KUidContactFieldGivenName);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Mask_GivenName"), *viewDef0));
+#endif
+
+	  viewDef0->AddL(KUidContactFieldPhoneNumber);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	  TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Mask_GNameAndPhones"), *viewDef0));
+#endif
+
+		viewDef0->AddL(KUidContactFieldEMail);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+		TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Mask_GNamePhonesAndEmails"), *viewDef0));
+#endif
+
+		viewDef0->Remove(2);
+	  viewDef0->Remove(1);
+	viewDef0->Remove(0);
+
+	viewDef0->AddL(KHome);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Mask_Home"), *viewDef0));
+#endif
+	viewDef0->Remove(0);
+
+	POPD(viewDef0);
+
+		
+	//ViewDefinition with masking of hidden fields
+	CContactItemViewDef* viewDef1 = CContactItemViewDef::NewLC( CContactItemViewDef::EIncludeFields,
+																CContactItemViewDef::EMaskHiddenFields);
+
+	viewDef1->AddL(KUidContactFieldGivenName);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyGivenName_noH"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+
+	viewDef1->AddL(KUidContactFieldPicture);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("noH_Photo"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+	POPD(viewDef1);
+
+	//todo: add more testing for hidden fields.
+	}
+
+
+
+void CPersistenceTests::ViewDefsInclL()
+	{
+	test.Next(_L("View Definition with Inclusions"));
+
+	CContactItem* cntItem = NULL;
+
+	//ViewDefinition with inclusion
+	CContactItemViewDef* viewDef1 = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+
+	cntItem = iCntTestImpl.ReadMinimalLC(1);
+	
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("Minimal")));
+#endif
+
+	POPD(cntItem);
+
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Full"), *iMatchAll));
+#endif
+
+	viewDef1->AddL(KUidContactFieldPhoneNumber);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyPhones"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+
+	viewDef1->AddL(KUidContactFieldAddress);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyAddress"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+
+	viewDef1->AddL(KUidContactFieldGivenName);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyGivenName"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+
+	viewDef1->AddL(KUidContactFieldEMail);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyEmails"), *viewDef1));
+#endif
+	  viewDef1->AddL(KUidContactFieldPhoneNumber);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	  TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("Emails_and_Phones"), *viewDef1));
+#endif
+		viewDef1->AddL(KUidContactFieldFamilyName);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+		TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("EmailsPhonesAndFamilyName"), *viewDef1));
+#endif
+		viewDef1->Remove(2);
+	  viewDef1->Remove(1);
+	viewDef1->Remove(0);
+
+	viewDef1->AddL(KUidContactFieldBirthday);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyBirthday"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+
+	viewDef1->AddL(KUidContactFieldPicture);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.PrintCntForViewL(_L("OnlyPicture"), *viewDef1));
+#endif
+	viewDef1->Remove(0);
+
+
+	POPD(viewDef1);
+	}
+
+
+
+void CPersistenceTests::GroupsL()
+	{
+	test.Next(_L("Groups testing"));
+	
+	//Create a new group
+	CContactGroup* group1 = iCntTestImpl.CreateGroupLC(_L("NewGroupLabel"));				//>>>
+	const TContactItemId newGroupID = group1->Id();
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group1, _L("NewGroup_created")));
+#endif
+	
+	//Add existing contact to the group
+	iCntTestImpl.GroupAddAndRemove(*group1, 1, -1);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group1, _L("GroupWithContAdded")));
+#endif
+	
+	//Add another existing contact to the groups
+	iCntTestImpl.GroupAddAndRemove(*group1, 2, -1);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group1, _L("GroupWithCont2Added")));
+#endif
+	
+	//Add the created group to an existing group
+	CContactGroup* group3 = static_cast<CContactGroup*>(iCntTestImpl.ReadLC(3, *iMatchAll));	//>>>
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group3, _L("ExitstingGroup3")));
+#endif
+	iCntTestImpl.GroupAddAndRemove(*group3, group1->Id(), -1);
+	POPD(group3);																	//<<<
+	POPD(group1);																	//<<<
+
+	//Print the existing group contents
+	group3 = static_cast<CContactGroup*>(iCntTestImpl.ReadLC(3, *iMatchAll));					//>>>
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group3, _L("Group3AddedGroup1")));
+#endif
+	POPD(group3);																	//<<<
+
+	//Delete one of the contacts, belonging to the newly created group
+	iCntTestImpl.DeleteL(2);
+	group1 = static_cast<CContactGroup*>(iCntTestImpl.ReadLC(newGroupID, *iMatchAll));			//>>>
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group1, _L("GroupWithContRemoved")));
+#endif
+	POPD(group1);																	//<<<
+
+	//Delete new group
+	iCntTestImpl.DeleteL(newGroupID);
+	group3 = static_cast<CContactGroup*>(iCntTestImpl.ReadLC(3, *iMatchAll));					//>>>
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*group3, _L("Group3-Group1WasDeleted")));
+#endif
+	//
+	
+	TRAPD(err, iCntTestImpl.GroupAddAndRemove(*group3, 238, -1));
+	TESTVALUE(err, KErrNotFound);
+	TRAP(err, iCntTestImpl.GroupAddAndRemove(*group3, -1, 1257));
+	TESTVALUE(err, KErrNotFound);
+
+	POPD(group3);																	//<<<
+	}
+
+
+void CPersistenceTests::BasicCRUDL()
+	{
+	test.Next(_L("Basic CRUD test"));
+
+
+	test.Printf(_L("Reading Template\n"));
+	CContactItem* cntItem = iCntTestImpl.ReadMinimalLC(0);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("GoldenTempl")));
+#endif
+	POPD(cntItem);
+
+	test.Printf(_L("Reading First contact\n"));
+	cntItem = iCntTestImpl.ReadMinimalLC(1);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("Contact_1")));
+#endif
+
+	TCnt theCnt2(cntItem);
+
+	theCnt2[KUidContactFieldPhoneNumber] & KHome & KVoice & KCell = _L("456456456");
+	theCnt2[KUidContactFieldPhoneNumber] & KWork & KVoice = _L("456456456");
+	
+	//Note that we are trying to create a contact, based on another conact which
+	//was read using ReadMinimal API. This API doest read template information
+	//So the newly created contact will not be bases on any template 
+	//(even not on Golden Template e.i.  TemplateRefId() == 0)
+	test.Printf(_L("Create new contact\n"));
+	TContactItemId newItemId = 0;
+	TESTTRAP(newItemId = iCntTestImpl.CreateL(*cntItem)); 
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("InMemoryAfterCreation")));
+#endif
+	POPD(cntItem);
+
+	test.Printf(_L("Reading Created contact\n"));
+	cntItem = iCntTestImpl.OpenLC(newItemId, *iMatchAll);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("Created_ReadFromDb")));
+#endif
+	
+	TCnt theCnt3(cntItem);
+	theCnt3[KUidContactFieldGivenName] = _L("new Given Name");
+	theCnt3[KUidContactFieldPhoneNumber] & KWork & KVoice = _L("123123123");
+	theCnt3[KUidContactFieldPhoneNumber] & KWork & KVoice & KCell += _L("123123123");
+	theCnt3[KUidContactFieldEMail] & KHome = _L("new@home");
+	theCnt3[KUidContactFieldAddress] & KHome = _L("new home address");
+
+	test.Printf(_L("Update contact\n"));
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("BeforeUpdate")));
+#endif
+	TESTTRAP(iCntTestImpl.UpdateL(*cntItem));
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("AfterUpdate")));
+#endif
+	POPD(cntItem);
+
+	test.Printf(_L("Reading Updated contact\n"));
+	cntItem = iCntTestImpl.ReadMinimalLC(newItemId);
+#ifdef __T_PERSISTENCELAYER_DUMP_CONTACT__
+	TESTTRAP(iCntTestImpl.DumpContactL(*cntItem, _L("Updated_ReadFromDb")));
+#endif
+	
+	iCntTestImpl.DeleteL(cntItem->Id()); 
+	
+	POPD(cntItem);
+	}
+
+
+//Persistence test construction and destruction
+CPersistenceTests* CPersistenceTests::NewLC (CCntTestImplementor& aCntTestImpl)
+	{
+	CPersistenceTests* self = new (ELeave) CPersistenceTests(aCntTestImpl);
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	return self;
+	}
+
+void CPersistenceTests::ConstructL()
+	{
+	iMatchAll = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields);
+	iMatchAll->AddL(KUidContactFieldMatchAll);
+	CleanupStack::Pop(iMatchAll);
+	}
+
+CPersistenceTests::~CPersistenceTests()
+	{
+	delete iMatchAll;
+	iMatchAll = NULL;
+	}
+
+/**
+
+@SYMTestCaseID PIM-T-PERSISTENCELAYER-0001
+
+*/
+
+LOCAL_C void DoTestsL()
+	{
+    CleanupClosePushL(test);
+	CPersistenceTests* cntTester = NULL;
+	test.Start(_L("@SYMTestCaseID:PIM-T-PERSISTENCELAYER-0001 Persistency tests"));
+	
+	RPIMTestServer serv;
+	User::LeaveIfError(serv.Connect());
+
+#ifdef RUN_PL
+
+	test.Start(_L("Persistence Layer Tests"));
+    __UHEAP_MARK;
+	CPlTestImpl* plCntTestImpl = CPlTestImpl::NewLC();
+  	cntTester = CPersistenceTests::NewLC(*plCntTestImpl);
+	cntTester->AllTestsL();
+	test(__NB_failures == 0);
+
+	POPD(cntTester);
+	CleanupStack::PopAndDestroy(plCntTestImpl);
+	plCntTestImpl = NULL;
+	test.End();
+    __UHEAP_MARKEND;
+
+#endif 
+
+#ifdef RUN_CNT
+
+	test.Start(_L("Contact model tests"));
+    __UHEAP_MARK;
+	CCntTestImpl* oldCntTestImpl = CCntTestImpl::NewLC();
+
+	cntTester = CPersistenceTests::NewLC(*oldCntTestImpl);
+	cntTester->AllTestsL();
+	POPD(cntTester);
+	test(__NB_failures == 0);
+
+	CleanupStack::PopAndDestroy(oldCntTestImpl);
+	oldCntTestImpl = NULL;
+	test.End();
+    __UHEAP_MARKEND;
+	User::After(1500000);
+#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());
+	test(err == KErrNone);
+	TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KCrudTestDbFile) );
+	__UHEAP_MARKEND;
+
+	
+    // Cleanup
+    delete activeScheduler;
+    delete cleanupStack;
+	activeScheduler = NULL;
+	cleanupStack = NULL;
+	
+	return err;
+    }
+
+