pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncread.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimprotocols/phonebooksync/Test/TE_cntsync/te_cntsyncread.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,2233 @@
+// Copyright (c) 2004-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_cntsyncread.h"
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadICCContactTest object
+ */
+CPhbkSyncReadICCContactTest* CPhbkSyncReadICCContactTest::NewL()
+	{
+	CPhbkSyncReadICCContactTest* self = new(ELeave) CPhbkSyncReadICCContactTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises its own name.
+ */
+CPhbkSyncReadICCContactTest::CPhbkSyncReadICCContactTest()
+	{
+	SetTestStepName(_L("ReadICCContactTest"));
+	}
+
+/** 
+ * Read an ICC entry - normal case.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+enum TVerdict CPhbkSyncReadICCContactTest::doTestStepL()
+	{
+	SetSyncModeL(RPhoneBookSession::EManual);
+	CheckSyncModeL(RPhoneBookSession::EManual);
+
+	SetSimTsyTestNumberL(9);
+	DoSyncL();
+
+	// We're NOT trying to read all phonebook content, only a single entry
+	// from each phonebook, hence EFalse
+	ReadContactL(KUidIccGlobalAdnPhonebook, KTest9ICCSlotsADN, EFalse); 
+	ReadContactL(KUidIccGlobalSdnPhonebook, KTest9ICCSlotsSDN, EFalse); 
+	ReadContactL(KUidIccGlobalLndPhonebook, KTest9ICCSlotsLND, EFalse); 
+	ReadContactL(KUidUsimAppAdnPhonebook, KTest9ICCSlotsUsim, EFalse); 
+	ReadContactL(KUidIccGlobalFdnPhonebook, KTest9ICCSlotsFDN, EFalse); 
+
+	return TestStepResult();
+	}
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadSequenceOfICCEntriesTest object
+ */
+CPhbkSyncReadSequenceOfICCEntriesTest* CPhbkSyncReadSequenceOfICCEntriesTest::NewL()
+	{
+	CPhbkSyncReadSequenceOfICCEntriesTest* self = new(ELeave) CPhbkSyncReadSequenceOfICCEntriesTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadSequenceOfICCEntriesTest::CPhbkSyncReadSequenceOfICCEntriesTest()
+	{
+	SetTestStepName(_L("ReadSequenceOfICCEntriesTest"));
+	}
+
+/** 
+ * Read a sequence of ICC entries - full phonebook case 
+ */
+enum TVerdict CPhbkSyncReadSequenceOfICCEntriesTest::doTestStepL()
+	{
+	// Load a data set with full slots on each phonebook
+	SetSimTsyTestNumberL(1);
+	DoSyncL();
+
+	// We shall try to read the whole of each phonebook, hence ETrue
+	ReadContactL(KUidIccGlobalAdnPhonebook, KTest1ICCSlotsADN, ETrue);
+	ReadContactL(KUidIccGlobalSdnPhonebook, KTest1ICCSlotsSDN, ETrue);
+	ReadContactL(KUidIccGlobalLndPhonebook, KTest1ICCSlotsLND, ETrue);
+	ReadContactL(KUidUsimAppAdnPhonebook, KTest1ICCSlotsUsim, ETrue);
+	ReadContactL(KUidIccGlobalFdnPhonebook, KTest1ICCSlotsFDN, ETrue);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactInvalidUIDTest object
+ */
+CPhbkSyncReadContactInvalidUIDTest* CPhbkSyncReadContactInvalidUIDTest::NewL()
+	{
+	CPhbkSyncReadContactInvalidUIDTest* self = new(ELeave) CPhbkSyncReadContactInvalidUIDTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactInvalidUIDTest::CPhbkSyncReadContactInvalidUIDTest()
+	{
+	SetTestStepName(_L("ReadContactInvalidUIDTest"));
+	}
+
+/** 
+ * Read a number of ICC entries - invalid UID.
+ */
+enum TVerdict CPhbkSyncReadContactInvalidUIDTest::doTestStepL()
+	{
+	// Load a data set with full slots on each phonebook
+	SetSimTsyTestNumberL(1);
+	DoSyncL();
+	
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	const CContactIdArray* sortedItems = iDb->SortedItemsL();
+	TInt count(sortedItems->Count());
+	TESTCHECK(count, KTest1MaxSlots);
+
+	TContactItemId invalidUid(-2);
+	CContactICCEntry* entry = NULL;
+	TRAPD(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(invalidUid)));
+	TESTCHECK(err, KErrNotFound);
+	delete entry;
+
+	invalidUid=-786;
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(invalidUid)));
+	TESTCHECK(err, KErrNotFound);
+	delete entry;
+
+	invalidUid=999;
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(invalidUid)));
+	TESTCHECK(err, KErrNotFound);
+	delete entry;
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactsEmptyFieldTest object
+ */
+CPhbkSyncReadContactsEmptyFieldTest* CPhbkSyncReadContactsEmptyFieldTest::NewL()
+	{
+	CPhbkSyncReadContactsEmptyFieldTest* self = new(ELeave) CPhbkSyncReadContactsEmptyFieldTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactsEmptyFieldTest::CPhbkSyncReadContactsEmptyFieldTest()
+	{
+	SetTestStepName(_L("ReadContactsEmptyFieldTest"));
+	}
+
+/** 
+ * Read a sequence of ICC entries - empty field case. 
+ * Name, number or email fields are empty.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+enum TVerdict CPhbkSyncReadContactsEmptyFieldTest::doTestStepL()
+	{
+	// This test employs data with empty fields
+	SetSimTsyTestNumberL(6);
+	DoSyncL();
+
+	ReadAllContactContentL(KUidIccGlobalAdnPhonebook, KTest6ICCSlotsADN);
+	ReadAllContactContentL(KUidIccGlobalSdnPhonebook, KTest6ICCSlotsSDN);
+	ReadAllContactContentL(KUidIccGlobalLndPhonebook, KTest6ICCSlotsLND);
+	ReadAllContactContentL(KUidUsimAppAdnPhonebook, KTest6ICCSlotsUsim);
+	ReadAllContactContentL(KUidIccGlobalFdnPhonebook, KTest6ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactFullViewICCLockedTest object
+ */
+CPhbkSyncReadContactFullViewICCLockedTest* CPhbkSyncReadContactFullViewICCLockedTest::NewL()
+	{
+	CPhbkSyncReadContactFullViewICCLockedTest* self = new(ELeave) CPhbkSyncReadContactFullViewICCLockedTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactFullViewICCLockedTest::CPhbkSyncReadContactFullViewICCLockedTest()
+	{
+	SetTestStepName(_L("ReadContactFullViewICCLockedTest"));
+	}
+
+/** 
+ * Read ICC entry - entry not available as the ICC becomes locked.
+ */
+enum TVerdict CPhbkSyncReadContactFullViewICCLockedTest::doTestStepL()
+	{
+	// ADN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadFullContactLockedL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN);
+
+	// SDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadFullContactLockedL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN);
+
+	// LND Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadFullContactLockedL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND);
+
+	// Usim App Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadFullContactLockedL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim);
+
+	// FDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadFullContactLockedL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactDiffViewsTest object
+ */
+CPhbkSyncReadContactDiffViewsTest* CPhbkSyncReadContactDiffViewsTest::NewL()
+	{
+	CPhbkSyncReadContactDiffViewsTest* self = new(ELeave) CPhbkSyncReadContactDiffViewsTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactDiffViewsTest::CPhbkSyncReadContactDiffViewsTest()
+	{
+	SetTestStepName(_L("ReadContactDiffViewsTest"));
+	}
+
+/** 
+ * Read an ICC entry - specify full view, full view for non-existent entry, name, number 
+ * and invalid view
+ */
+enum TVerdict CPhbkSyncReadContactDiffViewsTest::doTestStepL()
+	{
+	// ADN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadContactViewsL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN);
+
+	// SDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadContactViewsL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN);
+
+	// LND Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadContactViewsL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND);
+
+	// Usim App Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadContactViewsL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim);
+
+	// FDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadContactViewsL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadICCMinimalContactTest object
+ */
+CPhbkSyncReadICCMinimalContactTest* CPhbkSyncReadICCMinimalContactTest::NewL()
+	{
+	CPhbkSyncReadICCMinimalContactTest* self = new(ELeave) CPhbkSyncReadICCMinimalContactTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadICCMinimalContactTest::CPhbkSyncReadICCMinimalContactTest()
+	{
+	SetTestStepName(_L("ReadICCMinimalContactTest"));
+	}
+
+/**
+ * Read an ICC entry - minimal read operation.
+ */
+enum TVerdict CPhbkSyncReadICCMinimalContactTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(1);
+	DoSyncL();
+
+	ReadMinimalContactL(KUidIccGlobalAdnPhonebook, KTest1ICCSlotsADN);
+	ReadMinimalContactL(KUidIccGlobalSdnPhonebook, KTest1ICCSlotsSDN);
+	ReadMinimalContactL(KUidIccGlobalLndPhonebook, KTest1ICCSlotsLND);
+	ReadMinimalContactL(KUidUsimAppAdnPhonebook, KTest1ICCSlotsUsim);
+	ReadMinimalContactL(KUidIccGlobalFdnPhonebook, KTest1ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadMinimalContactInvalidUIDTest object
+ */
+CPhbkSyncReadMinimalContactInvalidUIDTest* CPhbkSyncReadMinimalContactInvalidUIDTest::NewL()
+	{
+	CPhbkSyncReadMinimalContactInvalidUIDTest* self = new(ELeave) CPhbkSyncReadMinimalContactInvalidUIDTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadMinimalContactInvalidUIDTest::CPhbkSyncReadMinimalContactInvalidUIDTest()
+	{
+	SetTestStepName(_L("ReadMinimalContactInvalidUIDTest"));
+	}
+
+enum TVerdict CPhbkSyncReadMinimalContactInvalidUIDTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(1);
+	DoSyncL();
+
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	const CContactIdArray* sortedItems = iDb->SortedItemsL();
+	TInt count = sortedItems->Count(); // for debugging
+	TESTCHECK(count, KTest1MaxSlots);
+
+	TContactItemId invalidUID(1500);
+	TRAPD(err,iDb->ReadMinimalContactL(invalidUID));
+	TESTCHECK(err, KErrNotFound);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadMinimalContactEmptyFieldTest object
+ */
+CPhbkSyncReadMinimalContactEmptyFieldTest* CPhbkSyncReadMinimalContactEmptyFieldTest::NewL()
+	{
+	CPhbkSyncReadMinimalContactEmptyFieldTest* self = new(ELeave) CPhbkSyncReadMinimalContactEmptyFieldTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadMinimalContactEmptyFieldTest::CPhbkSyncReadMinimalContactEmptyFieldTest()
+	{
+	SetTestStepName(_L("ReadMinimalContactEmptyFieldTest"));
+	}
+
+/** 
+ * Read a sequence of ICC entries - minimal read with missing fields. 
+ * Name, number or email fields are empty.
+ */
+enum TVerdict CPhbkSyncReadMinimalContactEmptyFieldTest::doTestStepL()
+	{
+	// This test employs data with empty fields
+	SetSimTsyTestNumberL(6);
+	DoSyncL();
+	
+	ReadMinimalContactL(KUidIccGlobalAdnPhonebook, KTest6ICCSlotsADN);
+	ReadMinimalContactL(KUidIccGlobalSdnPhonebook, KTest6ICCSlotsSDN);
+	ReadMinimalContactL(KUidIccGlobalLndPhonebook, KTest6ICCSlotsLND);
+	ReadMinimalContactL(KUidUsimAppAdnPhonebook, KTest6ICCSlotsUsim);
+	ReadMinimalContactL(KUidIccGlobalFdnPhonebook, KTest6ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadMinimalContactICCLockedTest object
+ */
+CPhbkSyncReadMinimalContactICCLockedTest* CPhbkSyncReadMinimalContactICCLockedTest::NewL()
+	{
+	CPhbkSyncReadMinimalContactICCLockedTest* self = new(ELeave) CPhbkSyncReadMinimalContactICCLockedTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadMinimalContactICCLockedTest::CPhbkSyncReadMinimalContactICCLockedTest()
+	{
+	SetTestStepName(_L("ReadMinimalContactICCLockedTest"));
+	}
+
+/** 
+ * Read a number of ICC entries - minimal read, entry not available as the ICC becomes locked.
+ */
+enum TVerdict CPhbkSyncReadMinimalContactICCLockedTest::doTestStepL()
+	{
+	// ADN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadMinimalContactLockedL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN);
+
+	// SDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadMinimalContactLockedL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN);
+
+	// LND Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadMinimalContactLockedL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND);
+
+	// Usim App Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadMinimalContactLockedL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim);
+
+	// FDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadMinimalContactLockedL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactTextDefFullViewTest object
+ */
+CPhbkSyncReadContactTextDefFullViewTest* CPhbkSyncReadContactTextDefFullViewTest::NewL()
+	{
+	CPhbkSyncReadContactTextDefFullViewTest* self = new(ELeave) CPhbkSyncReadContactTextDefFullViewTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactTextDefFullViewTest::CPhbkSyncReadContactTextDefFullViewTest()
+	{
+	SetTestStepName(_L("ReadContactTextDefFullViewTest"));
+	}
+
+/** 
+ * Read an ICC entry - create string from contact info (full view).
+ */
+enum TVerdict CPhbkSyncReadContactTextDefFullViewTest::doTestStepL()
+	{
+	// NOT trying to read all phonebook, hence EFalse
+
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+
+	ReadFullContactTextDefL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN, EFalse);
+	ReadFullContactTextDefL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN, EFalse);
+	ReadFullContactTextDefL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND, EFalse);
+	ReadFullContactTextDefL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim, EFalse);
+	ReadFullContactTextDefL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN, EFalse);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactNumberTextDefTest object
+ */
+CPhbkSyncReadContactNumberTextDefTest* CPhbkSyncReadContactNumberTextDefTest::NewL()
+	{
+	CPhbkSyncReadContactNumberTextDefTest* self = new(ELeave) CPhbkSyncReadContactNumberTextDefTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactNumberTextDefTest::CPhbkSyncReadContactNumberTextDefTest()
+	{
+	SetTestStepName(_L("ReadContactNumberTextDefTest"));
+	}
+
+/** 
+ * Read an ICC entry - create number string from contact info.
+ */
+enum TVerdict CPhbkSyncReadContactNumberTextDefTest::doTestStepL()
+	{
+	// NOT trying to read all phonebook, hence EFalse
+
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+
+	ReadNumberContactTextDefL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN, EFalse);
+	ReadNumberContactTextDefL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN, EFalse);
+	ReadNumberContactTextDefL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND, EFalse);
+	ReadNumberContactTextDefL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim, EFalse);
+	ReadNumberContactTextDefL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN, EFalse);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactNameTextDefTest object
+ */
+CPhbkSyncReadContactNameTextDefTest* CPhbkSyncReadContactNameTextDefTest::NewL()
+	{
+	CPhbkSyncReadContactNameTextDefTest* self = new(ELeave) CPhbkSyncReadContactNameTextDefTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactNameTextDefTest::CPhbkSyncReadContactNameTextDefTest()
+	{
+	SetTestStepName(_L("ReadContactNameTextDefTest"));
+	}
+
+/** 
+ * Read an ICC entry - create name string from contact info.
+ */
+enum TVerdict CPhbkSyncReadContactNameTextDefTest::doTestStepL()
+	{
+	// NOT trying to read all phonebook, hence EFalse
+
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+
+	ReadNameContactTextDefL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN, EFalse);
+	ReadNameContactTextDefL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN, EFalse);
+	ReadNameContactTextDefL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND, EFalse);
+	ReadNameContactTextDefL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim, EFalse);
+	ReadNameContactTextDefL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN, EFalse);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactInvalidTextDefTest object
+ */
+CPhbkSyncReadContactInvalidTextDefTest* CPhbkSyncReadContactInvalidTextDefTest::NewL()
+	{
+	CPhbkSyncReadContactInvalidTextDefTest* self = new(ELeave) CPhbkSyncReadContactInvalidTextDefTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactInvalidTextDefTest::CPhbkSyncReadContactInvalidTextDefTest()
+	{
+	SetTestStepName(_L("ReadContactInvalidTextDefTest"));
+	}
+
+/** 
+ * Read an ICC entry - invalid string specification.
+ */
+enum TVerdict CPhbkSyncReadContactInvalidTextDefTest::doTestStepL()
+	{
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+
+	ReadInvalidContactTextDefL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN);
+	ReadInvalidContactTextDefL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN);
+	ReadInvalidContactTextDefL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND);
+	ReadInvalidContactTextDefL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim);
+	ReadInvalidContactTextDefL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadContactICCLockedTest object
+ */
+CPhbkSyncReadContactICCLockedTest* CPhbkSyncReadContactICCLockedTest::NewL()
+	{
+	CPhbkSyncReadContactICCLockedTest* self = new(ELeave) CPhbkSyncReadContactICCLockedTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadContactICCLockedTest::CPhbkSyncReadContactICCLockedTest()
+	{
+	SetTestStepName(_L("ReadContactICCLockedTest"));
+	}
+
+/** 
+ * Read an ICC entry using text definition when ICC is locked.
+ */
+enum TVerdict CPhbkSyncReadContactICCLockedTest::doTestStepL()
+	{
+	// ADN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadLockedContactTextDefL(KUidIccGlobalAdnPhonebook, KTest2ICCSlotsADN);
+
+	// SDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadLockedContactTextDefL(KUidIccGlobalSdnPhonebook, KTest2ICCSlotsSDN);
+
+	// LND Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadLockedContactTextDefL(KUidIccGlobalLndPhonebook, KTest2ICCSlotsLND);
+
+	// Usim App Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadLockedContactTextDefL(KUidUsimAppAdnPhonebook, KTest2ICCSlotsUsim);
+
+	// FDN Entry
+	SetSimTsyTestNumberL(2);
+	DoSyncL();
+	ReadLockedContactTextDefL(KUidIccGlobalFdnPhonebook, KTest2ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/************************ STRESS TESTS *****************************/
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadFullICCNameViewTest object
+ */
+CPhbkSyncReadFullICCNameViewTest* CPhbkSyncReadFullICCNameViewTest::NewL()
+	{
+	CPhbkSyncReadFullICCNameViewTest* self = new(ELeave) CPhbkSyncReadFullICCNameViewTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadFullICCNameViewTest::CPhbkSyncReadFullICCNameViewTest()
+	{
+	SetTestStepName(_L("ReadFullICCNameViewTest"));
+	}
+
+/** 
+ * Read operation stress test.
+ *
+ * Read a full phonebook with the name view.
+ */
+enum TVerdict CPhbkSyncReadFullICCNameViewTest::doTestStepL()
+	{
+	// ensure contact database entries are removed because this test demands that 
+	// the order of new entry IDs corresponds to the order of the test data entries
+	delete iDb;
+	iDb=NULL;
+	User::After(1000000); //1 second wait for contact to shut down
+	iSession.Close();
+	ConfigurePhbkSyncToIdleL();
+	TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());	
+	ConfigurePhbkSyncToFullL();
+	iDb = OpenOrCreateContactDatabaseL();
+	User::After(1000000); //1 second wait for contact to start the phbk server
+	User::LeaveIfError(iSession.Connect());
+	User::After(3000000); //3 second wait for server to create phbktable
+
+	// Test data for this scenario is divided into individual phonebooks because
+	// SIMTSY cannot handle maximum entries for all phonebooks in a single set.
+	// Data provided is not necessarily the maximum possible for each phonebook
+	// due to inability to predict stack usage at the point of testing.
+	TRequestStatus status; 
+
+	// Global ADN
+	SetSimTsyTestNumberL(131);
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNameViewL(KUidIccGlobalAdnPhonebook, KTest13ICCSlotsADN);
+
+	// Global SDN
+	SetSimTsyTestNumberL(132);
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNameViewL(KUidIccGlobalSdnPhonebook, KTest13ICCSlotsSDN);
+
+	// Global LND
+	SetSimTsyTestNumberL(133);
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNameViewL(KUidIccGlobalLndPhonebook, KTest13ICCSlotsLND);
+
+	// USIM App
+	SetSimTsyTestNumberL(134);
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNameViewL(KUidUsimAppAdnPhonebook, KTest13ICCSlotsUsim);
+
+	// Global FDN
+	SetSimTsyTestNumberL(135);
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNameViewL(KUidIccGlobalFdnPhonebook, KTest13ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadFullICCNumberViewTest object
+ */
+CPhbkSyncReadFullICCNumberViewTest* CPhbkSyncReadFullICCNumberViewTest::NewL()
+	{
+	CPhbkSyncReadFullICCNumberViewTest* self = new(ELeave) CPhbkSyncReadFullICCNumberViewTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadFullICCNumberViewTest::CPhbkSyncReadFullICCNumberViewTest()
+	{
+	SetTestStepName(_L("ReadFullICCNumberViewTest"));
+	}
+
+/** 
+ * Read operation stress test.
+ *
+ * Read a full phonebook with the number view. It is also necessary to view the Contacts DB 
+ * using the development UI to ensure that these test cases pass.
+ */
+enum TVerdict CPhbkSyncReadFullICCNumberViewTest::doTestStepL()
+	{
+	// Test data for this scenario is divided into individual phonebooks because
+	// SIMTSY cannot handle maximum entries for all phonebooks in a single set.
+	// Data provided is not necessarily the maximum possible for each phonebook
+	// due to inability to predict stack usage at the point of testing.
+	TRequestStatus status; 
+
+	// Global ADN
+	SetSimTsyTestNumberL(131);
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNumberViewL(KUidIccGlobalAdnPhonebook, KTest13ICCSlotsADN);
+
+	// Global SDN
+	SetSimTsyTestNumberL(132);
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNumberViewL(KUidIccGlobalSdnPhonebook, KTest13ICCSlotsSDN);
+
+	// Global LND
+	SetSimTsyTestNumberL(133);
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNumberViewL(KUidIccGlobalLndPhonebook, KTest13ICCSlotsLND);
+
+	// USIM App
+	SetSimTsyTestNumberL(134);
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNumberViewL(KUidUsimAppAdnPhonebook, KTest13ICCSlotsUsim);
+
+	// Global FDN
+	SetSimTsyTestNumberL(135);
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactNumberViewL(KUidIccGlobalFdnPhonebook, KTest13ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadFullICCFullViewTest object
+ */
+CPhbkSyncReadFullICCFullViewTest* CPhbkSyncReadFullICCFullViewTest::NewL()
+	{
+	CPhbkSyncReadFullICCFullViewTest* self = new(ELeave) CPhbkSyncReadFullICCFullViewTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadFullICCFullViewTest::CPhbkSyncReadFullICCFullViewTest()
+	{
+	SetTestStepName(_L("ReadFullICCFullViewTest"));
+	}
+
+/** 
+ * Read a full phonebook with the full view.
+ */
+enum TVerdict CPhbkSyncReadFullICCFullViewTest::doTestStepL()
+	{
+	// Test data for this scenario is divided into individual phonebooks because
+	// SIMTSY cannot handle maximum entries for all phonebooks in a single set.
+	// Data provided is not necessarily the maximum possible for each phonebook
+	// due to inability to predict stack usage at the point of testing.
+	TRequestStatus status; 
+
+	// Global ADN
+	SetSimTsyTestNumberL(131);
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactFullViewL(KUidIccGlobalAdnPhonebook, KTest13ICCSlotsADN);
+
+	// Global SDN
+	SetSimTsyTestNumberL(132);
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactFullViewL(KUidIccGlobalSdnPhonebook, KTest13ICCSlotsSDN);
+
+	// Global LND
+	SetSimTsyTestNumberL(133);
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactFullViewL(KUidIccGlobalLndPhonebook, KTest13ICCSlotsLND);
+
+	// USIM App
+	SetSimTsyTestNumberL(134);
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactFullViewL(KUidUsimAppAdnPhonebook, KTest13ICCSlotsUsim);
+
+	// Global FDN
+	SetSimTsyTestNumberL(135);
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadAllContactFullViewL(KUidIccGlobalFdnPhonebook, KTest13ICCSlotsFDN);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadFullICCNameTextDefTest object
+ */
+CPhbkSyncReadFullICCNameTextDefTest* CPhbkSyncReadFullICCNameTextDefTest::NewL()
+	{
+	CPhbkSyncReadFullICCNameTextDefTest* self = new(ELeave) CPhbkSyncReadFullICCNameTextDefTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadFullICCNameTextDefTest::CPhbkSyncReadFullICCNameTextDefTest()
+	{
+	SetTestStepName(_L("ReadFullICCNameTextDefTest"));
+	}
+
+/** 
+ * Read a full phonebook - create name string from contact info.
+ */
+enum TVerdict CPhbkSyncReadFullICCNameTextDefTest::doTestStepL()
+	{
+	// Test data for this scenario is divided into individual phonebooks because
+	// SIMTSY cannot handle maximum entries for all phonebooks in a single set.
+	// Data provided is not necessarily the maximum possible for each phonebook
+	// due to inability to predict stack usage at the point of testing.
+	TRequestStatus status; 
+
+	// Global ADN
+	SetSimTsyTestNumberL(131);
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNameContactTextDefL(KUidIccGlobalAdnPhonebook, KTest13ICCSlotsADN, ETrue);
+
+	// Global SDN
+	SetSimTsyTestNumberL(132);
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNameContactTextDefL(KUidIccGlobalSdnPhonebook, KTest13ICCSlotsSDN, ETrue);
+
+	// Global LND
+	SetSimTsyTestNumberL(133);
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNameContactTextDefL(KUidIccGlobalLndPhonebook, KTest13ICCSlotsLND, ETrue);
+
+	// USIM App
+	SetSimTsyTestNumberL(134);
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNameContactTextDefL(KUidUsimAppAdnPhonebook, KTest13ICCSlotsUsim, ETrue);
+
+	// Global FDN
+	SetSimTsyTestNumberL(135);
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNameContactTextDefL(KUidIccGlobalFdnPhonebook, KTest13ICCSlotsFDN, ETrue);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadFullICCNumberTextDefTest object
+ */
+CPhbkSyncReadFullICCNumberTextDefTest* CPhbkSyncReadFullICCNumberTextDefTest::NewL()
+	{
+	CPhbkSyncReadFullICCNumberTextDefTest* self = new(ELeave) CPhbkSyncReadFullICCNumberTextDefTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadFullICCNumberTextDefTest::CPhbkSyncReadFullICCNumberTextDefTest()
+	{
+	SetTestStepName(_L("ReadFullICCNumberTextDefTest"));
+	}
+
+/** 
+ * Read a full phonebook - create number string from contact info.
+ */
+enum TVerdict CPhbkSyncReadFullICCNumberTextDefTest::doTestStepL()
+	{
+	// Test data for this scenario is divided into individual phonebooks because
+	// SIMTSY cannot handle maximum entries for all phonebooks in a single set.
+	// Data provided is not necessarily the maximum possible for each phonebook
+	// due to inability to predict stack usage at the point of testing.
+	TRequestStatus status; 
+
+	// Global ADN
+	SetSimTsyTestNumberL(131);
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNumberContactTextDefL(KUidIccGlobalAdnPhonebook, KTest13ICCSlotsADN, ETrue);
+
+	// Global SDN
+	SetSimTsyTestNumberL(132);
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNumberContactTextDefL(KUidIccGlobalSdnPhonebook, KTest13ICCSlotsSDN, ETrue);
+
+	// Global LND
+	SetSimTsyTestNumberL(133);
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNumberContactTextDefL(KUidIccGlobalLndPhonebook, KTest13ICCSlotsLND, ETrue);
+
+	// USIM App
+	SetSimTsyTestNumberL(134);
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNumberContactTextDefL(KUidUsimAppAdnPhonebook, KTest13ICCSlotsUsim, ETrue);
+
+	// Global FDN
+	SetSimTsyTestNumberL(135);
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadNumberContactTextDefL(KUidIccGlobalFdnPhonebook, KTest13ICCSlotsFDN, ETrue);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadFullICCFullViewTextDefTest object
+ */
+CPhbkSyncReadFullICCFullViewTextDefTest* CPhbkSyncReadFullICCFullViewTextDefTest::NewL()
+	{
+	CPhbkSyncReadFullICCFullViewTextDefTest* self = new(ELeave) CPhbkSyncReadFullICCFullViewTextDefTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadFullICCFullViewTextDefTest::CPhbkSyncReadFullICCFullViewTextDefTest()
+	{
+	SetTestStepName(_L("ReadFullICCFullViewTextDefTest"));
+	}
+
+/** 
+ * Read a full phonebook - create string from contact info (full view).
+ */
+enum TVerdict CPhbkSyncReadFullICCFullViewTextDefTest::doTestStepL()
+	{
+	// Test data for this scenario is divided into individual phonebooks because
+	// SIMTSY cannot handle maximum entries for all phonebooks in a single set.
+	// Data provided is not necessarily the maximum possible for each phonebook
+	// due to inability to predict stack usage at the point of testing.
+	TRequestStatus status; 
+
+	// Global ADN
+	SetSimTsyTestNumberL(131);
+	iSession.DoSynchronisation(status);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadFullContactTextDefL(KUidIccGlobalAdnPhonebook, KTest13ICCSlotsADN, ETrue);
+
+	// Global SDN
+	SetSimTsyTestNumberL(132);
+	iSession.DoSynchronisation(status, KUidIccGlobalSdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadFullContactTextDefL(KUidIccGlobalSdnPhonebook, KTest13ICCSlotsSDN, ETrue);
+
+	// Global LND
+	SetSimTsyTestNumberL(133);
+	iSession.DoSynchronisation(status, KUidIccGlobalLndPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadFullContactTextDefL(KUidIccGlobalLndPhonebook, KTest13ICCSlotsLND, ETrue);
+
+	// USIM App
+	SetSimTsyTestNumberL(134);
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadFullContactTextDefL(KUidUsimAppAdnPhonebook, KTest13ICCSlotsUsim, ETrue);
+
+	// Global FDN
+	SetSimTsyTestNumberL(135);
+	iSession.DoSynchronisation(status, KUidIccGlobalFdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+	ReadFullContactTextDefL(KUidIccGlobalFdnPhonebook, KTest13ICCSlotsFDN, ETrue);
+
+	return TestStepResult();
+	}
+
+
+/** 
+ * Check group membership.
+ * All ICC entries synchronised should belong to a single group. This group 
+ * should contain all the ADN phonebook entries
+ *
+ * @param aItem             ICC entry 
+ * @param aExpectedMembers  Expected number of members of the ADN phonebook
+ */
+void CPhbkReadIntegrationTestBase::CheckGroupMembershipL(CContactICCEntry& aItem, TInt aExpectedMembers)
+	{
+	const CContactIdArray* owned = aItem.GroupsJoined();	
+	TESTCHECKCONDITIONL(owned != NULL);
+	TESTCHECKL(owned->Count(), 1);
+	TContactItemId groupId = (*owned)[0];
+
+	CContactGroup* group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId));
+	CleanupStack::PushL(group);	
+	const CContactIdArray* itemsContained = group->ItemsContained();
+	TESTCHECKL(itemsContained->Count(), aExpectedMembers);
+	CleanupStack::PopAndDestroy(group);	
+	}
+
+/** 
+ * 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 CPhbkReadIntegrationTestBase::CheckFieldContentL(CContactItemFieldSet& aFieldset, TFieldType aFieldType, const TDesC& aExpectedContent)
+	{
+	TInt pos = aFieldset.Find(aFieldType);
+	CContactItemField& field = aFieldset[pos];
+	CContactTextField* textField = field.TextStorage();
+	TESTCHECKCONDITION(textField != NULL);
+	TESTCHECKCONDITIONL(textField->Text() == aExpectedContent);
+	}
+
+
+/** 
+ * Check that the field of type aFieldType has the same content as 
+ * aExpectedContent.  This method is an overload of 
+ * CPhbkReadIntegrationTestBase::CheckFieldContentL(CContactItemFieldSet& aFieldset, TFieldType aFieldType, const TDesC& aExpectedContent)
+ * and allows the user to check the field content of a field when there
+ * are multiple instances of the field in the CContactItemfieldSet array 
+ * specified.  This can be done by specifying the position in the array
+ * to start searching from.
+ *
+ * @param aFieldset Contact item fieldset
+ * @param aFieldType Field type to test
+ * @param aSearchFromPos The index in aFieldSet to start searching from
+ * @param aExpectedContent Expected data
+ */
+void CPhbkReadIntegrationTestBase::CheckFieldContentL(CContactItemFieldSet& aFieldset, TFieldType aFieldType, TInt aSearchFromPos, const TDesC& aExpectedContent)
+	{
+	TInt pos = aFieldset.FindNext(aFieldType, aSearchFromPos);
+	CContactItemField& field = aFieldset[pos];
+	CContactTextField* textField = field.TextStorage();
+	TESTCHECKCONDITION(textField != NULL);
+	TESTCHECKCONDITIONL(textField->Text() == aExpectedContent);
+	}
+	
+/** 
+ * Check that aEntry contains correct number of fields.
+ *
+ * @param aPhonebook  ICC Phonebook to check.
+ * @param aEntry      Contact ICC Entry
+ */
+void CPhbkReadIntegrationTestBase::CheckFieldCountL(const TUid aPhonebook, CContactICCEntry* aEntry)
+	{
+	CContactItemFieldSet& fieldset = aEntry->CardFields();
+	const TInt fieldsetCount = fieldset.Count(); //for debugging
+	if (aPhonebook == KUidUsimAppAdnPhonebook)
+		{
+		TESTCHECKCONDITION(fieldsetCount >= 6); //Name,Number,email,ICC slot, phonebook
+		}
+	else
+		{
+		TESTCHECKCONDITION(fieldsetCount >= 5); //Name,Number,ICC slot, phonebook
+		}
+	}
+
+/** 
+ * Check that aEntry contains correct number of fields for minimal contact item.
+ *
+ * @param aPhonebook  ICC Phonebook to check.
+ * @param aEntry      Contact ICC Entry
+ */
+void CPhbkReadIntegrationTestBase::CheckMinimalFieldCountL(const TUid aPhonebook, CContactICCEntry* aEntry)
+	{
+	CContactItemFieldSet& fieldset = aEntry->CardFields();
+	const TInt fieldsetCount = fieldset.Count(); //for debugging
+	if (aPhonebook == KUidUsimAppAdnPhonebook)
+		{
+		TESTCHECKCONDITION(fieldsetCount >= 5); //Name,Number,email,ICC slot, phonebook
+		}
+	else
+		{
+		TESTCHECKCONDITION(fieldsetCount >= 4); //Name,Number,ICC slot, phonebook
+		}
+	}
+
+/** 
+ * Check that the field data stored on the SIM is identical to the
+ * data stored in Contacts model.
+ * @param aPhonebook type of phonebook
+ * @param aItem ICC item to test
+ * @param aSlotNumber Slot number 
+ */
+void CPhbkReadIntegrationTestBase::CheckFieldsL(const TUid aPhonebook, CContactICCEntry* aItem, TInt aSlotNumber)
+	{
+	TBuf<20> buf;
+	CContactItemFieldSet& fieldset = aItem->CardFields();
+	if(aPhonebook == KUidIccGlobalAdnPhonebook)
+		{
+		buf.Format(KNameFormat, 'A', aSlotNumber);
+		}
+	else if(aPhonebook == KUidIccGlobalSdnPhonebook)
+		{
+		buf.Format(KNameFormat, 'B', aSlotNumber);
+		}
+	else if(aPhonebook == KUidIccGlobalLndPhonebook)
+		{
+		buf.Format(KNameFormat, 'C', aSlotNumber);
+		}
+	else if(aPhonebook == KUidUsimAppAdnPhonebook)
+		{
+		buf.Format(KNameFormat, 'D', aSlotNumber);
+		}
+	else if(aPhonebook == KUidIccGlobalFdnPhonebook)
+		{
+		buf.Format(KNameFormat, 'E', aSlotNumber);
+		}
+	CheckFieldContentL(fieldset,KUidContactFieldFamilyName,buf);
+	buf.Format(KNumberFormat,aSlotNumber);
+	CheckFieldContentL(fieldset,KUidContactFieldPhoneNumber,buf);
+	if(aPhonebook == KUidUsimAppAdnPhonebook)
+		{
+		buf.Format(KEmailFormat,aSlotNumber);
+		CheckFieldContentL(fieldset,KUidContactFieldEMail,buf);
+		}
+	}
+
+/** 
+ * Read all ICC entry - normal case.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+void CPhbkReadIntegrationTestBase::ReadContactL(const TUid aPhonebook, TInt aExpectedCount, TBool aReadAll)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+  	// Read all items or only first?
+  	if (!aReadAll)
+  		count = 1;
+  	
+	for (TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		CContactICCEntry* entry = NULL;
+		TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id)));
+		TESTCHECKL(err, KErrNone);
+		CleanupStack::PushL(entry);
+		// Verify correct number of fields created for entry
+		CheckFieldCountL(aPhonebook, entry);
+		CleanupStack::PopAndDestroy(); // entry
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read a sequence of ICC entries - normal case.
+ * Check group membership is correct and check field content
+ */
+void CPhbkReadIntegrationTestBase::ReadAllContactContentL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read each item
+	for (TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		CContactICCEntry* entry = NULL;
+		TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id)));
+		TESTCHECKL(err, KErrNone);
+		delete entry;
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read a ICC entry - entry not available as the ICC becomes locked.
+ */
+void CPhbkReadIntegrationTestBase::ReadFullContactLockedL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+	SignalSimTsyToReduceTimersL();
+
+	// Access ICC and wait for it to become locked
+	TContactItemId id = (*array)[0]; 
+	while(err==KErrNone) 
+		{
+		User::After(1000000);	// Wait a second and try again.
+		CContactICCEntry* failEntry=NULL;
+		TRAP(err, failEntry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView())); // Entry unavailable due to ICC being locked
+		delete failEntry;
+		}
+	TESTCHECKL(err, KErrAccessDenied);
+	SignalSimTsyToReduceTimersL();
+
+	// Wait for ICC to become unlocked again
+	while(err==KErrAccessDenied) 
+		{
+		User::After(1000000);	// Wait a second and try again.
+		CContactICCEntry* failEntry=NULL;
+		TRAP(err, failEntry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView())); // Entry unavailable due to ICC being locked
+		delete failEntry;
+		}
+
+	WaitForSyncToCompleteL();
+
+	// Read the item again
+	CContactICCEntry* entry = NULL;
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *iDb->AllFieldsView())));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(entry);
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Verify correct number of fields created for entry
+	CheckFieldCountL(aPhonebook, entry);
+
+	CleanupStack::PopAndDestroy(2); // group and entry
+	}
+
+/** 
+ * Read ICC entry - specify full view, full view for non-existent entry, name, number 
+ * and invalid view
+ */
+void CPhbkReadIntegrationTestBase::ReadContactViewsL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	TContactItemId id = (*array)[0];
+
+	// Full view 
+	CContactICCEntry* entry = NULL;
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *iDb->AllFieldsView())));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(entry);
+	CheckGroupMembershipL(*entry,aExpectedCount);
+	CheckFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+	CleanupStack::PopAndDestroy();
+
+	// Full view non-existent entry
+	TContactItemId invalidUID(9877); 
+	TRAP(err,entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(invalidUID, *iDb->AllFieldsView())));
+	TESTCHECKL(err, KErrNotFound);
+
+	// Number view 
+	CContactItemViewDef* numberView=CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields);
+	CleanupStack::PushL(numberView);
+	numberView->AddL(KUidContactFieldPhoneNumber); 
+	TESTCHECKL(numberView->Count(), 1);
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *numberView))); 
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(entry);
+	CheckGroupMembershipL(*entry,aExpectedCount);
+	CheckFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+	CleanupStack::PopAndDestroy();
+	CleanupStack::PopAndDestroy();
+
+	// Name view 
+	CContactItemViewDef* nameView = CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields);
+	CleanupStack::PushL(nameView);
+	nameView->AddL(KUidContactFieldFamilyName); 
+	TESTCHECKL(nameView->Count(), 1);
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *nameView)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(entry);
+	CheckGroupMembershipL(*entry,aExpectedCount);
+	CheckFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+	CleanupStack::PopAndDestroy();
+	CleanupStack::PopAndDestroy();
+
+	// Invalid view 
+	TUid invalidUid = {-2};
+	CContactICCEntry* failEntry = NULL;
+	CContactItemViewDef* invalidView=CContactItemViewDef::NewL(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields);
+	CleanupStack::PushL(invalidView);
+	invalidView->AddL(invalidUid); 
+	TESTCHECKL(invalidView->Count(), 1);
+	TRAP(err, failEntry = (CContactICCEntry*)(iDb->ReadContactL(id, *invalidView)));
+	TESTCHECKL(err, KErrNone); // valid id 
+	CleanupStack::PushL(failEntry);
+	CContactItemFieldSet& fieldset = failEntry->CardFields();
+	const TInt pos(fieldset.Find(KUidContactFieldFamilyName));	
+	CContactItemField& field = fieldset[pos];
+	CContactTextField* textfield = field.TextStorage();
+	TESTCHECKCONDITIONL(textfield->IsFull());
+	CleanupStack::PopAndDestroy();
+	CleanupStack::PopAndDestroy();
+	SignalSimTsyToReduceTimersL();
+
+	// Full view entry not available
+	while(err==KErrNone) // Wait for ICC to become locked
+		{
+		CContactICCEntry* entry = NULL;
+		User::After(1000000);
+		TRAP(err, entry = (CContactICCEntry*)iDb->ReadContactL(id, *iDb->AllFieldsView()));
+		if (!err)
+			delete entry;
+		}
+	TESTCHECKL(err, KErrAccessDenied);
+
+	CleanupStack::PopAndDestroy(group);	// group
+	}
+
+/**
+ * Read an ICC contact - minimal read operation.
+ */
+void CPhbkReadIntegrationTestBase::ReadMinimalContactL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read entry
+	TContactItemId id = (*array)[0];
+	CContactICCEntry* entry = NULL;
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadMinimalContactL(id)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(entry);
+	CheckMinimalFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+
+	CleanupStack::PopAndDestroy(2); // group & entry
+	}
+
+/** 
+ * Read minimal ICC entry - normal case.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+void CPhbkReadIntegrationTestBase::ReadAllMinimalContactL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read each item
+	for (TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		CContactICCEntry* entry = NULL;
+		TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadMinimalContactL(id)));
+		TESTCHECKL(err, KErrNone);
+		CleanupStack::PushL(entry);
+		// Verify correct number of fields created for entry
+		CheckMinimalFieldCountL(aPhonebook, entry);
+		CleanupStack::PopAndDestroy(); // entry
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read minimal ICC entry - entry not available as the ICC becomes locked.
+ */
+void CPhbkReadIntegrationTestBase::ReadMinimalContactLockedL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+	SignalSimTsyToReduceTimersL();
+
+	// Access ICC and wait for it to become locked
+	TContactItemId id = (*array)[0]; 
+	while(err==KErrNone) 
+		{
+		User::After(1000000);	// Wait a second and try again.
+		CContactICCEntry* failEntry=NULL;
+		TRAP(err, failEntry = (CContactICCEntry*)iDb->ReadMinimalContactL(id)); // Entry unavailable due to ICC being locked
+		delete failEntry;
+		}
+	TESTCHECKL(err, KErrAccessDenied);
+	SignalSimTsyToReduceTimersL();
+
+	// Wait for ICC to become unlocked again
+	while(err==KErrAccessDenied) 
+		{
+		User::After(1000000);	// Wait a second and try again.
+		CContactICCEntry* failEntry=NULL;
+		TRAP(err, failEntry = (CContactICCEntry*)iDb->ReadMinimalContactL(id)); // Entry unavailable due to ICC being locked
+		delete failEntry;
+		}
+		
+	WaitForSyncToCompleteL();
+
+	// Read the item again
+	CContactICCEntry* entry = NULL;
+	TRAP(err, entry = static_cast<CContactICCEntry*>(iDb->ReadMinimalContactL(id)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(entry);
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Verify correct number of fields created for entry
+	CheckMinimalFieldCountL(aPhonebook, entry);
+
+	CleanupStack::PopAndDestroy(2); // group and entry
+	}
+
+/** 
+ * Read an ICC entry -  - create string from contact info (full view)
+ */
+void CPhbkReadIntegrationTestBase::ReadFullContactTextDefL(const TUid aPhonebook, TInt aExpectedCount, TBool aReadAll)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read all items or only the first?
+	if (!aReadAll)
+		count = 1;
+		
+	for(TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		TBuf<RMobilePhone::KMaxMobileTelNumberSize> buf;
+		TRAPD(err, iDb->ReadContactTextDefL(id,buf,NULL)); // Pass NULL as text definition - Contacts model will construct descriptor from the first fields that match
+		TESTCHECKL(err, KErrNone);
+		TESTCHECKCONDITIONL(buf.Length() != 0);
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read an ICC entry -  - create number string from contact info
+ */
+void CPhbkReadIntegrationTestBase::ReadNumberContactTextDefL(const TUid aPhonebook, TInt aExpectedCount, TBool aReadAll)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read all items or only the first?
+	if (!aReadAll)
+		count = 1;
+		
+	for(TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		CContactTextDef *textDef=CContactTextDef::NewL();
+		CleanupStack::PushL(textDef);
+		textDef->AppendL(TContactTextDefItem(KUidContactFieldPhoneNumber,_L("==")));
+		TBuf<RMobilePhone::KMaxMobileTelNumberSize> buf;
+		TRAPD(err, iDb->ReadContactTextDefL(id,buf,textDef));
+		TESTCHECKL(err, KErrNone);
+		TESTCHECKCONDITIONL(buf.Length() != 0);
+		CleanupStack::PopAndDestroy(textDef);
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read an ICC entry - create name string from contact info
+ */
+void CPhbkReadIntegrationTestBase::ReadNameContactTextDefL(const TUid aPhonebook, TInt aExpectedCount, TBool aReadAll)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read all items or only the first?
+	if (!aReadAll)
+		count = 1;
+		
+	for(TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		CContactTextDef *textDef=CContactTextDef::NewL();
+		CleanupStack::PushL(textDef);
+		textDef->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,_L("==")));
+		TBuf<KMaxPhBkNameSize> buf;
+		TRAPD(err, iDb->ReadContactTextDefL(id,buf,textDef));
+		TESTCHECKL(err, KErrNone);
+		TESTCHECKCONDITIONL(buf.Length() != 0);
+		CleanupStack::PopAndDestroy(textDef);
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read an ICC entry - invalid string specification
+ */
+void CPhbkReadIntegrationTestBase::ReadInvalidContactTextDefL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read the first item
+	TContactItemId id = (*array)[0];
+	CContactTextDef *textDef=CContactTextDef::NewL();
+	CleanupStack::PushL(textDef);
+	textDef->SetExactMatchOnly(ETrue);
+	textDef->AppendL(TContactTextDefItem(KUidContactFieldCompanyName,_L("==")));
+	TBuf<KMaxPhBkNameSize> buf;
+	TRAP(err, iDb->ReadContactTextDefL(id,buf,textDef));
+	TESTCHECKL(err, KErrNone); // contact ID being read is valid and 
+							   // the ICC contact can be read (ie. read validation was ok).
+	TESTCHECKL(buf.Length(), 0); // field in the text definition does not 
+								 // exist in an ICC contact so buf is empty 
+	CleanupStack::PopAndDestroy(2); // group & textDef
+	}
+
+/** 
+ * Read a locked ICC entry - create name string from contact info
+ */
+void CPhbkReadIntegrationTestBase::ReadLockedContactTextDefL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	// Read the first item
+	TContactItemId id = (*array)[0];
+	CContactTextDef *textDef=CContactTextDef::NewLC();
+	textDef->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,_L("==")));
+	TBuf<KMaxPhBkNameSize> buf;
+	SignalSimTsyToReduceTimersL();
+	while(err==KErrNone) // Wait for ICC to become locked
+		{
+		User::After(5000);
+		TRAP(err, iDb->ReadContactTextDefL(id,buf,textDef));
+		}
+	TESTCHECKL(err, KErrAccessDenied);
+
+	CleanupStack::PopAndDestroy(2); // group & textDef
+	}
+
+
+/** 
+ * Read all ICC entry - full view.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+void CPhbkReadIntegrationTestBase::ReadAllContactFullViewL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	for(TInt i=0; i<count; ++i)
+		{
+		// Full view 
+		TContactItemId id = (*array)[i];
+		CContactICCEntry* entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *iDb->AllFieldsView())); // specify full view
+		CleanupStack::PushL(entry);
+		CheckFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+		CheckFieldsL(aPhonebook, entry, i + 1); // Entry contains correct content
+		CleanupStack::PopAndDestroy(entry);
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read all ICC entry - name view.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+void CPhbkReadIntegrationTestBase::ReadAllContactNameViewL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	for(TInt i=0; i<count; ++i)
+		{
+		// Name view 
+		TContactItemId id = (*array)[i];
+		CContactItemViewDef* view = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields);
+		view->AddL(KUidContactFieldFamilyName); 
+		TESTCHECKL(view->Count(), 1);
+		CContactICCEntry* entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *view));
+		CleanupStack::PushL(entry);
+		CheckFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+		CleanupStack::PopAndDestroy(entry);
+		CleanupStack::PopAndDestroy();	// view	
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+/** 
+ * Read all ICC entry - number view.
+ * Check group membership is correct and relevant number of fields have
+ * been created.
+ */
+void CPhbkReadIntegrationTestBase::ReadAllContactNumberViewL(const TUid aPhonebook, TInt aExpectedCount)
+	{
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the given phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						aPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	// Verify correct number of entries created for this phonebook
+	const TInt count = array->Count(); // for debugging
+	TESTCHECKL(count, aExpectedCount);
+
+	for(TInt i=0; i<count; ++i)
+		{
+		// Number view 
+		TContactItemId id = (*array)[i];
+		CContactItemViewDef* view = CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields);
+		view->AddL(KUidContactFieldPhoneNumber); 
+		TESTCHECKL(view->Count(), 1);
+		CContactICCEntry* entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id, *view));
+		CleanupStack::PushL(entry);
+		CheckFieldCountL(aPhonebook, entry); // Entry contains correct number of fields
+		CleanupStack::PopAndDestroy(entry);
+		CleanupStack::PopAndDestroy();	// view	
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	}
+
+
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadAdditionalNumTagsTest object
+ */
+CPhbkSyncReadAdditionalNumTagsTest* CPhbkSyncReadAdditionalNumTagsTest::NewL()
+	{
+	CPhbkSyncReadAdditionalNumTagsTest* self = new(ELeave) CPhbkSyncReadAdditionalNumTagsTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadAdditionalNumTagsTest::CPhbkSyncReadAdditionalNumTagsTest()
+	{
+	SetTestStepName(_L("ReadAdditionalNumTagsTest"));
+	}
+
+/** 
+ * Read ICC entries with additional numbers and alpha tags
+ */
+enum TVerdict CPhbkSyncReadAdditionalNumTagsTest::doTestStepL()
+	{
+	// ensure contact database entries are removed because this test demands that 
+	// the order of new entry IDs corresponds to the order of the test data entries
+	delete iDb;
+	iDb=NULL;
+	User::After(1000000); //1 second wait for contact to shut down
+	
+	iSession.Close();
+	ConfigurePhbkSyncToIdleL();
+	TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());	
+	ConfigurePhbkSyncToFullL();
+	iDb = OpenOrCreateContactDatabaseL();
+	User::After(1000000); //1 second wait for contact to start the phbk server
+	User::LeaveIfError(iSession.Connect());
+	User::After(3000000); //3 second wait for server to create phbktable
+
+	SetSimTsyTestNumberL(22);
+	DoSyncL();
+
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+	// get the unique groupId for the USIM App phonebook
+	TContactItemId groupId(KNullContactId);
+	User::LeaveIfError(iSession.GetPhoneBookId(groupId, 
+						RPhoneBookSession::ESyncGroupId,
+						KUidUsimAppAdnPhonebook));
+	TESTCHECKCONDITIONL(groupId != KNullContactId);
+  
+	// based on the groupId, get items belonging to the phonebook
+	CContactGroup* group = NULL;
+	TRAPD(err, group = static_cast<CContactGroup*>(iDb->ReadContactL(groupId)));
+	TESTCHECKL(err, KErrNone);
+	CleanupStack::PushL(group);
+	const CContactIdArray* array = group->ItemsContained();
+
+	const TInt count = array->Count(); // for debugging
+	for(TInt i=0; i<count; ++i)
+		{
+		TContactItemId id = (*array)[i];
+		CContactICCEntry* entry = static_cast<CContactICCEntry*>(iDb->ReadContactL(id));
+		CleanupStack::PushL(entry);
+		CContactItemFieldSet& fieldset = entry->CardFields();
+		TInt pos(KErrNotFound);
+		switch (i)
+		{
+		case 0:
+			pos = fieldset.Find(KUidContactFieldVCardMapMSG);
+			break;
+		case 1:
+			pos = fieldset.Find(KUidContactFieldVCardMapVOICE);
+			break;
+		case 2:
+			pos = fieldset.Find(KUidContactFieldVCardMapFAX);
+			break;
+		case 3:
+			pos = fieldset.Find(KUidContactFieldVCardMapPREF);
+			break;
+		case 4:
+			pos = fieldset.Find(KUidContactFieldVCardMapCELL);
+			break;
+		case 5:
+			pos = fieldset.Find(KUidContactFieldVCardMapPAGER);
+			break;
+		case 6:
+			pos = fieldset.Find(KUidContactFieldVCardMapBBS);
+			break;
+		case 7:
+			pos = fieldset.Find(KUidContactFieldVCardMapMODEM);
+			break;
+		case 8:
+			pos = fieldset.Find(KUidContactFieldVCardMapCAR);
+			break;
+		case 9:
+			pos = fieldset.Find(KUidContactFieldVCardMapISDN);
+			break;
+		case 10:
+			pos = fieldset.Find(KUidContactFieldVCardMapVIDEO);
+			break;
+
+		default:
+			break;
+		}
+		TESTCHECKCONDITIONL(pos != KErrNotFound);
+		CleanupStack::PopAndDestroy(entry);
+		}
+
+	CleanupStack::PopAndDestroy(); // group
+	return TestStepResult();
+	}
+	
+/** 
+ * Factory construction method.
+ * @return Pointer to CPhbkSyncReadInternationalNumberTest object
+ */
+CPhbkSyncReadInternationalNumberTest* CPhbkSyncReadInternationalNumberTest::NewL()
+	{
+	CPhbkSyncReadInternationalNumberTest* self = new(ELeave) CPhbkSyncReadInternationalNumberTest();
+	return self;
+	}
+
+/**
+ *  Default constructor.  Each test step initialises it's own name.
+ */
+CPhbkSyncReadInternationalNumberTest::CPhbkSyncReadInternationalNumberTest()
+	{
+	SetTestStepName(_L("ReadInternationalNumberTest"));
+	}
+
+/** 
+ * Read ICC entries with international numbers.
+ */
+enum TVerdict CPhbkSyncReadInternationalNumberTest::doTestStepL()
+	{
+	// Clear out the Contacts Database to start from afresh for this test.
+	delete iDb;
+	iDb=NULL;
+	User::After(1000000); //1 second wait for contact to shut down
+	
+	iSession.Close();
+	ConfigurePhbkSyncToIdleL();
+	TRAP_IGNORE(CContactDatabase::DeleteDefaultFileL());	
+	ConfigurePhbkSyncToFullL();
+	iDb = OpenOrCreateContactDatabaseL();
+	User::After(1000000); //1 second wait for contact to start the phbk server
+	User::LeaveIfError(iSession.Connect());
+	User::After(3000000); //3 second wait for server to create phbktable
+
+	SetSimTsyTestNumberL(136);
+	
+	// Sync the USIM App ADN Phonebook
+	TRequestStatus status = KErrNone;
+	iSession.DoSynchronisation(status, KUidUsimAppAdnPhonebook);
+	User::WaitForRequest(status);
+	TESTCHECKL(status.Int(), KErrNone);
+		
+	iDb->SetDbViewContactType(KUidContactICCEntry);	
+	
+	// Search for a particular contact in the database
+	
+	// Specify which fields to search
+	CContactItemFieldDef* fieldDef = new(ELeave) CContactItemFieldDef;
+	CleanupStack::PushL(fieldDef);
+	fieldDef->AppendL(KUidContactFieldFamilyName); 
+	
+	// Get the contact item ID of the contact we are looking for
+	CContactIdArray* array = iDb->FindLC(KTestPersonWithInternationalNumber, fieldDef);
+	TESTCHECKL(array->Count(),1);
+  	
+  	TContactItemId contactItemId = (*array)[0];
+  	
+  	CleanupStack::PopAndDestroy(2, fieldDef); // array, fieldDef
+  	
+  	// Get the contact item
+	CContactItem* contactItem = iDb->ReadContactL(contactItemId);
+	CleanupStack::PushL(contactItem);
+	
+	CContactItemFieldSet& fieldset = contactItem->CardFields();
+	
+	// Compare the international numbers with what is expected
+	// index stores the field position to search from since all
+	// the numbers are stored in multiple instances of the same field type.	
+	TInt index = fieldset.Find(KUidContactFieldPhoneNumber);
+	CheckFieldContentL(fieldset, KUidContactFieldPhoneNumber, KTestInternationalNumber1);
+
+	index = fieldset.FindNext(KUidContactFieldPhoneNumber, index+1);
+	CheckFieldContentL(fieldset, KUidContactFieldPhoneNumber, index, KTestInternationalNumber2);
+
+	index = fieldset.FindNext(KUidContactFieldPhoneNumber, index+1);
+	CheckFieldContentL(fieldset, KUidContactFieldPhoneNumber, index, KTestInternationalNumber1);
+
+	CleanupStack::PopAndDestroy(contactItem);
+	
+	return TestStepResult();
+	}
+
+
+/** 
+ *  Tests that an ICC contact can be read without starting PhBkSync first.
+ * 
+ *  @return EPass if the successful was successful.
+ */
+TVerdict CPhbkSyncReadWithOutOpeningPhBkSyncFirstTest::doTestStepL()
+	{
+	//
+	// Setup SIMTSY so some contacts exist on the SIM and sync them...
+	//
+	SetSyncModeL(RPhoneBookSession::EManual);
+	CheckSyncModeL(RPhoneBookSession::EManual);
+	SetSimTsyTestNumberL(0);
+	DoSyncL();
+
+	//
+	// Close the Contacts Database as may have a handle to Phonebook Sync...
+	//
+    delete iDb;
+	iDb=NULL;
+
+	//
+	// Close the Phonebook Sync handle and tell the server to shutdown and
+	// unload. This is required for this test to work and for security
+	// reasons is only possible with a debug server.
+	//
+#if _DEBUG
+	iSession.ShutdownServer(ETrue);
+	iSession.Close();
+	User::After(1); // To ensure the close / server shutdown is processed.
+#else
+	INFO_PRINTF1(_L("<font color=Orange>This test is only valid in UDEB!</font>"));
+	iSession.Close();
+#endif
+
+	//
+	// Now open Contacts Database (Phonebook Sync will not be automatically
+	// opened)...
+	//
+	iDb = OpenOrCreateContactDatabaseL();
+
+	//
+	// Find an ICC contact ID to read...
+	//
+	iDb->SetDbViewContactType(KUidContactICCEntry);
+
+	TContactIter  iter(*iDb);
+    TContactItemId  contactId = iter.FirstL();
+    
+    TESTCHECKCONDITIONL(contactId != KNullContactId);
+    
+    //
+    // Try and read the contact...
+    //
+	CContactItem*  item = NULL;
+
+	TRAPD(err, item = iDb->ReadContactL(contactId));
+#if _DEBUG
+	TESTCHECK(err, KErrNotFound);
+#else
+	TESTCHECK(err, KErrNone);
+	TESTCHECKCONDITION(item != NULL);
+#endif
+	delete item;
+	item = NULL;
+	
+	//
+	// Ensuring Phonebook Sync is running and synchronised...
+	//
+	TInt  ret = iSession.Connect();
+	TESTCHECKL(ret, KErrNone);
+
+	ConfigurePhbkSyncToFullL();
+	DoSyncL();
+
+	//
+    // Now repeat the test...
+    //
+	TRAP(err, item = iDb->ReadContactL(contactId));
+	TESTCHECK(err, KErrNone);
+	TESTCHECKCONDITION(item != NULL);
+	delete item;
+	item = NULL;
+
+	return TestStepResult();
+	} // CPhbkSyncReadWithOutOpeningPhBkSyncFirstTest::doTestStepL
+