diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/NotificationStep.cpp --- /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(); + iSharedEvents = new (ELeave)RArray(); + iDBContacts = new (ELeave)RArray(); + iDBEvents = new (ELeave)RArray(); + } + +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(); + } + + +