phonebookengines_old/contactsmodel/tsrc/t_filterbroadcast.cpp
changeset 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/t_filterbroadcast.cpp	Fri Jun 11 13:29:23 2010 +0300
@@ -0,0 +1,537 @@
+// 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 <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include <f32file.h>
+#include "t_utils2.h"
+#include "t_filterbroadcast.h"
+
+//
+// Constants.
+//
+
+_LIT(KTestName,"t_filterbroadcast");
+
+_LIT(KDbFileName,"c:t_filterbroadcast.cdb");
+
+_LIT(KViewName, "viewname");
+const TInt KNumSmsContacts = 111;
+// Time to wait for Views to be updated - 5s is very generous for any platform
+const TInt KViewWaitTimeout = 5000000;
+
+
+LOCAL_C void CleanupFilesL()
+	{
+    // delete the database file
+	if (CContactDatabase::ContactDatabaseExistsL(KDbFileName) )
+		{
+		CContactDatabase::DeleteDatabaseL(KDbFileName);
+		}
+	}
+
+
+
+//
+// CTestConductor.
+//
+
+CTestConductor* CTestConductor::NewL(RTest& aTest)
+	{
+	CTestConductor* self=new(ELeave) CTestConductor(aTest);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->RunTestsL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CTestConductor::~CTestConductor()
+	{
+	delete iDb;
+	delete iRandomGenerator;
+	}
+
+CTestConductor::CTestConductor(RTest& aTest) : iTest(aTest)
+	{
+	}
+
+void CTestConductor::ConstructL()
+	{
+	iDb=CContactDatabase::ReplaceL(KDbFileName);
+	iRandomGenerator=CRandomContactGenerator::NewL();
+	iRandomGenerator->SetDbL(*iDb);
+	AddContactsL();
+	}
+
+void CTestConductor::AddContactL(TInt aBitwiseFilterType)
+	{
+	iTest.Printf(_L("Adding Contact"));
+	iRandomGenerator->AddTypicalContactForFilterL(aBitwiseFilterType);
+	}
+
+void CTestConductor::AddContactsThatMatchFilterL(TInt aNumberOfContacts, TInt aFilter)
+	{
+	TInt counter = 0;
+	for (counter = 0; counter < aNumberOfContacts; counter++)
+		{
+		iRandomGenerator->AddTypicalContactForFilterL(aFilter);
+		}
+	}
+void CTestConductor::AddContactsL()
+	{
+	TInt bit=0;
+	iTest.Printf(_L("Adding "));
+
+	bit = CContactDatabase::ESmsable;
+	AddContactsThatMatchFilterL(KNumSmsContacts, bit);
+	}
+
+void CTestConductor::RunTestsL()
+	{
+	CViewTester* tester = CViewTester::NewL(iTest, *iDb, *this);
+	CleanupStack::PushL(tester);
+	tester->StartTest();
+	CActiveScheduler::Start();
+	CleanupStack::PopAndDestroy(tester);
+
+	// error from CViewTester ?
+	User::LeaveIfError(iTestError);
+	}
+
+
+void CTestConductor::SetTestError(TInt aTestError)
+	{
+	iTestError = aTestError;
+	}
+
+
+//
+// CViewTester.
+//
+
+CViewTester* CViewTester::NewL(RTest& aTest,CContactDatabase& aDb, CTestConductor& aTestConductor)
+	{
+	CViewTester* self=new(ELeave) CViewTester(aTest,aDb, aTestConductor);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+CViewTester::~CViewTester()
+	{
+	iTimer.Cancel();
+	iFilteredView->Close(*this);
+	iNamedRemoteView->Close(*this);
+	iSortOrder[0].Close();
+	iSortOrder[1].Close();
+	}
+
+CViewTester::CViewTester(RTest& aTest,CContactDatabase& aDb,CTestConductor& aTestConductor)
+	: CActive(EPriorityStandard),iTest(aTest),iDb(aDb),iTestConductor(aTestConductor)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CViewTester::ConstructL()
+	{
+	iSortOrder[0].AppendL(KUidContactFieldGivenName);
+	iSortOrder[0].AppendL(KUidContactFieldFamilyName);
+	iSortOrder[0].AppendL(KUidContactFieldCompanyName);
+
+	iSortOrder[1].AppendL(KUidContactFieldCompanyName);
+	iSortOrder[1].AppendL(KUidContactFieldFamilyName);
+	iSortOrder[1].AppendL(KUidContactFieldGivenName);
+
+	iTimer.CreateLocal();
+	}
+
+
+
+void CViewTester::StartTest()
+	{
+	iState = ECreate_RemoteView;
+	iRemoteViewEvent = TContactViewEvent::EUnavailable;
+	iFilteredViewEvent = TContactViewEvent::EUnavailable;
+	CallRunLAgain();
+	}
+
+void CViewTester::RunL()
+	{
+	switch (iState)
+		{
+		case ECreate_RemoteView:
+			iTest.Next(_L("Named Remote View creation View Ready event"));
+
+			iNamedRemoteView = CContactNamedRemoteView::NewL( *this, KViewName, iDb, iSortOrder[0], EContactsOnly );
+			// Wait for view to be created
+			iTimer.After( iStatus, KViewWaitTimeout );
+			SetActive();
+			NextState();
+		break;
+
+
+		// It is an error for the RTimer to trigger before the state has changed.
+		case EWait_RemoteView:
+			iTest.Printf(_L("Timeout waiting for Remote View to be created"));
+			TRAP_IGNORE(CleanupFilesL() );
+			iTest( EFalse); // failed
+		break;
+
+		case ECreate_FilteredView:
+			iTest.Next(_L("Filtered View creation View Ready event"));
+
+			iFilteredView = CContactFilteredView::NewL( *this, iDb, *iNamedRemoteView, CContactDatabase::ESmsable );
+			// Wait for view to be created
+			iTimer.After( iStatus, KViewWaitTimeout );
+			SetActive();
+			NextState();
+		break;
+
+
+		// It is an error for the RTimer to trigger before the state has changed.
+		case EWait_FilteredView:
+			iTest.Printf(_L("Timeout waiting for Filtered View to be created"));
+			TRAP_IGNORE(CleanupFilesL() );
+			iTest( EFalse ); // failed
+		break;
+
+		case EChangeSortOrder:
+			iTest.Next(_L("Re-sort Remote View and Filtered View, wait for view events"));
+
+			iNamedRemoteView->ChangeSortOrderL( iSortOrder[1] );
+			// Wait for views to be resorted
+			iTimer.After( iStatus, KViewWaitTimeout );
+			SetActive();
+			NextState();
+		break;
+
+
+		// It is an error for the RTimer to trigger before the state has changed.
+		case EWait_SortViewEvents:
+			// Give information on what went wrong:
+			iTest.Printf(_L("Test Timeout waiting for Filtered and Remote View to be resorted:\n"));
+			switch(iRemoteViewEvent)
+				{
+				case TContactViewEvent::EReady:
+					iTest.Printf(_L("  Named Remote View; sort not started\n"));
+				break;
+
+				case TContactViewEvent::EUnavailable:
+					iTest.Printf(_L("  Named Remote View; sort not finished\n"));
+				break;
+
+				case TContactViewEvent::ESortOrderChanged:
+					// Remote View Sorted & Ready
+				break;
+
+				default:
+					// error in test
+					User::Invariant();
+				}
+
+			switch(iFilteredViewEvent)
+				{
+				case TContactViewEvent::EReady:
+					iTest.Printf(_L("  Filtered View; sort not started\n"));
+				break;
+
+				case TContactViewEvent::EUnavailable:
+					iTest.Printf(_L("  Filtered View; sort not finished\n"));
+				break;
+
+				case TContactViewEvent::ESortOrderChanged:
+					// Filtered View Sorted & Ready
+				break;
+
+				default:
+					// error in test
+					User::Invariant();
+				}
+			TRAP_IGNORE(CleanupFilesL() );
+			iTest( EFalse ); // failed
+		break;
+
+		case EFinished:
+			CActiveScheduler::Stop(); // we're done.
+		break;
+
+		default:
+			ASSERT(EFalse);
+		break;
+		}
+	}
+
+
+TInt CViewTester::RunError(TInt aError)
+	{
+	iTestConductor.SetTestError(aError);
+
+	switch (iState)
+		{
+		case ECreate_RemoteView: iTest.Printf(_L("Test failed at step Create_RemoteView (%i) with error %i"), iState, aError); break;
+		case EWait_RemoteView: iTest.Printf(_L("Test failed at step Wait_RemoteView (%i) with error %i"), iState, aError); break;
+		case ECreate_FilteredView: iTest.Printf(_L("Test failed at step Create_FilteredView (%i) with error %i"), iState, aError); break;
+		case EWait_FilteredView: iTest.Printf(_L("Test failed at step Wait_FilteredView (%i) with error %i"), iState, aError); break;
+		case EChangeSortOrder: iTest.Printf(_L("Test failed at step ChangeSortOrder (%i) with error %i"), iState, aError); break;
+		case EWait_SortViewEvents: iTest.Printf(_L("Test failed at step Wait_SortViewEvents (%i) with error %i"), iState, aError);
+			// Give information on what went wrong:
+			iTest.Printf(_L("Test Timeout waiting for Filtered and Remote View to be resorted:\n"));
+			switch(iRemoteViewEvent)
+				{
+				case TContactViewEvent::EReady:
+					iTest.Printf(_L("  Named Remote View; sort not started\n"));
+					break;
+
+				case TContactViewEvent::EUnavailable:
+					iTest.Printf(_L("  Named Remote View; sort not finished\n"));
+					break;
+
+				case TContactViewEvent::ESortOrderChanged:
+					// Remote View Sorted & Ready
+					break;
+
+				default:
+					break;
+				}
+
+			switch(iFilteredViewEvent)
+				{
+				case TContactViewEvent::EReady:
+					iTest.Printf(_L("  Filtered View; sort not started\n"));
+					break;
+
+				case TContactViewEvent::EUnavailable:
+					iTest.Printf(_L("  Filtered View; sort not finished\n"));
+					break;
+
+				case TContactViewEvent::ESortOrderChanged:
+					// Filtered View Sorted & Ready
+					break;
+
+				default:
+					break;
+				}
+			break;
+
+		case EFinished: iTest.Printf(_L("Test failed at step Finished (%i) with error %i"), iState, aError); break;
+
+		default: iTest.Printf(_L("Test failed at step %i with error %i"), iState, aError);
+		}
+
+	// stop test
+	CActiveScheduler::Stop();
+	return KErrNone;
+	}
+
+
+
+void CViewTester::HandleContactViewEvent(const CContactViewBase& aView,const TContactViewEvent& aEvent)
+/**
+ * for each of the Remote and Filtered Views we wait for certain events
+ * iState				  Event
+ * EWait_RemoteView		  Named Remote View to become EReady
+ * EWait_FilteredView	  Filtered View to become EReady
+ * EWait_SortViewEvents   Named Remote View to become EUnavailable, and then ESortOrderChanged
+ *                        Filtered View to become EUnavailable, and then ESortOrderChanged
+ * The last expected event in each state calls NextState() for the test state machine.
+ * Any other event, or any event in another test state, is an error.
+ */
+	{
+	// view reference is correct?
+	if(&aView != iNamedRemoteView && &aView != iFilteredView)
+		{
+		iTest.Printf(_L("test error: event for unknown View\n"));
+		User::Invariant();
+		}
+
+	TBool expectedEvent = EFalse; // assume this is not the event we are looking for
+
+	// is this the/an event we are expecting now?
+	switch(aEvent.iEventType)
+		{
+		case TContactViewEvent::EReady:
+			if(iState == EWait_RemoteView && &aView == iNamedRemoteView)
+				{
+				// Remote View is now ready, go to next test state
+				iRemoteViewEvent = aEvent.iEventType;
+				iTest.Printf(_L("event: Remote View ready\n"));
+				expectedEvent = ETrue;
+				NextState();
+				}
+			else if(iState == EWait_FilteredView && &aView == iFilteredView)
+				{
+				// Filter View is now ready, go to next test state
+				iFilteredViewEvent = aEvent.iEventType;
+				iTest.Printf(_L("event: Filtered View ready\n"));
+				expectedEvent = ETrue;
+				NextState();
+				}
+		break;
+
+		case TContactViewEvent::EUnavailable:
+			if(iState == EWait_SortViewEvents && &aView == iNamedRemoteView)
+				{
+				// Remote View, but correct event?
+				if(iRemoteViewEvent == TContactViewEvent::EReady)
+					{
+					iRemoteViewEvent = aEvent.iEventType;
+					iTest.Printf(_L("event: Remote View unavailable\n"));
+					expectedEvent = ETrue;
+					}
+				}
+			else if(iState == EWait_SortViewEvents && &aView == iFilteredView)
+				{
+				if(iFilteredViewEvent == TContactViewEvent::EReady)
+					{
+					iFilteredViewEvent = aEvent.iEventType;
+					iTest.Printf(_L("event: Filtered View unavailable\n"));
+					expectedEvent = ETrue;
+					}
+				}
+		break;
+
+		case TContactViewEvent::ESortOrderChanged:
+			if(iState == EWait_SortViewEvents)
+				{
+				if(&aView == iNamedRemoteView && iRemoteViewEvent == TContactViewEvent::EUnavailable)
+					{
+					iRemoteViewEvent = aEvent.iEventType;
+					iTest.Printf(_L("event: Remote View sort order changed\n"));
+					expectedEvent = ETrue;
+					}
+				else if(&aView == iFilteredView && iFilteredViewEvent == TContactViewEvent::EUnavailable)
+					{
+					iFilteredViewEvent = aEvent.iEventType;
+					iTest.Printf(_L("event: Filtered View sort order changed\n"));
+					expectedEvent = ETrue;
+					}
+
+				// both views now Re-Sorted ?
+				if(iRemoteViewEvent == TContactViewEvent::ESortOrderChanged &&
+						iFilteredViewEvent == TContactViewEvent::ESortOrderChanged)
+					{
+					NextState();
+					}
+				}
+		break;
+
+		default:
+			// unexpected event
+		break;
+		}
+
+
+	if(!expectedEvent)
+		{
+		// valid View, but unexpected event
+		iTest.Printf(_L("test error: unexpected View event\n"));
+		TRAP_IGNORE(CleanupFilesL() );
+		iTest( EFalse );
+		}
+
+	return;
+	}
+
+
+
+void CViewTester::NextState()
+	{
+	TState oldState(iState);
+
+	iState = static_cast<TState>( static_cast<TInt>(iState) + 1 );
+
+	// moving from an event with timeout?
+	if(oldState == EWait_RemoteView || oldState == EWait_FilteredView || oldState == EWait_SortViewEvents)
+		{
+		// Cancel view wait timer, causes RunL to run
+		iTimer.Cancel();
+		}
+	}
+
+void CViewTester::CallRunLAgain()
+	{
+	TRequestStatus *pS=&iStatus;
+	User::RequestComplete(pS,KErrNone);
+	SetActive();
+	}
+
+void CViewTester::DoCancel()
+	{
+	}
+
+/**
+
+@SYMTestCaseID     PIM-T-FILTERBROADCAST-0001
+
+*/
+
+void doMainL()
+	{
+	RTest test( KTestName );
+	CTestConductor* testConductor=NULL;
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+
+	CTestRegister* TempFiles = CTestRegister::NewLC();
+	TempFiles->RegisterL(KDbFileName, EFileTypeCnt);
+
+	test.Start(_L("@SYMTESTCaseID:PIM-T-FILTERBROADCAST-0001 "));
+
+
+	__UHEAP_MARK;
+	testConductor = CTestConductor::NewL(test);
+
+	delete testConductor;
+	__UHEAP_MARKEND;
+
+	CleanupStack::PopAndDestroy(2);
+
+	test.Printf(_L("\n"));
+	test.End();
+	test.Close();
+	}
+//
+// Main.
+//
+
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	// The dummy is just to get rid of linker warning LNK4089 when building for WINS
+	TVolumeInfo Dummy;
+	Dummy.iSize = 1;
+	CActiveScheduler* scheduler=new CActiveScheduler;
+	if (scheduler)
+		{
+		CActiveScheduler::Install(scheduler);
+		CTrapCleanup* cleanup=CTrapCleanup::New();
+		if (cleanup)
+			{
+			TRAP_IGNORE(doMainL() );
+			// cleanup files even if doMainL() leaves
+			TRAP_IGNORE(CleanupFilesL() );
+			delete cleanup;
+			}
+		delete scheduler;
+		}
+	__UHEAP_MARKEND;
+	return KErrNone;
+    }