phonebookengines/contactsmodel/tsrc/t_groupview_unfiled_profile.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/t_groupview_unfiled_profile.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,601 @@
+// Copyright (c) 2000-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 <e32std.h>
+#include <e32test.h>
+#include <e32math.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include "t_utils2.h"
+#include "T_UTILS.H"
+#include "t_groupview_unfiled_profile.h"
+
+//
+// Macro's
+//
+#define CLEAR_ALL_CLOCKS CCntTest::ProfileReset(0, 30)
+#define START_CLOCK CCntTest::ProfileReset(macroTimer, 1); CCntTest::ProfileStart(macroTimer++)
+#define STOP_CLOCK CCntTest::ProfileEnd(--macroTimer)
+#define STOP_CLOCK_TIME( profile ) CCntTest::ProfileEnd(--macroTimer); CCntTest::ProfileResult(&(profile), macroTimer, 1)
+#define GET_LAST_CLOCK_TIME( profile ) CCntTest::ProfileResult(&profile, macroTimer, 1)
+
+//
+// Constants.
+//
+
+_LIT(KTestName,"t_groupview_unfiled_profile");
+_LIT(KLogFileName,"t_groupview_unfiled_profile.log");
+
+_LIT(KDbFileName,"c:t_groupview_unfiled_profile.cdb");
+
+_LIT(KRemoteViewName,"RemoteView");
+_LIT(KTextDefSeparator,"");
+
+RTest test(KTestName);
+
+
+const TInt KNumContacts=500;
+const TInt KNumContactsInGroupOne=250;
+const TInt KMaxContactsToAddInGroupTest = 50;
+const TInt KMaxContactsToRemoveInGroupTest = 50;
+
+_LIT(KGroupOneName,"GroupOne");
+
+//
+// File scope variable
+//
+TInt macroTimer = 1;
+
+//
+// CTestConductor.
+//
+
+CTestConductor* CTestConductor::NewL()
+	{
+	CTestConductor* self=new(ELeave) CTestConductor();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->RunTestsL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CTestConductor::~CTestConductor()
+	{
+	delete iLog;
+	delete iDb;
+	delete iRandomGenerator;
+    TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDbFileName));
+	iFs.Close();	
+	}
+
+CTestConductor::CTestConductor() {}
+
+void CTestConductor::ConstructL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	iLog=CLog::NewL(test,KLogFileName);
+	iDb=CContactDatabase::ReplaceL(KDbFileName);
+	iRandomGenerator=CRandomContactGenerator::NewL();
+	iRandomGenerator->SetDbL(*iDb);
+	AddContactsL();
+	}
+
+void CTestConductor::AddContactsL()
+	{
+	iTotalContacts=0;
+	TInt ii;
+	for (ii=0;ii<KNumContacts;ii++)
+		{
+		iRandomGenerator->AddTypicalRandomContactL();
+		iTotalContacts++;
+		test.Printf(_L("Adding %d \n"),ii);
+		}
+	CreateGroupTestDataL();
+	}
+
+void CTestConductor::CreateGroupTestDataL()
+	{
+	CContactGroup* groupOne = static_cast<CContactGroup*>(iDb->CreateContactGroupL(KGroupOneName));
+	CContactIdArray* idsInGroupViewOne = NULL;
+
+	CleanupStack::PushL(groupOne);
+
+	iGroupOneId = groupOne->Id();
+	for (TInt ii=1;ii<=KNumContactsInGroupOne;++ii)
+		{
+		test.Printf(_L("Making Group Contact %d \n"),ii);
+		iDb->AddContactToGroupL(ii,iGroupOneId);
+		}
+
+	CleanupStack::PopAndDestroy(groupOne);
+
+	groupOne = static_cast<CContactGroup*>(iDb->ReadContactL(iGroupOneId));
+	CleanupStack::PushL(groupOne);
+
+	idsInGroupViewOne = groupOne->ItemsContainedLC();
+	CleanupStack::PopAndDestroy(idsInGroupViewOne);
+	CleanupStack::PopAndDestroy(groupOne);
+	}
+
+void CTestConductor::AddSingleContactL()
+	{
+	test.Printf(_L("Adding Contact [%d] "), ++iTotalContacts);
+	iRandomGenerator->AddTypicalRandomContactL();
+	test.Printf(_L(" \n"));
+	}
+
+
+void CTestConductor::PrintTimeTaken(TInt aTime)
+	{
+	iLog->LogLine(_L(" Time Taken [%d.%dus] \n"), aTime/1000000, aTime%1000000);
+	}
+
+void CTestConductor::RunTestsL()
+	{
+	CGroupViewTester* tester=CGroupViewTester::NewL(*iLog,*iDb, *this);
+	CleanupStack::PushL(tester);
+	CActiveScheduler::Start();
+	CleanupStack::Pop(tester);
+	// error from CGroupViewTester?
+	User::LeaveIfError(iTestError);
+	}
+
+void CTestConductor::SetTestError(TInt aTestError)
+	{
+	iTestError = aTestError;
+	}
+
+
+//
+// CGroupViewTester.
+//
+
+CGroupViewTester* CGroupViewTester::NewL(CLog& aLog,CContactDatabase& aDb, CTestConductor& aTestConductor)
+	{
+	CGroupViewTester* self=new(ELeave) CGroupViewTester(aLog,aDb, aTestConductor);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CGroupViewTester::~CGroupViewTester()
+	{
+	iLocalView->Close(*this);
+	iNamedRemoteView->Close(*this);
+	iSortOrder_1.Close();
+	delete iTextDef;
+	}
+
+CGroupViewTester::CGroupViewTester(CLog& aLog,CContactDatabase& aDb, CTestConductor& aTestConductor)
+	: CActive(EPriorityStandard),iLog(aLog),iDb(aDb),iTestConductor(aTestConductor),iCurrentTest(EPreStartTest)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CGroupViewTester::ConstructL()
+	{
+	iSortOrder_1.AppendL(KUidContactFieldGivenName);
+	iSortOrder_1.AppendL(KUidContactFieldFamilyName);
+	iSortOrder_1.AppendL(KUidContactFieldCompanyName);
+
+	iTextDef=CContactTextDef::NewL();
+	iTextDef->AppendL(TContactTextDefItem(KUidContactFieldGivenName,KTextDefSeparator));
+	iTextDef->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,KTextDefSeparator));
+	iTextDef->AppendL(TContactTextDefItem(KUidContactFieldCompanyName,KTextDefSeparator));
+
+	NextTest();
+	}
+
+void CGroupViewTester::RunL()
+	{
+	TCntProfile profile;
+
+	switch (iCurrentTest)
+		{
+		case ECreateLocalView:
+			iLog.LogLine(_L("=== Create local view \n"));
+			iLocalView=CContactLocalView::NewL(*this,iDb,iSortOrder_1,EContactAndGroups);
+			break;
+
+		case ECreateRemoteNamedView:
+			iLog.LogLine(_L("=== Create Remote named view \n"));
+			iNamedRemoteView = CContactNamedRemoteView::NewL(*this,KRemoteViewName,iDb,iSortOrder_1,EContactAndGroups);
+			break;
+
+		case EStartLocalTests:
+			iLog.LogLine(_L("=== Start Local Tests \n"));
+			CLEAR_ALL_CLOCKS;
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			START_CLOCK;
+			iTester = CUnfiledGroupViewTester::NewL(iLog, iDb, iTestConductor, *iLocalView, iStatus);
+			SetActive();
+			iCurrentTest = EEndLocalTests;
+			iTester->StartL();
+			break;
+
+		case EEndLocalTests:
+			STOP_CLOCK_TIME( profile );
+			iLog.LogLine(_L("<< Stop  Clock [%d] \n"), macroTimer);
+			iLog.LogLine(_L("== End Local Tests Time to complete \n"));
+			delete iTester; iTester = NULL;
+			iTestConductor.PrintTimeTaken(profile.iTime);
+			NextTest();
+			break;
+
+		case EStartRemoteTests:
+			iLog.LogLine(_L("=== Start Remote Tests \n"));
+			CLEAR_ALL_CLOCKS;
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			START_CLOCK;
+			iTester = CUnfiledGroupViewTester::NewL(iLog, iDb, iTestConductor, *iNamedRemoteView, iStatus);
+			SetActive();
+			iCurrentTest = EEndRemoteTests;
+			iTester->StartL();
+			break;
+
+		case EEndRemoteTests:
+			STOP_CLOCK_TIME( profile );
+			iLog.LogLine(_L("<< Stop  Clock [%d] \n"), macroTimer);
+			iLog.LogLine(_L("== End Remote Tests Time to complete\n"));
+			delete iTester; iTester = NULL;
+			iTestConductor.PrintTimeTaken(profile.iTime);
+			NextTest();
+			break;
+
+
+		case ENumTests:
+			iLog.LogLine(_L("==== No Time to report, tests over ! \n"));
+			iLog.LogLine(_L("==== Group View Tests Finished, All Passed...\n"));
+			CActiveScheduler::Stop();
+			delete this;
+			break;
+		default:
+			ASSERT(EFalse);
+			break;
+		}
+	}
+
+TInt CGroupViewTester::RunError(TInt aError)
+	{
+	// propagate error
+	iTestConductor.SetTestError(aError);
+
+	switch (iCurrentTest)
+		{
+		case ECreateLocalView: test.Printf(_L("Test failed at step CreateLocalView (%i) with error %i"), iCurrentTest, aError); break;
+		case ECreateRemoteNamedView: test.Printf(_L("Test failed at step CreateRemoteNamedView (%i) with error %i"), iCurrentTest, aError); break;
+		case EStartLocalTests: test.Printf(_L("Test failed at step StartLocalTests (%i) with error %i"), iCurrentTest, aError); break;
+		case EEndLocalTests: test.Printf(_L("Test failed at step EndLocalTests (%i) with error %i"), iCurrentTest, aError); break;
+		case EStartRemoteTests: test.Printf(_L("Test failed at step StartRemoteTests (%i) with error %i"), iCurrentTest, aError); break;
+		case EEndRemoteTests: test.Printf(_L("Test failed at step EndRemoteTests (%i) with error %i"), iCurrentTest, aError); break;
+
+		case ENumTests: test.Printf(_L("Test failed at step NumTests (%i) with error %i"), iCurrentTest, aError); break;
+
+		default: test.Printf(_L("Test failed at step %i with error %i"), iCurrentTest, aError); break;
+		}
+
+	CActiveScheduler::Stop();
+	return KErrNone;
+	}
+
+void CGroupViewTester::HandleContactViewEvent(const CContactViewBase& aView,const TContactViewEvent& aEvent)
+	{
+	switch (iCurrentTest)
+		{
+		case ECreateLocalView:
+			test(iLocalView==&aView);
+			test(aEvent.iEventType==TContactViewEvent::EReady);
+				NextTest();
+			break;
+		case ECreateRemoteNamedView:
+			test(iNamedRemoteView==&aView);
+			test(aEvent.iEventType==TContactViewEvent::EReady);
+				NextTest();
+			break;
+		case EStartLocalTests:
+		case EEndLocalTests:
+		case EStartRemoteTests:
+		case EEndRemoteTests:
+		case ENumTests:
+			break;
+		default:
+			test(EFalse);
+			break;
+		}
+
+	}
+
+void CGroupViewTester::NextTest()
+	{
+	iCurrentTest = static_cast<TTest>( static_cast<TInt>(iCurrentTest) + 1 ) ;
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+void CGroupViewTester::ExceriseViewL(CContactViewBase& aView)
+	{
+	TContactItemId lastId=0;
+	const TInt numItems=aView.CountL();
+	for (TInt ii=0;ii<numItems;++ii)
+		{
+		if (ii==numItems-1)
+			{
+			lastId=aView.AtL(ii);
+			}
+		iDb.ReadContactTextDefL(aView.AtL(ii),iScratchBuf,iTextDef);
+		iLog.LogLineNoEcho(iScratchBuf);
+		iScratchBuf.SetLength(0);
+		}
+
+	test(aView.FindL(lastId)==numItems-1);
+	}
+
+
+void CGroupViewTester::TestGroupViewSortOrderL(CContactGroupView& aView)
+	{
+	iLog.LogLine(_L("<TestGroupViewSortOrderL> "));
+	const TInt numItems=aView.CountL();
+	iLog.LogLine(_L("aView.CountL = [%d] \n"), numItems );
+	for (TInt ii=0;ii<numItems;++ii)
+		{
+		if(ii!=numItems-1)//not last item
+			{
+			TContactIdWithMapping first = (aView.iGroupContacts)[ii];
+			TContactIdWithMapping second = (aView.iGroupContacts)[ii+1];
+			test(first.iMapping < second.iMapping);
+			}
+		}
+	}
+
+
+void CGroupViewTester::DoCancel()
+	{
+	}
+
+
+//
+//  CUnfiledGroupViewTester
+//
+CUnfiledGroupViewTester* CUnfiledGroupViewTester::NewL(CLog& aLog, CContactDatabase& aDb, CTestConductor& aTestConductor, CContactViewBase& aView, TRequestStatus& aClientStatus)
+	{
+	CUnfiledGroupViewTester* self = new (ELeave) CUnfiledGroupViewTester(aLog, aDb, aTestConductor, aView, aClientStatus);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CUnfiledGroupViewTester::CUnfiledGroupViewTester(CLog& aLog, CContactDatabase& aDb, CTestConductor& aTestConductor, CContactViewBase& aView, TRequestStatus& aClientStatus)
+	: CActive(EPriorityStandard),
+	iLog(aLog),
+	iDb(aDb),
+	iView(aView),
+	iTestConductor(aTestConductor),
+	iClientStatus(aClientStatus)
+	{
+	CActiveScheduler::Add(this);
+	iCurrentTest = EPreStartTest;
+	}
+
+CUnfiledGroupViewTester::~CUnfiledGroupViewTester()
+	{
+	delete iGroupViewUnfiled;
+	}
+
+void CUnfiledGroupViewTester::ConstructL()
+	{
+	}
+
+void CUnfiledGroupViewTester::DoCancel()
+	{
+	}
+
+void CUnfiledGroupViewTester::StartL()
+	{
+	iClientStatus = KRequestPending;
+	NextTest();
+	}
+
+void CUnfiledGroupViewTester::NextTest()
+	{
+	iCurrentTest = static_cast<TTest>( static_cast<TInt>(iCurrentTest) + 1 ) ;
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+void CUnfiledGroupViewTester::HandleContactViewEvent(const CContactViewBase& aView,const TContactViewEvent& aEvent)
+	{
+	TCntProfile profile;
+	TInt sizeOfView = 0;
+
+	switch (iCurrentTest)
+		{
+		case ECreateUnfiledGroupView:
+			test(iGroupViewUnfiled==&aView);
+			test(aEvent.iEventType==TContactViewEvent::EReady);
+			// Stop timer.
+			STOP_CLOCK_TIME( profile );
+			iLog.LogLine(_L("<< Stop  Clock [%d] \n"), macroTimer);
+			iLog.LogLine(_L("=== Time Taken to create view "));
+			iTestConductor.PrintTimeTaken(profile.iTime);
+			NextTest();
+		break;
+
+		case ETestAddUnfiledContacts:
+		case ETestRemoveUnfiledContacts:
+			TRAPD(err, sizeOfView = iGroupViewUnfiled->CountL() );
+			test(err == KErrNone);
+			if (sizeOfView == iSizeOfViewToExpect)
+				{
+				// Stop timer.
+				STOP_CLOCK_TIME( profile );
+				iLog.LogLine(_L("=== Time Taken handle all Messages "));
+				iLog.LogLine(_L("<< Stop  Clock [%d] \n"), macroTimer);
+				iTestConductor.PrintTimeTaken(profile.iTime);
+				iSizeOfViewToExpect = 0;
+				NextTest();
+				}
+		break;
+
+
+		case ENumTests:
+			break;
+		default:
+			test(EFalse);
+			break;
+		}
+
+	}
+
+void CUnfiledGroupViewTester::RunL()
+	{
+	TContactItemId deletedId;
+	TCntProfile profile;
+	TRequestStatus* clientStatus = &iClientStatus;
+	TInt counter = 0;
+	TInt currentSizeOfView = 0;
+
+	switch (iCurrentTest)
+		{
+		case ECreateUnfiledGroupView:
+			iLog.LogLine(_L("=== Create Unfiled group view"));
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			START_CLOCK;
+			iGroupViewUnfiled=CContactGroupView::NewL(iDb,iView,*this,KNullContactId,CContactGroupView::EShowContactsNotInAnyGroup);
+		break;
+
+		case ETestAddUnfiledContacts:
+			iLog.LogLine(_L("==== Add Un-filed Contacts to group"));
+
+			// Contact added here.
+			// Start timer
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			iSizeOfViewToExpect = iGroupViewUnfiled->CountL() + KMaxContactsToAddInGroupTest;
+
+			START_CLOCK;
+			for (counter= 0; counter< KMaxContactsToAddInGroupTest; counter++)
+			{
+				iTestConductor.AddSingleContactL();
+			}
+			// Stop timer.
+			STOP_CLOCK_TIME( profile );
+			iLog.LogLine(_L("<< Stop  Clock [%d] \n"), macroTimer);
+			iTestConductor.PrintTimeTaken(profile.iTime);
+			// Start timer
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			START_CLOCK;
+		break;
+
+		case ETestRemoveUnfiledContacts:
+			iLog.LogLine(_L("==== Remove Un-filed Contacts to group"));
+
+			// Contact added here.
+			// Start timer
+			currentSizeOfView = iGroupViewUnfiled->CountL();
+			iSizeOfViewToExpect = currentSizeOfView - KMaxContactsToRemoveInGroupTest;
+			currentSizeOfView--;
+
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			START_CLOCK;
+
+			for (counter = 0; counter < KMaxContactsToRemoveInGroupTest; counter++)
+			{
+				deletedId = iGroupViewUnfiled->AtL( currentSizeOfView - counter );
+				iDb.DeleteContactL(deletedId);
+				iLog.LogLine(_L("==== Removed contact from DB [%d]"), currentSizeOfView - counter);
+			}
+			// Stop timer.
+			STOP_CLOCK_TIME( profile );
+			iLog.LogLine(_L("<< Stop  Clock [%d] \n"), macroTimer);
+			iTestConductor.PrintTimeTaken(profile.iTime);
+			// Start timer
+			iLog.LogLine(_L(">> Start Clock [%d] \n"), macroTimer);
+			START_CLOCK;
+		break;
+
+		case ENumTests:
+			iLog.LogLine(_L("==== Group View Tests Finished, All Passed...\n"));
+			User::RequestComplete(clientStatus,KErrNone);
+			break;
+		default:
+			ASSERT(EFalse);
+			break;
+		}
+	}
+
+TInt CUnfiledGroupViewTester::RunError(TInt aError)
+	{
+	// propagate error
+	iTestConductor.SetTestError(aError);
+
+	switch (iCurrentTest)
+		{
+		case ECreateUnfiledGroupView: test.Printf(_L("Test failed at step CreateUnfiledGroupView (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestAddUnfiledContacts: test.Printf(_L("Test failed at step TestAddUnfiledContacts (%i) with error %i"), iCurrentTest, aError); break;
+		case ETestRemoveUnfiledContacts: test.Printf(_L("Test failed at step TestRemoveUnfiledContacts (%i) with error %i"), iCurrentTest, aError); break;
+
+		case ENumTests: test.Printf(_L("Test failed at step NumTests (%i) with error %i"), iCurrentTest, aError); break;
+
+		default: test.Printf(_L("Test failed at step %i with error %i"), iCurrentTest, aError); break;
+		}
+
+	CActiveScheduler::Stop();
+	return KErrNone;
+	}
+
+
+
+
+
+//
+// Main.
+//
+/**
+
+@SYMTestCaseID     PIM-T-GROUPVIEW-UNFILED-PROFILE-0001
+
+*/
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	RProcess().SetPriority(EPriorityBackground);
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	test.Start(_L("@SYMTESTCaseID:PIM-T-GROUPVIEW-UNFILED-PROFILE-0001 Test Groupview unfiled profile"));
+
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup=CTrapCleanup::New();
+		if (cleanup)
+			{
+			CTestConductor* testConductor=NULL;
+			TRAPD(err,testConductor=CTestConductor::NewL());
+			test(err == KErrNone);
+			delete testConductor;
+			delete cleanup;
+			}
+		delete scheduler;
+		}
+	test.End();
+	test.Close();
+	__UHEAP_MARKEND;
+	return KErrNone;
+    }