diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/t_viewsoom.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/t_viewsoom.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,1451 @@ +// 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 +#include +#include +#include +#include +#include +#include "t_utils2.h" +#include "T_UTILS.H" +#include "t_viewsoom.h" +#include +#include "CContactDbEventQueue.h" + +_LIT(KTestName,"T_ViewsOOM"); +LOCAL_D RFs TheFs; +// +// Constants. +// + +_LIT8(KSortPlugin, "application.vnd.symbian.com/contacts-reverse-sort"); //SimpleSortPlugin DLL Unique name + +_LIT(KLogFileName,"t_viewsoom.log"); + +_LIT(KDbFileName,"c:t_view2.cdb"); + +_LIT(KTextDefSeparator,""); +_LIT8(KUnicodeLineEnd,"\x0D\x00\x0a\x00"); + +_LIT(KContactsFile, "z:\\t_view2\\t_view2_initial_contacts_small.txt"); + +const TInt KMaxNumRequests(1000); + +// +// CTestConductor. +// + +CTestConductor* CTestConductor::NewL() + { + CTestConductor* self=new(ELeave) CTestConductor(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CTestConductor::~CTestConductor() + { + delete iGroupOne; + iLocalView->Close(*this); + iRemoteView_1->Close(*this); + iSortOrder_1.Close(); + iSortOrder_2.Close(); + + delete iSortChecker; + delete iViewCreator; + delete iContactAdder; + delete iContactRemover; + delete iViewExerciser; + delete iSortOrderChanger; + delete iLog; + delete iDb; + iTest.Close(); + TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDbFileName)); + iFs.Close(); + } + +CTestConductor::CTestConductor() : CActive(EPriorityIdle),iTest(KTestName),iCurrentTestNumber(-1) + { + CActiveScheduler::Add(this); + } + +/** + +@SYMTestCaseID PIM-T-VIEWSOOM-0001 + +*/ + +void CTestConductor::ConstructL() + { + iGroupId=-1; + iGnoreNotifications=EFalse; + iSortOrder_1.AppendL(KUidContactFieldGivenName); + iSortOrder_1.AppendL(KUidContactFieldFamilyName); + iSortOrder_1.AppendL(KUidContactFieldCompanyName); + + iSortOrder_2.AppendL(KUidContactFieldFamilyName); + iSortOrder_2.AppendL(KUidContactFieldGivenName); + iSortOrder_2.AppendL(KUidContactFieldCompanyName); + + User::LeaveIfError(iFs.Connect()); + iLog=CLog::NewL(iTest,KLogFileName); + iDb=CContactDatabase::ReplaceL(KDbFileName); + + iSortChecker=CSortChecker::NewL(*this); + iViewCreator=CViewCreator::NewL(*this); + iContactAdder=CContactAdder::NewL(*this); + iContactRemover=CContactRemover::NewL(*this); + iViewExerciser=CViewExerciser::NewL(*this); + iSortOrderChanger=CSortOrderChanger::NewL(*this); + + iTestError = KErrNone; + + NextTest(); + iTest.Start(_L("@SYMTESTCaseID:PIM-T-VIEWSOOM-0001 --- Contact Views OOM tests---")); + + CActiveScheduler::Start(); + + User::LeaveIfError(iTestError); + iTest.End(); + } + +void CTestConductor::NextTest() + { + ++iCurrentTestNumber; + TRequestStatus *pS=&iStatus; + User::RequestComplete(pS,KErrNone); + SetActive(); + } + +void CTestConductor::RunL() + { + switch (iCurrentTestNumber) + { + case ECreateLocalView: + iLog->LogLine(_L("=== Create local view")); + iCurrentTestObject=iViewCreator; + iLocalView=iViewCreator->CreateLocalViewL(iSortOrder_1); + break; + case EAddInitialContacts: + { + iLog->LogLine(_L("=== Add initial contacts")); + iCurrentTestObject=iContactAdder; +// iContactAdder->AddContactsL(_L("c:\\t_view2\\t_view2_initial_contacts.txt"),1); + iContactAdder->AddContactsL(KContactsFile,1); + } + break; + case EAddGroup: + { + //Create Test Group + iGroupOne = STATIC_CAST(CContactGroup*,iDb->CreateContactGroupL(KGroupOneName)); + for (TInt ii=1;ii<=KNumContactsInGroupOne;++ii) + { + iDb->AddContactToGroupL(ii,iGroupOne->Id()); + } + iGroupId = iGroupOne->Id(); + NextTest(); + } + break; + case ECreateRemoteView: + iLog->LogLine(_L("=== Create remote view")); + iCurrentTestObject=iViewCreator; + iRemoteView_1=iViewCreator->CreateRemoteViewL(iSortOrder_1); + break; + case EDoOOMTests: + { + iGnoreNotifications=ETrue; + COomTest *oomTest=new(ELeave) COomTest(iDb,iLocalView,iRemoteView_1,iGroupOne,*this); + CleanupStack::PushL(oomTest); + oomTest->TestsL(); + CleanupStack::PopAndDestroy(); // oomTest + NextTest(); + } + break; + case ENumTests: + { + RThread thread; + iTest(thread.RequestCount()==0); + CActiveScheduler::Stop(); + } + break; + default: + ASSERT(EFalse); + break; + } + } + + +TInt CTestConductor::RunError(TInt aError) + { + // quick code to report the test step and leave error + // allows test to exit neatly with message about where the failure occurred + iTestError = aError; + + switch (iCurrentTestNumber) + { + case ECreateLocalView: iTest.Printf(_L("RunL left in step CreateLocalView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddInitialContacts: iTest.Printf(_L("RunL left in step AddInitialContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddGroup: iTest.Printf(_L("RunL left in step AddGroup (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateRemoteView: iTest.Printf(_L("RunL left in step CreateRemoteView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EDoOOMTests: iTest.Printf(_L("RunL left in step DoOOMTestL (%i) with error %i"), iCurrentTestNumber, aError); break; + + case ENumTests: iTest.Printf(_L("RunL left in step NumTests (%i) with error %i"), iCurrentTestNumber, aError); break; + + default: iTest.Printf(_L("RunL left in step %i with error %i"), iCurrentTestNumber, aError); break; + } + + // stop test + CActiveScheduler::Stop(); + return KErrNone; + } + + +void CTestConductor::HandleContactViewEvent(const CContactViewBase& aView, const TContactViewEvent& aEvent) + { + if(iGnoreNotifications) + { + return; + } + + if(aEvent.iContactId == iGroupId ) + { + return;//ignore + } + + TRAPD(err, iCurrentTestObject->HandleNotificationL(aView, aEvent) ); + iTest(err == KErrNone); + } + +void CTestConductor::DoCancel() + { + } + + +// +// CSortChecker. +// + +CSortChecker* CSortChecker::NewL(CTestConductor& aConductor) + { + CSortChecker* self=new(ELeave) CSortChecker(aConductor); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +CSortChecker::CSortChecker(CTestConductor& aConductor) : iConductor(aConductor) + { + } + +void CSortChecker::ConstructL() + { + iCollateMethod=new(ELeave) TCollationMethod; + *iCollateMethod=*Mem::CollationMethodByIndex(0); + iCollateMethod->iFlags|=TCollationMethod::EIgnoreNone; + } + +CSortChecker::~CSortChecker() + { + iSortedFirstLast.ResetAndDestroy(); + iSortedLastFirst.ResetAndDestroy(); + delete iCollateMethod; + } + +void CSortChecker::AddContactL(const TDesC& aFirstName,const TDesC& aLastName) + { + HBufC* buf=HBufC::NewLC(aFirstName.Length()+aLastName.Length()); + TPtr bufPtr(buf->Des()); + bufPtr.Append(aFirstName); + bufPtr.Append(aLastName); + User::LeaveIfError(iSortedFirstLast.Append(buf)); + CleanupStack::Pop(); // buf. + + buf=HBufC::NewLC(aFirstName.Length()+aLastName.Length()); + TPtr bufPtr2(buf->Des()); + bufPtr2.Append(aLastName); + bufPtr2.Append(aFirstName); + User::LeaveIfError(iSortedLastFirst.Append(buf)); + CleanupStack::Pop(); // buf. + } + +void CSortChecker::RemoveContactL(const TDesC& aFirstName,const TDesC& aLastName) + { + HBufC* buf=HBufC::NewLC(aFirstName.Length()+aLastName.Length()); + TPtr bufPtr(buf->Des()); + bufPtr.Append(aFirstName); + bufPtr.Append(aLastName); + TInt index=iSortedFirstLast.Find(buf,TIdentityRelation(Match)); + ASSERT(index!=KErrNotFound); + delete iSortedFirstLast[index]; + iSortedFirstLast.Remove(index); + CleanupStack::PopAndDestroy(); // buf. + + buf=HBufC::NewLC(aFirstName.Length()+aLastName.Length()); + TPtr bufPtr2(buf->Des()); + bufPtr2.Append(aLastName); + bufPtr2.Append(aFirstName); + index=iSortedLastFirst.Find(buf,TIdentityRelation(Match)); + ASSERT(index!=KErrNotFound); + delete iSortedLastFirst[index]; + iSortedLastFirst.Remove(index); + CleanupStack::PopAndDestroy(); // buf. + } + +TBool CSortChecker::Match(const HBufC& aFirst,const HBufC& aSecond) + { + if (aFirst.Compare(aSecond)==0) + { + return ETrue; + } + return EFalse; + } + +TPtrC CSortChecker::ContactAt(TSortOrder aOrder,TInt aIndex) const + { + const RPointerArray& sortedList=(aOrder==ELastNameFirstName) ? iSortedLastFirst : iSortedFirstLast; + return TPtrC(*sortedList[aIndex]); + } + +TInt CSortChecker::Count() const + { + return iSortedFirstLast.Count(); + } + +TInt CSortChecker::Count(TSortOrder aOrder,const TDesC& aLowBoundary,const TDesC& aHighBoundary) const + { + const TInt low=FindIndex(aOrder,aLowBoundary,CSortChecker::EGreaterThanOrEqualTo); + const TInt high=FindIndex(aOrder,aHighBoundary,CSortChecker::EGreaterThanOrEqualTo); + if (low==KErrNotFound) + { + iConductor.iTest(high==KErrNotFound); + return 0; + } + return high-low; + } + +TInt CSortChecker::CountLow(TSortOrder aOrder,const TDesC& aHighBoundary) const + { + const TInt high=FindIndex(aOrder,aHighBoundary,CSortChecker::EGreaterThanOrEqualTo); + if (high==KErrNotFound) + { + return 0; + } + return high; + } + +TInt CSortChecker::CountHigh(TSortOrder aOrder,const TDesC& aLowBoundary) const + { + const TInt low=FindIndex(aOrder,aLowBoundary,CSortChecker::EGreaterThanOrEqualTo); + if (low==KErrNotFound) + { + return 0; + } + return Count()-low; + } + +void CSortChecker::Sort() + { + iSortedFirstLast.Sort(TLinearOrder(Compare)); + iSortedLastFirst.Sort(TLinearOrder(Compare)); + + const TInt numContacts=iSortedFirstLast.Count(); + __ASSERT_ALWAYS(numContacts==iSortedLastFirst.Count(),User::Invariant()); + } + +void CSortChecker::CheckSort(TSortOrder aOrder,const TDesC& aName,TInt aIndex) const + { + const RPointerArray& sortedList=(aOrder==ELastNameFirstName) ? iSortedLastFirst : iSortedFirstLast; + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,sortedList[aIndex]); + iConductor.iTest(sortedList[aIndex]->Compare(aName)==0); + } + +void CSortChecker::CheckSortLowSubView(TSortOrder aOrder,const TDesC& aName,TInt aIndex,const TDesC& aHighBoundary) const + { + const RPointerArray& sortedList=(aOrder==ELastNameFirstName) ? iSortedLastFirst : iSortedFirstLast; + const HBufC* name=sortedList[aIndex]; + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,name); + iConductor.iTest(name->CompareC(aHighBoundary,3,iCollateMethod)<0); + iConductor.iTest(name->Compare(aName)==0); + } + +void CSortChecker::CheckSortHighSubView(TSortOrder aOrder,const TDesC& aName,TInt aIndex,const TDesC& aLowBoundary) const + { + const RPointerArray& sortedList=(aOrder==ELastNameFirstName) ? iSortedLastFirst : iSortedFirstLast; + const TInt lowIndex=FindIndex(aOrder,aLowBoundary,CSortChecker::EGreaterThanOrEqualTo); + if (lowIndex!=KErrNotFound) + { + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,sortedList[lowIndex+aIndex]); + iConductor.iTest(sortedList[lowIndex+aIndex]->Compare(aName)==0); + } + } + +void CSortChecker::CheckSortSubView(TSortOrder aOrder,const TDesC& aName,TInt aIndex,const TDesC& aLowBoundary,const TDesC& aHighBoundary) const + { + const RPointerArray& sortedList=(aOrder==ELastNameFirstName) ? iSortedLastFirst : iSortedFirstLast; + const TInt lowIndex=FindIndex(aOrder,aLowBoundary,CSortChecker::EGreaterThanOrEqualTo); + if (lowIndex!=KErrNotFound) + { + const HBufC* name=sortedList[lowIndex+aIndex]; + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,name); + iConductor.iTest(name->CompareC(aHighBoundary,3,iCollateMethod)<0); + iConductor.iTest(name->Compare(aName)==0); + } + } + +TInt CSortChecker::FindIndex(TSortOrder aOrder,const TDesC& aBoundary,TCriteria aCriteria) const + { + const RPointerArray& sortedList=(aOrder==ELastNameFirstName) ? iSortedLastFirst : iSortedFirstLast; + const TInt numContacts=sortedList.Count(); + for (TInt ii=0;iiCompareC(aBoundary,3,iCollateMethod)<0) + { + return ii; + } + break; + case ELessThanOrEqualTo: + if (sortedList[ii]->CompareC(aBoundary,3,iCollateMethod)<=0) + { + return ii; + } + break; + case EGreaterThan: + if (sortedList[ii]->CompareC(aBoundary,3,iCollateMethod)>0) + { + return ii; + } + break; + case EGreaterThanOrEqualTo: + if (sortedList[ii]->CompareC(aBoundary,3,iCollateMethod)>=0) + { + return ii; + } + break; + default: + ASSERT(EFalse); + } + } + return KErrNotFound; + } + +TInt CSortChecker::Compare(const HBufC& aFirst, const HBufC& aSecond) + { + TCollationMethod collateMethod; + collateMethod = *Mem::CollationMethodByIndex(0); + collateMethod.iFlags|=TCollationMethod::EIgnoreNone; + return aFirst.CompareC(aSecond,3,&collateMethod); + } + + +// +// CTestBase. +// + +CTestBase::CTestBase(CTestConductor& aConductor) : iConductor(aConductor) + { + } + + +// +// CViewCreator. +// + +CViewCreator* CViewCreator::NewL(CTestConductor& aConductor) + { + CViewCreator* self=new(ELeave) CViewCreator(aConductor); + return self; + } + +CContactLocalView* CViewCreator::CreateLocalViewL(const RContactViewSortOrder& aSortOrder) + { + TInt32 viewPrefs=0; + viewPrefs|=EContactAndGroups; + iView=CContactLocalView::NewL(iConductor,*iConductor.iDb,aSortOrder,TContactViewPreferences(viewPrefs)); + return STATIC_CAST(CContactLocalView*,iView); + } + +CContactNamedLocalView* CViewCreator::CreateNamedLocalViewL(const TDesC& aName,const RContactViewSortOrder& aSortOrder) + { + TInt32 viewPrefs=0; + viewPrefs|=EContactAndGroups; + iView=CContactNamedLocalView::NewL(iConductor,aName,*iConductor.iDb,aSortOrder,TContactViewPreferences(viewPrefs)); + return STATIC_CAST(CContactNamedLocalView*,iView); + } + +CContactRemoteView* CViewCreator::CreateRemoteViewL(const RContactViewSortOrder& aSortOrder) + { + TInt32 viewPrefs=0; + viewPrefs|=EContactAndGroups; + iView=CContactRemoteView::NewL(iConductor,*iConductor.iDb,aSortOrder,TContactViewPreferences(viewPrefs)); + return STATIC_CAST(CContactRemoteView*,iView); + } + +CContactNamedRemoteView* CViewCreator::CreateNamedRemoteViewL(const TDesC& aName,const RContactViewSortOrder& aSortOrder) + { + TInt32 viewPrefs=0; + viewPrefs|=EContactAndGroups; + iView=CContactNamedRemoteView::NewL(iConductor,aName,*iConductor.iDb,aSortOrder,TContactViewPreferences(viewPrefs)); + return STATIC_CAST(CContactNamedRemoteView*,iView); + } + +CContactSubView* CViewCreator::CreateSubViewL(CContactViewBase& aUnderlyingView,const TDesC& aBoundary) + { + iView=CContactSubView::NewL(iConductor,*iConductor.iDb,aUnderlyingView,aBoundary); + return STATIC_CAST(CContactSubView*,iView); + } + +CContactSubView* CViewCreator::CreateSubViewL(CContactViewBase& aUnderlyingView,const TDesC& aLowBoundary,const TDesC& aHighBoundary) + { + iView=CContactSubView::NewL(iConductor,*iConductor.iDb,aUnderlyingView,aLowBoundary,aHighBoundary); + return STATIC_CAST(CContactSubView*,iView); + } + +CContactConcatenatedView* CViewCreator::CreateConcatenatedViewL(RPointerArray& aComponentViews) + { + iView=CContactConcatenatedView::NewL(iConductor,*iConductor.iDb,aComponentViews); + return STATIC_CAST(CContactConcatenatedView*,iView); + } + +void CViewCreator::HandleNotificationL(const CContactViewBase& aView,const TContactViewEvent& aEvent) + { + if(&aView==iView) + { + iConductor.iTest(aEvent.iEventType==TContactViewEvent::EReady); + iConductor.NextTest(); + } + } + +CViewCreator::CViewCreator(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + + +// +// CContactAdder. +// + +CContactAdder* CContactAdder::NewL(CTestConductor& aConductor) + { + CContactAdder* self=new(ELeave) CContactAdder(aConductor); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +CContactAdder::~CContactAdder() + { + delete iRandomGenerator; + delete iTemplate; + iFile.Close(); + iFs.Close(); + } + +void CContactAdder::AddContactsL(const TDesC& aFileName,TInt aNumViews) + { + User::LeaveIfError(iFile.Open(iFs,aFileName,EFileShareAny|EFileStreamText)); + iNumViews=aNumViews; + TInt pos=2; + iFile.Seek(ESeekStart,pos); // Ignore Unicode header. + iConductor.iTest.Printf(_L("Adding contact ")); + AddOneContactL(); + } + +void CContactAdder::HandleNotificationL(const CContactViewBase&,const TContactViewEvent& aEvent) + { + if (++iNumNotifications==iNumViews) + { + if (iFinished) + { + iConductor.NextTest(); + } + else + { + AddOneContactL(); + } + } + else + { + iConductor.iTest(aEvent.iEventType==TContactViewEvent::EItemAdded); + } + } + +CContactAdder::CContactAdder(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + +void CContactAdder::ConstructL() + { + User::LeaveIfError(iFs.Connect()); + iTemplate=STATIC_CAST(CContactTemplate*,iConductor.iDb->ReadContactL(iConductor.iDb->TemplateId())); + iRandomGenerator=CRandomContactGenerator::NewL(); + iRandomGenerator->SetDbL(*iConductor.iDb); + } + +void CContactAdder::AddOneContactL() + { + iRandomGenerator->AddTypicalRandomContactL(); + iConductor.iLog->IncVisualCounter(); + iNumNotifications=0; + TBuf<64> firstName; + TBuf<64> lastName; + iConductor.iLog->IncVisualCounter(); + iFinished=!ReadNamePairL(iFile,firstName,lastName); + iConductor.iLog->LogLineNoEcho(_L("Adding %S %S"),&firstName,&lastName); + CTestContact* contact=CTestContact::NewLC(*iTemplate); + contact->SetFirstNameL(firstName); + contact->SetLastNameL(lastName); + iConductor.iDb->AddNewContactL(contact->ContactItem()); + CleanupStack::PopAndDestroy(); // contact. + iConductor.iDb->CompactL(); + iConductor.iSortChecker->AddContactL(firstName,lastName); + if (iFinished) + { + iConductor.iLog->EndVisualCounter(); + iConductor.iSortChecker->Sort(); + } + } + +TBool CContactAdder::ReadNamePairL(RFile aFile,TDes& aFirstName,TDes& aLastName) + { + TBuf8<2> character=_L8(" "); + TBuf8<4> lineEndTestBuf=_L8(" "); + + aFirstName.SetLength(0); + aLastName.SetLength(0); + TBool readingLastName=ETrue; + while (lineEndTestBuf!=KUnicodeLineEnd) + { + User::LeaveIfError(aFile.Read(character,2)); + if (character.Length()>0) + { + lineEndTestBuf[0]=lineEndTestBuf[2]; + lineEndTestBuf[1]=lineEndTestBuf[3]; + lineEndTestBuf[2]=character[0]; + lineEndTestBuf[3]=character[1]; + + const TPtrC16 widePtr((TUint16*)character.Ptr(),1); + if (widePtr[0]==';') + { + readingLastName=EFalse; + } + else if (readingLastName) + { + aLastName.Append(widePtr); + } + else + { + aFirstName.Append(widePtr); + } + } + else + { + return EFalse; + } + } + + aFirstName.Delete(aFirstName.Length()-2,2); // Strip off \n\r. + return ETrue; + } + + +// +// CContactRemover. +// + +CContactRemover* CContactRemover::NewL(CTestConductor& aConductor) + { + CContactRemover* self=new(ELeave) CContactRemover(aConductor); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +CContactRemover::~CContactRemover() + { + iFile.Close(); + iFs.Close(); + } + +void CContactRemover::RemoveContactsL(const TDesC& aFileName,TInt aNumViews) + { + User::LeaveIfError(iFile.Open(iFs,aFileName,EFileShareAny|EFileStreamText)); + iNumViews=aNumViews; + TInt pos=2; + iFile.Seek(ESeekStart,pos); // Ignore Unicode header. + iConductor.iTest.Printf(_L("Removing contact ")); + RemoveOneContactL(); + } + +void CContactRemover::HandleNotificationL(const CContactViewBase&,const TContactViewEvent& aEvent) + { + if (++iNumNotifications==iNumViews) + { + if (iFinished) + { + iConductor.NextTest(); + } + else + { + RemoveOneContactL(); + } + } + else + { + iConductor.iTest(aEvent.iEventType==TContactViewEvent::EItemRemoved); + } + } + +CContactRemover::CContactRemover(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + +void CContactRemover::ConstructL() + { + User::LeaveIfError(iFs.Connect()); + } + +void CContactRemover::RemoveOneContactL() + { + iNumNotifications=0; + TBuf<64> firstName; + TBuf<64> lastName; + iConductor.iLog->IncVisualCounter(); + iFinished=!CContactAdder::ReadNamePairL(iFile,firstName,lastName); + iConductor.iLog->LogLineNoEcho(_L("Removing %S %S"),&firstName,&lastName); + CContactItemFieldDef* def=new(ELeave) CContactItemFieldDef(); + CleanupStack::PushL(def); + def->AppendL(KUidContactFieldGivenName); + def->AppendL(KUidContactFieldFamilyName); + CContactIdArray* matchList1=iConductor.iDb->FindLC(lastName,def); + CContactIdArray* matchList2=iConductor.iDb->FindLC(firstName,def); + + for (TInt ii=matchList1->Count()-1;ii>=0;--ii) + { + TContactItemId thisId=(*matchList1)[ii]; + for (TInt jj=matchList2->Count()-1;jj>=0;--jj) + { + if (thisId==(*matchList2)[jj]) + { + iConductor.iDb->DeleteContactL(thisId); + goto carry_on; + } + } + } + ASSERT(EFalse); + +carry_on: + CleanupStack::PopAndDestroy(3); // matchList2, matchList1, def. + iConductor.iDb->CompactL(); + iConductor.iSortChecker->RemoveContactL(firstName,lastName); + if (iFinished) + { + iConductor.iLog->EndVisualCounter(); + iConductor.iSortChecker->Sort(); + } + } + + +// +// CViewExerciser. +// + +CViewExerciser* CViewExerciser::NewL(CTestConductor& aConductor) + { + CViewExerciser* self=new(ELeave) CViewExerciser(aConductor); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +/*void CViewExerciser::ProfileViewL(CContactViewBase& aView) + { + TInt viewCount = aView.CountL(); + RDebug::Print(_L("Profile view Count: %d"),viewCount); + CCntTest::ProfileReset(0,1); + CCntTest::ProfileStart(0); + for (TInt ii=0;ii scratchBuf; + TContactItemId lastId=0; + const TInt numItems=aView.CountL(); + iConductor.iTest(iConductor.iSortChecker->Count()==numItems); + CContactTextDef* textDef=(aSortOrder==CSortChecker::EFirstNameLastName) ? iTextDef_FirstLast : iTextDef_LastFirst; + + for (TInt ii=0;iiReadContactTextDefL(thisId,scratchBuf,textDef); + iConductor.iSortChecker->CheckSort(aSortOrder,scratchBuf,ii); + scratchBuf.SetLength(0); + } + + iConductor.iTest(aView.FindL(lastId)==numItems-1); + + if (iQueue) + { + iConductor.NextTest(); + } + } + +void CViewExerciser::ExerciseSubViewL(CSortChecker::TSortOrder aSortOrder,CContactViewBase& aView,const TDesC& aLowBoundary,const TDesC& aHighBoundary) + { + TBuf<128> scratchBuf; + TContactItemId lastId=0; + const TInt numItems=aView.CountL(); + iConductor.iTest(iConductor.iSortChecker->Count(aSortOrder,aLowBoundary,aHighBoundary)==numItems); + + for (TInt ii=0;iiReadContactTextDefL(thisId,scratchBuf,textDef); + iConductor.iSortChecker->CheckSortSubView(aSortOrder,scratchBuf,ii,aLowBoundary,aHighBoundary); + scratchBuf.SetLength(0); + } + + iConductor.iTest(aView.FindL(lastId)==numItems-1); + + if (iQueue) + { + iConductor.NextTest(); + } + } + +void CViewExerciser::ExerciseLowSubViewL(CSortChecker::TSortOrder aSortOrder,CContactViewBase& aView,const TDesC& aLowBoundary) + { + TBuf<128> scratchBuf; + TContactItemId lastId=0; + const TInt numItems=aView.CountL(); + iConductor.iTest(iConductor.iSortChecker->CountLow(aSortOrder,aLowBoundary)==numItems); + + for (TInt ii=0;iiReadContactTextDefL(thisId,scratchBuf,textDef); + iConductor.iSortChecker->CheckSortLowSubView(aSortOrder,scratchBuf,ii,aLowBoundary); + scratchBuf.SetLength(0); + } + + iConductor.iTest(aView.FindL(lastId)==numItems-1); + + if (iQueue) + { + iConductor.NextTest(); + } + } + +void CViewExerciser::ExerciseHighSubViewL(CSortChecker::TSortOrder aSortOrder,CContactViewBase& aView,const TDesC& aHighBoundary) + { + TBuf<128> scratchBuf; + TContactItemId lastId=0; + const TInt numItems=aView.CountL(); + iConductor.iTest(iConductor.iSortChecker->CountHigh(aSortOrder,aHighBoundary)==numItems); + + for (TInt ii=0;iiReadContactTextDefL(thisId,scratchBuf,textDef); + iConductor.iSortChecker->CheckSortHighSubView(aSortOrder,scratchBuf,ii,aHighBoundary); + scratchBuf.SetLength(0); + } + + iConductor.iTest(aView.FindL(lastId)==numItems-1); + + if (iQueue) + { + iConductor.NextTest(); + } + } + +CViewExerciser::~CViewExerciser() + { + delete iTextDef_FirstLast; + delete iTextDef_LastFirst; + } + +void CViewExerciser::HandleNotificationL(const CContactViewBase&,const TContactViewEvent&) + { + iConductor.iTest(EFalse); + } + +CViewExerciser::CViewExerciser(CTestConductor& aConductor) : CTestBase(aConductor),iQueue(ETrue) + { + } + +void CViewExerciser::ConstructL() + { + iTextDef_FirstLast=CContactTextDef::NewL(); + iTextDef_FirstLast->AppendL(TContactTextDefItem(KUidContactFieldGivenName,KTextDefSeparator)); + iTextDef_FirstLast->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,KTextDefSeparator)); + iTextDef_FirstLast->AppendL(TContactTextDefItem(KUidContactFieldCompanyName,KTextDefSeparator)); + + iTextDef_LastFirst=CContactTextDef::NewL(); + iTextDef_LastFirst->AppendL(TContactTextDefItem(KUidContactFieldFamilyName,KTextDefSeparator)); + iTextDef_LastFirst->AppendL(TContactTextDefItem(KUidContactFieldGivenName,KTextDefSeparator)); + iTextDef_LastFirst->AppendL(TContactTextDefItem(KUidContactFieldCompanyName,KTextDefSeparator)); + } + +void CViewExerciser::QueueNextTestWhenComplete(TBool aQueue) + { + iQueue=aQueue; + } + + +// +// CSortOrderChanger. +// + +CSortOrderChanger* CSortOrderChanger::NewL(CTestConductor& aConductor) + { + CSortOrderChanger* self=new(ELeave) CSortOrderChanger(aConductor); + return self; + } + +void CSortOrderChanger::ChangeSortOrderL(RContactViewSortOrder& aSortOrder,CContactNamedLocalView& aView,TInt aNumViews) + { + aView.ChangeSortOrderL(aSortOrder); + iNumViews=aNumViews; + iNumNotifications=0; + } + +void CSortOrderChanger::ChangeSortOrderL(RContactViewSortOrder& aSortOrder,CContactNamedRemoteView& aView,TInt aNumViews) + { + aView.ChangeSortOrderL(aSortOrder); + iNumViews=aNumViews; + iNumNotifications=0; + } + +CSortOrderChanger::~CSortOrderChanger() + { + } + +void CSortOrderChanger::HandleNotificationL(const CContactViewBase&,const TContactViewEvent& aEvent) + { + iConductor.iTest(aEvent.iEventType==TContactViewEvent::EUnavailable || aEvent.iEventType==TContactViewEvent::ESortOrderChanged || aEvent.iEventType==TContactViewEvent::EReady); +// if (++iNumNotifications==iNumViews*3) // 3 because there will be EUnavailable, ESortOrderChanged, and EReady notifications for each view. + if (++iNumNotifications==iNumViews*2) // 3 because there will be EUnavailable, ESortOrderChanged, and EReady notifications for each view. + { + iConductor.NextTest(); + } + } + +CSortOrderChanger::CSortOrderChanger(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + + + +// +// +// COomFailBase +// + +COomFailBase::COomFailBase(COomTest *aOomTest,CContactDatabase* aDb,CContactViewBase* aUnderlyingView) + : iOomTest(aOomTest),iDb(aDb),iUnderlyingView(aUnderlyingView) + {} + +COomFailBase::~COomFailBase() + { + } + +void COomFailBase::ConstructL() + {} + +void COomFailBase::PreFailL() + {} + +void COomFailBase::ClearUp() + {} + +TBool COomFailBase::Skip(TInt , TOomFailureModes ) const + { + return(EFalse); + } + +void COomFailBase::ClearEventQueueL() + { + _LIT(KLoggingFormat, "(%d) Database Event Consumed. Type: %d\n"); + + CContactDbEventQueue* eventQueue = CContactDbEventQueue::NewL(iDb, KMaxNumRequests); + CleanupStack::PushL(eventQueue); + + // Clear the view of all outstanding events before continuing + TContactDbObserverEvent event; + TBool expectingEvent = ETrue; + const TInt KTimeOutInSeconds = 1; + for(TInt i = 0; expectingEvent; ++i) + { + expectingEvent = eventQueue->ListenForEvent(KTimeOutInSeconds, event); + if (expectingEvent) // meaning if we've just received one + { + iOomTest->Conductor().iTest.Printf(KLoggingFormat, i, event.iType); + } + } + + CleanupStack::PopAndDestroy(eventQueue); + } + +// +// COomTest +// + +COomTest::COomTest(CContactDatabase* aDb,CContactLocalView* aLocalView,CContactRemoteView* aRemoteView,CContactGroup* aGroup,CTestConductor& aConductor) + : iDb (aDb),iLocalView(aLocalView),iRemoteView (aRemoteView),iGroupOne(aGroup),iConductor(aConductor) + {} + +void COomTest::Test(TBool aMustBeTrue) + { + iConductor.iTest(aMustBeTrue); + } + +CTestConductor& COomTest::Conductor() const + { + return iConductor; + } + +void COomTest::DoOomTestL(COomFailBase *aOomTest, TOomFailureModes aMode) + { + Test(aOomTest!=NULL); + iConductor.iTest.Next(_L("")); + + + __UHEAP_MARK; + TInt oldFsCount=TheFs.ResourceCount(); +// + CleanupStack::PushL(aOomTest); + TRAPD(ret1,aOomTest->ConstructL()); + Test(ret1==KErrNone); + CContactDatabase *lockDb=NULL; + if (aMode==KOomFailContactServer) // contact server failure tests + { + lockDb=CContactDatabase::OpenL(KDbFileName); + CleanupStack::PushL(lockDb); + } + TInt successCount=0; + TInt skipCount=0; + for(TInt count=0;;count++) + {// + TRAPD(preFailErr,aOomTest->PreFailL()); + iConductor.iTest(preFailErr==KErrNone); + switch(aMode) + { + case KOomFailNormal: + __UHEAP_SETFAIL(RHeap::EDeterministic,count); + break; + case KOomFailContactServer: + lockDb->SetCntServerHeapFailure(RHeap::EDeterministic,count); + break; + case KOomFailFileServerOom: + TheFs.SetErrorCondition(KErrNoMemory,count); + break; + case KOomFailFileServerGeneral: + TheFs.SetErrorCondition(KErrGeneral,count); + break; + default:; + } + TInt ret=KErrNone; + if (aOomTest->Skip(count,aMode)) + skipCount++; + else + { + __UHEAP_MARK; + TRAP(ret,aOomTest->FailL()); + __UHEAP_MARKEND; + } + switch(aMode) + { + case KOomFailNormal: + __UHEAP_RESET; + break; + case KOomFailContactServer: + lockDb->SetCntServerHeapFailure(RHeap::ENone,0); + break; + case KOomFailFileServerOom: + case KOomFailFileServerGeneral: + TheFs.SetErrorCondition(KErrNone); + break; + default:; + } + TRAPD(clearUpErr,aOomTest->ClearUp()); + iConductor.iTest(clearUpErr==KErrNone); + if (ret==KErrNone) + { + if (successCount==8) + { + iConductor.iTest.Printf(_L("Count=%d"),count); + if (skipCount>0) + iConductor.iTest.Printf(_L(", skipped=%d"),skipCount); + iConductor.iTest.Printf(_L("\n")); + break; + } + successCount++; + } + else + { + successCount=0; + if (aMode==KOomFailFileServerGeneral) + Test(ret==KErrGeneral || ret==KErrNotFound); + else if (aMode==KOomFailFileServerOom) + Test(ret==KErrNoMemory || ret==KErrNotFound); + else + Test(ret==KErrNoMemory); + } + }// + + if (aMode==KOomFailContactServer) + CleanupStack::PopAndDestroy(); // lockDb + CleanupStack::PopAndDestroy(); // aOomTest + Test(oldFsCount==TheFs.ResourceCount()); + __UHEAP_MARKEND; + + } + +COomTest::~COomTest() + {} + +TBool COomTest::TestsL() + { + //__UHEAP_MARK; + for(TInt loop=0;loop 0) + { // increment the RTest number XXX + iConductor.iTest.Next(_L("--- Next Error case ---")); + + } + + TOomFailureModes mode=(TOomFailureModes)loop; + switch(mode) + { + case KOomFailNormal: // RTest 001.01 + iConductor.iTest.Start(_L("===Test Out Of Memory===")); + + break; + case KOomFailFileServerGeneral: // RTest 002.01 + iConductor.iTest.Start(_L("===Test File server general failure===")); + + break; + case KOomFailFileServerOom: // RTest 003.01 + iConductor.iTest.Start(_L("===Test File server Oom failure===")); + + break; + case KOomFailContactServer: // RTest 004.01 + iConductor.iTest.Start(_L("===Test Contact Server Oom failure===")); + + break; + default:; + } + User::LeaveIfError(TheFs.Connect()); + + //OOM TEST VIEWS// + DoOomTestL(new(ELeave) COomLocalView(this, iDb, NULL), mode); //Pass + DoOomTestL(new(ELeave) COomLocalView(this, iDb, NULL, KSortPlugin), mode); //Pass + DoOomTestL(new(ELeave) COomRemoteView(this, iDb, NULL), mode); //Pass + DoOomTestL(new(ELeave) COomRemoteView(this, iDb, NULL, KSortPlugin), mode); //Pass + + if(iLocalView) + { + for(TInt ii = 0; ii < iLocalView->CountL(); ++ii) + { + const CViewContact& temp = iLocalView->ContactAtL(ii); + } + } + + DoOomTestL(new(ELeave) COomFilteredView(this, iDb, iLocalView), mode);//Pass + DoOomTestL(new(ELeave) COomSubView(this, iDb, iLocalView), mode); //Pass + DoOomTestL(new(ELeave) COomSubView(this, iDb, iRemoteView), mode); //Pass + DoOomTestL(new(ELeave) COomGroupView(this, iDb, iLocalView, iGroupOne), mode); //Pass + DoOomTestL(new(ELeave) COomMatchingCriteria(this, iDb, iLocalView), mode); + DoOomTestL(new(ELeave) COomMatchingCriteria(this, iDb, iRemoteView), mode); + // + iConductor.iTest(TheFs.ResourceCount()==0); + TheFs.Close(); + iConductor.iTest.End(); + } + //__UHEAP_MARKEND; + return(ETrue); + } + + +// +// COomLocalView +// + +void COomLocalView::HandleContactViewEvent(const CContactViewBase& aView, const TContactViewEvent& /*aEvent*/) + { + if(&aView == iLocalView) + { + CActiveScheduler::Stop(); + } + } + + +void COomLocalView::PreFailL() + { + iSortOrder.AppendL(KUidContactFieldGivenName); + iSortOrder.AppendL(KUidContactFieldFamilyName); + iSortOrder.AppendL(KUidContactFieldCompanyName); + } + +void COomLocalView::FailL() + { + TInt32 viewPrefs=0; + viewPrefs|=EIgnoreUnSorted; + if(iSortPluginName.Length() == 0) + { + iLocalView=CContactLocalView::NewL(*this,*iDb,iSortOrder,TContactViewPreferences(viewPrefs)); + } + else + { + iLocalView=CContactLocalView::NewL(*this,*iDb,iSortOrder,TContactViewPreferences(viewPrefs),iSortPluginName); + } + CActiveScheduler::Start(); + iLocalView->Close(*this); + ClearEventQueueL(); + } + +void COomLocalView::ClearUp() + { + iSortOrder.Close(); + } + + + +// +// COomRemoteView +// + +void COomRemoteView::HandleContactViewEvent(const CContactViewBase& /*aView*/,const TContactViewEvent& /*aEvent*/) + { + CActiveScheduler::Stop(); + } + +void COomRemoteView::PreFailL() + { + iSortOrder.AppendL(KUidContactFieldGivenName); + iSortOrder.AppendL(KUidContactFieldFamilyName); + iSortOrder.AppendL(KUidContactFieldCompanyName); + } + +void COomRemoteView::FailL() + { + TInt32 viewPrefs=0; + viewPrefs|=EIgnoreUnSorted; + if(iSortPluginName.Length() == 0) + { + iRemoteView=CContactRemoteView::NewL(*this,*iDb,iSortOrder,TContactViewPreferences(viewPrefs)); + } + else + { + iRemoteView=CContactRemoteView::NewL(*this,*iDb,iSortOrder,TContactViewPreferences(viewPrefs),iSortPluginName); + } + CActiveScheduler::Start(); + iOomTest->Conductor().iTest(iRemoteView->Close(*this)); + ClearEventQueueL(); + } + +void COomRemoteView::ClearUp() + { + iSortOrder.Close(); + } + +// +// COomSubView +// +void COomSubView::HandleContactViewEvent(const CContactViewBase& /*aView*/, const TContactViewEvent& /*aEvent*/) + { + CActiveScheduler::Stop(); + } + +void COomSubView::PreFailL() + { + } + +void COomSubView::FailL() + { + iSubViewAbc=CContactSubView::NewL(*this,*iDb,*iUnderlyingView,_L(">=a"),_L("Close(*this); + ClearEventQueueL(); + } + +TBool COomSubView::Skip(TInt /*aCount*/, TOomFailureModes /*aMode*/) const + { + return EFalse; + } + +void COomSubView::ClearUp() + {} + +// COomFilteredView +// +void COomFilteredView::HandleContactViewEvent(const CContactViewBase& /*aView*/,const TContactViewEvent& /*aEvent*/) + { + CActiveScheduler::Stop(); + } + +void COomFilteredView::PreFailL() + { + } + +void COomFilteredView::FailL() + { + TInt filter=0; + filter|=CContactDatabase::EPhonable; + iPhonableFilterView=CContactFilteredView::NewL(*this,*iDb,*iUnderlyingView,filter); + CActiveScheduler::Start(); + iPhonableFilterView->Close(*this); + ClearEventQueueL(); + } + +void COomFilteredView::ClearUp() + {} + +// COomGroupView +// + +void COomGroupView::HandleContactViewEvent(const CContactViewBase& /*aView*/,const TContactViewEvent& /*aEvent*/) + { + if(iAsStarted) + { + CActiveScheduler::Stop(); + iAsStarted=EFalse; + } + } + +void COomGroupView::PreFailL() + { + } + +void COomGroupView::FailL() + { + iGroupView=CContactGroupView::NewL(*iDb,*iUnderlyingView,*this,iGroupOne->Id(),CContactGroupView::EShowContactsInGroup); + iAsStarted=ETrue; + CActiveScheduler::Start(); + iGroupView->Close(*this); + ClearEventQueueL(); + } + +void COomGroupView::ClearUp() + { + if(iAsStarted) + { + CActiveScheduler::Stop(); + iAsStarted=EFalse; + } + } + +TBool COomGroupView::Skip(TInt aCount, TOomFailureModes aMode) const + { + if(aMode==KOomFailNormal)return aCount == 5; + return EFalse; + } + + +void COomMatchingCriteria::CleanupContactArray(TAny* aArray) + { + RPointerArray* array=REINTERPRET_CAST(RPointerArray*,aArray); + if (array) + array->ResetAndDestroy(); + array->Close(); + } + +void COomMatchingCriteria::FailL() + { + _LIT(KFindString1,"C"); + CPtrCArray* array =new(ELeave)CPtrC16Array(1); + CleanupStack::PushL(array); + array->AppendL(KFindString1()); + + RPointerArray contactArray; + CleanupStack::PushL(TCleanupItem(COomMatchingCriteria::CleanupContactArray,&contactArray)); + + iUnderlyingView->ContactsMatchingCriteriaL(*array, contactArray); + + CleanupStack::PopAndDestroy(2); + } + +void COomMatchingCriteria::HandleContactViewEvent(const CContactViewBase& /*aView*/,const TContactViewEvent& /*aEvent*/) + { + CActiveScheduler::Stop(); + } + + + +// +// Main. +// + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + RProcess().SetPriority(EPriorityBackground); + CActiveScheduler* scheduler=new CActiveScheduler; + if (scheduler) + { + CActiveScheduler::Install(scheduler); + CTrapCleanup* cleanup=CTrapCleanup::New(); + if (cleanup) + { + CTestConductor* tester=NULL; + TRAPD(err,tester=CTestConductor::NewL()); + __ASSERT_ALWAYS(err==KErrNone,User::Invariant()); + delete tester; + delete cleanup; + } + delete scheduler; + } + __UHEAP_MARKEND; + return KErrNone; + }