phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/ContactViewsThread.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/ContactViewsThread.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,767 @@
+// Copyright (c) 2007-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 "ContactViewsThread.h"
+
+/**
+ * The Contact Views thread entry point
+ * @param aArgs - Command line parameters for the contact views thread
+ * @return TInt - exit reason
+ */
+GLDEF_C TInt RunContactViewsThreadL(TAny* aArgs)
+    {
+	TInt err;
+	CContactViews* contactViews = NULL;
+	CTrapCleanup* trapCleanup = CTrapCleanup::New();
+	CTestStep* testStep = static_cast<CTestStep*>(aArgs);
+	CActiveScheduler*	scheduler = new(ELeave) CActiveScheduler;
+
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+    	TRAP(err, contactViews = CContactViews::NewL(*testStep));
+
+    	if (err == KErrNone)
+			{
+			TRAP(err, contactViews->RunTestL());
+			}
+
+		RSemaphore semaphoreStop;
+		semaphoreStop.OpenGlobal(KSemaphoreName);
+
+		delete contactViews;
+		contactViews = NULL;
+		delete scheduler;
+		scheduler = NULL;
+		delete trapCleanup;
+		trapCleanup = NULL;
+
+		semaphoreStop.Signal();
+		semaphoreStop.Close();
+		}
+
+	return err;
+	}
+
+/**
+ * Class CContactViews constructor
+ * @param aTestStep - Reference to current test step, used for retrieveing data from the ini file
+ *                  and logging of results
+ */
+CContactViews::CContactViews(CTestStep& aTestStep)
+:iTestStep(aTestStep)
+	{
+	}
+
+/**
+ * Class CContactViews destructor
+ */
+CContactViews::~CContactViews()
+	{
+	iExpectedData.Close();
+	iActualData.Close();
+	delete iContactViewCollection;
+	delete iContactUtility;
+	delete iDb;
+	delete iScheduler;
+	iChunk.Close();
+	iSemaphore.Close();
+	}
+
+/**
+ * Allocates CContactViews object on heap
+ * @param aTestStep - Test Step Reference, used for reading data from ini and logging purpose
+ * @return pointer to newly constructed CContactViews object
+ */
+CContactViews* CContactViews::NewL(CTestStep& aTestStep)
+	{
+	CContactViews* self = new(ELeave) CContactViews(aTestStep);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+ * Second level CContactViews constructors
+ * Obtains handle to the global semaphore used for synchronizations with main thread
+ * Obtains handle to the Global chunk used for exchanging data across threads
+ * Allocates CContactUtilitiesCollection object used for contact views operations
+ * Allocates CContactViewCollection used for holding the newly constructed contact views
+ */
+void CContactViews::ConstructL()
+	{
+	iSemaphore.OpenGlobal(KSemaphoreName);
+	SetupChunk();
+	OpenDatabaseL();
+	iContactViewCollection = CContactViewCollection::NewL();
+	iContactUtility = CContactUtilitiesCollection::NewL(iTestStep, DatabaseReference(), ViewCollectionReference());
+    iContactUtility->ConstructViewsL();
+	ReadDataFromIniAndConstructValidationObjectsL();
+    SetViewOfInterest();    
+	}
+
+/**
+ * Helps to obtain reference to current database handle
+ * @return Reference to current database handle
+ */
+CContactDatabase& CContactViews::DatabaseReference()
+	{
+	return *iDb;
+	}
+
+/**
+ * Helps to obtain reference to current view collection
+ * @return Reference to current view collection
+ */
+CContactViewCollection& CContactViews::ViewCollectionReference()
+	{
+	return *iContactViewCollection;
+	}
+
+/**
+ * Helps to obtain reference to current test step used for reading data from ini and logging the results
+ * @return Reference to current view collection
+ */
+
+CTestStep& CContactViews::TestStepReference()
+	{
+ 	return iTestStep;
+	}
+
+/**
+ * Setups global chunk used for exchanging data across threads
+ */
+void CContactViews::SetupChunk()
+	{
+	iChunk.OpenGlobal(KChunkName(), EFalse);
+	iExecutionCompleted = reinterpret_cast<TBool*>(iChunk.Base());
+	iCurrentOperation = sizeof(TBool) + reinterpret_cast<TPtrC*>(iChunk.Base());
+	}
+
+/**
+ * Installs Active Schedular for the current thread
+ */
+void CContactViews::InstallActiveSchedularL()
+	{
+	iScheduler = new (ELeave) CActiveScheduler;
+	CActiveScheduler::Install(iScheduler);
+	}
+
+
+/**
+ * Opens an existing contacts database file based on the data mentioned in the ini file
+ */
+void CContactViews::OpenDatabaseL()
+	{
+	TPtrC databaseFileName;
+	_LIT(KDatabaseName, "dbname");
+	TestStepReference().GetStringFromConfig(TestStepReference().ConfigSection(), KDatabaseName, databaseFileName);
+	TRAPD(err, iDb = CContactDatabase::OpenL(databaseFileName));
+	User::LeaveIfError(err);
+	}
+
+
+/**
+ * Set the desired view to be validated for its content
+ * There can be n number of view constructed. It is a good idea to concentrate on a specific view
+ * and validate the view content at the end of each contact view operation
+ */
+void CContactViews::SetViewOfInterest()
+	{
+	TInt desiredViewIndex = 0;
+	_LIT(KDesiredViewIndex, "DesiredViewIndex");
+	TestStepReference().GetIntFromConfig(TestStepReference().ConfigSection(), KDesiredViewIndex, desiredViewIndex);
+
+	TPtrC desiredViewType;
+	_LIT(KDesiredViewType, "DesiredViewType");
+	TestStepReference().GetStringFromConfig(TestStepReference().ConfigSection(), KDesiredViewType, desiredViewType);
+
+	iContactView = iContactViewCollection->GetDesiredView(desiredViewType, desiredViewIndex);	
+	}
+
+/**
+ * Returns indication whether the execution is completed or not
+ * @return TBool - Information whether execution is completed or not
+ */
+TBool CContactViews::ExecutionCompleted()
+	{
+	return *iExecutionCompleted;
+	}
+
+/**
+ * Loop Function which validates the contact views after each CRUD operation is performed in the main thread
+ */
+void CContactViews::RunTestL()
+	{
+	// Suspend the current thread, will be resumed at a later stage by the main thread at the
+	// end of each CRUD Operation
+	iSemaphore.Signal();
+	RThread().Suspend();
+	
+
+	while (!ExecutionCompleted())
+		{
+		TContactViewValidationData actualValidationData;
+		SetCurrentOperation(actualValidationData);
+		CContactViewEventQueue& desiredViewObserver = ViewCollectionReference().RetrieveDesiredViewObserverL(TestStepReference());
+		ListenForContactViewEvents(desiredViewObserver, actualValidationData);
+		TInt viewCount = iContactView->CountL();
+		actualValidationData.SetViewCount(viewCount);		
+		iActualData.AppendL(actualValidationData);
+		iSemaphore.Signal();
+		RThread().Suspend();
+		}
+
+	for(TInt i = 0; i < iExpectedData.Count(); ++i)
+		{
+		TContactViewValidationData::TContactViewCurrentOperation currentOperation = iExpectedData[i].CurrentOperation();
+		TContactViewValidationData actualResult = RetrieveValidationData(currentOperation);
+		TBool result = Compare(iExpectedData[i], actualResult);
+		if(!result)
+			{ 
+			PrintDetailsL(iExpectedData[i], actualResult);									
+			const TInt KNullCount = 0;
+			if(actualResult.ViewCount() == KNullCount)
+				{
+				return;
+				}
+			_LIT(KValidationFailed, "The actual data doesnt match with the expected data");
+			TestStepReference().ERR_PRINTF1(KValidationFailed);
+			TestStepReference().SetTestStepResult(EFail);
+			} 
+		}
+	}
+
+/**
+ * Initally view validation objects are constructed based on data specified in the ini file.
+ * They are retrieved from the collection abd further used for validation against actual results
+ * @param - aCurrentOperation Current Operation to be validated
+ * @return TContactViewValidationData - Object which contains expected results for the current Operation
+ */
+TContactViewValidationData CContactViews::RetrieveValidationData
+							(TContactViewValidationData::TContactViewCurrentOperation aCurrentOperation)
+	{
+	TContactViewValidationData viewValidationData;
+	for(TInt i = 0; i < iActualData.Count(); ++i)
+		{
+		TContactViewValidationData::TContactViewCurrentOperation currentOperation =	iActualData[i].CurrentOperation();
+		if(aCurrentOperation == currentOperation)
+			{
+			viewValidationData = iActualData[i];
+			}
+		}
+	return viewValidationData;
+	}
+
+/**
+ * Sets the current CRUD Operation being performed in the main thread
+ * @param - aValidationData on return contains information about current CRUD operation being performed in the main thread
+ */
+void CContactViews::SetCurrentOperation(TContactViewValidationData& aValidationData)
+	{
+	aValidationData.SetCurrentOperation(*iCurrentOperation);
+	}
+
+/**
+ * Reads data from the ini file and constructs all the view validation objects
+ * and uploads them in a collection
+ */
+void CContactViews::ReadDataFromIniAndConstructValidationObjectsL()
+	{
+	_LIT(KListOfValidationSectionsString, "ListOfValidationSections");
+	TPtrC listOfValidationSectionsString;
+	TestStepReference().GetStringFromConfig(TestStepReference().ConfigSection(), KListOfValidationSectionsString, listOfValidationSectionsString);
+
+	RArray<TPtrC>	listOfValidationSections;
+	CleanupClosePushL(listOfValidationSections);
+	iContactUtility->TokenizeStringL(listOfValidationSectionsString, listOfValidationSections);
+
+	for(TInt i = 0; i < listOfValidationSections.Count(); ++i)
+		{
+		TContactViewValidationData viewValidationData;
+		IterateThroValidationSectionAndUpdateValidationData(listOfValidationSections[i], viewValidationData);
+		iExpectedData.AppendL(viewValidationData);
+		}
+
+	CleanupStack::PopAndDestroy(&listOfValidationSections);
+	}
+
+/**
+ * Reads a specific section in the ini file and constructs all the view validation objects
+ * @param aValidationSection  desired section in the ini file
+ * @param aValidationData contact view validation object to be updated
+ */
+void CContactViews::IterateThroValidationSectionAndUpdateValidationData
+									(const TPtrC& aValidationSection, TContactViewValidationData& aValidationData)
+	{
+	_LIT(KUnAvailableNotifications,			"UnAvailableNotifications");
+	_LIT(KReadyNotifications,				"ReadyNotifications");
+	_LIT(KSortOrderChangedNotifications, 	"SortOrderChangedNotifications");
+	_LIT(KSortErrorNotifications,			"SortErrorNotifications");
+	_LIT(KServerErrorNotifications,			"ServerErrorNotifications");
+	_LIT(KIndexingErrorNotifications,		"IndexingErrorNotifications");
+	_LIT(KItemAddedNotifications, 			"ItemAddedNotifications");
+	_LIT(KItemRemovedNotifications,			"ItemRemovedNotifications");
+	_LIT(KGroupChangedNotifications,		"GroupChangedNotifications");
+
+
+	TInt unAvailableNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KUnAvailableNotifications, unAvailableNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EUnAvailableNotifications, unAvailableNotifications);
+
+	TInt viewReadyNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KReadyNotifications, viewReadyNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EViewReadyNotifications, viewReadyNotifications);
+
+	TInt sortOrderChangedNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KSortOrderChangedNotifications, sortOrderChangedNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EViewSortOrderChangedNotifications, sortOrderChangedNotifications);
+
+	TInt sortErrorNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KSortErrorNotifications, sortErrorNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EViewSortErrorNotifications, sortErrorNotifications);
+
+	TInt serverErrorNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KServerErrorNotifications, serverErrorNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EContactServerErrorNotifications, serverErrorNotifications);
+
+	TInt indexingErrorNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KIndexingErrorNotifications, indexingErrorNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EViewIndexingErrorNotifications, indexingErrorNotifications);
+
+	TInt itemAddedNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KItemAddedNotifications, itemAddedNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EItemAddedNotifications, itemAddedNotifications);
+
+	TInt itemRemovedNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KItemRemovedNotifications, itemRemovedNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EItemRemovedNotifications, itemRemovedNotifications);
+
+	TInt groupChangedNotifications = 0;
+	TestStepReference().GetIntFromConfig(aValidationSection, KGroupChangedNotifications, groupChangedNotifications);
+	aValidationData.SetNotificationsCount(TContactViewValidationData::EGroupChangedNotifications, groupChangedNotifications);
+
+	TPtrC currentOperationTypeString;
+	_LIT(KCurrentOperationType, "currentOperationType");
+	TestStepReference().GetStringFromConfig(aValidationSection, KCurrentOperationType, currentOperationTypeString);
+	aValidationData.SetCurrentOperation(currentOperationTypeString);
+
+	TInt viewCount = 0;
+	_LIT(KViewCount, "viewcount");
+	TestStepReference().GetIntFromConfig(aValidationSection, KViewCount, viewCount);
+	aValidationData.SetViewCount(viewCount);
+	}
+
+
+/**
+ * Listen for contact view notifications and update the actual view validation information
+ * @param aViewObserver  desired contact view observer
+ * @param aActualData contact view validation object that will be updated with actual results
+ */
+void CContactViews::ListenForContactViewEvents(CContactViewEventQueue& aViewObserver,
+ 														TContactViewValidationData& aActualData)
+	{
+	const TInt KViewEventTimeOut = 20; // ms
+	TContactViewEvent viewEvent;
+	while(aViewObserver.ListenForEvent(KViewEventTimeOut,viewEvent))
+         {
+		 TContactViewValidationData::TContactViewNotificationType notificationType;
+		 aActualData.NotificationType(viewEvent, notificationType);
+		 aActualData.IncrementNotificationCount(notificationType);
+         }
+	}
+
+/**
+ * Compares the desired results against actual view update results
+ * @param aDesiredData  desired view update information
+ * @param aActualData actual view update information
+ */
+TBool CContactViews::Compare(TContactViewValidationData& aDesiredData, TContactViewValidationData& aActualData)
+	{
+	if(((aDesiredData.NotificationsCount(TContactViewValidationData::EUnAvailableNotifications)) != (aActualData.NotificationsCount(TContactViewValidationData::EUnAvailableNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EViewReadyNotifications)) != (aActualData.NotificationsCount(TContactViewValidationData::EViewReadyNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EViewSortOrderChangedNotifications))	!= (aActualData.NotificationsCount(TContactViewValidationData::EViewSortOrderChangedNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EViewSortErrorNotifications))		!= (aActualData.NotificationsCount(TContactViewValidationData::EViewSortErrorNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EContactServerErrorNotifications))	!= (aActualData.NotificationsCount(TContactViewValidationData::EContactServerErrorNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EViewIndexingErrorNotifications))	!= (aActualData.NotificationsCount(TContactViewValidationData::EViewIndexingErrorNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EItemAddedNotifications))		!= (aActualData.NotificationsCount(TContactViewValidationData::EItemAddedNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EItemRemovedNotifications))		!= (aActualData.NotificationsCount(TContactViewValidationData::EItemRemovedNotifications)))
+	|| ((aDesiredData.NotificationsCount(TContactViewValidationData::EGroupChangedNotifications))    != (aActualData.NotificationsCount(TContactViewValidationData::EGroupChangedNotifications)))
+	||  (aDesiredData.ViewCount() != aActualData.ViewCount()))
+		{
+		return EFalse;
+		}
+	return ETrue;
+	}
+
+/**
+ * Prints the desired results and actual view update results
+ * @param aDesiredData  desired view update information
+ * @param aActualData actual view update information
+ */
+void CContactViews::PrintDetailsL(TContactViewValidationData& aDesiredData, TContactViewValidationData& aActualData)
+	{
+	_LIT(KCurrentOperation, "The current CRUD operations being performed is ::::: %S \n");
+	_LIT(KDesiredViewCount, "The desired view count %d \n");
+	_LIT(KActualViewCount, "The actual view count is %d \n");
+	_LIT(KDesiredViewUnAvailableNotifications, "The total number of desired view unavailable notifications are %d \n");
+	_LIT(KActualViewUnAvailableNotifications,  "The total number of actual view unavailable notifications are %d \n");
+	_LIT(KDesiredViewReadyNotifications, "The total number of desired view ready notifications are %d \n");
+	_LIT(KActualViewReadyNotifications,  "The total number of actual view ready notifications are %d \n");
+	_LIT(KDesiredViewSortOrderChangedNotifications, "The total number of desired view sort order changed notifications are %d \n");
+	_LIT(KActualViewSortOrderChangedNotifications,  "The total number of actual view sort order changed notifications are %d \n");
+	_LIT(KDesiredViewSortErrorNotifications, "The total number of desired View Sort ErrorNotifications are %d \n");
+	_LIT(KActualViewSortErrorNotifications, "The total number of actual View Sort Error Notifications are %d \n");
+	_LIT(KDesiredContactServerErrorNotifications, "The total number of desired Contact Server Error Notificationsare %d \n");
+	_LIT(KActualContactServerErrorNotifications, "The total number of actual Contact Server Error Notifications are %d \n");
+	_LIT(KDesiredViewIndexingErrorNotifications, "The total number of desired view indexing notifications are %d \n");
+	_LIT(KActualViewIndexingErrorNotifications, "The total number of actual view indexing notifications are %d \n");
+	_LIT(KDesiredItemAddedNotifications, "The total number of desired item added notifications are %d \n");
+	_LIT(KActualItemAddedNotifications, "The total number of actual item added notifications are %d \n");
+	_LIT(KDesiredItemRemovedNotifications, "The total number of desired item removed notifications are %d \n");
+	_LIT(KActualItemRemovedNotifications, "The total number of actual item removed notifications are %d \n");
+	_LIT(KDesiredGroupChangedNotifications, "The total number of desired group changed notifications are %d \n");
+	_LIT(KActualGroupChangedNotifications, "The total number of actual group changed notifications are %d \n");
+
+	TPtrC currentOperation(aDesiredData.CurrentOperationInfoInStringFormatL()); 
+	TestStepReference().INFO_PRINTF2(KCurrentOperation, &currentOperation);
+
+	TestStepReference().INFO_PRINTF2(KDesiredViewCount, aDesiredData.ViewCount());
+	TestStepReference().INFO_PRINTF2(KActualViewCount, aActualData.ViewCount());
+
+	TestStepReference().INFO_PRINTF2(KDesiredViewUnAvailableNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EUnAvailableNotifications));
+	TestStepReference().INFO_PRINTF2(KActualViewUnAvailableNotifications, aActualData.NotificationsCount(TContactViewValidationData::EUnAvailableNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredViewReadyNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EViewReadyNotifications));
+	TestStepReference().INFO_PRINTF2(KActualViewReadyNotifications, aActualData.NotificationsCount(TContactViewValidationData::EViewReadyNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredViewSortOrderChangedNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EViewSortOrderChangedNotifications));
+	TestStepReference().INFO_PRINTF2(KActualViewSortOrderChangedNotifications, aActualData.NotificationsCount(TContactViewValidationData::EViewSortOrderChangedNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredViewSortErrorNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EViewSortErrorNotifications));
+	TestStepReference().INFO_PRINTF2(KActualViewSortErrorNotifications, aActualData.NotificationsCount(TContactViewValidationData::EViewSortErrorNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredContactServerErrorNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EContactServerErrorNotifications));
+	TestStepReference().INFO_PRINTF2(KActualContactServerErrorNotifications, aActualData.NotificationsCount(TContactViewValidationData::EContactServerErrorNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredViewIndexingErrorNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EViewIndexingErrorNotifications));
+	TestStepReference().INFO_PRINTF2(KActualViewIndexingErrorNotifications, aActualData.NotificationsCount(TContactViewValidationData::EViewIndexingErrorNotifications));
+
+
+	TestStepReference().INFO_PRINTF2(KDesiredItemAddedNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EItemAddedNotifications));
+	TestStepReference().INFO_PRINTF2(KActualItemAddedNotifications, aActualData.NotificationsCount(TContactViewValidationData::EItemAddedNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredItemRemovedNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EItemRemovedNotifications));
+	TestStepReference().INFO_PRINTF2(KActualItemRemovedNotifications, aActualData.NotificationsCount(TContactViewValidationData::EItemRemovedNotifications));
+
+	TestStepReference().INFO_PRINTF2(KDesiredGroupChangedNotifications, aDesiredData.NotificationsCount(TContactViewValidationData::EGroupChangedNotifications));
+	TestStepReference().INFO_PRINTF2(KActualGroupChangedNotifications, aActualData.NotificationsCount(TContactViewValidationData::EGroupChangedNotifications));
+	}
+
+
+/**
+ * Class TContactViewValidationData constructor
+ * Initializes all member variables
+ */
+TContactViewValidationData::TContactViewValidationData()
+:iViewCount(0),
+ iNumOfUnAvailableNotifications(0),
+ iNumOfReadyNotifications(0),
+ iNumOfSortOrderChangedNotifications(0),
+ iNumOfSortErrorNotifications(0),
+ iNumOfServerErrorNotifications(0),
+ iNumOfIndexingErrorNotifications(0),
+ iNumOfItemAddedNotifications(0),
+ iNumOfItemRemovedNotifications(0),
+ iNumOfGroupChangedNotifications(0),
+ iCurrentOperation(TContactViewValidationData::ENone)
+	{
+	}
+
+/**
+ * The following set of functions belong to class TContactViewValidationData
+ * Constructor is available to initialize the member variables
+ * Get/Set functions are available to retrieve and update the TContactViewValidationData member
+ * variables Functions are available to increment the relevant member variables
+ * Necessary Conversion functions are also available
+ */
+
+/**
+ * Set the desired view contact item count data
+ */
+void TContactViewValidationData::SetViewCount(TInt aViewCount)
+	{
+	iViewCount = aViewCount;
+	}
+
+/**
+ * Get the view contact item count information
+ */
+TInt TContactViewValidationData::ViewCount()
+	{
+	return iViewCount;
+	}
+
+/**
+ * Set the desired contact view operation based on information available in string format
+ */
+void TContactViewValidationData::SetCurrentOperation(const TPtrC& aCurrentOperation)
+	{
+	iCurrentOperationInStringFormat.Copy(aCurrentOperation);
+	ConvertStringToTContactViewValidationDataFormat(aCurrentOperation);
+	}
+
+/**
+ * Get the contact view operation information in string format
+ */
+TDesC& TContactViewValidationData::CurrentOperationInfoInStringFormatL()
+	{
+	return iCurrentOperationInStringFormat;
+	}
+
+/**
+ * Set the desired contact view operation based on information available in TContactViewValidationData::TContactViewCurrentOperation format
+ */
+void TContactViewValidationData::SetCurrentOperation(TContactViewValidationData::TContactViewCurrentOperation aCurrentOperation)
+	{
+	iCurrentOperation = aCurrentOperation;
+	}
+
+/**
+ * Get the contact view operation information in TContactViewValidationData::TContactViewCurrentOperation format
+ */
+TContactViewValidationData::TContactViewCurrentOperation TContactViewValidationData::CurrentOperation()
+	{
+	return iCurrentOperation;
+	}
+
+/**
+ * Converts String to View Validation Internal Format
+ * @param aCurrentOperation String containing information about current operation being performed
+ */
+void TContactViewValidationData::ConvertStringToTContactViewValidationDataFormat(const TPtrC& aCurrentOperation)
+	{
+	_LIT(KViewConstructionOperations,	"ViewConstructionOperations");
+	_LIT(KAddContactOperations,			"AddContactOperations");
+	_LIT(KRemoveContactsOperations,		"RemoveContactsOperations");
+	_LIT(KUpdateContactOperations,		"UpdateContactOperations");
+	_LIT(KSortOrderChangeOperations,	"SortOrderChangeOperations");
+	_LIT(KServerRelatedOperations,		"ServerRelatedOperations");
+	_LIT(KGroupChangedOperations,		"GroupChangedOperations");
+
+
+	if ( aCurrentOperation.Compare(KViewConstructionOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::EViewConstructionOperations;
+		}
+	else if ( aCurrentOperation.Compare(KAddContactOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::EAddContactOperations;
+		}
+	else if ( aCurrentOperation.Compare(KRemoveContactsOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::ERemoveContactsOperations;
+		}
+	else if ( aCurrentOperation.Compare(KUpdateContactOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::EUpdateContactOperations;
+		}
+	else if ( aCurrentOperation.Compare(KSortOrderChangeOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::ESortOrderChangeOperations;
+		}
+	else if ( aCurrentOperation.Compare(KServerRelatedOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::EServerRelatedOperations;
+		}
+	else if ( aCurrentOperation.Compare(KGroupChangedOperations) == 0)
+		{
+		iCurrentOperation = TContactViewValidationData::EGroupChangedOperations;
+		}
+	}
+
+/**
+ * Convert TContactViewEvent to TContactViewValidationData::TContactViewNotificationType format
+ * @param aEvent - Contact View Event information in TContactViewEvent format
+ * @param aNotificationType - Contact View Event information in TContactViewValidationData::TContactViewNotificationType format
+ */
+ void TContactViewValidationData::NotificationType (TContactViewEvent aEvent, TContactViewValidationData::TContactViewNotificationType& aNotificationType)
+	{
+	if(aEvent.iEventType == TContactViewEvent::EUnavailable)
+		{
+		aNotificationType = 	TContactViewValidationData::EUnAvailableNotifications;
+		}
+	else if(aEvent.iEventType ==  TContactViewEvent::EReady)
+		{
+		aNotificationType = 	TContactViewValidationData::EViewReadyNotifications;
+		}
+	else if(aEvent.iEventType ==  TContactViewEvent::ESortOrderChanged )
+		{
+		aNotificationType = 	TContactViewValidationData::EViewSortOrderChangedNotifications;
+		}
+	else if(aEvent.iEventType ==  TContactViewEvent::ESortError)
+		{
+		aNotificationType = 	TContactViewValidationData::EViewSortErrorNotifications;
+		}
+	else if(aEvent.iEventType == TContactViewEvent::EServerError )
+		{
+		aNotificationType = 	TContactViewValidationData::EContactServerErrorNotifications;
+		}
+	else if(aEvent.iEventType == TContactViewEvent::EIndexingError)
+		{
+		aNotificationType = 	TContactViewValidationData::EViewIndexingErrorNotifications;
+		}
+	else if(aEvent.iEventType == TContactViewEvent::EItemAdded)
+		{
+		aNotificationType = 	TContactViewValidationData::EItemAddedNotifications;
+		}
+	else if(aEvent.iEventType == TContactViewEvent::EItemRemoved)
+		{
+		aNotificationType = 	TContactViewValidationData::EItemRemovedNotifications;
+		}
+	else if(aEvent.iEventType == TContactViewEvent::EGroupChanged)
+		{
+		aNotificationType= 	TContactViewValidationData::EGroupChangedNotifications;
+		}
+	}
+
+ /**
+  * Sets the total number of expected notifications of desired type
+  * @param aNotificationType - Desired type of Contact View Event Notification
+  * @param aNumOfExpectedNotifications - Total number of notifications expected
+  */
+  void TContactViewValidationData::SetNotificationsCount( TContactViewNotificationType aNotificationType,
+ 																				TInt aNumOfExpectedNotifications)
+ 	{
+ 	if(aNotificationType ==	TContactViewValidationData::EUnAvailableNotifications)
+ 		{
+ 		iNumOfUnAvailableNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType ==  TContactViewValidationData::EViewReadyNotifications)
+ 		{
+ 		iNumOfReadyNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType ==  TContactViewValidationData::EViewSortOrderChangedNotifications)
+ 		{
+ 		iNumOfSortOrderChangedNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType ==  TContactViewValidationData::EContactServerErrorNotifications)
+ 		{
+ 		iNumOfServerErrorNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EViewIndexingErrorNotifications)
+ 		{
+ 		iNumOfIndexingErrorNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EItemAddedNotifications)
+ 		{
+ 		iNumOfItemAddedNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EItemRemovedNotifications)
+ 		{
+ 		iNumOfItemRemovedNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EGroupChangedNotifications)
+ 		{
+ 		iNumOfGroupChangedNotifications = aNumOfExpectedNotifications;
+ 		}
+ 	}
+
+ /**
+  * Retrieve the expected notifications count
+  * @param aNotificationType - Desired type of Contact View Event Notification
+  * @return TInt - Count of number of notifications
+  */
+  TInt TContactViewValidationData::NotificationsCount(TContactViewNotificationType aNotificationType)
+ 	{
+ 	TInt numOfNotifications = 0;
+ 	if(aNotificationType ==	TContactViewValidationData::EUnAvailableNotifications)
+ 		{
+ 		numOfNotifications = iNumOfUnAvailableNotifications;
+ 		}
+ 	else if(aNotificationType ==  TContactViewValidationData::EViewReadyNotifications)
+ 		{
+ 		numOfNotifications = iNumOfReadyNotifications;
+ 		}
+ 	else if(aNotificationType ==  TContactViewValidationData::EViewSortOrderChangedNotifications)
+ 		{
+ 		numOfNotifications = iNumOfSortOrderChangedNotifications;
+ 		}
+ 	else if(aNotificationType ==  TContactViewValidationData::EContactServerErrorNotifications)
+ 		{
+ 		numOfNotifications = iNumOfServerErrorNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EViewIndexingErrorNotifications)
+ 		{
+ 		numOfNotifications = iNumOfIndexingErrorNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EItemAddedNotifications)
+ 		{
+ 		numOfNotifications = iNumOfItemAddedNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EItemRemovedNotifications)
+ 		{
+ 		numOfNotifications = iNumOfItemRemovedNotifications;
+ 		}
+ 	else if(aNotificationType == TContactViewValidationData::EGroupChangedNotifications)
+ 		{
+ 		numOfNotifications = iNumOfGroupChangedNotifications;
+ 		}
+ 	return numOfNotifications;
+ 	}
+
+/**
+ * Increment the expected notifications count
+ * @param aNotificationType - Desired type of Contact View Event Notification
+ */
+ void TContactViewValidationData::IncrementNotificationCount
+				(TContactViewValidationData::TContactViewNotificationType aNotificationType)
+	{
+	if(aNotificationType ==	TContactViewValidationData::EUnAvailableNotifications)
+		{
+		++iNumOfUnAvailableNotifications;
+		}
+	else if(aNotificationType ==  TContactViewValidationData::EViewReadyNotifications)
+		{
+		++iNumOfReadyNotifications;
+		}
+	else if(aNotificationType ==  TContactViewValidationData::EViewSortOrderChangedNotifications)
+		{
+		++iNumOfSortOrderChangedNotifications;
+		}
+	else if(aNotificationType ==  TContactViewValidationData::EContactServerErrorNotifications)
+		{
+		++iNumOfServerErrorNotifications;
+		}
+	else if(aNotificationType == TContactViewValidationData::EViewIndexingErrorNotifications)
+		{
+		++iNumOfIndexingErrorNotifications;
+		}
+	else if(aNotificationType == TContactViewValidationData::EItemAddedNotifications)
+		{
+		++iNumOfItemAddedNotifications;
+		}
+	else if(aNotificationType == TContactViewValidationData::EItemRemovedNotifications)
+		{
+		++iNumOfItemRemovedNotifications;
+		}
+	else if(aNotificationType == TContactViewValidationData::EGroupChangedNotifications)
+		{
+		++iNumOfGroupChangedNotifications;
+		}
+	}
+
+