diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/TestContactViewAccessStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/TestContactViewAccessStep.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,691 @@ +// Copyright (c) 2007-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 "TestContactViewAccessStep.h" + +/** + * Constructor + */ +CTestContactViewAccessStep::CTestContactViewAccessStep() + { + // Unique loggind Id for the test step + SetTestStepName(KTestContactViewAccessStep); + } + +/** + * Destructor + */ +CTestContactViewAccessStep::~CTestContactViewAccessStep() + { + + if(iViewCollection) + { + delete iViewCollection; + } + delete iViewValidation; + delete iContactViewTest; + delete iContactUtility; + delete iBackupHelper; + } + +/** + * Base class pure virtual. + * @return EPass or EFail indicating the result of the test step. + */ +TVerdict CTestContactViewAccessStep::doTestStepPreambleL() + { + iActiveScheduler = new (ELeave) CActiveScheduler; + CActiveScheduler::Install(iActiveScheduler); + + CTestStep* self = static_cast(this); + iBackupHelper = CBackupRestoreHelper::NewL(*self); + + // Create utility objects + CreateUtilityClassL(); + + // File from where contacts must be imported + TPtrC importFileName; + TBool filePresent; + filePresent = GetStringFromConfig(ConfigSection(), SharedConstants::KFileToBeImported, importFileName); + + TBool pbapBased = EFalse; + GetBoolFromConfig(ConfigSection(), SharedConstants::KVCardVersionPBAP, pbapBased); + if(filePresent) + { + iContactUtility->ImportVcardContactsL(importFileName, pbapBased); + } + + return CTestStep::doTestStepPreambleL(); + } + +/** + * Base class pure virtual. + * @return EPass or EFail indicating the result of the test step. + */ +TVerdict CTestContactViewAccessStep::doTestStepL() + { + TPtrC listOfViews; + GetStringFromConfig(ConfigSection(), SharedConstants::KListOfViews, listOfViews); + + /* Get the list of views from ini and construct the view like local view/remote view/named remote view/ + find view/filtered view/group view/concatenated view or sub view based on the requirement */ + RArray sections; + iContactUtility->TokenizeStringL(listOfViews, sections); + iContactUtility->ConstructViewsL(sections); //section is destroyed in ConstructViewsL + + AccessViewsL(); + TestViewsUnderBackupRestoreL(); + + return TestStepResult(); + } + +/** + * Test the view API's like AtL(), AllFieldsLC(), ContactAtL(), ContactL(), CountL(), SortOrder(), + * ViewPreferences(), RefineFindView(), ContactsMatchingCriteria() and ContactsMatchingPrefixL() + * based on the sections given in the ini file. + * @param aSection ini sections + */ +void CTestContactViewAccessStep::TestViewAPIsL(const RArray& aSection) + { + // Based on the data specified in the ini file, test the view API's + for ( TInt i = 0; i < aSection.Count(); ++i ) + { + TPtrC viewAccessSection = aSection[i]; + + // Get the desired view based on the input given from the ini file + CContactViewBase* viewBase = iContactUtility->GetDesiredView(viewAccessSection); + CleanupStack::PushL(viewBase); + + TBool testAtLAPI = EFalse; + GetBoolFromConfig(viewAccessSection, KTestAtLAPI, testAtLAPI); + if ( testAtLAPI ) + { + // Function to test the AtL() API which returns the contact item id for the specified index + TestContactViewAtL(viewAccessSection, viewBase); + } + + TBool testContactAtLAPI = EFalse; + GetBoolFromConfig(viewAccessSection, KTestContactAtLAPI, testContactAtLAPI); + if ( testContactAtLAPI ) + { + // Function to test the ContactAtL() API which returns the contact item + TestContactAtL(viewAccessSection, viewBase); + } + + TBool testCountLAPI = EFalse; + GetBoolFromConfig(viewAccessSection, KTestCountLAPI, testCountLAPI); + if ( testCountLAPI ) + { + // Function to test the CountL() which returns the no. of contact items in the view + TestCountL(viewAccessSection, viewBase); + } + + TBool testAllFieldsAPI = EFalse; + GetBoolFromConfig(viewAccessSection, KTestAllFieldsAPI, testAllFieldsAPI); + if ( testAllFieldsAPI ) + { + // Function to test the AllFieldsLC() API which returns the fields of the contact item + TestContactFieldsL(viewAccessSection, viewBase); + } + + TBool testFindLAPI = EFalse; + GetBoolFromConfig(viewAccessSection, KTestFindLAPI, testFindLAPI); + if ( testFindLAPI ) + { + // Function to test the FindL() API which returns the index of the contact item + TestFindL(viewAccessSection, viewBase); + } + + TBool testSortOrder = EFalse; + GetBoolFromConfig(viewAccessSection, KTestSortOrder, testSortOrder); + if ( testSortOrder ) + { + // Function to test the SortOrder() API which returns the view's sort order + TestSortOrderL(viewAccessSection, viewBase); + } + + TBool testViewPreferences = EFalse; + GetBoolFromConfig(viewAccessSection, KTestViewPreferences, testViewPreferences); + if ( testViewPreferences ) + { + // Function to test the ViewPreferences() API which returns the view preferences + TestContactViewPreferencesL(viewAccessSection, viewBase); + } + + TBool refineFindView = EFalse; + GetBoolFromConfig(viewAccessSection, KRefineFindView, refineFindView); + if ( refineFindView ) + { + TInt index; + GetIntFromConfig(viewAccessSection, SharedConstants::KIndex, index); + // Get the desired view based on the input given from the ini file + CContactFindView* view = iViewCollection->GetDesiredFindView(index); + TPtrC searchWords; + GetStringFromConfig(viewAccessSection, KSearchWords, searchWords); + iContactViewTest->RefineFindViewL(searchWords, view, iContactUtility); + } + + TBool testContactsMatchingCriteria = EFalse; + GetBoolFromConfig(viewAccessSection, KTestContactsMatchingCriteria, testContactsMatchingCriteria); + // if contactMatchingCriteria is set to true, then get the contacts matching the specified words + if ( testContactsMatchingCriteria ) + { + TPtrC findWords; + GetStringFromConfig(viewAccessSection, KFindWords, findWords); + TPtrC errorCondition; + GetStringFromConfig(viewAccessSection, KErrorCondition, errorCondition); + RPointerArray matchContactArray = iContactViewTest->GetContactsMatchingCriteriaL(findWords, viewBase, iContactUtility, errorCondition); + CleanupClosePushL(matchContactArray); + if(matchContactArray.Count() != 0) + { + iViewValidation->ValidateCountL(viewAccessSection, matchContactArray.Count()); + } + CleanupStack::PopAndDestroy(&matchContactArray); + } + + TBool testContactsMatchingPrefix = EFalse; + GetBoolFromConfig(viewAccessSection, KTestContactsMatchingPrefix, testContactsMatchingPrefix); + + // if contactsMatchingPrefix is set to true, then get the contacts where the contacts matches with the prefix + if ( testContactsMatchingPrefix ) + { + TPtrC errorCondition; + GetStringFromConfig(viewAccessSection, KErrorCondition, errorCondition); + TPtrC searchWords; + GetStringFromConfig(viewAccessSection, KSearchWords, searchWords); + RPointerArray matchContactArray = iContactViewTest->GetContactsMatchingPrefixL(searchWords, viewBase, iContactUtility, errorCondition); + CleanupClosePushL(matchContactArray); + if(matchContactArray.Count() != 0) + { + iViewValidation->ValidateCountL(viewAccessSection, matchContactArray.Count()); + } + CleanupStack::PopAndDestroy(&matchContactArray); + } + TBool testSearchContact = EFalse; + GetBoolFromConfig(viewAccessSection, KTestSearchContactId, testSearchContact); + + // if testSearchContact is set to true, then get the contacts which is having that search word and verify its index + if(testSearchContact) + { + TPtrC errorCondition; + GetStringFromConfig(viewAccessSection, KErrorCondition, errorCondition); + viewBase = iContactUtility->GetDesiredView(viewAccessSection); + TPtrC searchWords; + GetStringFromConfig(viewAccessSection, KSearchWords, searchWords); + RPointerArray matchContactArray = iContactViewTest->GetContactsMatchingCriteriaL(searchWords, viewBase, iContactUtility, errorCondition); + CleanupClosePushL(matchContactArray); + if(matchContactArray.Count()!=0 ) + { + TInt index = iContactViewTest->FindL(matchContactArray[0]->Id(), viewBase, errorCondition); + iViewValidation->ValidateFindL(viewAccessSection, index); + } + else + { + ERR_PRINTF2(KContactNotFound, matchContactArray.Count()); + SetTestStepResult(EFail); + } + CleanupStack::PopAndDestroy(&matchContactArray); + } + + TBool testContactssortorderchange = EFalse; + GetBoolFromConfig(viewAccessSection, KTestContactssortorderchange, testContactssortorderchange); + + // if testContactssortorderchange is set to true, then change the sort order of the desired view + if ( testContactssortorderchange ) + { + iContactViewTest->TestChangeSortOrderL(viewAccessSection, iContactUtility); + } + CleanupStack::Pop(viewBase); + } + } + +/** + * Verify and validate the Contact item id returned by the AtL() API + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestContactViewAtL(const TPtrC& aSection, CContactViewBase* aView) + { + TPtrC errorCondition; + GetStringFromConfig(aSection, KErrorCondition, errorCondition); + // Get the required data for AtL() API from the ini file + TInt index = iContactViewTest->GetAtLApiDataFromIni(aSection); + // Call the AtL() API by passing the index and the desired view + TInt desiredContactItemId = iContactViewTest->AtL(index, aView, errorCondition); + // validate the returned contact item id with the expected contact item id + if(desiredContactItemId != -1) + { + iViewValidation->ValidateAtLApi(desiredContactItemId, aSection); + } + } + +/** + * Verify and Validate the contact item returned by the ContactAtL() API + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestContactAtL(const TPtrC& aSection, CContactViewBase* aView) + { + TInt index = iContactViewTest->GetContactAtLApiDataFromIni(aSection); + CViewContact* desiredContactItem = iContactViewTest->ContactAtL(index, aView); + if(desiredContactItem != NULL) + { + CleanupStack::PushL(desiredContactItem); + iViewValidation->ValidateContactAtLApi(desiredContactItem, aSection); + CleanupStack::PopAndDestroy(desiredContactItem); + } + } + +/** + * Verify and validate the count returned by the CountL() API + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestCountL(const TPtrC& aSection, CContactViewBase* aView) + { + TInt count = 0; + TRAPD( err, count = aView->CountL()); + if ( err != KErrNone ) + { + SetTestStepError(err); + SetTestStepResult(EFail); + } + else + { + iViewValidation->ValidateCountL(aSection, count); + } + } + +/** + * Verify and validate the index returned by the FindL() API + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestFindL(const TPtrC& aSection, CContactViewBase* aView) + { + TPtrC errorCondition; + GetStringFromConfig(aSection, KErrorCondition, errorCondition); + TInt id = iContactViewTest->GetFindLApiDataFromIni(aSection); + TInt index = iContactViewTest->FindL(id, aView, errorCondition); + if(index > -1) + { + iViewValidation->ValidateFindL(aSection, index); + } + } + +/** + * Verify and validate the fields returned by the AllFieldsLC() API. + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestContactFieldsL(const TPtrC& aSection, CContactViewBase* aView) + { + HBufC* fields = NULL; + TBool invalidData = EFalse; + GetBoolFromConfig(aSection, KInvalidData, invalidData); + if(invalidData) + { + //If ivalid data is passed then in udeb mode it is panic but in urel mode it is returning NULL + #ifndef _DEBUG + TRAPD( err, fields = iContactViewTest->GetAllFieldsLDataFromIniL(aSection, aView)); + if ( err != KErrNone ) + { + SetTestStepError(err); + SetTestStepResult(EFail); + } + else + { + if(fields != NULL) + { + // Append fields one by one to the fieldArray + RArray fieldArray; + iContactUtility->TokenizeStringL(*fields, fieldArray); + iViewValidation->ValidateAllFieldsL(aSection, fieldArray, aView, iContactViewTest); + } + else + { + INFO_PRINTF2(KInfoContactFields,&fields); + SetTestStepResult(EFail); + } + } + #else + SetTestStepResult(EFail); + #endif + } + else + { + TRAPD( err, fields = iContactViewTest->GetAllFieldsLDataFromIniL(aSection, aView)); + if ( err != KErrNone ) + { + SetTestStepError(err); + SetTestStepResult(EFail); + } + else + { + if(fields != NULL) + { + // Append fields one by one to the fieldArray + RArray fieldArray; + iContactUtility->TokenizeStringL(*fields, fieldArray); + iViewValidation->ValidateAllFieldsL(aSection, fieldArray, aView, iContactViewTest); + } + else + { + INFO_PRINTF2(KInfoContactFields,&fields); + SetTestStepResult(EFail); + } + } + } + } + +/** + * Verify and validate the contact view preferences + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestContactViewPreferencesL(const TPtrC& aSection, CContactViewBase* aView) + { + TContactViewPreferences desiredViewPreferences = iContactViewTest->ContactViewPreferences(aView); + iViewValidation->ValidateViewPreferencesL(aSection, desiredViewPreferences, iContactUtility); + } + +/** + * Verify and validate the sort order returned by the SortOrderL() API + * @param aSection ini section + * @param aView desired view + */ +void CTestContactViewAccessStep::TestSortOrderL(const TPtrC& aSection, CContactViewBase* aView) + { + TPtrC errorCondition; + GetStringFromConfig(aSection, KErrorCondition, errorCondition); + // Get the sort order for the desired view + RContactViewSortOrder contactViewSortOrder = iContactViewTest->GetSortOrderL(aView, errorCondition); + // Get the uid's of the retrieved sort order + TPtrC sortOrder; + GetStringFromConfig(aSection, KSortOrder, sortOrder); + RContactViewSortOrder viewSortOrder = iContactUtility->ConvertStringToSortOrderL(sortOrder); + // iterate through the Uid's and validate them + for ( TInt i = 0; i < contactViewSortOrder.Count(); ++i ) + { + TUid expectedUid = viewSortOrder[i]; + TUid uid = contactViewSortOrder[i]; + iViewValidation->ValidateSortOrderL(uid, expectedUid); + } + } + +/** + * Create objects of CContactUtilitiesCollection, CContactViewApiTest and CContactViewValidation + */ +void CTestContactViewAccessStep::CreateUtilityClassL() + { + TBool createDataBase = ETrue; + GetBoolFromConfig(ConfigSection(), SharedConstants::KCreateDataBase, createDataBase); + GetStringFromConfig(ConfigSection(), SharedConstants::KDbName, iDbName); + + iCntDb = CreateAndOpenDataBaseL(iDbName, createDataBase); + iViewCollection = CContactViewCollection::NewL(); + // Create Utility class object, to export the contact from database + CTestStep* self = static_cast(this); + CleanupStack::PushL(self); + iContactUtility = CContactUtilitiesCollection::NewL(*self, DatabaseReference(), ViewCollectionReference()); + iContactViewTest = CContactViewApiTest::NewL(self); + iViewValidation = new(ELeave) CContactViewValidation(self); + CleanupStack::Pop(self); + } + +/** + * Return the database reference + * @return iCntDb + */ +CContactDatabase& CTestContactViewAccessStep::DatabaseReference() + { + return *iCntDb; + } + +/** + * Return the viewcollection reference + * @return iViewCollection + */ +CContactViewCollection& CTestContactViewAccessStep::ViewCollectionReference() + { + return *iViewCollection; + } + + +/** + * Create and open the contact database + * @param aDbName database to be created/ opened + * @return CContactDatabase* + */ +CContactDatabase* CTestContactViewAccessStep::CreateAndOpenDataBaseL(const TPtrC& aDbName, TBool aCreateDataBase) + { + HBufC* dbName = HBufC::NewLC(aDbName.Length()); + dbName->Des().Copy(aDbName); + CContactDatabase* cntDb = NULL; + if( aCreateDataBase ) + { + TInt err = 0; + // Replace the existing database and opens it + if( aDbName != KNullDesC() ) + { + TRAP(err, cntDb = CContactDatabase::ReplaceL(dbName->Des())); + } + else //if database name is not given then create and open the default DB + { + TRAP(err, cntDb = CContactDatabase::ReplaceL()); + } + + if( err != KErrNone ) + { + ERR_PRINTF2(KErrInCreateDataBase, err); + SetTestStepResult(EFail); + SetTestStepError(err); + } + } + else + { + TRAPD(err, cntDb = CContactDatabase::OpenL(dbName->Des())); + if( err != KErrNone ) + { + ERR_PRINTF2(KErrInOpen, err); + SetTestStepResult(EFail); + SetTestStepError(err); + } + } + CleanupStack::PopAndDestroy(dbName); + return cntDb; + } + +/** + * Base class pure virtual. + * @return EPass or EFail indicating the result of the test step. + */ +TVerdict CTestContactViewAccessStep::doTestStepPostambleL() + { + delete iViewCollection; + iViewCollection = NULL; + // Delete the database if the variable deleteDatabase is set to true + TBool deleteDataBase = EFalse; + GetBoolFromConfig(ConfigSection(), SharedConstants::KDeleteDataBase, deleteDataBase); + delete iCntDb; + iContactUtility->DeleteDataBase(deleteDataBase, iDbName); + return CTestStep::doTestStepPostambleL(); + } + +/** + * Access Contact View Apis and validate their behaviour + */ +void CTestContactViewAccessStep::AccessViewsL() + { + TPtrC viewAccessList; + GetStringFromConfig(ConfigSection(), KViewAccessList, viewAccessList); + + /* if the view access list is defined in the ini then test the views api's like CountL(), AtL(), ContactAtL(), + FindL(), SortOrder(), ViewPreferences(), AllFieldsLC(), RefineFindView(), GetContactsMatchingCriteria() + and GetContactsMatchingPrefix() for the desired view */ + if ( viewAccessList != KNullDesC() ) + { + RArray accessList; + CleanupClosePushL(accessList); + iContactUtility->TokenizeStringL(viewAccessList, accessList); + TestViewAPIsL(accessList); + CleanupStack::PopAndDestroy(&accessList); + } + } + + +/** + * Access Contact View Apis under backup restore conditions + */ +void CTestContactViewAccessStep::TestViewsUnderBackupRestoreL() + { + _LIT(KViewAccessUnderBackupRestore, "ViewAccessUnderBackupRestore"); + TBool viewAccessUnderBackupRestore = EFalse; + GetBoolFromConfig(ConfigSection(), KViewAccessUnderBackupRestore, viewAccessUnderBackupRestore); + + if(!viewAccessUnderBackupRestore) + { + return; + } + + InitateBackupL(); + AccessViewsL(); + + StopBackupL(); + AccessViewsL(); + + InitiateRestoreL(); + AccessViewsL(); + + StopRestoreL(); + AccessViewsL(); + } + +/** + * Initate a system wide backup operation + */ +void CTestContactViewAccessStep::InitateBackupL() + { + iBackupHelper->StartBackupL(); + } +/** + * Stop the system wide backup operation + */ +void CTestContactViewAccessStep::StopBackupL() + { + iBackupHelper->EndBackupL(); + } +/** + * Initate a system wide restore operation + */ +void CTestContactViewAccessStep::InitiateRestoreL() + { + iBackupHelper->StartRestoreL(); + } +/** + * Stop the system wide restore operation + */ +void CTestContactViewAccessStep::StopRestoreL() + { + iBackupHelper->EndBackupL(); + } + +/** + * Initate a system wide restore operation + */ +CBackupRestoreHelper* CBackupRestoreHelper::NewL(CTestStep& aTestStep) + { + CBackupRestoreHelper* self = new(ELeave) CBackupRestoreHelper(aTestStep); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +/** + * Class CBackupRestoreHelper - Constructor + * @param aTestStep - Reference to current test step, used to read data from the ini file + */ +CBackupRestoreHelper::CBackupRestoreHelper(CTestStep& aTestStep) +:iBaseTestStep(aTestStep) + { + } + +/** + * Class CBackupRestoreHelper - second level constructor + */ +void CBackupRestoreHelper::ConstructL() + { + /** Initialise the drive list to empty and then get drive list data from + File Server. + Required before Backup and Restore testing + */ + iFs.Connect(); + iDriveList.FillZ(); + User::LeaveIfError(iFs.DriveList(iDriveList)); + iBackupClient = conn::CSBEClient::NewL(); + } + +/** + * Class CBackupRestoreHelper - destructor + */ +CBackupRestoreHelper::~CBackupRestoreHelper() + { + delete iBackupClient; + iFs.Close(); + } + +/** + * Uses the Secure Backup Engine API and starts a backup. + */ +void CBackupRestoreHelper::StartBackupL() + { + iBackupClient->SetBURModeL(iDriveList, conn::EBURBackupFull, conn::EBackupBase); + } + +/** + * Uses the Secure Backup Engine API and ends backup. + */ +void CBackupRestoreHelper::EndBackupL() + { + iBackupClient->SetBURModeL(iDriveList, conn::EBURNormal, conn::ENoBackup); + } + +/** + * Uses the Secure Backup Engine API and starts a restore. + */ +void CBackupRestoreHelper::StartRestoreL() + { + iBackupClient->SetBURModeL(iDriveList, conn::EBURRestoreFull, conn::EBackupBase); + } + +/** + * Uses the Secure Backup Engine API and ends restore. + */ +void CBackupRestoreHelper::EndRestoreL() + { + /** Use the Secure Backup Engine API to "end" a restore. */ + iBackupClient->SetBURModeL(iDriveList, conn::EBURNormal, conn::ENoBackup); + } + + +/** + * Reference to TestStep, used for retreiving ini data, printing operations etc.. + */ +CTestStep& CBackupRestoreHelper::BaseTestStepReference() + { + return(iBaseTestStep); + }