phonebookengines_old/contactsmodel/tsrc/t_connec.cpp
branchGCC_SURGE
changeset 41 d11de32a5e6f
parent 40 b46a585f6909
equal deleted inserted replaced
38:11319788d38f 41:d11de32a5e6f
       
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include <e32test.h>
       
    17 #include <f32file.h>
       
    18 #include <s32file.h>
       
    19 #include <s32mem.h>
       
    20 #include <cntdb.h>
       
    21 #include <cntitem.h>
       
    22 #include <cntfield.h>
       
    23 #include <cntfldst.h>
       
    24 #include "T_UTILS.H"
       
    25 #include <cntfilt.h>
       
    26 
       
    27 
       
    28 _LIT(KDatabaseFileName,"c:t_connec");
       
    29 _LIT(KCntTestName,"Connectivity functionality tests");
       
    30 _LIT(KCntContactName,"Contact %d");
       
    31 
       
    32 const TInt KTotalNumRecords=10;
       
    33 
       
    34 GLDEF_D TLocale OriginalLocale;
       
    35 GLDEF_D CCntTest* CntTest = NULL;
       
    36 GLDEF_D RTest test(KCntTestName);
       
    37 
       
    38 
       
    39 
       
    40 
       
    41 /** Set the contents of a text field */
       
    42 LOCAL_C void SetNameL(CContactItem& aItem,TUid aType,const TDesC& aName)
       
    43 	{
       
    44 	CContactItemFieldSet& fieldSet=aItem.CardFields();
       
    45 	const TInt pos=fieldSet.Find(aType);
       
    46 	if (pos!=KErrNotFound)
       
    47 		fieldSet[pos].TextStorage()->SetTextL(aName);
       
    48 	}
       
    49 
       
    50 
       
    51 /** Populate the database */
       
    52 LOCAL_C void PopulateDatabaseL(TInt aNumberToPopulate)
       
    53 	{
       
    54 	for (TInt i=0;i<aNumberToPopulate;i++)
       
    55 		{
       
    56 		CContactItem* item=CContactCard::NewLC(); 
       
    57 		TBuf<20> name;
       
    58 		name.Format(KCntContactName,i);
       
    59 		SetNameL(*item,KUidContactFieldGivenName,name);     
       
    60 		CntTest->Db()->AddNewContactL(*item); 
       
    61 		CleanupStack::PopAndDestroy(item);
       
    62 		}
       
    63 	CntTest->Db()->CompactL();
       
    64 	}
       
    65 
       
    66 
       
    67 
       
    68 
       
    69 
       
    70 LOCAL_C void TestFilteringL()
       
    71 	{
       
    72 	_LIT(KProgressIndicator,".");
       
    73 	test.Printf(KProgressIndicator);
       
    74 
       
    75 	CCntFilter* filter = CCntFilter::NewL();
       
    76 	CleanupStack::PushL(filter);
       
    77 
       
    78 	filter->SetContactFilterTypeCard(ETrue);
       
    79 	TTime time;
       
    80 	time.UniversalTime();
       
    81 	time-=TTimeIntervalMinutes(20); // changes in the last 20 mins
       
    82 	filter->SetFilterDateTime(time);
       
    83 	filter->SetIncludeNewContacts(ETrue);
       
    84 	CntTest->Db()->FilterDatabaseL(*filter);
       
    85 	test(filter->iIds->Count()==KTotalNumRecords);
       
    86 
       
    87 // modified contact
       
    88 	User::After(4000000);	// Let time pass to distinguish between mod  / new
       
    89 	// this may still fail if the device is running too slow (e.g. under a heavy load)
       
    90 	
       
    91 	filter->Reset();
       
    92 	time.UniversalTime();
       
    93 	filter->SetFilterDateTime(time);
       
    94 	filter->SetIncludeModifiedContacts(ETrue);
       
    95 	CntTest->Db()->FilterDatabaseL(*filter);
       
    96 	test(filter->iIds->Count()==0);
       
    97 	
       
    98 	CContactItem* contact = CntTest->Db()->OpenContactLX(5);
       
    99 	CleanupStack::PushL(contact);
       
   100 	contact->IncAccessCount();
       
   101 	CntTest->Db()->CommitContactL(*contact);
       
   102 	CleanupStack::PopAndDestroy(contact);
       
   103 	CleanupStack::Pop(); // contact.Close()
       
   104 
       
   105 	CntTest->Db()->FilterDatabaseL(*filter);
       
   106 	test(filter->iIds->Count()==1);
       
   107 
       
   108 // deleted contact
       
   109 	filter->Reset();
       
   110 	filter->SetFilterDateTime(time); // same time as for modified
       
   111 	filter->SetIncludeDeletedContacts(ETrue);
       
   112 	CntTest->Db()->FilterDatabaseL(*filter);
       
   113 	test(filter->iIds->Count()==0);
       
   114 
       
   115 	CntTest->Db()->DeleteContactL(5);
       
   116 	CntTest->Db()->FilterDatabaseL(*filter);
       
   117 	TInt deletedContactCount = filter->iIds->Count();
       
   118 	test(deletedContactCount ==1);
       
   119 	
       
   120 #ifdef _DEBUG
       
   121 	CContactIdArray* deletedCntArray = CntTest->Db()->DeletedContactsLC();
       
   122 	test(deletedCntArray->Count()==deletedContactCount);
       
   123 	CleanupStack::PopAndDestroy(deletedCntArray ); 
       
   124 #endif	
       
   125 
       
   126 	CleanupStack::PopAndDestroy(filter);
       
   127 	}
       
   128 
       
   129 LOCAL_C void SimpleFilterTestL()
       
   130 	{
       
   131 	CCntFilter* filter = CCntFilter::NewL();
       
   132 	CleanupStack::PushL(filter);
       
   133 	filter->SetContactFilterTypeCard(ETrue);
       
   134 	TTime time;
       
   135 	time.UniversalTime();
       
   136 	time-=TTimeIntervalMinutes(20); // changes in the last 20 mins
       
   137 	filter->SetFilterDateTime(time);
       
   138 	filter->SetIncludeNewContacts(ETrue);
       
   139 	CntTest->Db()->FilterDatabaseL(*filter);
       
   140 	test(filter->iIds->Count()==KTotalNumRecords);
       
   141 	CleanupStack::PopAndDestroy(filter);
       
   142 	}
       
   143 
       
   144 LOCAL_C void NonDateBasedFilterTest()
       
   145 	{
       
   146 	//This test has been created because, formerly,
       
   147 	//CContactDatabase::FilterDatabase(...) could not
       
   148 	//filter on contact types ONLY.
       
   149 	//Previously, the CCntFilter passed in had to 
       
   150 	//have specified filtering based on the 
       
   151 	//time-based states as well (e.g. new, modified, deleted).
       
   152 	//Addresses DEF036345
       
   153 	CCntFilter* theFilter = CCntFilter::NewLC();
       
   154 	theFilter->SetContactFilterTypeGroup(EFalse);
       
   155 	theFilter->SetContactFilterTypeTemplate(EFalse);
       
   156 	theFilter->SetContactFilterTypeOwnCard(EFalse);
       
   157 	theFilter->SetContactFilterTypeCard(ETrue);
       
   158 	//Get a filtered version of the database
       
   159 	CntTest->Db()->FilterDatabaseL(*theFilter);
       
   160 	test(theFilter->iIds->Count()==KTotalNumRecords);
       
   161 	CleanupStack::PopAndDestroy(theFilter);
       
   162 	}
       
   163 
       
   164 // Regression testcode for EDNJKAA-4WLDAY 
       
   165 // "Cannot synchronise Outlook contacts with German device"
       
   166 //
       
   167 // Tests filtering under the following conditions 
       
   168 // Time & date separator '.' 
       
   169 // Time separator ':', date separator '.' 
       
   170 // Time & date separator ':'
       
   171 // Time separator '.', date separator ':'
       
   172 // 
       
   173 LOCAL_C void TestFilterLocalesL()
       
   174 	{
       
   175 	SimpleFilterTestL();
       
   176 	NonDateBasedFilterTest();
       
   177 	TInt i=0;
       
   178 	TLocale example;
       
   179 	example.SetDateFormat(EDateEuropean);
       
   180 	for (i=0; i<4; i++)
       
   181 		{
       
   182 		example.SetTimeSeparator(TChar('.'),i);
       
   183 		example.SetDateSeparator(TChar('.'),i);
       
   184 		}
       
   185 	example.Set();
       
   186 	SimpleFilterTestL();
       
   187 
       
   188 	example.SetDateFormat(EDateAmerican);
       
   189 	for (i=0; i<4; i++)
       
   190 		{
       
   191 		example.SetTimeSeparator(TChar(':'),i);
       
   192 		}
       
   193 	example.Set();
       
   194 	SimpleFilterTestL();
       
   195 
       
   196 	example.SetDateFormat(EDateJapanese);
       
   197 	for (i=0; i<4; i++)
       
   198 		{
       
   199 		example.SetDateSeparator(TChar(':'),i);
       
   200 		}
       
   201 	example.Set();
       
   202 	SimpleFilterTestL();
       
   203 
       
   204 	for (i=0; i<4; i++)
       
   205 		{
       
   206 		example.SetTimeSeparator(TChar('.'),i);
       
   207 		}
       
   208 	example.Set();
       
   209 	SimpleFilterTestL();
       
   210 	}
       
   211 
       
   212 
       
   213 LOCAL_C void TestSyncUid()
       
   214 	{
       
   215 	// test sync / connectivity
       
   216 
       
   217 	TTime time;
       
   218 	time.UniversalTime();
       
   219 	TContactSyncId newSyncId = CntTest->Db()->SetLastSyncDateL(time);
       
   220 	TTime newTime;
       
   221 	CntTest->Db()->GetLastSyncDateL(newSyncId,newTime);
       
   222 	test(newTime==time);
       
   223 	User::After(1000000);
       
   224 	time.UniversalTime();
       
   225 	CntTest->Db()->SetLastSyncDateL(newSyncId, time);
       
   226 	TTime latestTime;
       
   227 	CntTest->Db()->GetLastSyncDateL(newSyncId,latestTime);
       
   228 	test(latestTime > newTime);
       
   229 	test(latestTime==time);
       
   230 	test(newTime!=time);
       
   231 	CntTest->Db()->SetLastSyncDateL(newSyncId++, time);
       
   232 	}
       
   233 
       
   234 // SetInclude* are exclusive
       
   235 // SetContactFilterType* is cumulative
       
   236 //
       
   237 LOCAL_C void CheckFilterSettingsL(TBool aSetting)
       
   238 	{
       
   239 	CCntFilter* filter = CCntFilter::NewLC();
       
   240 
       
   241 	filter->Reset();
       
   242 	filter->SetIncludeModifiedContacts(aSetting);
       
   243 	if (aSetting)
       
   244 		{
       
   245 		test(filter->IncludeModifiedContacts());
       
   246 		test(!filter->IncludeNewContacts());
       
   247 		test(!filter->IncludeDeletedContacts());
       
   248 		}
       
   249 
       
   250 	filter->SetIncludeNewContacts(aSetting); 
       
   251 	if (aSetting)
       
   252 		{
       
   253 		test(filter->IncludeNewContacts());
       
   254 		test(!filter->IncludeModifiedContacts());
       
   255 		test(!filter->IncludeDeletedContacts());
       
   256 		}
       
   257 
       
   258 
       
   259 	filter->SetIncludeDeletedContacts(aSetting);
       
   260 	if (aSetting)
       
   261 		{
       
   262 		test(filter->IncludeDeletedContacts());
       
   263 		test(!filter->IncludeModifiedContacts());
       
   264 		test(!filter->IncludeNewContacts());
       
   265 		}
       
   266 
       
   267 	filter->SetContactFilterTypeCard(aSetting);
       
   268  	filter->SetContactFilterTypeGroup(aSetting);
       
   269 	filter->SetContactFilterTypeTemplate(aSetting);
       
   270 	filter->SetContactFilterTypeOwnCard(aSetting);
       
   271 	if (aSetting)
       
   272 		{
       
   273 		test(filter->ContactFilterTypeGroup());
       
   274 		test(filter->ContactFilterTypeCard());
       
   275 		test(filter->ContactFilterTypeTemplate());
       
   276 		test(filter->ContactFilterTypeOwnCard());
       
   277 		}
       
   278 	else
       
   279 		{
       
   280 		test(!filter->ContactFilterTypeGroup());
       
   281 		test(!filter->ContactFilterTypeCard());
       
   282 		test(!filter->ContactFilterTypeTemplate());
       
   283 		test(!filter->ContactFilterTypeOwnCard());	
       
   284 		}
       
   285 	
       
   286 	filter->SetContactFilterTypeALL(aSetting);
       
   287 	if (aSetting)
       
   288 		{
       
   289 		test(filter->ContactFilterTypeALL());
       
   290 		test(filter->ContactFilterTypeGroup());
       
   291 		test(filter->ContactFilterTypeCard());
       
   292 		test(filter->ContactFilterTypeTemplate());
       
   293 		test(filter->ContactFilterTypeOwnCard());
       
   294 		}
       
   295 
       
   296 	TTime time;
       
   297 	time.UniversalTime();
       
   298 	filter->SetFilterDateTime(time);
       
   299 	test(filter->GetFilterDateTime()==time);
       
   300 		
       
   301 	CleanupStack::PopAndDestroy(filter);
       
   302 	}
       
   303 
       
   304 
       
   305 // Construction tests 
       
   306 // NewL methods are called by NewLC variants so there's no tests for that
       
   307 //
       
   308 LOCAL_C void TestFilterConstructionL()
       
   309 	{
       
   310 	CCntFilter* filter = CCntFilter::NewLC();
       
   311 	TTime time;
       
   312 	time.UniversalTime();
       
   313 	filter->SetFilterDateTime(time);
       
   314 
       
   315 	CCntFilter* clone = CCntFilter::NewLC(filter);
       
   316 	test(clone->GetFilterDateTime()==time);
       
   317 
       
   318 	CleanupStack::PopAndDestroy(2); //filter,clone
       
   319 	}
       
   320 
       
   321 LOCAL_C void TestFilterL()
       
   322 	{
       
   323 	CheckFilterSettingsL(ETrue);
       
   324 	CheckFilterSettingsL(EFalse);
       
   325 	TestFilterConstructionL();
       
   326 	TestFilteringL();
       
   327 	}
       
   328 
       
   329 LOCAL_C void RetrieveLocale(TAny *)
       
   330 	{
       
   331 	OriginalLocale.Set();
       
   332 	}
       
   333 
       
   334 /**
       
   335 
       
   336 @SYMTestCaseID     PIM-T-CONNEC-0001
       
   337 
       
   338 */
       
   339 
       
   340 LOCAL_C void DoTestsL()
       
   341     {
       
   342 	test.Start(_L("@SYMTESTCaseID:PIM-T-CONNEC-0001 Connectivity functionality tests"));
       
   343 
       
   344 
       
   345 	OriginalLocale.Refresh();
       
   346 	CleanupStack::PushL(TCleanupItem(RetrieveLocale, 0));
       
   347 
       
   348 	CntTest->CreateDatabaseL();
       
   349 	CntTest->OpenDatabaseL();
       
   350 	PopulateDatabaseL(KTotalNumRecords);
       
   351 
       
   352 	
       
   353 	TestFilterL();
       
   354 
       
   355 	TestFilterLocalesL();
       
   356 
       
   357 	TRAPD(err,TestSyncUid());
       
   358 	test(err==KErrNone);
       
   359 
       
   360 	CntTest->CloseDatabase();
       
   361 	CntTest->DeleteDatabaseL();
       
   362 	CleanupStack::PopAndDestroy(); // locale
       
   363     }
       
   364 
       
   365 GLDEF_C TInt E32Main()
       
   366 	{
       
   367 	__UHEAP_MARK;
       
   368 	CntTest = new CCntTest;
       
   369 	if (!CntTest)
       
   370 		{
       
   371 		return KErrNoMemory;
       
   372 		}
       
   373 
       
   374 	CntTest->ConstructL(test,KDatabaseFileName);
       
   375     TRAPD(err,DoTestsL());
       
   376 	test.Printf(_L("\n"));
       
   377 	CntTest->EndTestLib(err);
       
   378 	__UHEAP_MARKEND;
       
   379 	return KErrNone;
       
   380     }