contacts_plat/virtual_phonebook_store_api/tsrc/T_MVPbkContactStore/src/T_MVPbkContactStoreComposite.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contacts_plat/virtual_phonebook_store_api/tsrc/T_MVPbkContactStore/src/T_MVPbkContactStoreComposite.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,960 @@
+/*
+* Copyright (c) 2004 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:
+*
+*/
+
+
+//  CLASS HEADER
+#include "T_MVPbkContactStoreComposite.h"
+
+#include <CVPbkContactManager.h>
+#include <CVPbkContactViewDefinition.h>
+#include <CVPbkSortOrder.h>
+#include <CVPbkContactLinkArray.h>
+#include <CVPbkContactStoreUriArray.h>
+#include <MVPbkContactStoreList.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactViewBase.h>
+#include <MVPbkViewContact.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkStoreContactFieldCollection.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactViewFiltering.h>
+#include <TVPbkFieldTypeMapping.h>
+#include <TVPbkContactStoreUriPtr.h>
+
+#include <T_MVPbkContactStore.rsg>
+
+//  EXTERNAL INCLUDES
+#include <EUnitMacros.h>
+#include <barsc.h>
+#include <barsread.h>
+#include <s32mem.h>
+#include <bautils.h>
+
+//  INTERNAL INCLUDES
+
+// LOCAL
+namespace 
+    {
+#if defined(__WINS__)
+    _LIT( KResFile, "z:\\resource\\T_MVPbkContactStore.rsc" );
+#else
+    _LIT( KResFile, "c:\\resource\\T_MVPbkContactStore.rsc" );
+#endif // defined(__WINS__)    
+    _LIT( KFNameFieldValue, "Bbbfirstname" );
+    _LIT( KLNameFieldValue, "Ccclastname" ); 
+    _LIT( KTelNo, "555-1239876543" );
+
+    _LIT( KFNameFieldValue2, "Aaafirstname" );
+    _LIT( KLNameFieldValue2, "Bbblastname" );
+    _LIT( KTelNo2, "+358959876543" );
+
+    _LIT( KFNameFieldValue3, "Cccfirstname" );
+    _LIT( KLNameFieldValue3, "Aaalastname" );
+    _LIT( KTelNo3, "04051245652" );
+
+    void StopScheduler( CActiveSchedulerWait& aScheduler )
+        {
+        if ( aScheduler.IsStarted() )
+            {
+            aScheduler.AsyncStop();
+            }
+        }
+        
+    _LIT( KFindString, "a" );
+    _LIT( KFindStrings, "aa" );
+
+    } // namespace
+
+// CALLBACK
+
+void T_MVPbkContactStoreComposite::StoreReady(MVPbkContactStore& /*aContactStore*/)
+    {
+    if (iStoreScheduler.IsStarted())
+    	{    	
+	    iLastError = KErrNone;
+	    iLastEvent = EStoreReady;
+	    // Event coming straight from the store, so no OpenComplete() expected
+	    if ( iFlag ) 
+	        {
+	        iFlag = EFalse;
+	        if (iExpectedStoreEvent == iLastEvent)
+	        	{
+		        iExpectedStoreResponseFound = ETrue;
+	        	}
+	        StopScheduler(iStoreScheduler);
+	        }
+    	}
+    }
+
+void T_MVPbkContactStoreComposite::StoreUnavailable
+                            (MVPbkContactStore& /*aContactStore*/, TInt aReason)
+    {
+    if (iStoreScheduler.IsStarted())
+    	{    	
+	    iLastError = aReason;
+	    iLastEvent = EOpenError;
+	    
+	    // Event coming straight from the store, so no OpenComplete() expected
+	    if ( iFlag ) 
+	        {
+	        iFlag = EFalse;
+	        iExpectedStoreResponseFound = ETrue;
+ 	       StopScheduler(iStoreScheduler);
+	        }
+    	}
+    }
+    
+void T_MVPbkContactStoreComposite::HandleStoreEventL(
+                MVPbkContactStore& /*aContactStore*/, 
+                TVPbkContactStoreEvent /*aStoreEvent*/)
+	{
+	}
+
+void T_MVPbkContactStoreComposite::OpenComplete()
+    {
+    if (iStoreScheduler.IsStarted())
+    	{    	
+	    iLastError = KErrNone;
+	    iLastEvent = EOpenComplete;
+        if (iExpectedStoreEvent == iLastEvent)
+        	{
+	        iExpectedStoreResponseFound = ETrue;
+        	}
+	    StopScheduler(iStoreScheduler);
+    	}
+    }
+
+void T_MVPbkContactStoreComposite::ContactViewReady(MVPbkContactViewBase& /*aView*/)
+    {
+    if ( iViewScheduler.IsStarted() )
+        {
+        iLastError = KErrNone;
+        iLastEvent = EContactViewReady;
+        if (iExpectedViewEvent == iLastEvent)
+        	{
+	        iExpectedViewResponseFound = ETrue;
+        	}
+        StopScheduler(iViewScheduler);
+        }
+    }
+
+void T_MVPbkContactStoreComposite::ContactViewUnavailable(MVPbkContactViewBase& /*aView*/)
+    {
+    if ( iViewScheduler.IsStarted() )
+        {
+        iLastError = KErrNone;
+        iLastEvent = EContactViewUnavailable;
+        if (iExpectedViewEvent == iLastEvent)
+        	{
+	        iExpectedViewResponseFound = ETrue;
+        	}
+        StopScheduler(iViewScheduler);
+        }
+    }
+
+void T_MVPbkContactStoreComposite::ContactAddedToView
+        (MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, const MVPbkContactLink& /*aLink*/)
+    {
+    if ( iViewScheduler.IsStarted() )
+        {
+        iLastError = KErrNone;
+        iLastEvent = EContactAddedToView;
+        if (iExpectedViewEvent == iLastEvent)
+        	{
+	        iExpectedViewResponseFound = ETrue;
+        	}
+        StopScheduler(iViewScheduler);
+        }
+    }
+
+void T_MVPbkContactStoreComposite::ContactRemovedFromView
+        (MVPbkContactViewBase& /*aView*/, TInt /*aIndex*/, const MVPbkContactLink& /*aLink*/)
+    {
+    if ( iViewScheduler.IsStarted() )
+        {
+        iLastError = KErrNone;
+        iLastEvent = EContactRemovedFromView;
+        if (iExpectedViewEvent == iLastEvent)
+        	{
+	        iExpectedViewResponseFound = ETrue;
+        	}
+        StopScheduler(iViewScheduler);
+        }
+    }
+
+void T_MVPbkContactStoreComposite::ContactViewError
+        (MVPbkContactViewBase& /*aView*/, TInt aError, TBool /*aErrorNotified*/)
+    {
+    if ( iViewScheduler.IsStarted() )
+        {
+        iLastError = aError;
+        iLastEvent = EContactViewError;
+        iExpectedViewResponseFound = ETrue;
+        StopScheduler(iViewScheduler);
+        }
+    }
+
+void T_MVPbkContactStoreComposite::StepComplete(MVPbkContactOperationBase& /*aOperation*/,
+                                  TInt /*aStepSize*/)
+    {
+    iLastError = KErrNone;
+    iLastEvent = EStepComplete;
+    }
+
+TBool T_MVPbkContactStoreComposite::StepFailed(
+        MVPbkContactOperationBase& /*aOperation*/,
+        TInt /*aStepSize*/,
+        TInt aError)
+    {
+    iLastError = aError;
+    iLastEvent = EStepFailed;
+    CActiveScheduler::Stop();
+    return EFalse;
+    }
+
+void T_MVPbkContactStoreComposite::OperationComplete(MVPbkContactOperationBase& /*aOperation*/)
+    {
+    iLastError = KErrNone;
+    iLastEvent = EOperationComplete;
+    CActiveScheduler::Stop();
+    }
+
+void T_MVPbkContactStoreComposite::ContactOperationCompleted(TContactOpResult aResult)
+    {
+    if (iContactScheduler.IsStarted())
+    	{
+		iLastError = KErrNone;
+		iLastEvent = EContactOperationCompleted;
+		if ( aResult.iOpCode == EContactReadAndLock || 
+		     aResult.iOpCode == EContactRead )
+		    {
+		    iStoreContact = aResult.iStoreContact;
+		    }
+		    
+        if (iExpectedContactEvent == iLastEvent)
+        	{
+	        iExpectedContactResponseFound = ETrue;
+        	}
+		StopScheduler(iContactScheduler);
+    	}
+    }
+
+void T_MVPbkContactStoreComposite::ContactOperationFailed
+    (TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/)
+    {
+    iLastError = aErrorCode;
+    iLastEvent = EContactOperationFailed;
+    iExpectedContactResponseFound = ETrue;
+	StopScheduler(iContactScheduler);
+    }
+
+// CONSTRUCTION
+T_MVPbkContactStoreComposite* T_MVPbkContactStoreComposite::NewL(const RArray<TVPbkContactStoreUriPtr>& aUriList)
+    {
+    T_MVPbkContactStoreComposite* self = T_MVPbkContactStoreComposite::NewLC(aUriList); 
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+T_MVPbkContactStoreComposite* 
+T_MVPbkContactStoreComposite::NewLC(const RArray<TVPbkContactStoreUriPtr>& aUriList)
+    {
+    T_MVPbkContactStoreComposite* self = 
+        new( ELeave ) T_MVPbkContactStoreComposite();
+    CleanupStack::PushL( self );
+
+	self->ConstructL(aUriList); 
+
+    return self;
+    }
+
+// Destructor (virtual by CBase)
+T_MVPbkContactStoreComposite::~T_MVPbkContactStoreComposite()
+    {
+    delete iFindStrings;
+    delete iUriArray;
+    delete iStorePaths;
+    iFs.Close();
+    }
+
+// Default constructor
+T_MVPbkContactStoreComposite::T_MVPbkContactStoreComposite()
+: iFlag(EFalse)
+    {
+    }
+
+// Second phase construct
+void T_MVPbkContactStoreComposite::ConstructL(
+        const RArray<TVPbkContactStoreUriPtr>& aUriList)
+    {
+    // The ConstructL from the base class CEUnitTestSuiteClass must be called.
+    // It generates the test case table.
+    CEUnitTestSuiteClass::ConstructL();
+    User::LeaveIfError( iFs.Connect() );
+    TInt count( aUriList.Count() );
+    iStorePaths = new (ELeave) CDesCArrayFlat( count );
+    iUriArray = CVPbkContactStoreUriArray::NewL();
+    for ( TInt i = 0; i < count; ++i )
+        {
+        iStorePaths->AppendL( aUriList[ i ].UriDes() );
+        iUriArray->AppendL( TVPbkContactStoreUriPtr(iStorePaths->MdcaPoint( i ) ));
+        }
+    }
+
+
+//  METHODS
+
+void T_MVPbkContactStoreComposite::SetupL(  )   
+    {
+    iFlag = EFalse;
+    iContactManager = CVPbkContactManager::NewL( *iUriArray, &iFs );
+    iExpectedStoreResponseFound = EFalse;
+    iExpectedContactResponseFound = EFalse;    
+    }
+
+void T_MVPbkContactStoreComposite::SetupEmptyL()
+    {
+    iFlag = EFalse;
+    CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
+    iContactManager = CVPbkContactManager::NewL( *uriArray, &iFs );
+    CleanupStack::PopAndDestroy(uriArray);
+    }
+
+void T_MVPbkContactStoreComposite::SetupStoreL()
+    {
+    SetupL();
+
+    ReplaceAllStoresL();
+
+    PopulateStoresL();
+    }
+
+void T_MVPbkContactStoreComposite::SetupViewL(TInt aViewDefResId, TInt aSortOrderResId)
+    {
+    TFileName path;        
+    // NearestLanguageFile takes only TFileName
+    path.Zero();
+    path.Append( KResFile() );
+
+    if ( path.Length() != 0 )
+        {
+        BaflUtils::NearestLanguageFile( iFs, path );
+        }
+	
+    RResourceFile resFile;
+    CleanupClosePushL(resFile);
+    resFile.OpenL( iFs, path );
+    TResourceReader reader;
+    HBufC8* buffer = resFile.AllocReadLC(aViewDefResId);
+    reader.SetBuffer(buffer);
+
+    CVPbkContactViewDefinition* def = CVPbkContactViewDefinition::NewL(reader);
+    CleanupStack::PopAndDestroy(buffer);
+    CleanupStack::PushL(def);
+
+    CVPbkSortOrder* sortOrder = CreateSortOrderLC( aSortOrderResId );
+
+    iView = iContactManager->CreateContactViewLC( *this, *def, *sortOrder );
+    CleanupStack::Pop(); // iView
+    EUNIT_ASSERT( iView );
+    CleanupStack::PopAndDestroy(3); // sortOrder, def, resFile
+
+    StartViewSchedulerAndDecideToLeaveL(EContactViewReady);
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == iExpectedViewEvent );
+    }
+
+void T_MVPbkContactStoreComposite::SetupOrderedFlatCompositeViewL()
+    {
+    SetupStoreL();
+    
+    SetupCreateFindStringsL();
+
+    SetupViewL(R_ORDERED_FLAT_COMPOSITE_CONTACT_VIEW, R_SORTORDER_LASTNAME_FIRSTNAME);
+    }
+
+void T_MVPbkContactStoreComposite::SetupOrderedComplexCompositeViewL()
+    {
+    SetupStoreL();
+    
+    SetupCreateFindStringsL();
+
+    SetupViewL(R_ORDERED_COMPLEX_COMPOSITE_CONTACT_VIEW, R_SORTORDER_LASTNAME_FIRSTNAME);
+    }
+
+void T_MVPbkContactStoreComposite::SetupSortedFlatCompositeViewL()
+    {
+    SetupStoreL();
+    
+    SetupCreateFindStringsL();
+
+    SetupViewL(R_SORTED_FLAT_COMPOSITE_CONTACT_VIEW, R_SORTORDER_LASTNAME_FIRSTNAME);
+    }
+
+void T_MVPbkContactStoreComposite::SetupSortedComplexCompositeViewL()
+    {
+    SetupStoreL();
+    
+    SetupCreateFindStringsL();
+
+    SetupViewL(R_SORTED_COMPLEX_COMPOSITE_CONTACT_VIEW, R_SORTORDER_LASTNAME_FIRSTNAME);
+    }
+
+void T_MVPbkContactStoreComposite::SetupStoreWithContactsL()
+    {
+    SetupStoreL();
+
+    PopulateStoresL();
+    }
+
+void T_MVPbkContactStoreComposite::SetupCreateFindStringsL()
+    {
+    iFindStrings = new(ELeave)CDesCArrayFlat( 2 );
+    }
+
+void T_MVPbkContactStoreComposite::Teardown(  )
+    {
+    delete iFindStrings;
+    iFindStrings = NULL;
+    
+    delete iStoreContact; iStoreContact = NULL;
+    delete iView; iView = NULL;
+    if ( iStoreList )
+        {
+        iStoreList->CloseAll( *this );
+        }
+    iStoreList = NULL;
+    delete iContactManager; iContactManager = NULL;
+    }
+
+
+// TESTS
+
+void T_MVPbkContactStoreComposite::TestGetStoreListL()
+    {
+    iStoreList = &iContactManager->ContactStoresL();
+    EUNIT_ASSERT( iStoreList->Count() == iUriArray->Count() );
+    }
+
+void T_MVPbkContactStoreComposite::TestLoadContactStoreL()
+    {
+    const TInt count = iUriArray->Count();
+    for ( TInt i = 0; i < count; ++i )
+        {
+        iContactManager->LoadContactStoreL( (*iUriArray)[i] );
+        }
+    iStoreList = &iContactManager->ContactStoresL();
+    EUNIT_ASSERT( iStoreList->Count() == count );
+    }
+
+void T_MVPbkContactStoreComposite::TestOpeningAllStoresL(  )
+    {
+    iStoreList = &iContactManager->ContactStoresL();
+    TInt storeCount ( iStoreList->Count() );
+    EUNIT_ASSERT_EQUALS_DESC( storeCount, 4, "Store count check failed." );
+
+    // Try to open all stores.
+    iStoreList->OpenAllL( *this );
+
+    // We have to get EOpenComplete event.
+    StartStoreSchedulerAndDecideToLeaveL(EOpenComplete);
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == iExpectedStoreEvent );
+    }
+
+void T_MVPbkContactStoreComposite::TestViewContactCountL()
+    {
+    // There is at least 3 * storecount contacts available
+    EUNIT_ASSERT( iView->ContactCountL() >= ( iUriArray->Count() * 3 ) );
+    }
+
+void T_MVPbkContactStoreComposite::TestCommitMultipleContactsL()
+    {
+    TInt cntCount( iView->ContactCountL() );
+    RArray<MVPbkStoreContact*> storeCnts;
+    CleanupClosePushL( storeCnts );
+    
+    iView->ContactAtL( 0 ).ReadAndLockL( *this );
+
+    StartContactSchedulerAndDecideToLeaveL(EContactOperationCompleted);
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == iExpectedContactEvent );
+    iExpectedContactResponseFound = EFalse;
+
+    MVPbkStoreContact* cnt1 = iStoreContact;
+    iStoreContact = NULL;
+    CleanupDeletePushL( cnt1 );
+    storeCnts.Append( cnt1 );
+
+    // get last contact from view
+    iView->ContactAtL( cntCount - 1 ).ReadAndLockL( *this ); 
+
+    StartContactSchedulerAndDecideToLeaveL(EContactOperationCompleted);
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == iExpectedContactEvent );
+    iExpectedContactResponseFound = EFalse;
+
+    MVPbkStoreContact* cnt2 = iStoreContact;
+    iStoreContact = NULL;
+    CleanupDeletePushL( cnt2 );
+    storeCnts.Append( cnt2 );
+        
+    MVPbkContactOperationBase* op = 
+        iContactManager->CommitContactsL( storeCnts.Array(), *this );
+    CleanupDeletePushL( op );
+
+    StartSchedulerAndDecideToLeaveL();
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == EOperationComplete );
+    EUNIT_ASSERT( iView->ContactCountL() == cntCount );
+
+    CleanupStack::PopAndDestroy( 4 ); // op, cnt2, cnt1, storeCnts
+    }
+
+void T_MVPbkContactStoreComposite::TestDeleteMultipleContactsL()
+    {
+    TInt deletecount( 2 );
+    TInt cntCount( iView->ContactCountL() );
+    CVPbkContactLinkArray* contactLinks = CVPbkContactLinkArray::NewLC();
+
+    for ( TInt i = 0; i < deletecount; ++i )
+        {
+        MVPbkContactLink* lnk = iView->ContactAtL( i ).CreateLinkLC();
+        contactLinks->AppendL( lnk );
+        CleanupStack::Pop(); // lnk
+        }
+
+    MVPbkContactOperationBase* op = 
+        iContactManager->DeleteContactsL( *contactLinks, *this);
+    CleanupDeletePushL( op );
+    
+    // TODO: This part of VPBkEng under construction...
+    StartSchedulerAndDecideToLeaveL();
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == EOperationComplete );
+    /*
+    StartSchedulerAndDecideToLeaveL();
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == EContactViewUnavailable );
+    StartSchedulerAndDecideToLeaveL();
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == EContactViewReady );
+    */
+    
+    EUNIT_ASSERT( iView->ContactCountL() == ( cntCount - deletecount ) );
+
+    CleanupStack::PopAndDestroy(); // op
+    CleanupStack::PopAndDestroy(); // contactLnks
+    }
+    
+void T_MVPbkContactStoreComposite::TestCreateFilteredViewL()
+    {
+    // First check that the view supports filtering
+    EUNIT_ASSERT( iView->ViewFiltering() );
+    
+    iFindStrings->AppendL( KFindString );
+       
+    MVPbkContactViewBase* findView = 
+        iView->ViewFiltering()->CreateFilteredViewLC( *this, *iFindStrings, 
+            NULL );
+    StartViewSchedulerAndDecideToLeaveL(EContactViewReady);
+    
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == EContactViewReady );    
+    
+    CleanupStack::PopAndDestroy( 1 ); // findView
+    }
+    
+void T_MVPbkContactStoreComposite::TestCreateFilteredView2L()
+    {
+    // First check that the view supports filtering
+    EUNIT_ASSERT( iView->ViewFiltering() );
+    
+    iFindStrings->AppendL( KFindString );
+    
+    // First character
+    MVPbkContactViewBase* findView = 
+        iView->ViewFiltering()->CreateFilteredViewLC( *this, 
+            *iFindStrings, NULL ); 
+    StartViewSchedulerAndDecideToLeaveL(EContactViewReady);
+    
+    iFindStrings->Reset();
+    iFindStrings->AppendL( KFindStrings );
+    
+    // Second character
+    MVPbkContactViewBase* refineView = 
+        findView->ViewFiltering()->CreateFilteredViewLC( *this, 
+            *iFindStrings, NULL );
+    StartViewSchedulerAndDecideToLeaveL(EContactViewReady);    
+    
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == EContactViewReady );
+    
+    CleanupStack::PopAndDestroy( 2 ); // findView, refineView
+    }
+        
+void T_MVPbkContactStoreComposite::TestDeleteContactsFromFilteredViewL()
+    {
+    // First check that the view supports filtering
+    EUNIT_ASSERT( iView->ViewFiltering() );
+    
+    iFindStrings->AppendL( KFindString );
+    
+    // First character
+    MVPbkContactViewBase* findView = 
+        iView->ViewFiltering()->CreateFilteredViewLC( *this, 
+            *iFindStrings, NULL );
+    StartViewSchedulerAndDecideToLeaveL(EContactViewReady);
+    
+    iFindStrings->Reset();
+    iFindStrings->AppendL( KFindStrings );
+    
+    // Second character
+    MVPbkContactViewBase* refineView = 
+        findView->ViewFiltering()->CreateFilteredViewLC( *this, 
+            *iFindStrings, NULL );
+    StartViewSchedulerAndDecideToLeaveL(EContactViewReady);    
+        
+    TestDeleteMultipleContactsL();
+            
+    CleanupStack::PopAndDestroy( 2 ); // findView, refineView        
+    }
+
+// HELP FUNCTIONS
+
+void T_MVPbkContactStoreComposite::ReplaceAllStoresL()
+    {
+    iStoreList = &iContactManager->ContactStoresL();
+    TInt count ( iStoreList->Count() );
+    
+    for ( TInt i = 0; i < count; ++i )
+        {
+        MVPbkContactStore& contactStore = iStoreList->At( i );
+        contactStore.ReplaceL( *this );
+	    
+	    // Flag to notice that we dont wait OpenComplete event
+	    // but StoreReady or StoreError event
+	    iFlag = ETrue;
+	    
+        StartStoreSchedulerAndDecideToLeaveL(EStoreReady);
+        EUNIT_ASSERT( iLastError == KErrNone );
+        EUNIT_ASSERT( iLastEvent == iExpectedStoreEvent );
+        }
+    }
+
+CVPbkSortOrder* T_MVPbkContactStoreComposite::CreateSortOrderLC( TInt aResId )
+    {
+    TFileName path;        
+    // NearestLanguageFile takes only TFileName
+    path.Zero();
+    path.Append( KResFile() );
+
+    if ( path.Length() != 0 )
+        {
+        BaflUtils::NearestLanguageFile( iFs, path );
+        }
+	
+    RResourceFile resFile;	
+    CleanupClosePushL( resFile );
+    resFile.OpenL( iFs, path );
+    TResourceReader reader;
+    HBufC8* buffer = resFile.AllocReadLC( aResId );
+    reader.SetBuffer(buffer);
+
+    CVPbkSortOrder* sortOrder = CVPbkSortOrder::NewL( reader, iContactManager->FieldTypes() );
+    CleanupStack::PopAndDestroy( 2 ); // buffer, resFile
+    CleanupStack::PushL( sortOrder );
+    return sortOrder;
+    }
+
+void T_MVPbkContactStoreComposite::PopulateStoresL()
+    {
+    TInt storeCount( iStoreList->Count() );
+    for ( TInt i = 0; i < storeCount; ++i )
+        {
+        MVPbkContactStore* store = &iStoreList->At( i );
+        MVPbkStoreContact* storeContact = store->CreateNewContactLC();
+        AddContactFieldsAndSaveL( *storeContact, KFNameFieldValue, KLNameFieldValue, KTelNo );
+        CleanupStack::PopAndDestroy(); // storeContact
+        storeContact = store->CreateNewContactLC();
+        AddContactFieldsAndSaveL( *storeContact, KFNameFieldValue2, KLNameFieldValue2, KTelNo2 );
+        CleanupStack::PopAndDestroy(); // storeContact
+        storeContact = store->CreateNewContactLC();
+        AddContactFieldsAndSaveL( *storeContact, KFNameFieldValue3, KLNameFieldValue3, KTelNo3 );
+        CleanupStack::PopAndDestroy(); // storeContact
+        }
+    }
+
+void T_MVPbkContactStoreComposite::AddContactFieldsAndSaveL( 
+    MVPbkStoreContact& aStoreContact, const TDesC& aFName, const TDesC& aLName, const TDesC& aTelNo )
+    {
+    AddFieldToContact( aStoreContact, R_FIRST_NAME_TYPE, aFName );
+    AddFieldToContact( aStoreContact, R_LAST_NAME_TYPE, aLName );
+    AddFieldToContact( aStoreContact, R_TEL_NO_TYPE, aTelNo );
+   
+    // Save modifications to the storecontact
+    aStoreContact.CommitL( *this );
+    StartContactSchedulerAndDecideToLeaveL(EContactOperationCompleted);
+    EUNIT_ASSERT( iLastError == KErrNone );
+    EUNIT_ASSERT( iLastEvent == iExpectedContactEvent );
+    iExpectedContactResponseFound = EFalse;
+    if ( iView ) // If no view, there will be no events to it
+        {
+        StartViewSchedulerAndDecideToLeaveL(EContactAddedToView);
+        EUNIT_ASSERT( iLastError == KErrNone );
+        EUNIT_ASSERT( iLastEvent == iExpectedViewEvent );
+        }
+    }
+
+void T_MVPbkContactStoreComposite::AddFieldToContact( MVPbkStoreContact& aStoreContact, TInt aResId, const TDesC& aValue )
+    {
+    TInt fldCount( aStoreContact.Fields().FieldCount() );
+    // Create fieldtype
+    TVPbkFieldTypeMapping fieldTypeMapping = CreateFieldTypeMappingL( aResId );
+    const MVPbkFieldType* fieldType = 
+        fieldTypeMapping.FindMatch( iContactManager->FieldTypes() );
+    EUNIT_ASSERT( fieldType );
+    // Add value to the field
+    AddValueToContactFieldL( aStoreContact, *fieldType, aValue );
+    EUNIT_ASSERT( aStoreContact.Fields().FieldCount() == ++fldCount );
+    }
+
+void T_MVPbkContactStoreComposite::AddValueToContactFieldL( MVPbkStoreContact& aStoreContact, 
+    const MVPbkFieldType& aFieldType, const TDesC& aValue )
+    {
+    MVPbkStoreContactField* field = aStoreContact.CreateFieldLC( aFieldType );
+    EUNIT_ASSERT( field->FieldData().DataType() == EVPbkFieldStorageTypeText );
+    MVPbkContactFieldTextData::Cast( field->FieldData() ).SetTextL( aValue );
+    aStoreContact.AddFieldL( field );
+    CleanupStack::Pop();    
+    }
+
+TVPbkFieldTypeMapping T_MVPbkContactStoreComposite::CreateFieldTypeMappingL( const TInt aResId )
+    {
+    TFileName path;        
+    // NearestLanguageFile takes only TFileName
+    path.Zero();
+    path.Append( KResFile() );
+
+    if ( path.Length() != 0 )
+        {
+        BaflUtils::NearestLanguageFile( iFs, path );
+        }
+	
+    RResourceFile resFile;	
+    CleanupClosePushL( resFile );
+    resFile.OpenL( iFs, path );
+    TResourceReader reader;
+    HBufC8* buffer = resFile.AllocReadLC( aResId );
+    reader.SetBuffer(buffer);
+
+    TVPbkFieldTypeMapping result(reader);
+    CleanupStack::PopAndDestroy( 2 ); // buffer, resFile
+
+    return result;
+    }
+
+void T_MVPbkContactStoreComposite::StartSchedulerAndDecideToLeaveL()
+    {
+    CActiveScheduler::Start();
+    if ( iLastError == KErrNoMemory )
+        {
+        User::Leave( iLastError );
+        }
+    }
+    
+void T_MVPbkContactStoreComposite::StartStoreSchedulerAndDecideToLeaveL(TInt aExpectedEvent)
+	{
+	iExpectedStoreEvent = aExpectedEvent;
+    while (!iExpectedStoreResponseFound)
+    	{	
+	    iStoreScheduler.Start();
+	    if ( iLastError == KErrNoMemory )
+	        {
+	        User::Leave( iLastError );
+	        }
+    	}	
+    iExpectedStoreResponseFound = EFalse;
+	}
+    
+void T_MVPbkContactStoreComposite::StartContactSchedulerAndDecideToLeaveL(TInt aExpectedEvent)
+	{
+	iExpectedContactEvent = aExpectedEvent;
+    while (!iExpectedContactResponseFound)
+    	{	
+	    iContactScheduler.Start();
+	    if ( iLastError == KErrNoMemory )
+	        {
+	        User::Leave( iLastError );
+	        }
+    	}	
+    iExpectedContactResponseFound = EFalse;
+	}
+
+
+void T_MVPbkContactStoreComposite::StartViewSchedulerAndDecideToLeaveL(TInt aExpectedEvent)
+    {
+    iExpectedViewEvent = aExpectedEvent;
+    while (!iExpectedViewResponseFound)
+    	{	
+	    iViewScheduler.Start();
+	    if ( iLastError == KErrNoMemory )
+	        {
+	        User::Leave( iLastError );
+	        }
+    	}
+    iExpectedViewResponseFound = EFalse;
+    }	
+	
+//  TEST TABLE
+
+EUNIT_BEGIN_TEST_TABLE( 
+    T_MVPbkContactStoreComposite,
+    "VPbkApiTester::MVPbkContactStoreComposite",
+    "MODULE" )
+
+EUNIT_TEST(
+    "Retrieving stores from contact manager",
+    "MVPbkContactStoreList",
+    "ContactStoresL",
+    "FUNCTIONALITY",
+    SetupL, TestGetStoreListL, Teardown )
+
+EUNIT_TEST(
+    "Loading stores dynamically",
+    "CVPbkContactManager",
+    "LoadContactStoreL",
+    "FUNCTIONALITY",
+    SetupL, TestLoadContactStoreL, Teardown )
+
+EUNIT_TEST(
+    "Opening all stores",
+    "MVPbkContactStoreList",
+    "OpenAllL",
+    "FUNCTIONALITY",
+    SetupStoreL, TestOpeningAllStoresL, Teardown )
+
+EUNIT_TEST(
+    "View's contact count",
+    "MVPbkContactViewBase",
+    "ContactCountL",
+    "FUNCTIONALITY",
+    SetupOrderedFlatCompositeViewL, TestViewContactCountL, Teardown )
+
+EUNIT_TEST(
+    "View's contact count",
+    "MVPbkContactViewBase",
+    "ContactCountL",
+    "FUNCTIONALITY",
+    SetupOrderedComplexCompositeViewL, TestViewContactCountL, Teardown )
+
+EUNIT_TEST(
+    "View's contact count",
+    "MVPbkContactViewBase",
+    "ContactCountL",
+    "FUNCTIONALITY",
+    SetupSortedFlatCompositeViewL, TestViewContactCountL, Teardown )
+
+EUNIT_TEST(
+    "View's contact count",
+    "MVPbkContactViewBase",
+    "ContactCountL",
+    "FUNCTIONALITY",
+    SetupSortedComplexCompositeViewL, TestViewContactCountL, Teardown )
+
+EUNIT_TEST(
+    "Commit of multiple contacts",
+    "CVPbkContactManager",
+    "CommitContactsL",
+    "FUNCTIONALITY",
+    SetupOrderedFlatCompositeViewL, TestCommitMultipleContactsL, Teardown )
+
+EUNIT_TEST(
+    "Deletion of multiple contacts",
+    "CVPbkContactManager",
+    "DeleteContactsL",
+    "FUNCTIONALITY",
+    SetupOrderedFlatCompositeViewL, TestDeleteMultipleContactsL, Teardown )
+    
+EUNIT_TEST(
+    "Create filtered view. One character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupSortedFlatCompositeViewL, TestCreateFilteredViewL, Teardown )    
+
+EUNIT_TEST(
+    "Create filtered view. One character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupOrderedFlatCompositeViewL, TestCreateFilteredViewL, Teardown )        
+    
+EUNIT_TEST(
+    "Create filtered view. One character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupSortedComplexCompositeViewL, TestCreateFilteredViewL, Teardown )    
+
+EUNIT_TEST(
+    "Create filtered view. One character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupOrderedComplexCompositeViewL, TestCreateFilteredViewL, Teardown )   
+
+EUNIT_TEST(
+    "Create filtered view. Two character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupSortedFlatCompositeViewL, TestCreateFilteredView2L, Teardown )    
+
+EUNIT_TEST(
+    "Create filtered view. Two character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupOrderedFlatCompositeViewL, TestCreateFilteredView2L, Teardown )        
+    
+EUNIT_TEST(
+    "Create filtered view. Two character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupSortedComplexCompositeViewL, TestCreateFilteredView2L, Teardown )    
+
+EUNIT_TEST(
+    "Create filtered view. Two character.",
+    "MVPbkContactViewBase",
+    "CreateFilteredViewLC",
+    "FUNCTIONALITY",
+    SetupOrderedComplexCompositeViewL, TestCreateFilteredView2L, Teardown ) 
+    
+EUNIT_TEST(
+    "Delete contacts from filtered view.",
+    "CVPbkContactManager",
+    "DeleteContactsL",
+    "FUNCTIONALITY",
+    SetupOrderedFlatCompositeViewL, TestDeleteContactsFromFilteredViewL, Teardown )                 
+    
+EUNIT_END_TEST_TABLE
+
+//  END OF FILE