phonebookengines/contactsmodel/tsrc/cntmatchlog/src/t_logcntmodel.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/cntmatchlog/src/t_logcntmodel.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,718 @@
+// Copyright (c) 2006-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:
+//
+
+#include <e32test.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include <logcntmodel.h>
+#include "test.h"
+
+GLREF_D RTest theTest;
+GLDEF_D CTrapCleanup* theCleanup;
+
+RTest theTest(_L("Log View Contact Matching plugin test"));
+
+LOCAL_D void Check(TInt aValue, TInt aExpected, TInt aLine)
+	{
+	if(aValue != aExpected)
+		{
+		RDebug::Print(_L("*** Expected error: %d, got: %d\r\n"), aExpected, aValue);
+		theTest(EFalse, aLine);
+		}
+	}
+
+_LIT(KFirstName1, "Example");
+_LIT(KLastName1, "Name");
+_LIT(KNumber1, "447700900000");
+_LIT(KFirstName2, "Elma");
+_LIT(KLastName2, "Fudd");
+
+TBool OomTesting;
+
+
+//
+// Set the contents of a text field, creating the field if required
+//
+LOCAL_D void SetNameL(CContactItem& aItem,const TUid& aType,const TDesC& aName, TBool aAddField)
+	{
+	CContactItemFieldSet& fieldSet=aItem.CardFields();
+	const TInt pos=fieldSet.Find(aType);
+	if (!aAddField && pos!=KErrNotFound)
+		fieldSet[pos].TextStorage()->SetTextL(aName);
+	else
+		{
+		CContactItemField* field=CContactItemField::NewLC(KStorageTypeText,aType);
+   		field->SetMapping(KUidContactFieldVCardMapUnusedN);
+		field->TextStorage()->SetTextL(aName);
+		aItem.AddFieldL(*field);
+		CleanupStack::Pop(); // field
+		}
+	}
+
+//Creates a contact item. Then adds it to the default contacts database.
+LOCAL_D TLogContactItemId CreateContactL(const TDesC& aGivenName, 
+									 const TDesC& aFamilyName, 
+									 const TDesC& aPhoneNumber)
+	{
+	CContactItem* item=CContactCard::NewLC();
+
+	if (aFamilyName.Length())
+		SetNameL(*item, KUidContactFieldFamilyName, aFamilyName, ETrue);
+
+	if (aGivenName.Length())
+		SetNameL(*item, KUidContactFieldGivenName, aGivenName, ETrue);
+
+	if (aPhoneNumber.Length())
+		SetNameL(*item, KUidContactFieldPhoneNumber, aPhoneNumber, ETrue);
+
+	CContactItemFieldSet& fieldSet= item->CardFields();
+
+	TLogContactItemId id = KLogNullContactId;
+	
+	if (fieldSet.Count())
+		{
+		// Open the DB for writing
+		CContactDatabase* TheContacts = CContactDatabase::OpenL();
+		CleanupStack::PushL(TheContacts);
+		id = TheContacts->AddNewContactL(*item);
+		CleanupStack::PopAndDestroy(); // TheContacts,
+		}
+	else
+		User::Leave(KErrNotSupported);
+	CleanupStack::PopAndDestroy(item);
+	return id;
+	}
+	
+
+//This function checks the name read from the contacts DB is the same as the name saved in the DB.
+//Contact name format is taken into account.
+LOCAL_D void CheckContactName(TDesC& aName, const TDesC& aGivenName, const TDesC& aFamilyName, TLogContactNameFormat aContactNameFormat)
+	{
+	TBuf<128> fullname;
+	if(aContactNameFormat == ELogWesternFormat)
+		{
+		fullname.Format(_L("%S %S"), &aGivenName, &aFamilyName);
+		}
+	else //ELogChineseFormat
+		{
+		fullname.Format(_L("%S %S"), &aFamilyName, &aGivenName);
+		}
+	TEST(aName == fullname);
+	}
+	
+_LIT(KRemotePartyNameSeparator, " ");
+
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0001
+@SYMTestCaseDesc			Load the plug-in
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the NewL method of the interface class. 
+@SYMTestExpectedResults		A pointer to the plug-in should be returned. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D void TestLoadContactMatchingPluginL(CLogCntModel* &aCntModel)
+	{
+	// Delete the contacts DB
+	
+	// Note, suppressing test prints during OOM test because they flood epocwind.out and use memory
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0001 Delete the contacts DB to start the test"));
+
+	TRAPD(err, CContactDatabase::DeleteDefaultFileL());
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);
+	TEST(err == KErrNone || err == KErrNotFound);
+
+	// Load the plugin
+	aCntModel=NULL;
+	if(!OomTesting)
+		theTest.Next(_L("Load contact matching plugin"));
+
+	TRAP(err,aCntModel=CLogCntModel::NewL());
+	if( err==KEComErrNoInterfaceIdentified)
+		{
+		RDebug::Print(_L("Plugin not found"));
+		}
+	// Remove this line when DEF098715 is fixed
+	if(err==KErrNoMemory)REComSession::FinalClose();
+	
+	if(OomTesting && err==KErrNoMemory)
+
+		User::Leave(KErrNoMemory);
+
+	TEST2(err, KErrNone);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0002
+@SYMTestCaseDesc			Open the contacts session
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the OpenContactsL method of the interface class. 
+@SYMTestExpectedResults		The session should be created and opened. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist, Contacts DB should not exist
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D void TestOpenContactMatchingPluginL(CLogCntModel* aCntModel)
+	{	
+	// Open contacts DB
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0002 Open contacts DB using contact matching plugin"));
+
+	TRAPD(err, aCntModel->OpenContactsL());
+	
+	if(OomTesting && err==KErrNoMemory)
+
+		User::Leave(KErrNoMemory);
+	TEST2(err,KErrNone);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0003
+@SYMTestCaseDesc			Match a phone number to a contacts item 
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the MatchPhoneNumberL method of the interface class. 
+@SYMTestExpectedResults		A non-null contacts Id should be returned. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist, contacts DB should exist, a contact item for the test phone number should exist in the DB.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D TLogContactItemId TestMatchContactL(CLogCntModel* aCntModel)
+	{
+	// Read back a contact Id using the plugin interface, should be null
+	TLogContactItemId  contactId = KLogNullContactId;
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0003 Check that correct id read back when no contact exists using contact matching plugin"));
+
+	TRAPD(err, contactId=aCntModel->MatchPhoneNumberL(KNumber1, 7));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);	
+	TEST(KErrNone==err);
+	TEST2(contactId,KLogNullContactId);
+		
+	// Create a contact
+	if(!OomTesting)
+		theTest.Next(_L("Create a test entry to match"));
+
+	TLogContactItemId id1 = CreateContactL(KFirstName1, KLastName1, KNumber1);
+	
+	// Read back the contact Id using the plugin interface
+	contactId = KLogNullContactId;
+	if(!OomTesting)
+		theTest.Next(_L("Check that correct id read back using contact matching plugin"));
+
+	TRAP(err, contactId=aCntModel->MatchPhoneNumberL(KNumber1, 7));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);	
+	TEST(KErrNone==err);
+	TEST2(id1,contactId);
+	return contactId;
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0004
+@SYMTestCaseDesc			Fetch the string data for the contact item matching the phone number in Western format.
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the ReadContactNameL method of the interface class using the contacts Id retrieved by APPENG-CNTMODEL-EC021-CIT-0003 using Western format.  
+@SYMTestExpectedResults		The text for the contacts item should be retrieved and should be the text in the item created for the test, in Western format. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist, contacts DB should exist, a contact item for the test phone number should exist.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D void TestGetWesternContactStringL(CLogCntModel* aCntModel, TLogContactItemId aContactId)
+	{
+	// Read back the text information in Western format using the plugin interface
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0004 Check that correct string ( Western Format ) read back using contact matching plugin"));
+
+	// Setup buffer to contain concatenated result
+	TBuf<128> buf;
+	TRAPD(err, aCntModel->ReadContactNameL(aContactId, buf, ELogWesternFormat));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);	
+	TEST(KErrNone==err);
+	::CheckContactName(buf, KFirstName1, KLastName1, ELogWesternFormat);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0005
+@SYMTestCaseDesc			Fetch the string data for the contact item matching the phone number in Chinese format.
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the ReadContactNameL method of the interface class using the contacts Id retrieved by APPENG-CNTMODEL-EC021-CIT-0003 using Chinese format. 
+@SYMTestExpectedResults		The text for the contacts item should be retrieved and should be the text in the item created for the test, in Chinese format. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist, contacts DB should exist, a contact item for the test phone number should exist.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+
+LOCAL_D void TestGetChineseContactStringL(CLogCntModel* aCntModel, TLogContactItemId aContactId)
+	{
+	// Read back the text information in Chinese format using the plugin interface
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0005 Check that correct string ( Chinese Format ) read back using contact matching plugin"));
+
+	// Setup buffer to contain concatenated result
+	TBuf<128> buf;
+	TRAPD(err, aCntModel->ReadContactNameL(aContactId, buf, ELogChineseFormat));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);	
+	TEST(KErrNone==err);
+	::CheckContactName(buf, KFirstName1, KLastName1, ELogChineseFormat);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0012
+@SYMTestCaseDesc			Check failure cases for String Get.
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				Calls are made to the ReadContactNameL method for 3 failure cases
+							A buffer that is too small, 
+							A non-existent contact id 
+							An existing contact id with an incorrect format parameter.
+@SYMTestExpectedResults		For the buffer being too small no errors should occur. 
+							For a non-existent contact id no string should be found.
+							For an existing contact id with an incorrect format parameter the Western format string should be returned.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist, contacts DB should exist, a contact item for the test phone number should exist.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+
+LOCAL_D void TestFailGetContactStringL(CLogCntModel* aCntModel, TLogContactItemId aContactId)
+	{
+	// Read back the text information into a buffer too small to hold it using the plugin interface
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0012 Read back the text information into a buffer too small to hold it using the plugin interface"));
+
+	// Setup buffer to contain concatenated result
+	TBuf<1> overflow;
+	TRAPD(err, aCntModel->ReadContactNameL(aContactId, overflow, ELogWesternFormat));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);	
+	TEST(KErrNone==err);
+	
+	// Read back the text information for a non-existent Id using the plugin interface
+	if(!OomTesting)
+		theTest.Next(_L("Check no string read back for a non-existent Id using contact matching plugin"));
+
+	// Set id1 to a non-existent Id
+	aContactId=100;
+	// Re-initialise buffer
+	// Setup buffer to contain concatenated result
+	TBuf<128> buf;
+	// Initialise buffer
+	buf=_L("");
+	TRAP(err, aCntModel->ReadContactNameL(aContactId, buf, ELogWesternFormat));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);
+	TEST(KErrNotFound==err);
+	TEST(buf.Length()==0);
+
+	// Read back the text information for an existing Id when making a call with an incorrect format parameter using the plugin interface
+	if(!OomTesting)
+		theTest.Next(_L("Check that correct string for an existing Id ( Western Format ) read back when making a call with an incorrect format parameter using contact matching plugin"));
+
+	// Set id1 to a existing Id
+	TLogContactItemId contactId=1;
+	buf=_L("");
+	TRAP(err, aCntModel->ReadContactNameL(contactId, buf, static_cast<TLogContactNameFormat>(100)));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);
+	TEST(KErrNone==err);
+	::CheckContactName(buf, KFirstName1, KLastName1, ELogWesternFormat);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0006
+@SYMTestCaseDesc			Attempt to match a phone number to a contacts Id when more than one contacts items exist that match the phone number
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the MatchPhoneNumberL method of the interface class. 
+@SYMTestExpectedResults		The null Id should be returned. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist, contacts DB should exist, more than one contact item for the test phone number should exist ( these should be created for the test ).
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D void TestMultiContactMatchL(CLogCntModel* aCntModel)
+	{
+	// Check that NULL Id is returned for phone number with > 1 contact
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0006 Test contacts matching for a phone number with multiple contacts defined"));
+
+	// Create another contact with the same number
+	(void)CreateContactL(KFirstName2, KLastName2, KNumber1);
+	aCntModel->OpenContactsL();
+	TLogContactItemId contactId=KLogNullContactId;
+	TRAPD(err, contactId=aCntModel->MatchPhoneNumberL(KNumber1, 7));
+	if(OomTesting && err==KErrNoMemory)
+		User::Leave(KErrNoMemory);
+	TEST(KErrNone==err);
+	// Check no contact is returned
+	TEST(KLogNullContactId==contactId);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0007
+@SYMTestCaseDesc			Close the open contacts session.
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				A call is made to the CloseContacts method of the interface class. 
+@SYMTestExpectedResults		The session should close. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist. Contacts session should be open.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D void TestCloseContactMatchingPluginL(CLogCntModel* aCntModel)
+	{
+
+	// Close contacts DB
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0007 Close contacts DB using contact matching plugin"));
+
+	aCntModel->CloseContacts();
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0008
+@SYMTestCaseDesc			Attempt to open the contacts session when it is already opened.
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				Two consecutive calls are made to the OpenContactsL method of the interface class. 
+@SYMTestExpectedResults		The session should remain open. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+LOCAL_D void TestMultiOpenContactMatchingPluginL(CLogCntModel* aCntModel)
+	{
+	// Test consecutive opens of contacts DB using contact matching plugin
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0008 Test consecutive opens of contacts DB using contact matching plugin"));
+
+	aCntModel->OpenContactsL();
+	aCntModel->OpenContactsL();
+	}
+ 
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0009
+@SYMTestCaseDesc			Attempt to close the contacts session when it is not open.
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				Two consecutive calls are made to the CloseContacts method of the interface class. 
+@SYMTestExpectedResults		Nothing should happen. No errors should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist. 
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+
+
+LOCAL_D void TestMultiCloseContactMatchingPluginL(CLogCntModel *aCntModel)
+	{
+	// Test consecutive closes of contacts DB using contact matching plugin
+	if(!OomTesting)
+		theTest.Next(_L("@SYMTESTCaseID:PIM-APPENG-CNTMODEL-EC021-CIT-0009 Test consecutive closes of contacts DB using contact matching plugin"));
+
+	aCntModel->CloseContacts();
+	aCntModel->CloseContacts();
+	}
+
+// Call the functional tests for the contacts matching plug-in
+
+
+LOCAL_D void TestContactMatchingPluginL()
+	{
+	CLogCntModel* cntModel=NULL;
+	TestLoadContactMatchingPluginL(cntModel);
+	CleanupStack::PushL(cntModel);
+	
+	TestOpenContactMatchingPluginL(cntModel);
+	TLogContactItemId contactId = TestMatchContactL(cntModel);
+	TestGetWesternContactStringL(cntModel, contactId);
+	TestGetChineseContactStringL(cntModel, contactId);
+	TestFailGetContactStringL(cntModel, contactId);
+	TestMultiContactMatchL(cntModel);
+	TestCloseContactMatchingPluginL(cntModel);
+	TestMultiOpenContactMatchingPluginL(cntModel);
+	TestMultiCloseContactMatchingPluginL(cntModel);
+		
+	// Delete the plugin
+	if(!OomTesting)
+		theTest.Next(_L("Unload the plugin"));
+
+	CleanupStack::PopAndDestroy(cntModel);
+	}
+	
+const TInt KMaxIterations     =   100;
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0011
+@SYMTestCaseDesc			Performance measurement test
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				Make 100 calls to all the interface methods and report the average time for each call. 
+@SYMTestExpectedResults		No errors should occur. The average time taken for all the API’s should be printed to epocwind.out.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist. The contacts DB should contain some contact items for test purposes.
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+LOCAL_D void PerformanceTestContactMatchingPluginL()
+	{
+	TIMERINSTALL;
+	TInt i;
+
+	// Delete the contacts DB so when we open it teh 1st time the DB will be created
+	theTest.Printf(_L("Delete the contacts DB\n"));
+	TRAPD(err, CContactDatabase::DeleteDefaultFileL());
+	TEST(err == KErrNone || err == KErrNotFound);
+	
+	CLogCntModel *cntModel=NULL;
+	for (i = 0; i < KMaxIterations; i++)
+		{
+		TIMERSTART;
+		// Don't trap open, want the load time only
+		cntModel=CLogCntModel::NewL();
+		TIMERSTOP;
+		TIMERPRINT;
+		// Delete to allow next create
+		delete cntModel;
+		}
+	theTest.Printf(_L("Average: Plugin load           (us) %08d\n"), TIMERAVERAGE);
+
+	// Load the plug-in for the rest of the test
+	cntModel=CLogCntModel::NewL();
+	CleanupStack::PushL(cntModel);
+
+	TIMERRESET;
+	TIMERSTART;
+	// Open contacts DB - this will create the DB because it doesn't exist
+	cntModel->OpenContactsL();
+	TIMERSTOP;
+	theTest.Printf(_L("First open of contacts DB      (us) %08d\n"), delta);
+	// Close DB so we can reopen it in the test below.
+	cntModel->CloseContacts();
+	
+	TIMERRESET;
+	for (i = 0; i < KMaxIterations; i++)
+		{
+		TIMERSTART;
+		// Don't trap open, want the load time only
+		cntModel->OpenContactsL();
+		TIMERSTOP;
+		TIMERPRINT;		
+		// Close to allow next open
+		cntModel->CloseContacts();
+		}
+	theTest.Printf(_L("Average: Open contacts DB      (us) %08d\n"), TIMERAVERAGE);
+	
+	// Open the contacts DB for the rest of the test.
+	cntModel->OpenContactsL();
+	
+	// Create a contact
+	TLogContactItemId id1 = CreateContactL(KFirstName1, KLastName1, KNumber1);
+	
+	// Setup buffer to contain concatenated result
+	TBuf<128> buf;
+	// Separator
+	TBufC<2> separator(KRemotePartyNameSeparator);
+	
+	// Get average time to read the contact Id using the plugin interface
+	TIMERRESET;
+	for (i = 0; i < KMaxIterations; i++)
+		{
+		TLogContactItemId  contactId;
+		TIMERSTART;
+		contactId=cntModel->MatchPhoneNumberL(KNumber1, 7);
+		TIMERSTOP;
+		TIMERPRINT;
+		TEST2(id1,contactId);
+		}
+	theTest.Printf(_L("Average: Match phone number    (us) %08d\n"), TIMERAVERAGE);
+	
+	// Get average time to read the text information using the plugin interface
+	TIMERRESET;
+	for (i = 0; i < KMaxIterations; i++)
+		{
+		TIMERSTART;
+		cntModel->ReadContactNameL(id1, buf, ELogWesternFormat);
+		TIMERSTOP;
+		TIMERPRINT;
+		}
+	theTest.Printf(_L("Average: Read contact info     (us) %08d\n"), TIMERAVERAGE);
+
+	// Get average time to close the DB using the plugin interface
+	TIMERRESET;
+	for (i = 0; i < KMaxIterations; i++)
+		{
+		TIMERSTART;
+		cntModel->CloseContacts();
+		TIMERSTOP;
+		TIMERPRINT;
+		// Reopen to allow next close
+		cntModel->OpenContactsL();
+		}
+	theTest.Printf(_L("Average: Close contacts DB     (us) %08d\n"), TIMERAVERAGE);
+
+	cntModel->CloseContacts();
+	CleanupStack::PopAndDestroy(); // cntModel;
+	
+	// Check memory usage for plugin. At this stage ECOM and contacts are running so the HEAP usage
+	// detected by loading the plugin should be just due to the plugin
+
+	// Save initial heap available size
+	TInt largestBlock;
+	TInt initialSize=User::Heap().Available(largestBlock);
+
+	// Load plugin and save heap available size
+	cntModel=CLogCntModel::NewL();
+	TInt size=User::Heap().Available(largestBlock);
+	
+	// Delete the plugin and check that the heap size reverts to the initial size
+	delete cntModel;
+	TEST(initialSize==User::Heap().Available(largestBlock));
+	
+	// Print heap used by plugin load
+	theTest.Printf(_L("Plugin load uses %08d bytes on the heap\n"), initialSize-size);
+	}
+
+/**
+@SYMTestCaseID				PIM-APPENG-CNTMODEL-EC021-CIT-0010
+@SYMTestCaseDesc			Resource leak test
+@SYMTestType				CIT
+@SYMTestPriority			High
+@SYMTestActions				Repeat all the previous test cases in an OOM test and check for handle leaks. 
+@SYMTestExpectedResults		No memory leaks or handle leaks should occur.
+@SYMTestStatus				Implemented
+@SYMTestCaseDependencies	Plug-in implementation must exist
+@SYMEC						EC021 Break dependency of Log engine (Syslibs/Logeng) on Contacts model (App-engines/Cntmodel)
+*/
+LOCAL_C void OomTest(void (*testFuncL)(void))
+	{	
+	TInt error;
+	TInt count = 0;
+	OomTesting = ETrue;
+
+	do
+		{
+		User::__DbgSetAllocFail(RHeap::EUser, RHeap::EFailNext, ++count);
+		User::__DbgMarkStart(RHeap::EUser);
+		
+  		// find out the number of open handles
+		TInt startProcessHandleCount;
+		TInt startThreadHandleCount;
+		RThread().HandleCount(startProcessHandleCount, startThreadHandleCount);
+		
+		TRAP(error, (testFuncL)());
+		
+		// check that no handles have leaked
+		TInt endProcessHandleCount;
+		TInt endThreadHandleCount;
+		RThread().HandleCount(endProcessHandleCount, endThreadHandleCount);
+		
+		TEST2(endProcessHandleCount, startProcessHandleCount);
+		TEST2(endThreadHandleCount, startThreadHandleCount);
+		
+		User::__DbgMarkEnd(RHeap::EUser, 0);
+		} while(error == KErrNoMemory);
+
+	_LIT(KTestFailed, "Out of memory test failure on iteration %d\n");
+	__ASSERT_ALWAYS(error==KErrNone, theTest.Panic(error, KTestFailed, count));
+
+	// Reset alloc fail
+	User::__DbgSetAllocFail(RHeap::EUser, RHeap::ENone, 1);
+	
+	theTest.Printf(_L("OOM testing succeeded at heap failure rate of %d\n"), count);
+	OomTesting = EFalse;
+	}
+
+/**
+
+@SYMTestCaseID     PIM-T-LOGCNTMODEL-0001
+
+*/
+
+LOCAL_D void doTestsL()
+	{
+	theTest.Start(_L("@SYMTESTCaseID:PIM-T-LOGCNTMODEL-0001 Test contact matching plugin"));
+
+	
+	TInt startProcessHandleCount;
+	TInt startThreadHandleCount;
+	RThread().HandleCount(startProcessHandleCount, startThreadHandleCount);
+	
+	CActiveScheduler *testScheduler = new (ELeave) CActiveScheduler;
+	CleanupStack::PushL( testScheduler );
+	CActiveScheduler::Install( testScheduler );
+	
+	// Test main plugin functionality
+	theTest.Next(_L("Test contacts plugin functionality"));
+
+	TestContactMatchingPluginL();
+	
+	// OOM test main plug-in functionality
+	theTest.Next(_L("OOM test contacts plugin functionality"));
+
+	OomTest(TestContactMatchingPluginL);
+	
+	// Perform plugin performance measurements - no benchmark testing
+	theTest.Next(_L("Test contacts matching plugin performance"));
+
+	PerformanceTestContactMatchingPluginL();
+		
+	CleanupStack::PopAndDestroy(); // Scheduler,
+	testScheduler = NULL;
+	
+	TInt endProcessHandleCount;
+	TInt endThreadHandleCount;
+	RThread().HandleCount(endProcessHandleCount, endThreadHandleCount);
+	TEST2(endProcessHandleCount, startProcessHandleCount);
+	TEST2(endThreadHandleCount, startThreadHandleCount);
+	}
+
+TInt E32Main()
+	{	
+	__UHEAP_MARK;
+
+	theCleanup = CTrapCleanup::New();
+
+	TRAPD(err, ::doTestsL());	
+	TEST2(err, KErrNone);
+
+	delete theCleanup;	
+
+	theTest.End();
+	theTest.Close();
+
+	__UHEAP_MARKEND;
+
+	return KErrNone;
+	}