pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncadd.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncadd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1090 @@
+// Copyright (c) 2002-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 "te_cntsyncbase.h"
+#include "te_cntsyncadd.h"
+#include <phbksync.h>
+#include <exterror.h>
+
+_LIT(KTestEmpty,"");
+_LIT(KBoundaryTestName,"B");
+_LIT(KBoundaryTestNumber,"2");
+_LIT(KTestCompany,"Company A");
+_LIT(KTestNumberWithDTMF,"020788p98w8548");
+_LIT(KTestAddNumber,"12345678");
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddICCContactTest object
+ */
+CPhbkAddICCContactTest* CPhbkAddICCContactTest::NewL()
+	{
+	CPhbkAddICCContactTest* self = new(ELeave) CPhbkAddICCContactTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddICCContactTest::CPhbkAddICCContactTest()
+	{
+	SetTestStepName(_L("AddICCContactTest"));
+	}
+
+/** Add an ICC entry to each of the supported phonebooks - normal case */
+enum TVerdict CPhbkAddICCContactTest::doTestStepL()
+	{
+	SetSyncModeL(RPhoneBookSession::EManual);
+	CheckSyncModeL(RPhoneBookSession::EManual);
+	SetSimTsyTestNumberL(19);
+	DoSyncL();
+
+	AddContactL(KTestName,KTestNumber,KUidIccGlobalAdnPhonebook,KTestEMail);
+	AddContactL(KTestName,KTestNumber,KUidIccGlobalSdnPhonebook);
+	AddContactL(KTestName,KTestNumber,KUidIccGlobalLndPhonebook);
+	AddContactL(KTestName,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail);
+	AddContactL(KTestName,KTestNumber,KUidIccGlobalFdnPhonebook);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryEmptyNameTest object
+ */
+CPhbkAddEntryEmptyNameTest* CPhbkAddEntryEmptyNameTest::NewL()
+	{
+	CPhbkAddEntryEmptyNameTest* self = new(ELeave) CPhbkAddEntryEmptyNameTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryEmptyNameTest::CPhbkAddEntryEmptyNameTest()
+	{
+	SetTestStepName(_L("AddEntryEmptyNameTest"));
+	}
+
+/** Add an ICC entry to each of the supported phonebooks - name field is empty */
+enum TVerdict CPhbkAddEntryEmptyNameTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(19);
+	DoSyncL();
+
+	TRAPD(err, AddContactL(KTestEmpty,KTestNumber,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestEmpty,KTestNumber,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestEmpty,KTestNumber,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestEmpty,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestEmpty,KTestNumber,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryEmptyNumberTest object
+ */
+CPhbkAddEntryEmptyNumberTest* CPhbkAddEntryEmptyNumberTest::NewL()
+	{
+	CPhbkAddEntryEmptyNumberTest* self = new(ELeave) CPhbkAddEntryEmptyNumberTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryEmptyNumberTest::CPhbkAddEntryEmptyNumberTest()
+	{
+	SetTestStepName(_L("AddEntryEmptyNumberTest"));
+	}
+
+/** Add an ICC entry to each of the supported phonebooks - number field is empty */
+enum TVerdict CPhbkAddEntryEmptyNumberTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(19);
+	DoSyncL();
+
+	TRAPD(err, AddContactL(KTestName,KTestEmpty,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestName,KTestEmpty,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestName,KTestEmpty,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestName,KTestEmpty,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrNone); 
+
+	TRAP(err, AddContactL(KTestName,KTestEmpty,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrNone); 
+
+	return TestStepResult();
+	}
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryEmptyEmailTest object
+ */
+CPhbkAddEntryEmptyEmailTest* CPhbkAddEntryEmptyEmailTest::NewL()
+	{
+	CPhbkAddEntryEmptyEmailTest* self = new(ELeave) CPhbkAddEntryEmptyEmailTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryEmptyEmailTest::CPhbkAddEntryEmptyEmailTest()
+	{
+	SetTestStepName(_L("AddEntryEmptyEmailTest"));
+	}
+
+/** Add an ICC entry to each of the supported phonebooks - first email field is empty, second one is valid */
+enum TVerdict CPhbkAddEntryEmptyEmailTest::doTestStepL()
+	{
+	SetSyncModeL(RPhoneBookSession::EManual);
+	CheckSyncModeL(RPhoneBookSession::EManual);
+
+	TRequestStatus status;
+
+	// Loading a bunch of entries from the SIM (one of them contains the dodgy entry)
+	SetSimTsyTestNumberL(27);
+
+	// Sync
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	// Resetting the phone 
+	SetSimTsyTestNumberL(28);
+
+	// Sync again
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+
+	// look for contact in the synchronised database
+	CContactItemFieldDef* fieldDef = new(ELeave) CContactItemFieldDef;
+	CleanupStack::PushL(fieldDef);
+	fieldDef->AppendL(KUidContactFieldEMail); // define subset of fields to search
+	CContactIdArray* array = iDb->FindLC(KTestEMail,fieldDef);
+	TESTCHECKL(array->Count(),1); 
+	TContactItemId entryId = (*array)[0];
+
+	// now read it back
+	CContactItem* entryItem = iDb->ReadContactLC(entryId);
+	CContactICCEntry* newEntry = CContactICCEntry::NewL(*entryItem);
+	CleanupStack::PushL(newEntry);
+	
+	// now checking the entry
+	CContactItemFieldSet& fieldset = newEntry->CardFields();
+	CheckEmptyEmailFieldContentL(fieldset,KUidContactFieldEMail,KTestEMail);
+	
+	CleanupStack::PopAndDestroy(newEntry);
+	CleanupStack::PopAndDestroy(entryItem);
+	CleanupStack::PopAndDestroy(array);
+	CleanupStack::PopAndDestroy(fieldDef);
+
+	return TestStepResult();
+	}
+
+/** 
+ * Check that the field of type aFieldType has the same content as 
+ * aExpectedContent
+ * @param aFieldset Contact item fieldset
+ * @param aFieldType Field type to test
+ * @param aExpectedContent Expected data
+ */
+void CPhbkAddIntegrationTestBase::CheckEmptyEmailFieldContentL(CContactItemFieldSet& aFieldset, TFieldType aFieldType, const TDesC& aExpectedContent)
+	{
+	// Look for up to two entries with that label
+	TInt pos1 = aFieldset.FindNext(aFieldType,KContactFieldSetSearchAll);
+	TInt pos2 = aFieldset.FindNext(aFieldType,pos1+1);
+	
+	TBool match1 = EFalse;
+	TBool match2 = EFalse;
+
+	// There must be exactly two email fields 
+	TESTCHECKCONDITION((pos1!=KErrNotFound)&&(pos2!=KErrNotFound));
+
+	// Checking the value of the first match
+	if(pos1 != KErrNotFound)
+		{
+		CContactItemField& field1 = aFieldset[pos1];		
+		CContactTextField* textField1 = field1.TextStorage();
+		if(textField1 != NULL)
+			{
+			match1 = (textField1->Text() == aExpectedContent); // Flips to ETrue
+			}
+		}
+
+	// Checking the value of the second match
+	if(pos2 != KErrNotFound)
+		{
+		CContactItemField& field2 = aFieldset[pos2];		
+		CContactTextField* textField2 = field2.TextStorage();
+		if(textField2 != NULL)
+			{
+			match2 = (textField2->Text() == aExpectedContent); // Flips to ETrue
+			}
+		}
+
+	// One (and only one) of the entries must match the expected value
+	TESTCHECKCONDITIONL( (match1 && !match2) || (!match1 && match2) );
+	}
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddPhonebookFullTest object
+ */
+CPhbkAddPhonebookFullTest* CPhbkAddPhonebookFullTest::NewL()
+	{
+	CPhbkAddPhonebookFullTest* self = new(ELeave) CPhbkAddPhonebookFullTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddPhonebookFullTest::CPhbkAddPhonebookFullTest()
+	{
+	SetTestStepName(_L("AddPhonebookFullTest"));
+	}
+
+/** Add an ICC entry to each of the supported phonebooks - fails because phonebook is full */
+enum TVerdict CPhbkAddPhonebookFullTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(16);
+	DoSyncL();
+
+	TRAPD(error,AddContactL(KTestName,KTestNumber,KUidIccGlobalAdnPhonebook)); 
+	TESTCHECKL(error, KErrNoMemory); // TSY reports "no free slots as KErrNoMemory"
+
+	TRAP(error,AddContactL(KTestName,KTestNumber,KUidIccGlobalSdnPhonebook)); 
+	TESTCHECKL(error, KErrNoMemory); // TSY reports "no free slots as KErrNoMemory"
+
+	TRAP(error,AddContactL(KTestName,KTestNumber,KUidIccGlobalLndPhonebook)); 
+	TESTCHECKL(error, KErrNoMemory); // TSY reports "no free slots as KErrNoMemory"
+
+	TRAP(error,AddContactL(KTestName,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail)); 
+	TESTCHECKL(error, KErrNoMemory); // TSY reports "no free slots as KErrNoMemory"
+
+	TRAP(error,AddContactL(KTestName,KTestNumber,KUidIccGlobalFdnPhonebook)); 
+	TESTCHECKL(error, KErrNoMemory); // TSY reports "no free slots as KErrNoMemory"
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddBoundaryConditionsTest object
+ */
+CPhbkAddBoundaryConditionsTest* CPhbkAddBoundaryConditionsTest::NewL()
+	{
+	CPhbkAddBoundaryConditionsTest* self = new(ELeave) CPhbkAddBoundaryConditionsTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddBoundaryConditionsTest::CPhbkAddBoundaryConditionsTest()
+	{
+	SetTestStepName(_L("AddBoundaryConditionsTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - boundary conditions met */
+enum TVerdict CPhbkAddBoundaryConditionsTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(19);
+	DoSyncL();
+	RPhoneBookSession::TContactFieldsV1 fields;
+	RPhoneBookSession::TContactFieldsV1Pckg fieldsPckg(fields);
+	iSession.GetContactFormat(fieldsPckg);
+
+	TInt i(0);
+
+	TBuf16<KMaxPhBkNameSize> name;
+	TBuf16<RMobilePhone::KMaxMobileTelNumberSize> number;
+
+	// Check Condition when length of fields are less than max length defined in config
+	name.Format(KBoundaryTestName);
+	number.Format(KBoundaryTestNumber);
+
+	// value of i=2 because name field already contains 1 char
+	for(i=2; i<fields.iNameField.iLength; i++)
+		name.Append(KBoundaryTestName);
+
+	TESTCHECKL(fields.iNameField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNameField.iDisplayed);
+	
+	// value of i=2 because number field already contains 1 char
+	for(i=2; i<fields.iNumberField.iLength; i++)
+		number.Append(KBoundaryTestNumber);
+
+	TESTCHECK(fields.iNumberField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNumberField.iDisplayed);
+	TESTCHECK(fields.iIccSlotField.iLength, -1);
+	TESTCHECK(fields.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITION(fields.iIccSlotField.iDisplayed);
+
+	// Now try to add these fields that test boundary conditions 
+	TRAPD(err, AddContactL(name,number,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	// Check Condition when length of fields are equal to max length defined in config
+	name.Format(KBoundaryTestName);
+	number.Format(KBoundaryTestNumber);
+
+	// value of i=2 because name field already contains 1 char
+	for(i=2; i<fields.iNameField.iLength+1; i++)
+		name.Append(KBoundaryTestName);
+
+	TESTCHECKL(fields.iNameField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNameField.iDisplayed);
+	
+	// value of i=2 because number field already contains 1 char
+	for(i=2; i<fields.iNumberField.iLength+1; i++)
+		number.Append(KBoundaryTestNumber);
+
+	TESTCHECK(fields.iNumberField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNumberField.iDisplayed);
+	TESTCHECK(fields.iIccSlotField.iLength, -1);
+	TESTCHECK(fields.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITION(fields.iIccSlotField.iDisplayed);
+
+	// Now try to add these fields that test boundary conditions 
+	TRAP(err, AddContactL(name,number,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrNone);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrNone);
+
+	// Check Condition when length of name field is greater than max length defined in config
+	name.Format(KBoundaryTestName);
+	number.Format(KBoundaryTestNumber);
+
+	// value of i=2 because name field already contains 1 char
+	for(i=2; i<fields.iNameField.iLength+2; i++)
+		name.Append(KBoundaryTestName);
+
+	TESTCHECKL(fields.iNameField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNameField.iDisplayed);
+
+	// value of i=2 because number field already contains 1 char
+	for(i=2; i<fields.iNumberField.iLength+1; i++)
+		number.Append(KBoundaryTestNumber);
+
+	TESTCHECK(fields.iNumberField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNumberField.iDisplayed);
+	TESTCHECK(fields.iIccSlotField.iLength, -1);
+	TESTCHECK(fields.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITION(fields.iIccSlotField.iDisplayed);
+
+	// Now try to add these fields that exceed boundary conditions 
+	TRAP(err, AddContactL(name,number,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrPhonebookTextOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrPhonebookTextOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrPhonebookTextOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrPhonebookTextOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrPhonebookTextOverflow);
+
+	// Check Condition when length of tel number field is greater than max length defined in config
+	name.Format(KBoundaryTestName);
+	number.Format(KBoundaryTestNumber);
+
+	// value of i=2 because name field already contains 1 char
+	for(i=2; i<fields.iNameField.iLength+1; i++)
+		name.Append(KBoundaryTestName);
+
+	TESTCHECKL(fields.iNameField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNameField.iDisplayed);
+
+	// value of i=2 because number field already contains 1 char
+	for(i=2; i<fields.iNumberField.iLength+2; i++)
+		number.Append(KBoundaryTestNumber);
+
+	TESTCHECK(fields.iNumberField.iCount, 1);
+	TESTCHECKCONDITION(fields.iNumberField.iDisplayed);
+	TESTCHECK(fields.iIccSlotField.iLength, -1);
+	TESTCHECK(fields.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITION(fields.iIccSlotField.iDisplayed);
+
+	// Now try to add these fields that exceed boundary conditions 
+	TRAP(err, AddContactL(name,number,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrPhonebookNumberOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrPhonebookNumberOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrPhonebookNumberOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrPhonebookNumberOverflow);
+
+	TRAP(err, AddContactL(name,number,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrPhonebookNumberOverflow);
+	
+	return TestStepResult();
+	}
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddNameBoundaryExceededTest object
+ */
+CPhbkAddNameBoundaryExceededTest* CPhbkAddNameBoundaryExceededTest::NewL()
+	{
+	CPhbkAddNameBoundaryExceededTest* self = new(ELeave) CPhbkAddNameBoundaryExceededTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddNameBoundaryExceededTest::CPhbkAddNameBoundaryExceededTest()
+	{
+	SetTestStepName(_L("AddNameBoundaryExceededTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - name boundary conditions exceeded */
+enum TVerdict CPhbkAddNameBoundaryExceededTest::doTestStepL()
+	{
+	RPhoneBookSession::TContactFieldsV1 fields;
+	RPhoneBookSession::TContactFieldsV1Pckg fieldsPckg(fields);
+	iSession.GetContactFormat(fieldsPckg);
+	
+	TBuf16<KMaxPhBkNameSize> name;
+	name.Format(KBoundaryTestName);
+	TBuf16<RMobilePhone::KMaxMobileTelNumberSize> number;
+	number.Format(KBoundaryTestNumber);
+
+	TInt i(0);
+	for(i=0; i<(fields.iNameField.iLength+10); i++)
+		name.Append(KBoundaryTestName); // name boundary exceeded by 10 characters
+
+	TESTCHECKL(fields.iNameField.iCount, 1);
+	TESTCHECKCONDITIONL(fields.iNameField.iDisplayed);
+	
+	for(i=1; i<fields.iNumberField.iLength+3; i++)
+		number.Append(KBoundaryTestNumber);
+
+	TESTCHECKL(fields.iNumberField.iCount, 1);
+	TESTCHECKCONDITIONL(fields.iNumberField.iDisplayed);
+	TESTCHECKL(fields.iIccSlotField.iLength, -1);
+	TESTCHECKL(fields.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITIONL(fields.iIccSlotField.iDisplayed);
+
+	// move to another SIM TSY configuration where the phonebook is full
+
+	TRAPD(err, AddContactL(name,number,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddNumberBoundaryExceededTest object
+ */
+CPhbkAddNumberBoundaryExceededTest* CPhbkAddNumberBoundaryExceededTest::NewL()
+	{
+	CPhbkAddNumberBoundaryExceededTest* self = new(ELeave) CPhbkAddNumberBoundaryExceededTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddNumberBoundaryExceededTest::CPhbkAddNumberBoundaryExceededTest()
+	{
+	SetTestStepName(_L("AddNumberBoundaryExceededTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - number boundary conditions exceeded */
+enum TVerdict CPhbkAddNumberBoundaryExceededTest::doTestStepL()
+	{
+	RPhoneBookSession::TContactFieldsV1 fields;
+	RPhoneBookSession::TContactFieldsV1Pckg fieldsPckg(fields);
+	iSession.GetContactFormat(fieldsPckg);
+	TBuf16<KMaxPhBkNameSize> name;
+	name.Format(KBoundaryTestName);
+	TBuf16<RMobilePhone::KMaxMobileTelNumberSize> number;
+	number.Format(KBoundaryTestNumber);
+
+	TInt i(0);
+	for(i=1; i<fields.iNameField.iLength+1; i++)
+		name.Append(KBoundaryTestName); 
+
+	TESTCHECKL(fields.iNameField.iCount, 1);
+	TESTCHECKCONDITIONL(fields.iNameField.iDisplayed);
+	
+	for(i=0; i<fields.iNumberField.iLength+1; i++)
+		number.Append(KBoundaryTestNumber); // number boundary exceeded by 1 character
+
+	TESTCHECKL(fields.iNumberField.iCount, 1);
+	TESTCHECKCONDITIONL(fields.iNumberField.iDisplayed);
+	TESTCHECKL(fields.iIccSlotField.iLength, -1);
+	TESTCHECKL(fields.iIccSlotField.iCount, 1);
+	TESTCHECKCONDITIONL(fields.iIccSlotField.iDisplayed);
+
+	// move to another SIM TSY configuration where the phonebook is full
+
+	TRAPD(err, AddContactL(name,number,KUidIccGlobalAdnPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidIccGlobalSdnPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidIccGlobalLndPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidUsimAppAdnPhonebook,KTestEMail));
+	TESTCHECKL(err, KErrOverflow);
+	TRAP(err, AddContactL(name,number,KUidIccGlobalFdnPhonebook));
+	TESTCHECKL(err, KErrOverflow);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddSequenceOfEntriesTest object
+ */
+CPhbkAddSequenceOfEntriesTest* CPhbkAddSequenceOfEntriesTest::NewL()
+	{
+	CPhbkAddSequenceOfEntriesTest* self = new(ELeave) CPhbkAddSequenceOfEntriesTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddSequenceOfEntriesTest::CPhbkAddSequenceOfEntriesTest()
+	{
+	SetTestStepName(_L("AddSequenceOfEntriesTest"));
+	}
+
+/* Add sequence of ICC entries - Fill ICC */
+enum TVerdict CPhbkAddSequenceOfEntriesTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(19);
+	DoSyncL();
+	for(TInt i=1; i<(KMaxICCSlotsTest6+10);++i)
+		{
+		TRAPD(err1, AddContactL(KTestName, KTestNumber, KUidIccGlobalAdnPhonebook)); // Keep adding entries to all phonebooks
+		TRAPD(err2, AddContactL(KTestName, KTestNumber, KUidIccGlobalSdnPhonebook));
+		TRAPD(err3, AddContactL(KTestName, KTestNumber, KUidIccGlobalLndPhonebook));
+		TRAPD(err4, AddContactL(KTestName, KTestNumber, KUidUsimAppAdnPhonebook, KTestEMail));
+		TRAPD(err5, AddContactL(KTestName, KTestNumber, KUidIccGlobalFdnPhonebook));
+		if(i < (KMaxICCSlotsTest6 - KNumOfUsedSlotstest6 + 1))
+			{			
+			TESTCHECKL(err1, KErrNone);
+			TESTCHECKL(err2, KErrNone);
+			TESTCHECKL(err3, KErrNone);
+			TESTCHECKL(err4, KErrNone);
+			TESTCHECKL(err5, KErrNone);
+			}
+		else
+			{
+			TESTCHECKL(err1, KErrNoMemory);
+			TESTCHECKL(err2, KErrNoMemory);
+			TESTCHECKL(err3, KErrNoMemory);
+			TESTCHECKL(err4, KErrNoMemory);
+			TESTCHECKL(err5, KErrNoMemory);
+			}
+		}
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryICCLockedTest object
+ */
+CPhbkAddEntryICCLockedTest* CPhbkAddEntryICCLockedTest::NewL()
+	{
+	CPhbkAddEntryICCLockedTest* self = new(ELeave) CPhbkAddEntryICCLockedTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryICCLockedTest::CPhbkAddEntryICCLockedTest()
+	{
+	SetTestStepName(_L("AddEntryICCLockedTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - ICC locked */
+enum TVerdict CPhbkAddEntryICCLockedTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(18);
+	DoSyncL();
+	TInt err1(KErrNone), err2(KErrNone), err3(KErrNone), err4(KErrNone), err5(KErrNone);
+	while(err1==KErrNone && err2==KErrNone && err3==KErrNone && err4==KErrNone) // Wait for ICC to become locked
+		{
+		TRAP(err1,AddContactL(KTestName,KTestNumber,KUidIccGlobalAdnPhonebook));
+		TRAP(err2,AddContactL(KTestName,KTestNumber,KUidIccGlobalSdnPhonebook));
+		TRAP(err3,AddContactL(KTestName,KTestNumber,KUidIccGlobalLndPhonebook));
+		TRAP(err4,AddContactL(KTestName,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail));
+		TRAP(err5,AddContactL(KTestName,KTestNumber,KUidIccGlobalFdnPhonebook));
+		User::After(2000000);	// Wait a second and try again.
+		}
+	TRAP(err1,AddContactL(KTestName,KTestNumber,KUidIccGlobalAdnPhonebook));
+	TRAP(err2,AddContactL(KTestName,KTestNumber,KUidIccGlobalSdnPhonebook));
+	TRAP(err3,AddContactL(KTestName,KTestNumber,KUidIccGlobalLndPhonebook));
+	TRAP(err4,AddContactL(KTestName,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail));
+	TRAP(err5,AddContactL(KTestName,KTestNumber,KUidIccGlobalFdnPhonebook));
+	TESTCHECK(err1, KErrAccessDenied);
+	TESTCHECK(err2, KErrAccessDenied);
+	TESTCHECK(err3, KErrAccessDenied);
+	TESTCHECK(err4, KErrAccessDenied);
+	TESTCHECK(err5, KErrAccessDenied);
+	User::After(10000000); // Wait for ICC to become unlocked
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryICCWriteFailsTest object
+ */
+CPhbkAddEntryICCWriteFailsTest* CPhbkAddEntryICCWriteFailsTest::NewL()
+	{
+	CPhbkAddEntryICCWriteFailsTest* self = new(ELeave) CPhbkAddEntryICCWriteFailsTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryICCWriteFailsTest::CPhbkAddEntryICCWriteFailsTest()
+	{
+	SetTestStepName(_L("AddEntryICCWriteFailsTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - ICC write fails */
+enum TVerdict CPhbkAddEntryICCWriteFailsTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(5);
+	DoSyncL();
+	TRAPD(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalAdnPhonebook)); 
+	TESTCHECKL(err, KErrBadHandle);
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalSdnPhonebook)); 
+	TESTCHECKL(err, KErrBadHandle);
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalLndPhonebook)); 
+	TESTCHECKL(err, KErrBadHandle);
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail)); 
+	TESTCHECKL(err, KErrBadHandle);
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalFdnPhonebook)); 
+	TESTCHECKL(err, KErrBadHandle);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryInvalidFieldTest object
+ */
+CPhbkAddEntryInvalidFieldTest* CPhbkAddEntryInvalidFieldTest::NewL()
+	{
+	CPhbkAddEntryInvalidFieldTest* self = new(ELeave) CPhbkAddEntryInvalidFieldTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryInvalidFieldTest::CPhbkAddEntryInvalidFieldTest()
+	{
+	SetTestStepName(_L("AddEntryInvalidFieldTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - invalid field included */
+enum TVerdict CPhbkAddEntryInvalidFieldTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(17);
+	DoSyncL();
+
+	DoAddEntryInvalidFieldL(KUidIccGlobalAdnPhonebook);
+	DoAddEntryInvalidFieldL(KUidIccGlobalSdnPhonebook);
+	DoAddEntryInvalidFieldL(KUidIccGlobalLndPhonebook);
+	DoAddEntryInvalidFieldL(KUidUsimAppAdnPhonebook);
+	DoAddEntryInvalidFieldL(KUidIccGlobalFdnPhonebook);
+
+	return TestStepResult();
+	}
+
+
+/* Add an ICC entry to phonebook aPhonebook - invalid field included */
+void CPhbkAddIntegrationTestBase::DoAddEntryInvalidFieldL(const TUid aPhonebook)
+	{
+	TContactItemId templateId = iDb->ICCTemplateIdL(aPhonebook);
+	CContactItem* iccTemplate = iDb->ReadContactLC(templateId);
+	CContactICCEntry* entry = CContactICCEntry::NewL(*iccTemplate);
+	CleanupStack::PopAndDestroy(iccTemplate);
+	CleanupStack::PushL(entry);
+
+	AddTextFieldL(KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN, KTestName, *entry);
+	AddTextFieldL(KUidContactFieldPhoneNumber,KUidContactFieldVCardMapTEL, KTestNumber, *entry);
+	AddTextFieldL(KUidContactFieldCompanyName,KUidContactFieldVCardMapUnusedN, KTestCompany, *entry); // invalid field 
+	TContactItemId id(KNullContactId);
+	TRAPD(err, id=iDb->AddNewContactL(*entry));
+	CleanupStack::PopAndDestroy(entry);	
+	TESTCHECKL(id, KNullContactId);
+	TESTCHECKL(err, KErrNotSupported); 
+	}
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryNumberWithDTMFTest object
+ */
+CPhbkAddEntryNumberWithDTMFTest* CPhbkAddEntryNumberWithDTMFTest::NewL()
+	{
+	CPhbkAddEntryNumberWithDTMFTest* self = new(ELeave) CPhbkAddEntryNumberWithDTMFTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryNumberWithDTMFTest::CPhbkAddEntryNumberWithDTMFTest()
+	{
+	SetTestStepName(_L("AddEntryNumberWithDTMFTest"));
+	}
+
+/* Add sequence of ICC entries - Fill ICC */
+enum TVerdict CPhbkAddEntryNumberWithDTMFTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(19);
+	DoSyncL();
+	TRAPD(err,AddContactL(KTestName,KTestNumberWithDTMF,KUidIccGlobalAdnPhonebook)); 
+	TESTCHECKL(err, KErrNone); 
+	TRAP(err,AddContactL(KTestName,KTestNumberWithDTMF,KUidIccGlobalSdnPhonebook)); 
+	TESTCHECKL(err, KErrNone); 
+	TRAP(err,AddContactL(KTestName,KTestNumberWithDTMF,KUidIccGlobalLndPhonebook)); 
+	TESTCHECKL(err, KErrNone); 
+	TRAP(err,AddContactL(KTestName,KTestNumberWithDTMF,KUidUsimAppAdnPhonebook,KTestEMail)); 
+	TESTCHECKL(err, KErrNone); 
+	TRAP(err,AddContactL(KTestName,KTestNumberWithDTMF,KUidIccGlobalFdnPhonebook)); 
+	TESTCHECKL(err, KErrNone); 
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryReadOnlyAccessTest object
+ */
+CPhbkAddEntryReadOnlyAccessTest* CPhbkAddEntryReadOnlyAccessTest::NewL()
+	{
+	CPhbkAddEntryReadOnlyAccessTest* self = new(ELeave) CPhbkAddEntryReadOnlyAccessTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddEntryReadOnlyAccessTest::CPhbkAddEntryReadOnlyAccessTest()
+	{
+	SetTestStepName(_L("AddEntryReadOnlyAccessTest"));
+	}
+
+/* Add an ICC entry to each of the supported phonebooks - read-only phonebook */
+enum TVerdict CPhbkAddEntryReadOnlyAccessTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(20);
+	DoSyncL();
+	TRAPD(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalAdnPhonebook)); // valid fields
+	TESTCHECKL(err, KErrAccessDenied); // read-only access 
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalSdnPhonebook)); // valid fields
+	TESTCHECKL(err, KErrAccessDenied); // read-only access 
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalLndPhonebook)); // valid fields
+	TESTCHECKL(err, KErrAccessDenied); // read-only access 
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidUsimAppAdnPhonebook,KTestEMail)); // valid fields
+	TESTCHECKL(err, KErrAccessDenied); // read-only access 
+	TRAP(err,AddContactL(KTestName,KTestNumber,KUidIccGlobalFdnPhonebook)); // valid fields
+	TESTCHECKL(err, KErrAccessDenied); // read-only access 
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Add a contact to the ICC & database.
+ * @param aName Name
+ * @param aNumber Phone number
+ * @param aPhonebook Phonebook
+ * @param aEMail Email address - only added to Usim phonebook
+ */
+void CPhbkAddIntegrationTestBase::AddContactL(const TDesC& aName, const TDesC& aNumber, const TUid aPhonebook, const TDesC& aEMail)
+	{
+	TContactItemId templateId(iDb->ICCTemplateIdL(aPhonebook));
+	CContactItem* iccTemplate = iDb->ReadContactLC(templateId);
+	CContactICCEntry* entry = CContactICCEntry::NewL(*iccTemplate);
+	CleanupStack::PopAndDestroy(iccTemplate);
+	CleanupStack::PushL(entry);
+	AddTextFieldL(KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,aName,*entry);
+	AddTextFieldL(KUidContactFieldPhoneNumber,KUidContactFieldVCardMapTEL,aNumber,*entry);
+	if ((aPhonebook == KUidUsimAppAdnPhonebook) || (aPhonebook == KUidIccGlobalAdnPhonebook))
+		{
+		AddTextFieldL(KUidContactFieldEMail,KUidContactFieldVCardMapUnusedN,aEMail,*entry);
+		}
+	TContactItemId id(iDb->AddNewContactL(*entry)); 
+	CleanupStack::PopAndDestroy(entry);	
+	TESTCHECKCONDITIONL(id != KNullContactId);
+	}
+
+/**
+ * Add a new text field (aField) to the CContactICCEntry supplied by aIccEntry. 
+ * @param aFieldType Field type
+ * @param aMapping Mapping for the field's content type
+ * @param aField Field data
+ * @param aIccEntry CContactICCEntry item
+ */ 
+void CPhbkAddIntegrationTestBase::AddTextFieldL(TFieldType aFieldType, TUid aMapping, const TDesC& aField, CContactICCEntry& aIccEntry)
+	{
+	CContactItemFieldSet& fieldSet = aIccEntry.CardFields();
+	TInt pos = fieldSet.Find(aFieldType);
+	if (pos!=KErrNotFound)
+		{
+		CContactItemField& field=fieldSet[pos];
+		field.TextStorage()->SetTextL(aField);
+		}
+	else
+		{
+		CContactItemField* field=CContactItemField::NewLC(KStorageTypeText, aFieldType);
+		field->SetMapping(aMapping);
+		field->AddFieldTypeL(aFieldType); 
+		field->TextStorage()->SetTextL(aField);
+		aIccEntry.AddFieldL(*field);
+		CleanupStack::Pop(field); 
+		}
+	}
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddAdditionalNumWithTagTest object
+ */
+CPhbkAddAdditionalNumWithTagTest* CPhbkAddAdditionalNumWithTagTest::NewL()
+	{
+	CPhbkAddAdditionalNumWithTagTest* self = new(ELeave) CPhbkAddAdditionalNumWithTagTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkAddAdditionalNumWithTagTest::CPhbkAddAdditionalNumWithTagTest()
+	{
+	SetTestStepName(_L("AddAdditionalNumWithTagTest"));
+	}
+
+/** 
+ * Add contacts to the ICC & database with additional number plus alpha tag.
+ */
+enum TVerdict CPhbkAddAdditionalNumWithTagTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(22);
+	DoSyncL();
+
+	// add additional entry for each type of number alpha tag
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapMSG);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapVOICE);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapFAX);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapPREF);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapCELL);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapPAGER);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapBBS);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapMODEM);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapCAR);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapISDN);
+	AddAdditionalNumEntryL(KTestAddNumber, KUidContactFieldVCardMapVIDEO);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Add a contact with additional number plus alpha tag.
+ */
+void CPhbkAddIntegrationTestBase::AddAdditionalNumEntryL(const TDesC& aFieldNum, const TUid aFieldType)
+	{
+	TContactItemId templateId(iDb->ICCTemplateIdL(KUidUsimAppAdnPhonebook));
+	CContactItem* iccTemplate = iDb->ReadContactLC(templateId);
+	CContactICCEntry* entry = CContactICCEntry::NewL(*iccTemplate);
+	CleanupStack::PopAndDestroy(iccTemplate);
+	CleanupStack::PushL(entry);
+
+	// create typical USIM App entry
+	AddTextFieldL(KUidContactFieldFamilyName, KUidContactFieldVCardMapUnusedN, KTestName, *entry);
+	AddTextFieldL(KUidContactFieldPhoneNumber, KUidContactFieldVCardMapTEL, KTestNumber, *entry);
+	AddTextFieldL(KUidContactFieldEMail, KUidContactFieldVCardMapUnusedN, KTestEMail, *entry);
+
+	// add additional number with alpha tag
+	CContactItemField* field=CContactItemField::NewLC(KStorageTypeText, KUidContactFieldPhoneNumber);
+	field->SetMapping(KUidContactFieldVCardMapTEL);
+	field->AddFieldTypeL(KUidContactFieldPhoneNumber); 
+	field->TextStorage()->SetTextL(aFieldNum);
+	field->AddFieldTypeL(aFieldType); 
+	entry->AddFieldL(*field);
+	CleanupStack::Pop(field); 
+
+	TContactItemId id(iDb->AddNewContactL(*entry)); 
+	CleanupStack::PopAndDestroy(entry);	
+	TESTCHECKCONDITIONL(id != KNullContactId);
+
+	// check additional entry has the additional number
+	CContactItem* newEntry = static_cast <CContactICCEntry*> (iDb->ReadContactLC(id));
+	TESTCHECKCONDITIONL(newEntry != NULL);
+	CContactItemFieldSet& fieldSet = newEntry->CardFields();
+	TInt pos = fieldSet.Find(aFieldType);
+	TESTCHECKCONDITIONL(pos != KErrNotFound);
+	CleanupStack::PopAndDestroy(newEntry);	
+
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkAddEntryWithNoTemplateTest object
+ */
+CPhbkAddEntryWithNoTemplateTest* CPhbkAddEntryWithNoTemplateTest::NewL()
+	{
+	CPhbkAddEntryWithNoTemplateTest* self = new(ELeave) CPhbkAddEntryWithNoTemplateTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises its own name.
+ */
+CPhbkAddEntryWithNoTemplateTest::CPhbkAddEntryWithNoTemplateTest()
+	{
+	SetTestStepName(_L("AddEntryWithNoTemplateTest"));
+	}
+
+/** 
+ *  Create contact group with zero as template ID, and add a contact to it.
+ */
+enum TVerdict CPhbkAddEntryWithNoTemplateTest::doTestStepL()
+	{
+
+	//
+	// delete ini file
+	//
+	
+	INFO_PRINTF1(_L("Deleting phonefile"));
+	_LIT(KPhbkSyncIniFile,"C:\\Private\\102030A1\\Phbksync.ini");
+	RFs fs;
+	TInt err = fs.Connect();
+	TESTCHECKL(err, KErrNone);
+	err=fs.Delete(KPhbkSyncIniFile);
+	fs.Close();	
+
+	//
+	// add a new contact to a group with template id zero
+	//
+	CContactItem* group = iDb->CreateContactGroupLC();
+	group->SetTemplateRefId(0);
+
+	CContactICCEntry* contact = NULL;
+	CreateContactLC(contact, KUidIccGlobalAdnPhonebook,KTestName,KTestNumber, KTestEMail);
+
+	iDb->AddContactToGroupL(*contact,*group);
+
+	CleanupStack::PopAndDestroy(2,group);
+
+	//
+	// force a creation of the phonebooks (including a call to CSyncEngineServer::CreateGroupIdL)
+	//
+	ConfigurePhbkSyncToIdleL();
+	ConfigurePhbkSyncToFullL();
+
+	return TestStepResult();
+}
+ 
+void CPhbkAddIntegrationTestBase::CreateContactLC(CContactICCEntry*& aEntry, const TUid aPhonebook, const TDesC& aName, const TDesC& aNumber, const TDesC& aEmail)
+	{
+	TContactItemId templateId(iDb->ICCTemplateIdL(aPhonebook));
+	CContactItem* iccTemplate = iDb->ReadContactLC(templateId);
+	aEntry = CContactICCEntry::NewL(*iccTemplate);
+	CleanupStack::PopAndDestroy(iccTemplate);
+	CleanupStack::PushL(aEntry);
+
+	AddTextFieldL(KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,aName,*aEntry);
+	AddTextFieldL(KUidContactFieldPhoneNumber,KUidContactFieldVCardMapTEL,aNumber,*aEntry);
+	if ((aPhonebook == KUidUsimAppAdnPhonebook) || (aPhonebook == KUidIccGlobalAdnPhonebook))
+		{
+		AddTextFieldL(KUidContactFieldEMail,KUidContactFieldVCardMapUnusedN,aEmail,*aEntry);
+		}
+	}