phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/RequestMixStep.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/PerfFuncSuite/src/RequestMixStep.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,637 @@
+// 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:
+//
+
+/**
+ @file 
+ @publishedAll
+ @released
+*/
+#include "RequestMixStep.h"
+#include "PerformanceFunctionalityDefs.h"
+
+_LIT(KRun1,"SingleSession");
+_LIT(KRun2,"MultipleSession");
+_LIT(KRun3,"MultipleDestroy");
+_LIT(KRun4,"SingleTransaction");
+_LIT(KRun5,"MultipleTransaction");
+_LIT(KRun6,"IndefiniteLock");
+_LIT(KRun7,"OddSession");
+
+_LIT(KTest1, "KSingle session tests");
+_LIT(KTest2, "Multiple session tests");
+_LIT(KTest3, "multiple destroy tests");
+_LIT(KTest4, "KSingle session Transaction tests");
+_LIT(KTest5, "Multiple session Transaction tests");
+_LIT(KTest6, "Indefinite Locking test");
+_LIT(KTest7, "Transaction Odd Session Commit test");
+
+#define KNumberOfContacts 10
+
+CRequestMixStep::~CRequestMixStep()
+	{
+	}
+
+CRequestMixStep::CRequestMixStep() : CPerformanceFunctionalityBase(KNumberOfContacts)
+	{
+	SetTestStepName(KRequestMixStep);
+	}
+
+
+TVerdict CRequestMixStep::doTestStepL()
+	{
+	__UHEAP_MARK;
+	InitializeL();
+	_LIT(KStartTest,"CRequestMixStep::doTestStepL()");
+	INFO_PRINTF1(KStartTest);  //Block start 
+	CContactDatabase *contactsDatabase2 = CContactDatabase::OpenL();//open another seesion to cntsrv
+																	//used by tests that require 2 sessions
+	CleanupStack::PushL( contactsDatabase2 );
+	iIterate->Reset();
+
+	const TDesC &KRun = ConfigSection();
+	
+	if( KRun == KRun1 )
+		{
+		INFO_PRINTF1(KTest1);
+		SingularTestsL();
+		}
+	else if( KRun == KRun2 )
+		{
+		INFO_PRINTF1(KTest2);
+		SingularTestsL(contactsDatabase2);
+		}
+	else if( KRun == KRun3 )
+		{
+		INFO_PRINTF1(KTest3);
+		MultipleDestroyTestL();
+		}
+	else if( KRun == KRun4 )
+		{
+		INFO_PRINTF1(KTest4);
+		TransactionTestsL();
+		}
+	else if( KRun == KRun5 )
+		{
+		INFO_PRINTF1(KTest5);
+		TransactionTestsL(contactsDatabase2);
+		}
+	else if( KRun == KRun6 )
+		{
+		INFO_PRINTF1(KTest6);
+		EndlessLockTestL();
+		}
+	else if( KRun == KRun7 )
+		{
+		INFO_PRINTF1(KTest7);
+		TransactionOddSessionCommitTestL(contactsDatabase2);
+		}
+	else
+		{
+		MissingTestPanic();
+		}
+	
+	CleanupStack::PopAndDestroy(contactsDatabase2);
+	Cleanup();
+	__UHEAP_MARKEND;
+
+	return TestStepResult();
+	}
+
+void CRequestMixStep::SingularTestsL(CContactDatabase *aDb2)
+	{
+	UpdateTestL(aDb2);
+	CloseTestL(aDb2);
+	OpenCloseTestL(aDb2);
+	ReadOpenCloseTestL(aDb2);
+	MultipleOpenTestL(aDb2);
+	}
+
+void CRequestMixStep::TransactionTestsL(CContactDatabase *aDb2)
+	{
+	TransactionCommitTestL(aDb2);
+	TransactionCloseTestL(aDb2);
+	TransactionReadCloseTestL(aDb2);
+	TransactionDeleteTestL(aDb2);
+	}
+
+void CRequestMixStep::UpdateTestL(CContactDatabase *aDb2)
+	{
+	if(!aDb2)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	CContactItem *contactItem2 = NULL;
+	CContactItem *contactItem3 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	TContactItemId con2 = iIterate->NextL();
+	//Lock contact A using session 1
+	contactItem1 = iContactsDatabase->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	
+	//Attemp to open contact a with session 1/2
+	TRAP(err, contactItem2 = aDb2->OpenContactL(con1) );
+	
+	TESTPRINT( err == KErrInUse );
+	CLEAR( contactItem2 );
+	
+	err = KErrNone;
+	//Attemp to read contact a with session 1/2
+	TRAP(err, contactItem2 = aDb2->ReadContactL(con1) );
+	
+	TESTPRINT(KErrNone == err) ;
+	CLEAR( contactItem2 );
+	
+	
+	err = KErrNone;
+	//read contact b with session 1/2
+	contactItem2 = aDb2->ReadContactLC(con2);
+	//attempt to update contact 1 with contact 2 using session 1/2
+	TRAP(err, contactItem3 = aDb2->UpdateContactLC(con1, contactItem2); 
+			  CleanupStack::PopAndDestroy(contactItem3);
+		);
+	TESTPRINT(KErrInUse == err) ;
+	contactItem3 = NULL;
+	CleanupStack::PopAndDestroy(contactItem2);
+	contactItem2 = NULL;
+	
+	
+	err = KErrNone;
+	//attempt to delete contact 1 with session 1/2
+	TRAP(err, aDb2->DeleteContactL(con1) );
+	TESTPRINT(KErrInUse == err) ;
+	
+	CleanupStack::PopAndDestroy(contactItem1);
+	CleanupStack::PopAndDestroy();//unlock contact 1
+	contactItem1 = NULL;
+	}
+
+void CRequestMixStep::CloseTestL(CContactDatabase *aDb2)
+	{
+	if(!aDb2)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	contactItem1 = iContactsDatabase->ReadContactL(con1);
+	
+	TRAP(err, aDb2->CommitContactL(*contactItem1) );
+	CLEAR( contactItem1 );
+	TESTPRINT(KErrAccessDenied == err);
+	
+	contactItem1 = iContactsDatabase->ReadContactL(con1);
+	
+	err = KErrNone;
+	TRAP(err, aDb2->CloseContactL(con1) );
+	CLEAR( contactItem1 );
+	TESTPRINT(KErrNone == err);
+	}
+
+void CRequestMixStep::OpenCloseTestL(CContactDatabase *aDb2)
+	{
+	const TBool KSingle = !aDb2;
+	if(KSingle)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	contactItem1 = iContactsDatabase->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	
+	TRAP(err, aDb2->CommitContactL(*contactItem1) );
+	if(KSingle)
+		{
+		TESTPRINT(KErrNone == err);
+		}
+	else
+		{
+		TESTPRINT(KErrInUse == err);
+		}
+	
+	err = KErrNone;
+	TRAP(err, iContactsDatabase->CommitContactL(*contactItem1) );
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();
+	contactItem1 = NULL;
+	if(KSingle)
+		{
+		TESTPRINT(KErrAccessDenied == err);
+		}
+	else
+		{
+		TESTPRINT(KErrNone == err);
+		}
+	
+	contactItem1 = iContactsDatabase->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	
+	TRAP(err, aDb2->CloseContactL(con1) );
+	TESTPRINT(KErrNone == err);
+	
+	err = KErrNone;
+	TRAP(err, aDb2->CloseContactL(con1) );
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();
+	contactItem1 = NULL;
+	TESTPRINT(KErrNone == err);
+	}
+
+void CRequestMixStep::ReadOpenCloseTestL(CContactDatabase *aDb2)
+	{
+	const TBool KSingle = !aDb2;
+	if(!aDb2)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	CContactItem *contactItem2 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	TContactItemId con2 = iIterate->NextL();
+
+	contactItem1 = iContactsDatabase->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	contactItem2 = aDb2->ReadContactL(con1);
+	
+	TRAP(err, aDb2->CommitContactL(*contactItem2) );
+	if(KSingle)
+		{
+		TESTPRINT(KErrNone == err);
+		}
+	else
+		{
+		TESTPRINT(KErrInUse == err);
+		}
+	
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();//destroy lock (unlock)
+	contactItem1 = NULL;
+	CLEAR(contactItem2);
+	
+	contactItem1 = iContactsDatabase->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	contactItem2 = aDb2->ReadContactL(con1);
+	
+	TRAP(err, aDb2->CloseContactL(con1) );
+	TESTPRINT(KErrNone == err);
+	
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();//destroy lock (unlock)
+	contactItem1 = NULL;
+	CLEAR(contactItem2);
+	
+	contactItem1 = iContactsDatabase->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	contactItem2 = aDb2->ReadContactL(con2);
+	
+	TRAP(err, aDb2->CommitContactL(*contactItem2) );
+	TESTPRINT(KErrAccessDenied == err);
+	
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();//destroy lock (unlock)
+	contactItem1 = NULL;
+	CLEAR(contactItem2);
+	}
+/**
+for single session:
+open x many contact then commit them all
+open x many contacts, close them, then destroy the locks
+for multiple sessions:
+open x many contacts then commit them using different session
+open x many contacts, check that they are still locked, then close them
+*/
+void CRequestMixStep::MultipleOpenTestL(CContactDatabase *aDb2)
+	{
+	const TBool KSingle = !aDb2;
+	if(KSingle)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	const TInt KMany = 5;
+	TInt i = 0;
+	TInt err = KErrNone;
+	CContactItem *contactItems[KMany];
+	TContactItemId con1 = 0;
+	
+	iIterate->Reset();
+	
+	for(i = 0; i < KMany; ++i)
+		{
+		contactItems[i] = iContactsDatabase->OpenContactLX( iIterate->NextL() );
+		CleanupStack::PushL( contactItems[i] );
+		}
+		
+	for(i = 0; i < KMany; ++i)
+		{
+		TRAP(err, aDb2->CommitContactL( *contactItems[i] ));
+		if(KSingle)
+			{
+			TESTPRINTI(KErrNone == err, i);
+			}
+		else
+			{
+			TESTPRINTI(KErrInUse == err, i);
+			}
+		}
+		
+	for(i = KMany - 1; i >= 0; --i)
+		{
+		CleanupStack::PopAndDestroy( contactItems[i] );
+		CleanupStack::Pop();//pop lock
+		contactItems[i] = NULL;
+		}
+		
+	iIterate->Reset();
+	err = KErrNone;
+	if(KSingle)
+		{
+		for(i = 0; i < KMany; ++i)
+			{
+			contactItems[i] = iContactsDatabase->OpenContactLX( iIterate->NextL() );
+			CleanupStack::PushL( contactItems[i] );
+			}
+			
+		for(i = 0; i < KMany; ++i)
+			{
+			TRAP(err, iContactsDatabase->CloseContactL( contactItems[i]->Id() ));
+			TESTPRINTI(KErrNone == err, i);
+			}
+			
+		for(i = KMany - 1; i >= 0; --i)
+			{
+			CleanupStack::PopAndDestroy( contactItems[i] );
+			CleanupStack::PopAndDestroy();
+			contactItems[i] = NULL;
+			}
+		}
+	else
+		{	
+		for(i = 0; i < KMany; ++i)
+			{
+			con1 = iIterate->NextL();
+			TRAP(err, contactItems[0] = iContactsDatabase->OpenContactL( con1 ) );
+			TESTPRINTI(KErrInUse == err, i);
+			iContactsDatabase->CloseContactL( con1 );
+			CLEAR(contactItems[0]);
+			}
+		}
+	}
+/**
+open x many contacts and push lock on stack
+destroy all contacts and locks
+check all contacts are now unlocked
+*/
+void CRequestMixStep::MultipleDestroyTestL()
+	{
+	const TInt KMany = 5;
+	TInt i = 0;
+	TInt err = KErrNone;
+	CContactItem *contactItems[KMany];
+	
+	iIterate->Reset();
+	
+	for(i = 0; i < KMany; ++i)
+		{
+		contactItems[i] = iContactsDatabase->OpenContactLX( iIterate->NextL() );
+		CleanupStack::PushL( contactItems[i] );
+		}		
+		
+	for(i = KMany - 1; i >= 0; --i)
+		{
+		CleanupStack::PopAndDestroy( contactItems[i] );
+		CleanupStack::PopAndDestroy();
+		contactItems[i] = NULL;
+		}	
+		
+	iIterate->Reset();	
+	for(i = 0; i < KMany; ++i)
+		{
+		TRAP(err, contactItems[0] = iContactsDatabase->OpenContactL( iIterate->NextL() ) );
+		TESTPRINTI(KErrNone == err, i);//checks the contact is no longer locked
+		CLEAR( contactItems[0] );
+		}
+		
+	iIterate->Reset();
+	for(i = 0; i < KMany; ++i)
+		{
+		iContactsDatabase->CloseContactL( iIterate->NextL() );
+		}	
+	}
+
+void CRequestMixStep::TransactionCommitTestL( CContactDatabase *aDb2 )
+	{
+	if(!aDb2)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	CContactItem *contactItem2 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+
+	contactItem1 = aDb2->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	
+	TRAP(err, contactItem2 = iContactsDatabase->OpenContactL( con1 ) );
+	TESTPRINT( KErrInUse == err );
+	CLEAR( contactItem2 );
+	TRAP(err, iContactsDatabase->doCommitContactL(*contactItem1,ETrue,ETrue) );
+	TESTPRINT( KErrNone == err );
+	
+	iContactsDatabase->DatabaseCommitLP(EFalse);
+	
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();
+	contactItem1 = NULL;
+	CLEAR(contactItem2);
+	}
+
+void CRequestMixStep::TransactionCloseTestL( CContactDatabase *aDb2 )
+	{
+	if(!aDb2)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	CContactItem *contactItem2 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+
+	contactItem1 = aDb2->OpenContactLX(con1);
+	CleanupStack::PushL(contactItem1);
+	
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	
+	TRAP(err, iContactsDatabase->CloseContactL( con1 ) );
+	TESTPRINT( KErrNone == err );
+	
+	iContactsDatabase->DatabaseCommitLP(EFalse);
+	
+	CleanupStack::PopAndDestroy( contactItem1 );
+	CleanupStack::PopAndDestroy();
+	contactItem1 = NULL;
+	CLEAR(contactItem2);
+	}
+
+void CRequestMixStep::TransactionReadCloseTestL( CContactDatabase *aDb2 )
+	{
+	if(!aDb2)
+		{
+		aDb2 = iContactsDatabase;
+		}
+	
+	TInt err = KErrNone;
+	CContactItem *contactItem1 = NULL;
+	CContactItem *contactItem2 = NULL;
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	TContactItemId con2 = iIterate->NextL();
+
+	contactItem1 = aDb2->ReadContactLC(con1);
+	contactItem2 = aDb2->ReadContactLC(con2);
+	
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	
+	TRAP(err, iContactsDatabase->doCommitContactL( *contactItem1,ETrue,ETrue ) );
+	TESTPRINT( KErrAccessDenied == err );
+	
+	TRAP(err, iContactsDatabase->CloseContactL( con2 ) );
+	TESTPRINT( KErrNone == err );
+	
+	iContactsDatabase->DatabaseCommitLP(EFalse);
+	
+	CleanupStack::PopAndDestroy( contactItem2 );
+	CleanupStack::PopAndDestroy( contactItem1 );
+	contactItem1 = NULL;
+	contactItem2 = NULL;
+	}
+
+void CRequestMixStep::TransactionDeleteTestL( CContactDatabase *aDb2 )
+	{
+
+	TInt err = KErrNone;
+	
+	if( NULL == aDb2 )
+		{
+		TESTPRINT(NULL == aDb2);
+		return;
+		}
+	
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	CContactItem *contactItem1 = NULL;
+
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	
+	TRAP(err, aDb2->doDeleteContactL( con1, ETrue, ETrue ) );
+	TESTPRINT( KErrLocked == err );
+	
+	iContactsDatabase->DatabaseRollback();
+	CleanupStack::Pop();
+	if( iContactsDatabase->IsDamaged() )
+		{
+		iContactsDatabase->RecoverL();
+		}
+	
+	TRAP(err, contactItem1 = iContactsDatabase->ReadContactL( con1 ) );
+	CLEAR( contactItem1 );
+	TESTPRINT( KErrNone == err );
+	
+	if( err == KErrNotFound )
+		{
+		iIterate->RemoveL( con1 );
+		AddEmptyContactsL(1, EFalse);
+		}
+	}
+
+void CRequestMixStep::TransactionOddSessionCommitTestL( CContactDatabase *aDb2 )
+	{
+	TInt err = KErrNone;
+	
+	if( NULL == aDb2 )
+		{
+		TESTPRINT( NULL == aDb2 );
+		return;
+		}
+	iIterate->Reset();
+	TContactItemId con1 = iIterate->NextL();
+	CContactItem *contactItem1 = NULL;
+
+	iContactsDatabase->DatabaseBeginLC(EFalse);
+	
+	TRAP(err, iContactsDatabase->doDeleteContactL( con1, ETrue, ETrue ) );
+	TESTPRINT( KErrNone == err );
+	
+	TRAP( err, aDb2->DatabaseCommitLP(EFalse) );
+	TESTPRINT( KErrLocked == err );
+	if( err )
+		{
+		CleanupStack::Pop();
+		}
+	TRAP(err, contactItem1 = iContactsDatabase->ReadContactL( con1 ) );
+	CLEAR( contactItem1 );
+	TESTPRINT( KErrNotFound == err );
+	
+	if( err == KErrNotFound )
+		{
+		iIterate->RemoveL( con1 );
+		AddEmptyContactsL(1, EFalse);
+		}
+	}
+
+/**open contact, kill database session, 
+reopen database, check that contact is not still locked*/
+void CRequestMixStep::EndlessLockTestL( )
+	{
+	CContactItem *contactItem2 = NULL;
+	TContactItemId con1 = iIterate->NextL();
+	
+	TInt err = KErrNone;
+	iIterate->Reset();
+	OpenL( con1 );
+	
+	CLEAR(iContactsDatabase);
+	iContactsDatabase = CContactDatabase::OpenL();
+	TRAP(err, contactItem2 = iContactsDatabase->OpenContactL( con1 ) );
+	TESTPRINT( err == KErrNone );
+	CLEAR(contactItem2);
+	CloseL( ETrue );
+	}