diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/t_view2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/t_view2.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,1791 @@ +// 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_view2.h" +#include "T_UTILS.H" +#include + +//#define VERBOSE_LOGGING + +// Test Macro +LOCAL_D RTest test(_L("t_view2")); + +// +// Constants. +// + +_LIT(KTestName,"@SYMTESTCaseID:PIM-T-VIEW2-0001 t_view2"); +_LIT(KLogFileName,"t_view2.log"); + +_LIT(KDbFileName,"c:t_view2.cdb"); + +_LIT(KLocalViewName,"LocalView"); +_LIT(KRemoteViewName,"RemoteView"); +_LIT(KTextDefSeparator,""); +_LIT8(KUnicodeLineEnd,"\x0D\x00\x0a\x00"); +_LIT(KWhiteSpaces, " "); +const TInt KNumberOfUnsortableContacts=10; + +// test files +_LIT(KContactsFile1, "z:\\t_view2\\t_view2_initial_contacts.txt"); +_LIT(KContactsFile2, "z:\\t_view2\\t_view2_more_contacts_1.txt"); +_LIT(KContactsFile3, "z:\\t_view2\\t_view2_more_contacts_2.txt"); + +LOCAL_C void CleanupContactArray(TAny* aArray) + { + RPointerArray* array=REINTERPRET_CAST(RPointerArray*,aArray); + if (array) + array->ResetAndDestroy(); + array->Close(); + } + +// +// CTestConductor. +// + +CTestConductor* CTestConductor::NewL() + { + CTestConductor* self=new(ELeave) CTestConductor(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CTestConductor::~CTestConductor() + { + iLocalView->Close(*this); + iNamedLocalView->Close(*this); + iRemoteView_1->Close(*this); + iRemoteView_2->Close(*this); + iNamedRemoteView_1->Close(*this); + iNamedRemoteView_2->Close(*this); + iLocalViewWithViewPreferences->Close(*this); + iSubViewLessThanA->Close(*this); + iSubViewAbc->Close(*this); + iSubViewDef->Close(*this); + iSubViewGhi->Close(*this); + iSubViewJkl->Close(*this); + iSubViewGreaterThanOrEqualToM->Close(*this); + iConcatenatedView->Close(*this); + iSortOrder_1.Close(); + iSortOrder_2.Close(); + iSortOrder_3.Close(); + iSortOrder_4.Close(); + iLocalFindView->Close(*this); + iFreshLocalView->Close(*this); + + iRemoteFindView->Close(*this); + + if(iFindDesArray) + { + iFindDesArray->Reset(); + delete iFindDesArray; + } + + iFindDesArray2->Reset(); + delete iFindDesArray2; + + delete iUnsortableAdder; + delete iRandomGenerator; + delete iSortChecker; + delete iViewCreator; + delete iContactAdder; + delete iContactRemover; + delete iViewExerciser; + delete iSortOrderChanger; + delete iOwnCardRemover; + delete iOwnCardModifier; + delete iLog; + delete iDb; + iTestIds.Reset(); + iTestIds.Close(); + + TRAP_IGNORE(CContactDatabase::DeleteDatabaseL(KDbFileName)); + iFs.Delete(KLogFileName()); + iFs.RmDir(KLogFileName()); + iFs.Close(); + } + +CTestConductor::CTestConductor() : CActive(EPriorityIdle),iCurrentTestNumber(-1) + { + CActiveScheduler::Add(this); + } + +void CTestConductor::ConstructL() + { + iSortOrder_1.AppendL(KUidContactFieldGivenName); + iSortOrder_1.AppendL(KUidContactFieldFamilyName); + iSortOrder_1.AppendL(KUidContactFieldCompanyName); + + iSortOrder_2.AppendL(KUidContactFieldFamilyName); + iSortOrder_2.AppendL(KUidContactFieldGivenName); + iSortOrder_2.AppendL(KUidContactFieldCompanyName); + + iSortOrder_3.AppendL(KUidContactFieldGivenName); + iSortOrder_3.AppendL(KUidContactFieldFamilyName); + iSortOrder_3.AppendL(KUidContactFieldEMail); + iSortOrder_3.AppendL(KUidContactFieldCompanyName); + iSortOrder_3.AppendL(KUidContactFieldPhoneNumber); + + iSortOrder_4.AppendL(KUidContactFieldGivenName); + + User::LeaveIfError(iFs.Connect()); + iFs.MkDirAll(KLogFileName()); + iLog=CLog::NewL(test,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); + iOwnCardRemover = new(ELeave) CContactOwnCardRemover(*this); + iOwnCardModifier = new(ELeave) CContactOwnCardModifier(*this); + + iRandomGenerator=CRandomContactGenerator::NewL(); + iRandomGenerator->SetDbL(*iDb); + + + NextTest(); + CActiveScheduler::Start(); + // error from active object? + User::LeaveIfError(iTestError); + test.Printf(_L("\n")); + } + +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(KContactsFile1,1); + break; + case EExerciseLocalView_1: + iLog->LogLine(_L("=== Exercise local view (1)")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iLocalView); + iLog->LogLine(_L("=== Profiling local view Contact At()(1)")); + iViewExerciser->ProfileViewL(*iLocalView); + break; + case ECreateLocalNamedView: + iLog->LogLine(_L("=== Create named local view")); + iCurrentTestObject=iViewCreator; + iNamedLocalView=iViewCreator->CreateNamedLocalViewL(KLocalViewName,iSortOrder_1); + break; + case EExerciseLocalNamedView_1: + iLog->LogLine(_L("=== Exercise named local view (1)")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iNamedLocalView); + break; + case EAddMoreContacts_1: + iLog->LogLine(_L("=== Add more contacts (1)")); + iCurrentTestObject=iContactAdder; + iContactAdder->AddContactsL(KContactsFile2,2); + break; + case EExerciseLocalView_2: + iLog->LogLine(_L("=== Exercise local view (2)")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iLocalView); + break; + case EExerciseLocalNamedView_2: + iLog->LogLine(_L("=== Exercise named local view (2)")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iNamedLocalView); + break; + case ECreateRemoteView1: + iLog->LogLine(_L("=== Create remote view")); + iCurrentTestObject=iViewCreator; + iRemoteView_1=iViewCreator->CreateRemoteViewL(iSortOrder_1); + break; + case EExerciseRemoteView1: + { + iLog->LogLine(_L("=== Exercise remote view")); + iCurrentTestObject=iViewExerciser; + + iFindDesArray =new(ELeave)CPtrC16Array(1); + iFindDesArray->AppendL(_L("Administrator")); + iLocalFindView= CContactFindView::NewL(*iDb,*iLocalView,*this,iFindDesArray); + iRemoteFindView = CContactFindView::NewL(*iDb,*iRemoteView_1,*this,iFindDesArray); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iRemoteView_1); + iLog->LogLine(_L("=== Profiling Remote view Contact At()")); + iViewExerciser->ProfileViewL(*iRemoteView_1); + } + break; + case ECreateRemoteView2: + iLog->LogLine(_L("=== Create remote view - view of same sort already exists")); + iCurrentTestObject=iViewCreator; + iRemoteView_2=iViewCreator->CreateRemoteViewL(iSortOrder_1); + break; + case EExerciseRemoteView2: + { + iLog->LogLine(_L("=== Exercise remote view - view of same sort already exists")); + iFindDesArray2 =new(ELeave)CPtrC16Array(2); + iFindDesArray2->AppendL(_L("Administrator")); + iFindDesArray2->AppendL(_L("Notes")); + iFindDesArray->Reset(); + delete iFindDesArray; + iLocalFindView->RefineFindViewL(iFindDesArray2); + iRemoteFindView->RefineFindViewL(iFindDesArray2); + iFindDesArray =new(ELeave)CPtrC16Array(1); + iFindDesArray->AppendL(_L("Administrator")); + iLocalFindView->RefineFindViewL(iFindDesArray); + iRemoteFindView->RefineFindViewL(iFindDesArray); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iRemoteView_2); + } + break; + case ECreateNamedRemoteView1: + iLog->LogLine(_L("=== Create named remote view")); + iCurrentTestObject=iViewCreator; + iNamedRemoteView_1=iViewCreator->CreateNamedRemoteViewL(KRemoteViewName,iSortOrder_1); + break; + case EExerciseNamedRemoteView1: + iLog->LogLine(_L("=== Exercise named remote view")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iNamedRemoteView_1); + break; + case ECreateNamedRemoteView2: + iLog->LogLine(_L("=== Create named remote view - view of same name already exists")); + iCurrentTestObject=iViewCreator; + iNamedRemoteView_2=iViewCreator->CreateNamedRemoteViewL(KRemoteViewName,iSortOrder_1); + break; + case EExerciseNamedRemoteView2: + iLog->LogLine(_L("=== Exercise named remote view - view of same name already exists")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iNamedRemoteView_2); + break; + case ECreateSubViewLessThanA: + iLog->LogLine(_L("=== Create \"less than A\" subview")); + iCurrentTestObject=iViewCreator; + iSubViewLessThanA=iViewCreator->CreateSubViewL(*iNamedRemoteView_1,_L("LogLine(_L("=== Exercise \"less than A\" subview")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseLowSubViewL(CSortChecker::EFirstNameLastName,*iSubViewLessThanA,_L("a")); + break; + case ECreateSubViewAbc: + iLog->LogLine(_L("=== Create \"ABC\" subview")); + iCurrentTestObject=iViewCreator; + iSubViewAbc=iViewCreator->CreateSubViewL(*iNamedRemoteView_1,_L(">=a"),_L("LogLine(_L("=== Exercise \"ABC\" subview")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseSubViewL(CSortChecker::EFirstNameLastName,*iSubViewAbc,_L("a"),_L("d")); + break; + case ECreateSubViewDef: + iLog->LogLine(_L("=== Create \"DEF\" subview")); + iCurrentTestObject=iViewCreator; + iSubViewDef=iViewCreator->CreateSubViewL(*iNamedRemoteView_1,_L(">=d"),_L("LogLine(_L("=== Exercise \"DEF\" subview")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseSubViewL(CSortChecker::EFirstNameLastName,*iSubViewDef,_L("d"),_L("g")); + break; + case ECreateSubViewGhi: + iLog->LogLine(_L("=== Create \"GHI\" subview")); + iCurrentTestObject=iViewCreator; + iSubViewGhi=iViewCreator->CreateSubViewL(*iNamedRemoteView_1,_L(">=g"),_L("LogLine(_L("=== Exercise \"GHI\" subview")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseSubViewL(CSortChecker::EFirstNameLastName,*iSubViewGhi,_L("g"),_L("j")); + break; + case ECreateSubViewJkl: + iLog->LogLine(_L("=== Create \"JKL\" subview")); + iCurrentTestObject=iViewCreator; + iSubViewJkl=iViewCreator->CreateSubViewL(*iNamedRemoteView_1,_L(">=j"),_L("LogLine(_L("=== Exercise \"JKL\" subview")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseSubViewL(CSortChecker::EFirstNameLastName,*iSubViewJkl,_L("j"),_L("m")); + break; + case ECreateSubViewGreaterThanOrEqualToM: + iLog->LogLine(_L("=== Create \"greater than M\" subview")); + iCurrentTestObject=iViewCreator; + iSubViewGreaterThanOrEqualToM=iViewCreator->CreateSubViewL(*iNamedRemoteView_1,_L(">=m")); + break; + case EExerciseSubViewGreaterThanOrEqualToM: + iLog->LogLine(_L("=== Exercise \"greater than M\" subview")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseHighSubViewL(CSortChecker::EFirstNameLastName,*iSubViewGreaterThanOrEqualToM,_L("m")); + break; + case ECreateConcatenatedView: + iLog->LogLine(_L("=== Create concatenated view of all the subviews")); + { + RPointerArray views; + User::LeaveIfError(views.Append(iSubViewLessThanA)); + User::LeaveIfError(views.Append(iSubViewAbc)); + User::LeaveIfError(views.Append(iSubViewDef)); + User::LeaveIfError(views.Append(iSubViewGhi)); + User::LeaveIfError(views.Append(iSubViewJkl)); + User::LeaveIfError(views.Append(iSubViewGreaterThanOrEqualToM)); + iCurrentTestObject=iViewCreator; + iConcatenatedView=iViewCreator->CreateConcatenatedViewL(views); + views.Close(); + } + break; + case EExerciseConcatenatedView: + iLog->LogLine(_L("=== Exercise concatenated view of all the subviews")); + iCurrentTestObject=iViewExerciser; + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iConcatenatedView); + break; + case EChangeSortOrder1: + iLog->LogLine(_L("=== Change sort order (1) of underlying named remoted view")); + iCurrentTestObject=iSortOrderChanger; + iSortOrderChanger->ChangeSortOrderL(iSortOrder_3,*iNamedRemoteView_1,14); + break; + case EChangeSortOrder2: + iLog->LogLine(_L("=== Change sort order (2) of underlying named remoted view")); + iCurrentTestObject=iSortOrderChanger; + iSortOrderChanger->ChangeSortOrderL(iSortOrder_4,*iNamedRemoteView_1,14); + break; + case EChangeSortOrder3: + iLog->LogLine(_L("=== Change sort order (3) of underlying named remoted view")); + iCurrentTestObject=iSortOrderChanger; + iSortOrderChanger->ChangeSortOrderL(iSortOrder_2,*iNamedRemoteView_1,14); + break; + case EExerciseAllAffectedViews: + iLog->LogLine(_L("=== Exercise all views affected by sort order change")); + iViewExerciser->QueueNextTestWhenComplete(EFalse); + iLog->LogLine(_L("==== Exercise named remote view")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iNamedRemoteView_1); + iLog->LogLine(_L("==== Exercise named remote view - view of same name already exists")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iNamedRemoteView_2); + iLog->LogLine(_L("==== Exercise \"less than A\" subview")); + iViewExerciser->ExerciseLowSubViewL(CSortChecker::ELastNameFirstName,*iSubViewLessThanA,_L("a")); + iLog->LogLine(_L("==== Exercise \"ABC\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewAbc,_L("a"),_L("d")); + iLog->LogLine(_L("==== Exercise \"DEF\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewDef,_L("d"),_L("g")); + iLog->LogLine(_L("==== Exercise \"GHI\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewGhi,_L("g"),_L("j")); + iLog->LogLine(_L("==== Exercise \"JKL\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewJkl,_L("j"),_L("m")); + iLog->LogLine(_L("==== Exercise \"greater than M\" subview")); + iViewExerciser->ExerciseHighSubViewL(CSortChecker::ELastNameFirstName,*iSubViewGreaterThanOrEqualToM,_L("m")); + iLog->LogLine(_L("==== Exercise concatenated view of all the subviews")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iConcatenatedView); + NextTest(); + break; + case EAddMoreContacts_2: + iLog->LogLine(_L("=== Add more contacts (2)")); + iCurrentTestObject=iContactAdder; + iContactAdder->AddContactsL(KContactsFile3,18); + break; + case EExerciseAllViews_1: + iLog->LogLine(_L("=== Exercise all views (1)")); + iLog->LogLine(_L("==== Exercise local view (2)")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iLocalView); + iLog->LogLine(_L("==== Exercise named local view (2)")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iNamedLocalView); + iLog->LogLine(_L("==== Exercise remote view")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iRemoteView_1); + iLog->LogLine(_L("==== Exercise remote view - view of same sort already exists")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iRemoteView_2); + iLog->LogLine(_L("==== Exercise named remote view")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iNamedRemoteView_1); + iLog->LogLine(_L("==== Exercise named remote view - view of same name already exists")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iNamedRemoteView_2); + iLog->LogLine(_L("==== Exercise \"less than A\" subview")); + iViewExerciser->ExerciseLowSubViewL(CSortChecker::ELastNameFirstName,*iSubViewLessThanA,_L("a")); + iLog->LogLine(_L("==== Exercise \"ABC\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewAbc,_L("a"),_L("d")); + iLog->LogLine(_L("==== Exercise \"DEF\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewDef,_L("d"),_L("g")); + iLog->LogLine(_L("==== Exercise \"GHI\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewGhi,_L("g"),_L("j")); + iLog->LogLine(_L("==== Exercise \"JKL\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewJkl,_L("j"),_L("m")); + iLog->LogLine(_L("==== Exercise \"greater than M\" subview")); + iViewExerciser->ExerciseHighSubViewL(CSortChecker::ELastNameFirstName,*iSubViewGreaterThanOrEqualToM,_L("m")); + iLog->LogLine(_L("==== Exercise concatenated view of all the subviews")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iConcatenatedView); + NextTest(); + break; + case ERemoveSomeContacts: + iLog->LogLine(_L("=== Remove some contacts")); + iCurrentTestObject=iContactRemover; + //iContactRemover->RemoveContactsL(KContactsFile2,18); + NextTest(); + break; + case EExerciseAllViews_2: + iLog->LogLine(_L("=== Exercise all views (2)")); + iLog->LogLine(_L("==== Exercise local view (3)")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iLocalView); + iLog->LogLine(_L("==== Exercise named local view (3)")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iNamedLocalView); + iLog->LogLine(_L("==== Exercise remote view")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iRemoteView_1); + iLog->LogLine(_L("==== Exercise remote view - view of same sort already exists")); + iViewExerciser->ExerciseViewL(CSortChecker::EFirstNameLastName,*iRemoteView_2); + iLog->LogLine(_L("==== Exercise named remote view")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iNamedRemoteView_1); + iLog->LogLine(_L("==== Exercise named remote view - view of same name already exists")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iNamedRemoteView_2); + iLog->LogLine(_L("==== Exercise \"less than A\" subview")); + iViewExerciser->ExerciseLowSubViewL(CSortChecker::ELastNameFirstName,*iSubViewLessThanA,_L("a")); + iLog->LogLine(_L("==== Exercise \"ABC\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewAbc,_L("a"),_L("d")); + iLog->LogLine(_L("==== Exercise \"DEF\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewDef,_L("d"),_L("g")); + iLog->LogLine(_L("==== Exercise \"GHI\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewGhi,_L("g"),_L("j")); + iLog->LogLine(_L("==== Exercise \"JKL\" subview")); + iViewExerciser->ExerciseSubViewL(CSortChecker::ELastNameFirstName,*iSubViewJkl,_L("j"),_L("m")); + iLog->LogLine(_L("==== Exercise \"greater than M\" subview")); + iViewExerciser->ExerciseHighSubViewL(CSortChecker::ELastNameFirstName,*iSubViewGreaterThanOrEqualToM,_L("m")); + iLog->LogLine(_L("==== Exercise concatenated view of all the subviews")); + iViewExerciser->ExerciseViewL(CSortChecker::ELastNameFirstName,*iConcatenatedView); + NextTest(); + break; + case EAllViewsOutOfBoundsAccess: + { + //Views depend on their underlying views being in a good state, however + //as some base views are potentially in other processes they must be resistant + //to out of date views accessesing out of bound members, views, should not + //panic but should leave with KErrNotFound; + //local view + TInt err=0; + iLog->LogLine(_L("=== Test views for out of bounds access")); + TInt outCount = iLocalView->CountL(); + TRAP(err,iLocalView->AtL(outCount)); + test(err==KErrNotFound); + TRAP(err,iLocalView->ContactAtL(outCount)); + test(err==KErrNotFound); + //Remote View + outCount = iRemoteView_1->CountL(); + TRAP(err,iRemoteView_1->AtL(outCount)); + test(err==KErrNotFound); + TRAP(err,iRemoteView_1->ContactAtL(outCount)); + test(err==KErrNotFound); + //Sub View + outCount = iSubViewAbc->CountL(); + TRAP(err,iSubViewAbc->AtL(outCount)); + test(err==KErrNotFound); + TRAP(err,iSubViewAbc->ContactAtL(outCount)); + test(err==KErrNotFound); + //Sub View + outCount = iConcatenatedView->CountL(); + TRAP(err,iConcatenatedView->AtL(outCount)); + test(err==KErrNotFound); + TRAP(err,iConcatenatedView->ContactAtL(outCount)); + test(err==KErrNotFound); + //Local Find View View + outCount = iLocalFindView->CountL(); + TRAP(err,iLocalFindView->AtL(outCount)); + test(err==KErrNotFound); + TRAP(err,iLocalFindView->ContactAtL(outCount)); + test(err==KErrNotFound); + //Local Find View View + outCount = iRemoteFindView->CountL(); + TRAP(err,iRemoteFindView->AtL(outCount)); + test(err==KErrNotFound); + TRAP(err,iRemoteFindView->ContactAtL(outCount)); + test(err==KErrNotFound); + NextTest(); + } + break; + case ECreateLocalViewWithUnsortableAtEnd: + { + iLog->LogLine(_L("=== Create local view with Unsortable Contacts at End")); + iCurrentTestObject=iViewCreator; + TInt32 viewPrefs=0; + viewPrefs|=EUnSortedAtEnd; + iLocalViewWithViewPreferences=iViewCreator->CreateLocalViewL(iSortOrder_1,TContactViewPreferences(viewPrefs)); + } + break; + case EAddUnsortableContacts: + { + iLog->LogLine(_L("=== Add Contacts with no sortable fields only phone numbers")); + iUnsortableAdder = CUnsortableContactAdder::NewL(*this,*iLocalViewWithViewPreferences); + iCurrentTestObject=iUnsortableAdder;//will recieve notificaitons + TInt32 viewPrefs=0; + viewPrefs|=EUnSortedAtEnd; + iUnsortableAdder->AddContactsL(KNumberOfUnsortableContacts,TContactViewPreferences(viewPrefs)); + } + break; + case EExerciseLocalViewWithUnsortableAtEnd: + { + iLog->LogLine(_L("=== Exercies Views for view preferences")); + ExerciseViewPreferencesL(iLocalViewWithViewPreferences,TContactViewPreferences(EUnSortedAtEnd)); + ExerciseViewPreferencesL(iLocalView,TContactViewPreferences(EUnSortedAtBeginning)); + ExerciseViewPreferencesL(iRemoteView_1,TContactViewPreferences(EUnSortedAtBeginning)); + NextTest(); + } + break; + case EAddFreshLocalView: + { + iLog->LogLine(_L("=== Create new view with Unsortable Contacts at End")); + iCurrentTestObject=iViewCreator; + TInt32 viewPrefs=0; + viewPrefs|=EUnSortedAtEnd; + viewPrefs|=ESingleWhiteSpaceIsEmptyField; + iFreshLocalView=iViewCreator->CreateLocalViewL(iSortOrder_1,TContactViewPreferences(viewPrefs)); + } + break; + case EExerciseFreshLocalView: + { + iLog->LogLine(_L("=== Exercies new view for view preferences")); + ExerciseViewPreferencesL(iFreshLocalView,TContactViewPreferences(EUnSortedAtEnd)); + NextTest(); + } + break; + case EAddSomeMoreUnsortableContacts: + { + iLog->LogLine(_L("=== Add more Contacts with no sortable fields only phone numbers")); + iCurrentTestObject=iUnsortableAdder;//will recieve notificaitons + TInt32 viewPrefs=0; + viewPrefs|=EUnSortedAtEnd;//doesn't matter if Atbegining either same for adder. + iUnsortableAdder->AddContactsL(KNumberOfUnsortableContacts,TContactViewPreferences(viewPrefs)); + } + break; + case EExerciseViewForPrefsAgain: + { + iLog->LogLine(_L("=== Exercies Views for view preferences again after updates")); + ExerciseViewPreferencesL(iLocalViewWithViewPreferences,TContactViewPreferences(EUnSortedAtEnd)); + ExerciseViewPreferencesL(iLocalView,TContactViewPreferences(EUnSortedAtBeginning)); + ExerciseViewPreferencesL(iRemoteView_1,TContactViewPreferences(EUnSortedAtBeginning)); + ExerciseViewPreferencesL(iFreshLocalView,TContactViewPreferences(EUnSortedAtEnd)); + NextTest(); + } + break; + case EAddWhiteSpaceContacts: + { + iLog->LogLine(_L("=== Add more Contacts with white space in some sort fields")); + iCurrentTestObject=iUnsortableAdder;//will recieve notificaitons + TInt32 viewPrefs=0; + viewPrefs|=ESingleWhiteSpaceIsEmptyField;//doesn't matter if Atbegining either same for adder. + iTestIds.Reset(); + iUnsortableAdder->AddContactsL(KNumberOfUnsortableContacts,TContactViewPreferences(viewPrefs)); + } + break; + case EExerciseWhiteSpaceContacts: + { + //iFreshLocalView + ExerciseViewPreferencesL(iFreshLocalView,TContactViewPreferences(ESingleWhiteSpaceIsEmptyField)); + NextTest(); + } + break; + case ERemoveOwnCardContact: + { + iLog->LogLine(_L("=== Remove Own Card contact")); + iCurrentTestObject=iOwnCardRemover; + iOwnCardRemover->RemoveOwnCardL(*iFreshLocalView); + } + break; + case (EModifyOwnCardContact): + { + NextTest(); + break; + /* + iLog->LogLine(_L("=== Modify Own Card contact")); + iCurrentTestObject=iOwnCardModifier; + iOwnCardModifier->ModifyOwnCardL(*iFreshLocalView); + break; + */ + } + case ESearchForEuroChar: + { + iLog->LogLine(_L("=== Search for a Euro character")); + _LIT(KFindString1,"\x20a0"); + CPtrCArray* array =new(ELeave)CPtrC16Array(1); + CleanupStack::PushL(array); + array->AppendL(KFindString1()); + RPointerArray contactArray; + CleanupStack::PushL(TCleanupItem(CleanupContactArray,&contactArray)); + iRemoteView_1->ContactsMatchingCriteriaL(*array, contactArray); + CleanupStack::PopAndDestroy(2, array); + NextTest(); + } + break; + case ENumTests: + { + RThread thread; + test(thread.RequestCount()==0); + CActiveScheduler::Stop(); + } + break; + default: + ASSERT(EFalse); + break; + } + } + +void CTestConductor::HandleContactViewEvent(const CContactViewBase& aView,const TContactViewEvent& aEvent) + { + if(&aView == iRemoteFindView) + { + return; + } + + if(&aView == iLocalFindView) + { + return; + } + TRAPD(err, iCurrentTestObject->HandleNotificationL(aView,aEvent) ); + test(err == KErrNone); + } + +void CTestConductor::DoCancel() + { + } + + +TInt CTestConductor::RunError(TInt aError) + { + iTestError = aError; + + // quick code to report the test step and leave error + // allows test to exit nicely, rather than Panic + switch (iCurrentTestNumber) + { + case ECreateLocalView: test.Printf(_L("RunL left in step CreateLocalView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddInitialContacts: test.Printf(_L("RunL left in step AddInitialContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseLocalView_1: test.Printf(_L("RunL left in step ExerciseLocalView_1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateLocalNamedView: test.Printf(_L("RunL left in step CreateLocalNamedView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseLocalNamedView_1: test.Printf(_L("RunL left in step ExerciseLocalNamedView_1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddMoreContacts_1: test.Printf(_L("RunL left in step AddMoreContacts_1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseLocalView_2: test.Printf(_L("RunL left in step ExerciseLocalView_2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseLocalNamedView_2: test.Printf(_L("RunL left in step ExerciseLocalNamedView_2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateRemoteView1: test.Printf(_L("RunL left in step CreateRemoteView1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseRemoteView1: test.Printf(_L("RunL left in step ExerciseRemoteView1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateRemoteView2: test.Printf(_L("RunL left in step CreateRemoteView2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseRemoteView2: test.Printf(_L("RunL left in step ExerciseRemoteView2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateNamedRemoteView1: test.Printf(_L("RunL left in step CreateNamedRemoteView1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseNamedRemoteView1: test.Printf(_L("RunL left in step ExerciseNamedRemoteView1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateNamedRemoteView2: test.Printf(_L("RunL left in step CreateNamedRemoteView2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseNamedRemoteView2: test.Printf(_L("RunL left in step ExerciseNamedRemoteView2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateSubViewLessThanA: test.Printf(_L("RunL left in step CreateSubViewLessThanA (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseSubViewLessThanA: test.Printf(_L("RunL left in step ExerciseSubViewLessThanA (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateSubViewAbc: test.Printf(_L("RunL left in step CreateSubViewAbc (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseSubViewAbc: test.Printf(_L("RunL left in step ExerciseSubViewAbc (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateSubViewDef: test.Printf(_L("RunL left in step CreateSubViewDef (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseSubViewDef: test.Printf(_L("RunL left in step ExerciseSubViewDef (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateSubViewGhi: test.Printf(_L("RunL left in step CreateSubViewGhi (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseSubViewGhi: test.Printf(_L("RunL left in step ExerciseSubViewGhi (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateSubViewJkl: test.Printf(_L("RunL left in step CreateSubViewJkl (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseSubViewJkl: test.Printf(_L("RunL left in step ExerciseSubViewJkl (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateSubViewGreaterThanOrEqualToM: test.Printf(_L("RunL left in step CreateSubViewGreaterThanOrEqualToM (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseSubViewGreaterThanOrEqualToM: test.Printf(_L("RunL left in step ExerciseSubViewGreaterThanOrEqualToM (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateConcatenatedView: test.Printf(_L("RunL left in step CreateConcatenatedView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseConcatenatedView: test.Printf(_L("RunL left in step ExerciseConcatenatedView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EChangeSortOrder1: test.Printf(_L("RunL left in step ChangeSortOrder1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EChangeSortOrder2: test.Printf(_L("RunL left in step ChangeSortOrder2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EChangeSortOrder3: test.Printf(_L("RunL left in step ChangeSortOrder3 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseAllAffectedViews: test.Printf(_L("RunL left in step ExerciseAllAffectedViews (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddMoreContacts_2: test.Printf(_L("RunL left in step AddMoreContacts_2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseAllViews_1: test.Printf(_L("RunL left in step ExerciseAllViews_1 (%i) with error %i"), iCurrentTestNumber, aError); break; + case ERemoveSomeContacts: test.Printf(_L("RunL left in step RemoveSomeContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseAllViews_2: test.Printf(_L("RunL left in step ExerciseAllViews_2 (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAllViewsOutOfBoundsAccess: test.Printf(_L("RunL left in step AllViewsOutOfBoundsAccess (%i) with error %i"), iCurrentTestNumber, aError); break; + case ECreateLocalViewWithUnsortableAtEnd: test.Printf(_L("RunL left in step CreateLocalViewWithUnsortableAtEnd (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddUnsortableContacts: test.Printf(_L("RunL left in step AddUnsortableContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseLocalViewWithUnsortableAtEnd: test.Printf(_L("RunL left in step ExerciseLocalViewWithUnsortableAtEnd (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddFreshLocalView: test.Printf(_L("RunL left in step AddFreshLocalView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseFreshLocalView: test.Printf(_L("RunL left in step ExerciseFreshLocalView (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddSomeMoreUnsortableContacts: test.Printf(_L("RunL left in step AddSomeMoreUnsortableContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseViewForPrefsAgain: test.Printf(_L("RunL left in step ExerciseViewForPrefsAgain (%i) with error %i"), iCurrentTestNumber, aError); break; + case EAddWhiteSpaceContacts: test.Printf(_L("RunL left in step AddWhiteSpaceContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case EExerciseWhiteSpaceContacts: test.Printf(_L("RunL left in step ExerciseWhiteSpaceContacts (%i) with error %i"), iCurrentTestNumber, aError); break; + case ERemoveOwnCardContact: test.Printf(_L("RunL left in step RemoveOwnCardContact (%i) with error %i"), iCurrentTestNumber, aError); break; + case EModifyOwnCardContact: test.Printf(_L("RunL left in step ModifyOwnCardContact (%i) with error %i"), iCurrentTestNumber, aError); break; + case ESearchForEuroChar: test.Printf(_L("RunL left in step SearchForEuroChar (%i) with error %i"), iCurrentTestNumber, aError); break; + + case ENumTests: test.Printf(_L("RunL left in step NumTests (%i) with error %i"), iCurrentTestNumber, aError); break; + + default: test.Printf(_L("RunL left in step %i with error %i"), iCurrentTestNumber, aError); break; + } + + // stop test + CActiveScheduler::Stop(); + return KErrNone; + } + + +void CTestConductor::ExerciseViewPreferencesL(const CContactViewBase* aViewToTest,TContactViewPreferences aPrefsToTest) + { + //test the viewpreferences of a view. All views with EunsortedatBegining for example should place, any contact + //without the field specified in a sort to the begining of the main sorted list of contact + TInt normalContacts = aViewToTest->CountL()-iTestIds.Count(); + test(normalContacts>0); + TContactItemId id=KErrNotFound; + TInt index =KErrNotFound; + for(TInt ii=0;iiFindL(iTestIds[ii]); + test(index>=0);//no error code + if(aPrefsToTest&EUnSortedAtBeginning) + { + //should be before 'normal' contacts + test(index=normalContacts);//in the right place + } + //Integrity check + id=aViewToTest->AtL(index); + const CViewContact& contact=aViewToTest->ContactAtL(index); + test(contact.Id()==id); + if(aPrefsToTest&ESingleWhiteSpaceIsEmptyField) + { + //Contact Fields Should not have any white space as a field, _L(" ") + for(TInt zz=0;zzConstructL(); + 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()+1); + TPtr bufPtr(buf->Des()); + bufPtr.Append(aFirstName); + if (aFirstName.Length()) + bufPtr.Append(_L(" ")); + bufPtr.Append(aLastName); + User::LeaveIfError(iSortedFirstLast.Append(buf)); + CleanupStack::Pop(); // buf. + + buf=HBufC::NewLC(aFirstName.Length()+aLastName.Length()+1); + TPtr bufPtr2(buf->Des()); + bufPtr2.Append(aLastName); + if (aLastName.Length()) + bufPtr2.Append(_L(" ")); + 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()+1); + TPtr bufPtr(buf->Des()); + bufPtr.Append(aFirstName); + if (aFirstName.Length()) + bufPtr.Append(_L(" ")); + 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()+1); + TPtr bufPtr2(buf->Des()); + bufPtr2.Append(aLastName); + if (aLastName.Length()) + bufPtr2.Append(_L(" ")); + 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) + { + test(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(CompareWithoutIgnoringSpacesL)); + iSortedLastFirst.Sort(TLinearOrder(CompareWithoutIgnoringSpacesL)); + + 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; +#ifdef VERBOSE_LOGGING + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,sortedList[aIndex]); +#endif + test(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]; +#ifdef VERBOSE_LOGGING + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,name); +#endif + test(name->CompareC(aHighBoundary,3,iCollateMethod)<0); + test(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) + { +#ifdef VERBOSE_LOGGING + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,sortedList[lowIndex+aIndex]); +#endif + test(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]; +#ifdef VERBOSE_LOGGING + iConductor.iLog->LogLineNoEcho(_L("Checking - %S against %S"),&aName,name); +#endif + test(name->CompareC(aHighBoundary,3,iCollateMethod)<0); + test(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) + { + return aFirst.CompareC(aSecond); + } + +TInt CSortChecker::CompareWithoutIgnoringSpacesL(const HBufC& aFirst, const HBufC& aSecond) + { + // In order to sort correctly, we need to recognise spaces, but ignore other punctuation + HBufC* temp1=HBufC::NewLC(aFirst.Length()); + TPtr first(temp1->Des()); + first.Copy(aFirst); + HBufC* temp2=HBufC::NewLC(aSecond.Length()); + TPtr second(temp2->Des()); + second.Copy(aSecond); + + TCollationMethod collateMethod; + collateMethod = *Mem::CollationMethodByIndex(0); + collateMethod.iFlags|=TCollationMethod::EIgnoreNone; + TInt compare=0; + TInt collationLevel=0; + + while (!compare && collationLevel<4) + { + compare=first.CompareC(second,collationLevel,&collateMethod); + ++collationLevel; + } + + CleanupStack::PopAndDestroy(2); + return compare; + } + +// +// 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,TContactViewPreferences aViewPrefs) + { + iView=CContactLocalView::NewL(iConductor,*iConductor.iDb,aSortOrder,aViewPrefs); + return STATIC_CAST(CContactLocalView*,iView); + } + +CContactLocalView* CViewCreator::CreateLocalViewL(const RContactViewSortOrder& aSortOrder) + { + TInt32 viewPrefs=0; + viewPrefs|=EUnSortedAtBeginning; + 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|=EUnSortedAtBeginning; + 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|=EUnSortedAtBeginning; + 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|=EUnSortedAtBeginning; + 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) + { + test(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 iTemplate; + iFile.Close(); + iFs.Close(); + } + +void CContactAdder::AddContactsL(const TDesC& aFileName,TInt aNumViews) + { + TInt err = iFile.Open(iFs,aFileName,EFileShareAny|EFileStreamText); + if (err == KErrNotFound) + { + test.Printf(_L("Contact test data file (\"%S\") is missing from build, ensure exports are built."), &aFileName); + } + User::LeaveIfError(err); + iNumViews=aNumViews; + TInt pos=2; + iFile.Seek(ESeekStart,pos); // Ignore Unicode header. + test.Printf(_L("Adding contact ")); + AddOneContactL(); + } + +void CContactAdder::HandleNotificationL(const CContactViewBase&,const TContactViewEvent& aEvent) + { + if (++iNumNotifications==iNumViews) + { + if (iFinished) + { + iConductor.NextTest(); + } + else + { + AddOneContactL(); + } + } + else + { + test(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())); + } + +void CContactAdder::AddOneContactL() + { + iNumNotifications=0; + TBuf<64> firstName; + TBuf<64> lastName; + iConductor.iLog->IncVisualCounter(); + iFinished=!ReadNamePairL(iFile,firstName,lastName); +#ifdef VERBOSE_LOGGING + iConductor.iLog->LogLineNoEcho(_L("Adding %S %S"),&firstName,&lastName); +#endif + 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. + test.Printf(_L("Removing contact ")); + RemoveOneContactL(); + } + +void CContactRemover::HandleNotificationL(const CContactViewBase&,const TContactViewEvent& aEvent) + { + if (++iNumNotifications==iNumViews) + { + if (iFinished) + { + iConductor.NextTest(); + } + else + { + RemoveOneContactL(); + } + } + else + { + test(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); +#ifdef VERBOSE_LOGGING + iConductor.iLog->LogLineNoEcho(_L("Removing %S %S"),&firstName,&lastName); +#endif + 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(); + test(iConductor.iSortChecker->Count()==numItems); + + for (TInt ii=0;iiCheckSort(aSortOrder,scratchBuf,ii); + scratchBuf.SetLength(0); + } + + test(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(); + test(iConductor.iSortChecker->Count(aSortOrder,aLowBoundary,aHighBoundary)==numItems); + + for (TInt ii=0;iiCheckSortSubView(aSortOrder,scratchBuf,ii,aLowBoundary,aHighBoundary); + scratchBuf.SetLength(0); + } + + test(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(); + test(iConductor.iSortChecker->CountLow(aSortOrder,aLowBoundary)==numItems); + + for (TInt ii=0;iiCheckSortLowSubView(aSortOrder,scratchBuf,ii,aLowBoundary); + scratchBuf.SetLength(0); + } + + test(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(); + test(iConductor.iSortChecker->CountHigh(aSortOrder,aHighBoundary)==numItems); + + for (TInt ii=0;iiCheckSortHighSubView(aSortOrder,scratchBuf,ii,aHighBoundary); + scratchBuf.SetLength(0); + } + + test(aView.FindL(lastId)==numItems-1); + + if (iQueue) + { + iConductor.NextTest(); + } + } + +CViewExerciser::~CViewExerciser() + { + delete iTextDef_FirstLast; + delete iTextDef_LastFirst; + } + +void CViewExerciser::HandleNotificationL(const CContactViewBase&,const TContactViewEvent&) + { + test(EFalse); + } + +void CViewExerciser::GetComparisonStringL(const TContactItemId aContactId, const CSortChecker::TSortOrder aSortOrder, TDes& aContactInfo) + { + TBuf<64> first; + TBuf<64> last; + + CContactItem* contact=iConductor.iDb->ReadMinimalContactLC(aContactId); + + CContactItemFieldSet& fieldSet=contact->CardFields(); + TInt pos=fieldSet.Find(KUidContactFieldGivenName); + if (pos!=KErrNotFound) + first.Append(fieldSet[pos].TextStorage()->Text()); + pos=fieldSet.Find(KUidContactFieldFamilyName); + if (pos!=KErrNotFound) + last.Append(fieldSet[pos].TextStorage()->Text()); + CleanupStack::PopAndDestroy(contact); + + if (aSortOrder==CSortChecker::EFirstNameLastName) + { + aContactInfo.Append(first); + if (first.Length()) + aContactInfo.Append(_L(" ")); + aContactInfo.Append(last); + } + else + { + aContactInfo.Append(last); + if (last.Length()) + aContactInfo.Append(_L(" ")); + aContactInfo.Append(first); + } + } + +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) + { + test(aEvent.iEventType==TContactViewEvent::EUnavailable || aEvent.iEventType==TContactViewEvent::ESortOrderChanged); + if (++iNumNotifications==iNumViews*2) // 2 because there will be EUnavailable, ESortOrderChanged notifications for each view. + { + iConductor.NextTest(); + } + } + +CSortOrderChanger::CSortOrderChanger(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + + +// +// CUnsortableContactAdder. +// + +CUnsortableContactAdder::CUnsortableContactAdder(CTestConductor& aConductor,const CContactViewBase& aView) + :CTestBase(aConductor),iView(&aView) + {} + +CUnsortableContactAdder* CUnsortableContactAdder::NewL(CTestConductor& aConductor,const CContactViewBase& aView) + { + CUnsortableContactAdder* self=new(ELeave) CUnsortableContactAdder(aConductor,aView); + return self; + } + +CUnsortableContactAdder::~CUnsortableContactAdder() + { + } + +void CUnsortableContactAdder::AddContactsL(TInt aNumberOfContact,TContactViewPreferences aContactTypes) + { + iNumContacts = aNumberOfContact; + iNumNotifications=0; + for(TInt ii=0;iiAddTypicalContactForLocalViewPreferencesL(TContactViewPreferences(aContactTypes)); + iConductor.iTestIds.Append(id); + } + + + } +void CUnsortableContactAdder::HandleNotificationL(const CContactViewBase& aView,const TContactViewEvent& aEvent) + { + if(aEvent.iEventType==TContactViewEvent::EItemAdded && &aView == iView ) + { + //only start the next test when all the contact have been added to our view. + if (++iNumNotifications==iNumContacts) + { + iConductor.NextTest(); + } + } + } + +/** Constructor */ +CContactOwnCardRemover::CContactOwnCardRemover(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + +/** Default destructor */ +CContactOwnCardRemover::~CContactOwnCardRemover() + { + } + +/** Sets aId as an own card, then deletes it */ +void CContactOwnCardRemover::RemoveOwnCardL(const CContactViewBase& aView) + { + iView=&aView; + iOriginalCount = aView.CountL(); + TInt id = aView.AtL(0); + CContactItem* item = iConductor.iDb->ReadContactLC(id); + iConductor.iDb->SetOwnCardL(*item); + CleanupStack::PopAndDestroy(item); + iConductor.iDb->DeleteContactL(id); + } + +/** Verifies that a remove event was sent as a result of deleting the item */ +void CContactOwnCardRemover::HandleNotificationL(const CContactViewBase& aView,const TContactViewEvent& aEvent) + { + if (&aView == iView && aEvent.iEventType == TContactViewEvent::EItemRemoved) + { + test(iView->CountL() == iOriginalCount - 1); + iConductor.NextTest(); + } + } + +// Added test code here for modification of own card + +_LIT(KNewOwnerCardFirstName, "T_VIEW2_OWNCARD"); + +/** Constructor */ +CContactOwnCardModifier::CContactOwnCardModifier(CTestConductor& aConductor) : CTestBase(aConductor) + { + } + +/** Default destructor */ +CContactOwnCardModifier::~CContactOwnCardModifier() + { + } + +/** Sets aId as an own card, then modifies it */ +void CContactOwnCardModifier::ModifyOwnCardL(const CContactViewBase& aView) +{ + iView=&aView; + iOriginalCount = aView.CountL(); + TInt id = aView.AtL(0); + CContactItem* item = iConductor.iDb->OpenContactLX(id); + if (item) + { + CleanupStack::PushL(item); + iConductor.iDb->SetOwnCardL(*item); + // Modify first name + CContactItemFieldSet& fieldSet = item->CardFields(); + TInt index=fieldSet.Find(KUidContactFieldGivenName); + User::LeaveIfError(index); + CContactItemField& field = fieldSet[index]; + ASSERT(field.StorageType()==KStorageTypeText); + STATIC_CAST(CContactTextField*,field.Storage())->SetTextL(KNewOwnerCardFirstName); + iConductor.iDb->CommitContactL(*item); + CleanupStack::PopAndDestroy(2); // item, lock record + } +} + +/** Verifies that notification of own card item modification has been received*/ +void CContactOwnCardModifier::HandleNotificationL(const CContactViewBase& aView,const TContactViewEvent& aEvent) + { + if (&aView == iView && aEvent.iEventType == TContactViewEvent::EItemAdded) + {// THIS SHOULD NOT LEAVE... + test(iView->CountL()==iOriginalCount); // Follows corresponding remove + // Test that the own card data has been updated correctly + TContactItemId ownCardId = iConductor.iDb->OwnCardId(); + TInt ownCardIndex = aView.FindL(ownCardId); + const CViewContact& contact = aView.ContactAtL(ownCardIndex); + test(ownCardId==contact.Id()); // No reason this should fail + + const RContactViewSortOrder& sortOrder = aView.SortOrderL(); + // Get the first name field + TInt index = 0; + TInt soCount = sortOrder.Count(); + for (; index < soCount; ++index) + { + if (KUidContactFieldGivenName == sortOrder[index]) + { + break; + } + } + + TPtrC fieldData(contact.Field(index) ); + test( (fieldData.CompareC(KNewOwnerCardFirstName) ) == 0); + iNotificationsReceived++; + if (iNotificationsReceived == 2) + { + iConductor.NextTest(); + } + } + } + + +// +// Main. +// + +/** + +@SYMTestCaseID PIM-T-VIEW2-0001 + +*/ + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; +// UserHal::SetAutoSwitchOffBehavior(ESwitchOffDisabled); + CActiveScheduler* scheduler=new CActiveScheduler; + if (scheduler) + { + CActiveScheduler::Install(scheduler); + CTrapCleanup* cleanup=CTrapCleanup::New(); + if (cleanup) + { + CTestConductor* tester=NULL; + test.Start(KTestName); + + TRAPD(err,tester=CTestConductor::NewL()); + __ASSERT_ALWAYS(err == KErrNone, User::Invariant()); + test.End(); + delete tester; + test.Close(); + delete cleanup; + } + delete scheduler; + } + __UHEAP_MARKEND; + return KErrNone; + }