diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/t_connec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/t_connec.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,380 @@ +// Copyright (c) 1997-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 +#include +#include "T_UTILS.H" +#include + + +_LIT(KDatabaseFileName,"c:t_connec"); +_LIT(KCntTestName,"Connectivity functionality tests"); +_LIT(KCntContactName,"Contact %d"); + +const TInt KTotalNumRecords=10; + +GLDEF_D TLocale OriginalLocale; +GLDEF_D CCntTest* CntTest = NULL; +GLDEF_D RTest test(KCntTestName); + + + + +/** Set the contents of a text field */ +LOCAL_C void SetNameL(CContactItem& aItem,TUid aType,const TDesC& aName) + { + CContactItemFieldSet& fieldSet=aItem.CardFields(); + const TInt pos=fieldSet.Find(aType); + if (pos!=KErrNotFound) + fieldSet[pos].TextStorage()->SetTextL(aName); + } + + +/** Populate the database */ +LOCAL_C void PopulateDatabaseL(TInt aNumberToPopulate) + { + for (TInt i=0;i name; + name.Format(KCntContactName,i); + SetNameL(*item,KUidContactFieldGivenName,name); + CntTest->Db()->AddNewContactL(*item); + CleanupStack::PopAndDestroy(item); + } + CntTest->Db()->CompactL(); + } + + + + + +LOCAL_C void TestFilteringL() + { + _LIT(KProgressIndicator,"."); + test.Printf(KProgressIndicator); + + CCntFilter* filter = CCntFilter::NewL(); + CleanupStack::PushL(filter); + + filter->SetContactFilterTypeCard(ETrue); + TTime time; + time.UniversalTime(); + time-=TTimeIntervalMinutes(20); // changes in the last 20 mins + filter->SetFilterDateTime(time); + filter->SetIncludeNewContacts(ETrue); + CntTest->Db()->FilterDatabaseL(*filter); + test(filter->iIds->Count()==KTotalNumRecords); + +// modified contact + User::After(4000000); // Let time pass to distinguish between mod / new + // this may still fail if the device is running too slow (e.g. under a heavy load) + + filter->Reset(); + time.UniversalTime(); + filter->SetFilterDateTime(time); + filter->SetIncludeModifiedContacts(ETrue); + CntTest->Db()->FilterDatabaseL(*filter); + test(filter->iIds->Count()==0); + + CContactItem* contact = CntTest->Db()->OpenContactLX(5); + CleanupStack::PushL(contact); + contact->IncAccessCount(); + CntTest->Db()->CommitContactL(*contact); + CleanupStack::PopAndDestroy(contact); + CleanupStack::Pop(); // contact.Close() + + CntTest->Db()->FilterDatabaseL(*filter); + test(filter->iIds->Count()==1); + +// deleted contact + filter->Reset(); + filter->SetFilterDateTime(time); // same time as for modified + filter->SetIncludeDeletedContacts(ETrue); + CntTest->Db()->FilterDatabaseL(*filter); + test(filter->iIds->Count()==0); + + CntTest->Db()->DeleteContactL(5); + CntTest->Db()->FilterDatabaseL(*filter); + TInt deletedContactCount = filter->iIds->Count(); + test(deletedContactCount ==1); + +#ifdef _DEBUG + CContactIdArray* deletedCntArray = CntTest->Db()->DeletedContactsLC(); + test(deletedCntArray->Count()==deletedContactCount); + CleanupStack::PopAndDestroy(deletedCntArray ); +#endif + + CleanupStack::PopAndDestroy(filter); + } + +LOCAL_C void SimpleFilterTestL() + { + CCntFilter* filter = CCntFilter::NewL(); + CleanupStack::PushL(filter); + filter->SetContactFilterTypeCard(ETrue); + TTime time; + time.UniversalTime(); + time-=TTimeIntervalMinutes(20); // changes in the last 20 mins + filter->SetFilterDateTime(time); + filter->SetIncludeNewContacts(ETrue); + CntTest->Db()->FilterDatabaseL(*filter); + test(filter->iIds->Count()==KTotalNumRecords); + CleanupStack::PopAndDestroy(filter); + } + +LOCAL_C void NonDateBasedFilterTest() + { + //This test has been created because, formerly, + //CContactDatabase::FilterDatabase(...) could not + //filter on contact types ONLY. + //Previously, the CCntFilter passed in had to + //have specified filtering based on the + //time-based states as well (e.g. new, modified, deleted). + //Addresses DEF036345 + CCntFilter* theFilter = CCntFilter::NewLC(); + theFilter->SetContactFilterTypeGroup(EFalse); + theFilter->SetContactFilterTypeTemplate(EFalse); + theFilter->SetContactFilterTypeOwnCard(EFalse); + theFilter->SetContactFilterTypeCard(ETrue); + //Get a filtered version of the database + CntTest->Db()->FilterDatabaseL(*theFilter); + test(theFilter->iIds->Count()==KTotalNumRecords); + CleanupStack::PopAndDestroy(theFilter); + } + +// Regression testcode for EDNJKAA-4WLDAY +// "Cannot synchronise Outlook contacts with German device" +// +// Tests filtering under the following conditions +// Time & date separator '.' +// Time separator ':', date separator '.' +// Time & date separator ':' +// Time separator '.', date separator ':' +// +LOCAL_C void TestFilterLocalesL() + { + SimpleFilterTestL(); + NonDateBasedFilterTest(); + TInt i=0; + TLocale example; + example.SetDateFormat(EDateEuropean); + for (i=0; i<4; i++) + { + example.SetTimeSeparator(TChar('.'),i); + example.SetDateSeparator(TChar('.'),i); + } + example.Set(); + SimpleFilterTestL(); + + example.SetDateFormat(EDateAmerican); + for (i=0; i<4; i++) + { + example.SetTimeSeparator(TChar(':'),i); + } + example.Set(); + SimpleFilterTestL(); + + example.SetDateFormat(EDateJapanese); + for (i=0; i<4; i++) + { + example.SetDateSeparator(TChar(':'),i); + } + example.Set(); + SimpleFilterTestL(); + + for (i=0; i<4; i++) + { + example.SetTimeSeparator(TChar('.'),i); + } + example.Set(); + SimpleFilterTestL(); + } + + +LOCAL_C void TestSyncUid() + { + // test sync / connectivity + + TTime time; + time.UniversalTime(); + TContactSyncId newSyncId = CntTest->Db()->SetLastSyncDateL(time); + TTime newTime; + CntTest->Db()->GetLastSyncDateL(newSyncId,newTime); + test(newTime==time); + User::After(1000000); + time.UniversalTime(); + CntTest->Db()->SetLastSyncDateL(newSyncId, time); + TTime latestTime; + CntTest->Db()->GetLastSyncDateL(newSyncId,latestTime); + test(latestTime > newTime); + test(latestTime==time); + test(newTime!=time); + CntTest->Db()->SetLastSyncDateL(newSyncId++, time); + } + +// SetInclude* are exclusive +// SetContactFilterType* is cumulative +// +LOCAL_C void CheckFilterSettingsL(TBool aSetting) + { + CCntFilter* filter = CCntFilter::NewLC(); + + filter->Reset(); + filter->SetIncludeModifiedContacts(aSetting); + if (aSetting) + { + test(filter->IncludeModifiedContacts()); + test(!filter->IncludeNewContacts()); + test(!filter->IncludeDeletedContacts()); + } + + filter->SetIncludeNewContacts(aSetting); + if (aSetting) + { + test(filter->IncludeNewContacts()); + test(!filter->IncludeModifiedContacts()); + test(!filter->IncludeDeletedContacts()); + } + + + filter->SetIncludeDeletedContacts(aSetting); + if (aSetting) + { + test(filter->IncludeDeletedContacts()); + test(!filter->IncludeModifiedContacts()); + test(!filter->IncludeNewContacts()); + } + + filter->SetContactFilterTypeCard(aSetting); + filter->SetContactFilterTypeGroup(aSetting); + filter->SetContactFilterTypeTemplate(aSetting); + filter->SetContactFilterTypeOwnCard(aSetting); + if (aSetting) + { + test(filter->ContactFilterTypeGroup()); + test(filter->ContactFilterTypeCard()); + test(filter->ContactFilterTypeTemplate()); + test(filter->ContactFilterTypeOwnCard()); + } + else + { + test(!filter->ContactFilterTypeGroup()); + test(!filter->ContactFilterTypeCard()); + test(!filter->ContactFilterTypeTemplate()); + test(!filter->ContactFilterTypeOwnCard()); + } + + filter->SetContactFilterTypeALL(aSetting); + if (aSetting) + { + test(filter->ContactFilterTypeALL()); + test(filter->ContactFilterTypeGroup()); + test(filter->ContactFilterTypeCard()); + test(filter->ContactFilterTypeTemplate()); + test(filter->ContactFilterTypeOwnCard()); + } + + TTime time; + time.UniversalTime(); + filter->SetFilterDateTime(time); + test(filter->GetFilterDateTime()==time); + + CleanupStack::PopAndDestroy(filter); + } + + +// Construction tests +// NewL methods are called by NewLC variants so there's no tests for that +// +LOCAL_C void TestFilterConstructionL() + { + CCntFilter* filter = CCntFilter::NewLC(); + TTime time; + time.UniversalTime(); + filter->SetFilterDateTime(time); + + CCntFilter* clone = CCntFilter::NewLC(filter); + test(clone->GetFilterDateTime()==time); + + CleanupStack::PopAndDestroy(2); //filter,clone + } + +LOCAL_C void TestFilterL() + { + CheckFilterSettingsL(ETrue); + CheckFilterSettingsL(EFalse); + TestFilterConstructionL(); + TestFilteringL(); + } + +LOCAL_C void RetrieveLocale(TAny *) + { + OriginalLocale.Set(); + } + +/** + +@SYMTestCaseID PIM-T-CONNEC-0001 + +*/ + +LOCAL_C void DoTestsL() + { + test.Start(_L("@SYMTESTCaseID:PIM-T-CONNEC-0001 Connectivity functionality tests")); + + + OriginalLocale.Refresh(); + CleanupStack::PushL(TCleanupItem(RetrieveLocale, 0)); + + CntTest->CreateDatabaseL(); + CntTest->OpenDatabaseL(); + PopulateDatabaseL(KTotalNumRecords); + + + TestFilterL(); + + TestFilterLocalesL(); + + TRAPD(err,TestSyncUid()); + test(err==KErrNone); + + CntTest->CloseDatabase(); + CntTest->DeleteDatabaseL(); + CleanupStack::PopAndDestroy(); // locale + } + +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + CntTest = new CCntTest; + if (!CntTest) + { + return KErrNoMemory; + } + + CntTest->ConstructL(test,KDatabaseFileName); + TRAPD(err,DoTestsL()); + test.Printf(_L("\n")); + CntTest->EndTestLib(err); + __UHEAP_MARKEND; + return KErrNone; + }