phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/NotificationStep.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/NotificationStep.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,458 @@
+// Copyright (c) 2006-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:
+// These tests attempt to overload the transaction / event queue
+// by calling many operations before the active scheduler is started
+// or by calling the operations within the active scheduler.
+// Unknownchanges event should be generated when queue is overloaded
+// 
+//
+
+/**
+ @file 
+ @publishedAll
+ @released
+*/
+#include "NotificationStep.h"
+#include "PerformanceFunctionalityDefs.h"
+#include "CCntEventQueue.h"
+
+_LIT(KRun1,"UnkownChange");
+_LIT(KRun2,"TransactionUnkown");
+_LIT(KRun3,"TransactionUnkownPlus");
+_LIT(KRun4,"RevertTransactionUnkown");
+_LIT(KRun5,"RevertTransactionUnkownPlus");
+
+_LIT(KTest1, "unknown changes notification test");
+_LIT(KTest2, "Transaction unknown changes notification test");
+_LIT(KTest3, "Transaction unknown changes plus additional changes notification test");
+
+const TInt KTimeout = 5000000;//5 seconds timeout
+const TInt KPlusContacts = 10;
+const TInt KInitialCount = -1;
+
+#define KNumberOfContacts 10
+
+CNotificationStep::CNotificationStep() 
+					: 	CPerformanceFunctionalityBase( KNumberOfContacts ),
+						iMessageCount( KInitialCount )
+	{
+	SetTestStepName(KNotificationStep);
+	}
+	
+void CNotificationStep::PreTestL()
+	{
+	iMyActive = new (ELeave) CNotificationStep::CNotificationActive( this );
+	}
+	
+CNotificationStep::~CNotificationStep()
+	{
+	CLEAR(iMyActive);
+	}
+/**
+checks notifications are received and makes sure that they're correct,
+times out if notification is not received after timeout period
+*/	
+void CNotificationStep::CNotificationActive::RunL()
+	{
+	_LIT(KDatabaseGenerated,"Database Generated");
+	_LIT(KExpected,"Expected");
+	iStep->iEnd.UniversalTime();
+
+	
+	if( iStep->iEnd.MicroSecondsFrom( iStep->iStart ).Int64() > KTimeout ) //test has timed out
+		{
+		 _LIT(KTimedOut,"CNotificationStep listener has timed out");
+		iStep->ERR_PRINTF1(KTimedOut );
+		iStep->PrintNotifications(KDatabaseGenerated, *iStep->iDBEvents, *iStep->iDBContacts);
+		iStep->PrintNotifications(KExpected, *iStep->iSharedEvents, *iStep->iSharedContacts);
+		iStep->TEST1( EFalse, ETrue );//fail test
+		iStep->ResetArrays();
+		iStep->iMessageCount = KInitialCount;
+		iStep->iStart.UniversalTime();
+		CActiveScheduler::Stop();
+		}
+	else if( iStep->iMessageCount > KInitialCount )// if zero or more notifications are expected
+		{
+		//all expected messages have been received
+		if( iStep->iMessageCount == iStep->iSharedEvents->Count() 
+			&& iStep->iMessageCount == iStep->iSharedContacts->Count()
+			&& iStep->iMessageCount == iStep->iDBEvents->Count() 
+			&& iStep->iMessageCount == iStep->iDBContacts->Count() )
+			{
+			const TBool chk = (iStep->*iCheck)();
+			iStep->TEST1( chk  , ETrue );
+			//if test fails
+			if(!chk)
+				{
+				iStep->PrintNotifications(KDatabaseGenerated, *iStep->iDBEvents, *iStep->iDBContacts);
+				iStep->PrintNotifications(KExpected, *iStep->iSharedEvents, *iStep->iSharedContacts);
+				}
+			iStep->iMessageCount = KInitialCount;
+			iStep->ResetArrays();
+			iStep->iStart.UniversalTime();
+			CActiveScheduler::Stop();	
+			}
+		else//wait for rest of db message to be propogated
+			{
+			Activate();
+			}
+		}
+	else //test hasnt timed out and no notifications are expected
+		{
+		if( !iClear )//not expecting to receive notifications for contacts added in preamble, fail test.
+			{			
+			_LIT(KEmptyTestError,"CNotificationStep::CNotificationActive::RunL: Notifications have not been queued up");
+			iStep->ERR_PRINTF1(KEmptyTestError );
+			iStep->TEST1( EFalse, ETrue );//fail test
+			iStep->ResetArrays();
+			iStep->iMessageCount = KInitialCount;
+			CActiveScheduler::Stop();
+			}
+		//expecting to receive notifications for contacts added in preamble, have received all expected notifications
+		else if( iStep->iDBContacts->Count() >= KNumberOfContacts )
+			{
+			iStep->ResetArrays();
+			iStep->iMessageCount = KInitialCount;
+			CActiveScheduler::Stop();
+			}
+		else//have not received all expected notifications from contacts added in preamble
+			{
+			Activate();
+			}
+		}
+	}
+	
+void CNotificationStep::CNotificationActive::DoCancel()
+	{
+	}
+
+TInt CNotificationStep::CNotificationActive::RunError(TInt aError)
+	{
+	 _LIT(KActiveError,"CNotificationStep:: Error in doTest runL: %d");
+	iStep->ERR_PRINTF2(KActiveError, aError );
+	return aError;
+	}
+
+void CNotificationStep::CNotificationActive::Activate()
+	{
+	if(!IsActive())
+		{
+		TRequestStatus *pS=&iStatus;
+		User::RequestComplete(pS,KErrNone);
+		SetActive();
+		}
+	}
+	
+//receives notificaiton from database
+void CNotificationStep::CNotificationActive::HandleDatabaseEventL(TContactDbObserverEvent aEvent)
+	{  
+	iStep->iDBContacts->Append(aEvent.iContactId);
+	iStep->iDBEvents->Append(aEvent.iType);
+	Activate();
+
+	}
+
+void CNotificationStep::InitializeL()
+	{
+	CPerformanceFunctionalityBase::InitializeL();
+	iNotifier = CContactChangeNotifier::NewL(*iContactsDatabase, iMyActive);
+	iSharedContacts = new (ELeave)RArray<TInt>();
+	iSharedEvents = new (ELeave)RArray<TInt>();
+	iDBContacts = new (ELeave)RArray<TInt>();
+	iDBEvents = new (ELeave)RArray<TInt>();
+	}
+
+void CNotificationStep::Cleanup()
+	{
+	if( iSharedEvents )
+		{
+		iSharedEvents->Reset();
+		CLEAR(iSharedEvents);
+		}
+	if( iSharedContacts )
+		{
+		iSharedContacts->Reset();
+		CLEAR(iSharedContacts);
+		}
+	if( iDBEvents )
+		{
+		iDBEvents->Reset();
+		CLEAR(iDBEvents);
+		}
+	if( iDBContacts )
+		{
+		iDBContacts->Reset();
+		CLEAR(iDBContacts);
+		}
+	CLEAR( iNotifier );
+	CPerformanceFunctionalityBase::Cleanup();
+	}
+
+TVerdict CNotificationStep::doTestStepL()
+	{
+	__UHEAP_MARK;
+	InitializeL();
+	
+	_LIT(KDoStepPrint,"CNotificationStep::doTestStepL()");
+	INFO_PRINTF1(KDoStepPrint);  //Block start 
+	iIterate->Reset();
+	
+	CActiveScheduler::Add(iMyActive);
+	ClearNotifications();
+	
+	const TDesC &run = ConfigSection();
+	
+	if( run == KRun1 )
+		{
+		UnkownChangeTestL();
+		}
+	else if( run == KRun2 )
+		{
+		TransactionUnkownChangeTestL( EFalse );
+		}
+	else if( run == KRun3 )
+		{
+		PlusTransactionUnkownChangeTestL( EFalse );
+		}
+	else if( run == KRun4 )
+		{
+		TransactionUnkownChangeTestL( ETrue );
+		}
+	else if( run == KRun5 )
+		{
+		PlusTransactionUnkownChangeTestL( ETrue );
+		}
+	else
+		{
+		MissingTestPanic();
+		}
+
+	Cleanup();
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+	
+void CNotificationStep::ClearNotifications()
+	{
+	//clear any prior notifications, due to adding contacts...
+	iMyActive->iClear = ETrue;
+	iMyActive->iCheck = &CNotificationStep::UnkownChangeCheck;
+	iMyActive->Activate();
+	iStart.UniversalTime();
+	CActiveScheduler::Start();
+	iMyActive->iClear = EFalse;
+	}
+
+void CNotificationStep::ResetArrays()
+	{		
+	iSharedEvents->Reset();
+	iSharedContacts->Reset(); 
+	iDBContacts->Reset();
+	iDBEvents->Reset();
+	}
+/**
+add event to array and increment message count
+*/
+void CNotificationStep::AddEventL(const TInt aEvent)
+	{
+	iSharedEvents->AppendL(aEvent);
+	//increment message count, if message count uninitialized, set to 1.
+	( ( iMessageCount < 0 ) ? ( iMessageCount=1 ) : ++iMessageCount );
+	}
+	
+/**
+add contact to array
+*/
+void CNotificationStep::AddContactL(const TInt aCid)
+	{
+	iSharedContacts->AppendL( aCid );
+	//message count will be incremented in addevent
+	}
+
+/**
+commit or rollback transaction as necessary, recover database if damage by rollback
+*/
+void CNotificationStep::EndTransactionL(const TBool aRevert)
+	{
+	if(aRevert)
+		{
+		iContactsDatabase->DatabaseRollback();
+		AddEventL( EContactDbObserverEventRollback );
+		AddContactL( KNullContactId );
+		CleanupStack::Pop();
+		if( iContactsDatabase->IsDamaged() )
+			{
+			iContactsDatabase->RecoverL();
+			AddEventL( EContactDbObserverEventTablesClosed );
+			AddContactL( 0 );
+			AddEventL( EContactDbObserverEventTablesOpened );
+			AddContactL( 0 );
+			}
+		}
+	else
+		{
+		iContactsDatabase->DatabaseCommitLP(EFalse);
+		}
+	}
+	
+void CNotificationStep::UnkownChangeTestL()
+	{
+	INFO_PRINTF1(KTest1);
+	TContactItemId cid = iIterate->NextL();
+	TInt i = 0;
+	for( ; i < KMaxNumberOfEventsInEventQueue + 10; ++i )
+		{
+		OpenL( cid );
+		CommitL( EFalse );
+		}
+	AddEventL( EContactDbObserverEventContactChanged );
+	AddContactL( cid );
+	AddEventL( EContactDbObserverEventUnknownChanges );
+	AddContactL( -1 );
+	iMyActive->iCheck = &CNotificationStep::UnkownChangeCheck;
+	iMyActive->Activate();
+	iStart.UniversalTime();
+	CActiveScheduler::Start();
+	}	
+				
+/**
+check for unkownchange notification cause by the session queue being overloaded
+*/	
+TBool CNotificationStep::UnkownChangeCheck()
+	{
+	TBool SingleCheck = EFalse;
+	TBool OverallResult = ETrue;
+	
+	TESTPRINT( SingleCheck = ( iSharedContacts->Count() == iDBContacts->Count()) );
+	OverallResult = OverallResult && SingleCheck;
+	
+	TESTPRINT( SingleCheck = ( iSharedEvents->Count() == iDBEvents->Count() ) );
+	OverallResult = OverallResult && SingleCheck;
+	
+	TESTPRINT( SingleCheck = ( iSharedEvents->Count() == iSharedContacts->Count() ) );
+	OverallResult = OverallResult && SingleCheck;
+	
+	TInt length = iSharedContacts->Count();
+	TInt i = 0;
+	for(; i < length; ++i )
+		{
+		TESTPRINTI( SingleCheck = ( iSharedContacts->Find( (*iDBContacts)[i] ) > KErrNotFound ), i );
+		OverallResult = OverallResult && SingleCheck;
+		
+		TESTPRINTI( SingleCheck = ( iSharedEvents->Find( (*iDBEvents)[i] ) > KErrNotFound ) , i );
+		OverallResult = OverallResult && SingleCheck;
+		}
+	
+	return OverallResult;
+	}
+
+/**
+check for unknownchange notification cause by the transaction queue being overloaded
+*/	
+void CNotificationStep::TransactionUnkownChangeTestL(const TBool aRevert)
+	{
+	INFO_PRINTF1(KTest2);
+	
+	TContactItemId cid = iIterate->NextL();
+	TInt i = 0;
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	for( ; i < KMaxNumberOfEventsInEventQueue + 1; ++i )
+		{
+		OpenL( cid );
+		CommitL( ETrue );
+		}
+	EndTransactionL( aRevert );
+	
+	if( !aRevert )
+		{
+		AddEventL( EContactDbObserverEventUnknownChanges );
+		AddContactL( -1 );
+		}
+	iMyActive->iCheck = &CNotificationStep::TransactionUnkownChangeCheck;
+	iMyActive->Activate();
+	iStart.UniversalTime();
+	CActiveScheduler::Start();
+	}					
+	
+TBool CNotificationStep::TransactionUnkownChangeCheck()
+	{
+	TBool SingleCheck = EFalse;
+	TBool OverallResult = ETrue;
+	
+	TESTPRINT( SingleCheck = ( iMessageCount == iDBContacts->Count() ) );
+	OverallResult = OverallResult && SingleCheck;
+	
+	TESTPRINT( SingleCheck = ( iMessageCount == iDBEvents->Count() ) );
+	OverallResult = OverallResult && SingleCheck;
+	
+	TInt length = iSharedContacts->Count();
+	TInt i = 0;
+	for(; i < length; ++i )
+		{
+		TESTPRINTI( SingleCheck = ( iSharedContacts->Find( (*iDBContacts)[i] ) > KErrNotFound ), i );
+		OverallResult = OverallResult && SingleCheck;
+	
+		TESTPRINTI( SingleCheck = ( iSharedEvents->Find( (*iDBEvents)[i] ) > KErrNotFound ), i );
+		OverallResult = OverallResult && SingleCheck;	
+		}
+
+	return OverallResult;
+	}	
+
+void CNotificationStep::PlusTransactionUnkownChangeTestL(const TBool aRevert)
+	{
+	INFO_PRINTF1(KTest3);
+	
+	TContactItemId cid = iIterate->NextL();
+	TInt i = 0;
+	for( ; i < KPlusContacts; ++i )
+		{
+		OpenL( cid );
+		CommitL( EFalse );
+		}
+		
+	TInt many = aRevert ? KPlusContacts : 1;
+	for( i = 0; i < many; ++i )
+		{
+		AddEventL( EContactDbObserverEventContactChanged );
+		AddContactL( cid );
+		}
+	
+	cid = iIterate->NextL();
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	for( i = 0; i < KMaxNumberOfEventsInEventQueue + 1; ++i )
+		{
+		OpenL( cid );
+		CommitL( ETrue );
+		}
+	EndTransactionL( aRevert );
+	
+	if( !aRevert )
+		{
+		AddEventL( EContactDbObserverEventUnknownChanges );
+		AddContactL( -1 );
+		iMyActive->iCheck = &CNotificationStep::UnkownChangeCheck;
+		}
+	else
+		{
+		iMyActive->iCheck = &CNotificationStep::TransactionUnkownChangeCheck;
+		}
+	iMyActive->Activate();
+	iStart.UniversalTime();
+	CActiveScheduler::Start();
+	}					
+	
+
+