phonebookengines/contactsmodel/tsrc/Integration/TestStartUp/src/TestContactsDbStep.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/Integration/TestStartUp/src/TestContactsDbStep.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,469 @@
+// Copyright (c) 2005-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 "TestContactsDbStep.h"
+#include "cntviewstoreprivate.h"
+#include <e32panic.h>
+
+
+CTestContactsDbStep::~CTestContactsDbStep()
+/**
+ * Destructor
+ */
+	{
+	delete iDb;
+	iDb = NULL;
+	}
+
+CTestContactsDbStep::CTestContactsDbStep() 
+/**
+ * Constructor
+ */
+	{ 
+	// Call base class method to set up the human readable name for logging
+	SetTestStepName(KTestContactsDbStep);
+	}
+
+TVerdict CTestContactsDbStep::doTestStepPreambleL()
+/**Step
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+ 	{
+ 	SetTestStepResult(EPass);
+ 	
+ 	GetStringFromConfig(ConfigSection(),KCntDbActionTag,iCntsDbAction); 
+ 	GetIntFromConfig(ConfigSection(),KNoOfCntsTag,iNumberOfContacts);
+ 	
+ 	CActiveScheduler* iSched = NULL;
+    iSched = new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(iSched);
+ 		
+ 	return TestStepResult();
+ 	}
+ 	
+
+TVerdict CTestContactsDbStep::doTestStepL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+    {
+    SetTestStepResult(EPass);
+	
+    if (iCntsDbAction.Compare(KCreateDb) == KErrNone)
+        {
+    	CreateDefaultCntsDb();
+        }
+        
+    else if (iCntsDbAction.Compare(KOpenDb) == KErrNone)
+        {
+    	OpenDefaultCntsDb();
+        }
+        
+    else if (iCntsDbAction.Compare(KReplaceDb) == KErrNone)
+        {
+    	ReplaceDefaultCntsDb();
+        }
+        
+    else if (iCntsDbAction.Compare(KAddItemsDb) == KErrNone)
+        {
+    	TRAPD(err,AddContactsL(iNumberOfContacts));
+    	if (err != KErrNone)
+    	    {
+    		_LIT(KAddCntLeft,"AddContactsL Left, err = %d");
+    		INFO_PRINTF2(KAddCntLeft, err);
+    		SetTestStepResult(EFail);
+    	    }
+        }
+    
+    else if (iCntsDbAction.Compare(KDeleteDb) == KErrNone)
+        {
+    	DeleteDefaultCntsDb();
+        }
+        
+    else if (iCntsDbAction.Compare(KCheckCntViewDefs) == KErrNone)
+        {
+        
+#ifdef _DEBUG
+
+    	TBool res = CheckExistingViewDefsL();
+    	if (!res)
+    	    {
+    		SetTestStepResult(EFail);
+    	    }
+#endif
+        }
+        
+    else
+        {
+    	//illegal contacts db action
+    	SetTestStepResult(EFail);
+        }
+        
+    return TestStepResult();
+    }
+    
+
+TVerdict CTestContactsDbStep::doTestStepPostambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+    {
+    delete iSched;
+	iSched = NULL;
+	CActiveScheduler::Install(NULL);
+	
+	return TestStepResult();
+    }
+
+
+/**
+ * @return - err 
+ * Implements a method to create a default contacts database.
+ */    
+void CTestContactsDbStep::CreateDefaultCntsDb()   
+    {
+    TRAPD(err,iDb = CContactDatabase::CreateL());
+    if ((err != KErrNone) && (err != KErrAlreadyExists))
+        {
+        _LIT(KNoDbCreate,"Could not create cnts default db, err = %d");
+        ERR_PRINTF2(KNoDbCreate,err);  
+        SetTestStepResult(EFail);
+        }
+    }
+
+
+/**
+ * @return - err
+ * Implements a method to open a default contacts database.
+ */
+void CTestContactsDbStep::OpenDefaultCntsDb()   
+    {
+    TRAPD(err,iDb = CContactDatabase::OpenL());
+    if (err != KErrNone)
+        {
+        _LIT(KNoDbOpen,"Could not open cnts default db, err = %d");
+        ERR_PRINTF2(KNoDbOpen,err);  
+        SetTestStepResult(EFail);
+        }
+    }
+    
+
+/**
+ * @return err
+ * Implements a method to delete and a default contacts database.
+ */
+void CTestContactsDbStep::DeleteDefaultCntsDb()   
+    {
+    delete iDb;
+    iDb = NULL;
+    
+    TRAPD(err,CContactDatabase::DeleteDefaultFileL());
+    if(err != KErrNone)
+        {
+    	_LIT(KNoDbDel,"Could not delete cnts default db, err = %d");
+        ERR_PRINTF2(KNoDbDel,err);  
+        SetTestStepResult(EFail);
+        }
+    }
+    
+    
+/**
+ * Implements a method to replace the default contacts database
+ */   
+void CTestContactsDbStep::ReplaceDefaultCntsDb()
+    {
+	TRAPD(err,iDb = CContactDatabase::ReplaceL())
+	if (err != KErrNone)
+	    {
+		_LIT(KNoRep,"Could not replace default contacts db, err = %d");
+		ERR_PRINTF2(KNoRep,err);
+		SetTestStepResult(EFail);
+	    }  
+    }
+
+
+/**
+ * @return TBool
+ * Implements a method to check the remote view definitions used
+ * by the cnts server when it is running. They are not necessarily
+ * the same as the view definitions stored in central repository.
+ * The views are fetched using a debug mode only, test API, and compared
+ * against the data in the ini file.
+ */
+TBool CTestContactsDbStep::CheckExistingViewDefsL()
+    {        
+ 	RPointerArray<CContactDefaultViewDefinition> existingViewDefs;
+ 	RContactViewSortOrder viewSortOrder;
+ 	 
+ 	TInt noOfViewsFromIni;
+ 	GetIntFromConfig(ConfigSection(),KNoOfViewsTag,noOfViewsFromIni);	 
+	
+	TRAPD(err,TContactViewStorePrivate::GetDefinitionsOfExistingViewsL(KNullDesC, existingViewDefs));
+	if ((err == KErrNone) && (existingViewDefs.Count() == noOfViewsFromIni))
+	     {
+	 	 for (TInt n = 0; n < noOfViewsFromIni; n++)
+	         {
+	         CContactDefaultViewDefinition* existingDefs = existingViewDefs[n];
+		     TBuf<KMaxTagLen>viewNameTag;
+		     TBuf<KMaxTagLen>pluginNameTag;
+		     TBuf<KMaxTagLen>viewPreferanceTag;
+		     TBuf<KMaxTagLen>viewTypeTag;
+		     TBuf<KMaxTagLen>sortOrderTag;
+		
+		     TPtrC viewNameFromIni;
+		     TPtrC pluginNameFromIni;
+		     TInt  viewPreferanceFromIni;
+		     TInt  viewTypeFromIni =0;
+		     TInt  sortOrderFromIni =0;
+		
+	         viewNameTag       = KViewNameTag;
+		     pluginNameTag     = KPluginNameTag;
+		     viewPreferanceTag = KViewPreferanceTag;
+		     viewTypeTag       = KViewTypeTag;
+		
+		     viewNameTag.AppendNum(n+1);
+		     pluginNameTag.AppendNum(n+1);
+		     viewPreferanceTag.AppendNum(n+1);
+		     viewTypeTag.AppendNum(n+1);
+		
+		     GetStringFromConfig(ConfigSection(),viewNameTag,viewNameFromIni);
+		     GetStringFromConfig(ConfigSection(),pluginNameTag,pluginNameFromIni);
+		     GetIntFromConfig(ConfigSection(),viewPreferanceTag,viewPreferanceFromIni);
+		     GetIntFromConfig(ConfigSection(),viewTypeTag,viewTypeFromIni);
+             
+             if ((existingDefs->ViewNameL().Compare(viewNameFromIni)) != KErrNone)
+		         {
+		         _LIT(KWrongName, "View Name does not match expected name in INI file");
+		         ERR_PRINTF1(KWrongName);
+		         return (EFalse);
+		         }
+		         
+		     //Truncate plugin name
+		     HBufC8 *buf = NULL;
+		     TRAPD(err1, buf = HBufC8::NewL(pluginNameFromIni.Size()));
+		     CleanupStack::PushL(buf);
+		
+		     if (err1 != KErrNone)
+		        {
+		        CleanupStack::PopAndDestroy(buf);
+			    return (EFalse);
+	    	    }
+	    	
+             TPtr8 tptr8pluginNameFromIni = buf->Des();
+             tptr8pluginNameFromIni.Copy(pluginNameFromIni);
+             if ((existingDefs->SortPluginNameL().Compare(tptr8pluginNameFromIni)) != KErrNone)
+                 {
+             	 _LIT(KNoMatch,"Plugin names dont match");
+             	 ERR_PRINTF1(KNoMatch);
+             	 return (EFalse);
+                 }
+             CleanupStack::PopAndDestroy(buf);
+		         
+		     if (existingDefs->ViewPreferences() != viewPreferanceFromIni)
+		         {
+		         _LIT(KVprefNoMatch,"ViewPreferances do not match");
+		         ERR_PRINTF1(KVprefNoMatch);
+		         return (EFalse);
+		         }
+		     
+		     CContactDefaultViewDefinition::TViewType viewType;
+	         if (viewTypeFromIni == 0)
+		         {			
+			     viewType = CContactDefaultViewDefinition::ERemoteView;
+		         }
+		     else if (viewTypeFromIni == 1)
+		         {
+			     viewType = CContactDefaultViewDefinition::ENamedRemoteView;
+		         }
+		     else
+		         {
+		         viewType = (CContactDefaultViewDefinition::TViewType)viewTypeFromIni;
+		         }
+		       
+		     if (existingDefs->ViewType() != viewType)
+		         {
+			     _LIT(KViewTypeNoMatch,"View Types do not match");
+		         ERR_PRINTF1(KViewTypeNoMatch);
+		         return (EFalse);
+		         }
+		         
+	     	viewSortOrder = existingDefs->SortOrder();
+		    TUid sortOrderUid = TUid::Null();
+								    
+		    sortOrderTag = KFirstSortOrderTag;
+	        sortOrderTag.AppendNum(n+1);
+	    	    
+		    if (GetIntFromConfig(ConfigSection(),sortOrderTag,sortOrderFromIni))						
+		        {
+			    sortOrderUid = TUid::Uid(sortOrderFromIni);
+					
+		        if (viewSortOrder[0] != sortOrderUid)
+	                {
+			        _LIT(KFirstSOWrong,"Incorrect first sort order received = %d");
+			        ERR_PRINTF2(KFirstSOWrong,viewSortOrder[0]);
+			        return (EFalse);
+			        }
+		        }
+			
+		    sortOrderTag = KSecondSortOrderTag;
+		    sortOrderTag.AppendNum(n+1);
+	
+		    if (GetIntFromConfig(ConfigSection(),sortOrderTag,sortOrderFromIni))
+		        {
+			    sortOrderUid = TUid::Uid(sortOrderFromIni);
+			
+		        if (viewSortOrder[1] != sortOrderUid)
+	                {
+			        _LIT(KSecondSOWrong,"Incorrect second sort order received = %d");
+			        ERR_PRINTF2(KSecondSOWrong,viewSortOrder[1]);
+			        return (EFalse);
+			        }
+		        }
+				
+		    sortOrderTag = KThirdSortOrderTag;
+		    sortOrderTag.AppendNum(n+1);
+		
+		    if (GetIntFromConfig(ConfigSection(),sortOrderTag,sortOrderFromIni))
+		        {
+			    sortOrderUid = TUid::Uid(sortOrderFromIni);
+			
+		        if (viewSortOrder[2] != sortOrderUid)
+	                {
+		            _LIT(KThirdSOWrong,"Incorrect third sort order received = %d");
+			        ERR_PRINTF2(KThirdSOWrong,viewSortOrder[2]);
+			        return (EFalse);
+			        }
+		        }
+					    
+	         }
+	     viewSortOrder.Close();
+	     }
+	 else
+	     {
+	 	 _LIT(KErrExistingView,"Problem with GetDefinitionsOfExistingViewsL(existingViewDefs)");
+	 	 ERR_PRINTF1(KErrExistingView);
+	 	 return (EFalse);
+	     }
+	     
+	 return (ETrue);
+    }
+
+
+/**
+ * @param aNumber of contact items
+ * Implements a simple method to a number of contact items to the
+ * the default database.
+*/    
+void  CTestContactsDbStep::AddContactsL(TInt aNumber)
+    {
+    OpenDefaultCntsDb();
+    if (iDb == NULL)
+        {
+    	SetTestStepResult(EFail);
+        }
+    else
+        {
+    	CContactItemViewDef* viewAll = CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,
+                                                                 CContactItemViewDef::EIncludeHiddenFields);
+                                       
+        viewAll->AddL(KUidContactFieldMatchAll);
+        CleanupStack::PushL(viewAll);
+                                         
+        CContactTemplate* cntTemplate = STATIC_CAST(CContactTemplate*,iDb->ReadContactL(iDb->TemplateId(),*viewAll));
+        CleanupStack::PushL(cntTemplate);
+       
+	    CContactCard* contact = CContactCard::NewLC(cntTemplate);
+	    for(TInt i = 0; i < aNumber; i++)
+	        {		
+	        iDb->AddNewContactL(*contact);
+	        }
+	    	
+	    TContactIter hh(*iDb);
+	    _LIT(KText,"someDummyTextInFields");	
+	    CContactItem *contactItem = iDb->OpenContactL( hh.NextL(), *viewAll );
+	    CleanupStack::PushL(contactItem);
+	    SetManyFieldsL(contactItem->CardFields(),KText,20);
+	    iDb->CommitContactL(*contactItem);
+	    
+	    CleanupStack::PopAndDestroy(contactItem);	    
+	    CleanupStack::PopAndDestroy(contact);    
+        CleanupStack::PopAndDestroy(cntTemplate);
+        CleanupStack::PopAndDestroy(viewAll);
+        }
+    
+    }
+    
+/*sets a specific contact field to a value as determined by its type.
+field at aPos in aFields is set to aText*/
+void CTestContactsDbStep::SetFieldL(CContactItemFieldSet &aFields, const TInt aPos, const TDesC& aText)
+	{
+	CContactItemField &field = aFields[aPos];
+	if( field.IsTemplateLabelField() )
+		{
+		return;
+		}
+		
+	if( 0 == aText.Size() )
+		{
+		return;
+		}
+	
+	switch(field.StorageType())
+		{
+		case KStorageTypeText:
+			field.TextStorage()->SetTextL(aText);
+		break;
+		case KStorageTypeStore:
+			{
+			HBufC8 *buf = HBufC8::NewLC(aText.Size());
+			TPtr8 tptr8 = buf->Des();
+			tptr8.Copy(aText);
+			field.StoreStorage()->SetThingL(*buf);
+			CleanupStack::PopAndDestroy(buf);
+			}
+		break;
+		case KStorageTypeContactItemId:
+			{
+			field.AgentStorage()->SetAgentId(0);
+			}
+		break;
+		case KStorageTypeDateTime:
+			{			
+			field.DateTimeStorage()->SetTime( TTime(0) );
+			}
+		break;
+		default:
+			User::Panic(aText,EInvariantFalse);
+		break;
+		}
+	}
+
+void CTestContactsDbStep::SetManyFieldsL(CContactItemFieldSet &aFields, const TDesC& aText, const TInt aMany)
+	{
+	TInt count = aFields.Count();
+	if( count > aMany )
+		{
+		count = aMany;
+		}
+		
+	TInt i = 0;
+	for(; i < count; ++i)
+        {
+		SetFieldL(aFields, i,aText);
+		}
+	}